[
  {
    "path": ".cursor/mcp.json",
    "content": "{\n  \"mcpServers\": {\n    \"shadcn\": {\n      \"command\": \"npx\",\n      \"args\": [\"shadcn@latest\", \"mcp\"]\n    }\n  }\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: \"Bug report\"\ndescription: Report an issue with Magic UI\ntitle: \"[bug]: \"\nlabels: [\"bug\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        ### Thanks for taking the time to create a bug report. Please search open/closed issues before submitting, as the issue may have already been reported/addressed.\n\n  - type: markdown\n    attributes:\n      value: |\n        #### If you aren't sure this is a bug or not, please open a discussion instead:\n        - [Discussions](https://github.com/magicuidesign/magicui/discussions/new?category=general)\n\n  - type: textarea\n    id: bug-description\n    attributes:\n      label: Describe the bug\n      description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us how in the description. Thanks!\n      placeholder: Bug description\n    validations:\n      required: true\n\n  - type: input\n    id: components-affected\n    attributes:\n      label: Affected component/components\n      description: Which Magic UI components are affected?\n      placeholder: ex. Rainbow Button, Terminal...\n    validations:\n      required: true\n\n  - type: textarea\n    id: reproduction\n    attributes:\n      label: How to reproduce\n      description: A step-by-step description of how to reproduce the bug.\n      placeholder: |\n        1. Go to '...'\n        2. Click on '....'\n        3. See error\n    validations:\n      required: true\n\n  - type: input\n    id: codesandbox-stackblitz\n    attributes:\n      label: Codesandbox/StackBlitz link\n      description: |\n        A link to a CodeSandbox or StackBlitz that includes a minimal reproduction of the problem. In rare cases when not applicable, you can link to a GitHub repository that we can easily run to recreate the issue. If a report is vague and does not have a reproduction, it will be closed without warning. \n\n        > [!CAUTION]\n        > If you skip this step, this issue might be **labeled** with `please add a reproduction` and **closed**.\n    validations:\n      required: false\n\n  - type: textarea\n    id: logs\n    attributes:\n      label: Logs\n      description: \"Please include browser console and server logs around the time this bug occurred. Optional if provided reproduction. Please try not to insert an image but copy paste the log text.\"\n      render: bash\n\n  - type: textarea\n    id: system-info\n    attributes:\n      label: System Info\n      description: Information about browsers, system or binaries that's relevant.\n      render: bash\n      placeholder: System, Binaries, Browsers\n    validations:\n      required: true\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Before submitting\n      description: By submitting this issue, you agree to follow our [Contributing Guidelines](https://github.com/magicuidesign/magicui/blob/main/CONTRIBUTING.md).\n      options:\n        - label: I've made research efforts and searched the documentation\n          required: true\n        - label: I've searched for existing issues\n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: \"Feature request\"\ndescription: Create a feature request for Magic UI\ntitle: \"[feat]: \"\nlabels: [\"area: request\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        ### Thanks for taking the time to create a feature request! Please search open/closed issues before submitting, as the issue may have already been reported/addressed.\n\n  - type: markdown\n    attributes:\n      value: |\n        #### If you aren't sure this is a bug or not, please open a discussion instead:\n        - [Discussions](https://github.com/magicuidesign/magicui/discussions/new?category=general)\n\n  - type: textarea\n    id: feature-description\n    attributes:\n      label: Feature description\n      description: Tell us about your feature request\n      placeholder: \"I think this feature would be great because...\"\n      value: \"Describe your feature request...\"\n    validations:\n      required: true\n\n  - type: input\n    id: components-affected\n    attributes:\n      label: Affected component/components\n      description: Is this feature request relevant to any of the already existing components?\n      placeholder: ex. Button, Checkbox...\n    validations:\n      required: false\n\n  - type: textarea\n    id: context\n    attributes:\n      label: Additional Context\n      description: Add any other context about the feature here.\n      placeholder: ex. screenshots, Stack Overflow links, forum links, etc.\n      value: \"Additional details here...\"\n    validations:\n      required: false\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Before submitting\n      description: By submitting this issue, you agree to follow our [Contributing Guidelines](https://github.com/magicuidesign/magicui/blob/main/CONTRIBUTING.md).\n      options:\n        - label: I've made research efforts and searched the documentation\n          required: true\n        - label: I've searched for existing issues and PRs\n          required: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Description\n<!-- Summarize what this PR changes in 2-4 lines. -->\n\n## Changes\n<!-- List concrete changes by item (e.g., feature, refactor, bug fix). -->\n\n## Motivation\n<!-- Briefly explain why this change is needed and what problem it solves. -->\n\n## Breaking Changes\n<!-- If this affects compatibility, describe impact and migration steps. If not, write None. -->\n\n## Screenshots\n<!-- For UI changes, attach Before/After screenshots and device/browser info. -->\n<!-- Optional for UI changes -->\n> Device / Browser / Viewport:\n\n| Before | After |\n| --- | --- |\n|  |  |\n"
  },
  {
    "path": ".github/scripts/publish-articles.cjs",
    "content": "#!/usr/bin/env node\n\"use strict\";\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst yaml = require(\"js-yaml\");\n\nconst payload = JSON.parse(fs.readFileSync(\"payload.json\", \"utf8\"));\nconst articles = (payload && payload.data && payload.data.articles) || [];\nif (!Array.isArray(articles) || articles.length === 0) process.exit(0);\n\nconst folder = path.join(\"apps\", \"www\", \"content\", \"blog\");\nfs.mkdirSync(folder, { recursive: true });\n\nfor (const a of articles) {\n  const fmObj = {\n    title: a.title || \"\",\n    description: a.meta_description || \"\",\n    image: a.image_url || \"\",\n    author: \"Dillion Verma\",\n    tags: Array.isArray(a.tags) ? a.tags : [],\n    publishedOn: a.created_at || \"\",\n    featured: true,\n  };\n  const fm =\n    \"---\\n\" + yaml.dump(fmObj, { noRefs: true, lineWidth: 0 }) + \"---\\n\";\n  const body = String(a.content_markdown || \"\");\n  const file = path.join(folder, `${a.slug}.mdx`);\n  fs.writeFileSync(file, fm + body, \"utf8\");\n  console.log(`Wrote ${file}`);\n}\n"
  },
  {
    "path": ".github/scripts/submit-sitemap.mjs",
    "content": "import { JWT } from \"google-auth-library\";\nimport { google } from \"googleapis\";\n\nconst { SITE_URL, SITEMAP_URL, GOOGLE_SEARCH_CONSOLE_JSON_KEY } = process.env;\n\nif (!SITE_URL || !SITEMAP_URL || !GOOGLE_SEARCH_CONSOLE_JSON_KEY) {\n  throw new Error(\"Missing required environment variables\");\n}\n\nconst keys = JSON.parse(\n  Buffer.from(GOOGLE_SEARCH_CONSOLE_JSON_KEY, \"base64\").toString(\"utf-8\"),\n);\n\nconst client = new JWT({\n  email: keys.client_email,\n  key: keys.private_key,\n  scopes: [\n    \"https://www.googleapis.com/auth/webmasters\",\n    \"https://www.googleapis.com/auth/webmasters.readonly\",\n  ],\n});\n\ngoogle.options({ auth: client });\n\nconst searchconsole = google.searchconsole(\"v1\");\n\n(async () => {\n  try {\n    await searchconsole.sitemaps.submit({\n      feedpath: SITEMAP_URL,\n      siteUrl: SITE_URL,\n    });\n  } catch (e) {\n    console.log(e);\n    process.exit(1);\n  } finally {\n    process.exit(0);\n  }\n})();\n"
  },
  {
    "path": ".github/workflows/code-check.yml",
    "content": "name: Code check\n\non:\n  pull_request:\n    branches: [\"*\"]\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    name: pnpm lint\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 22\n\n      - uses: pnpm/action-setup@v4\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"pnpm_cache_dir=$(pnpm store path)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v3\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n      - name: Install dependencies\n        run: pnpm install\n\n      - run: pnpm lint\n\n  format:\n    runs-on: ubuntu-latest\n    name: pnpm format:check\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 22\n\n      - uses: pnpm/action-setup@v4\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"pnpm_cache_dir=$(pnpm store path)\" >> $GITHUB_OUTPUT\n\n      - uses: actions/cache@v3\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - run: pnpm format:check\n\n  tsc:\n    runs-on: ubuntu-latest\n    name: pnpm typecheck\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 22\n\n      - uses: pnpm/action-setup@v4\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"pnpm_cache_dir=$(pnpm store path)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v3\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n      - name: Install dependencies\n        run: pnpm install\n\n      - run: pnpm typecheck\n\n  registry-deps:\n    runs-on: ubuntu-latest\n    name: pnpm registry-deps:check\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 22\n\n      - uses: pnpm/action-setup@v4\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"pnpm_cache_dir=$(pnpm store path)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v3\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n      - name: Install dependencies\n        run: pnpm install\n\n      - run: pnpm registry-deps:check\n\n  registry-drift:\n    runs-on: ubuntu-latest\n    name: registry artifact drift check\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: 22\n\n      - uses: pnpm/action-setup@v4\n        name: Install pnpm\n        id: pnpm-install\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Get pnpm store directory\n        id: pnpm-cache\n        run: |\n          echo \"pnpm_cache_dir=$(pnpm store path)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v3\n        name: Setup pnpm cache\n        with:\n          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}\n          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}\n          restore-keys: |\n            ${{ runner.os }}-pnpm-store-\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Build registry artifacts\n        run: pnpm build:registry\n\n      - name: Verify registry artifacts are committed\n        run: |\n          CHANGED_FILES=\"$(git status --porcelain --untracked-files=all -- \\\n            apps/www/registry.json \\\n            apps/www/registry/__index__.tsx \\\n            apps/www/public/registry.json \\\n            apps/www/public/r \\\n            apps/www/public/llms.txt \\\n            apps/www/public/llms-full.txt)\"\n\n          if [ -n \"$CHANGED_FILES\" ]; then\n            echo \"Registry artifacts are out of date.\"\n            echo \"Changed files:\"\n            printf '%s\\n' \"$CHANGED_FILES\"\n            echo \"Run: pnpm build:registry\"\n            echo \"Then commit generated files.\"\n            exit 1\n          fi\n"
  },
  {
    "path": ".github/workflows/publish-article.yml",
    "content": "name: Publish Blog Article\n\non:\n  workflow_dispatch:\n    inputs:\n      payload:\n        description: \"JSON payload from webhook\"\n        required: true\n\npermissions:\n  contents: write\n\njobs:\n  publish-article:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v5\n        with:\n          ref: ${{ github.head_ref }}\n\n      - uses: pnpm/action-setup@v4\n        with:\n          version: 9.15.0\n          run_install: false\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 22\n          cache: pnpm\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Save payload\n        run: node -e \"require('fs').writeFileSync('payload.json', process.env.PAYLOAD)\"\n        env:\n          PAYLOAD: ${{ github.event.inputs.payload }}\n\n      - name: Write blog posts\n        run: node .github/scripts/publish-articles.cjs\n\n      - name: Delete payload\n        run: rm -f payload.json\n\n      - name: Format code\n        run: pnpm format:fix\n\n      - name: Commit & push\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"41898282+github-actions[bot]@users.noreply.github.com\"\n          git add .\n          git commit -m \"Add blog article from webhook\" || echo \"No changes\"\n          git push\n"
  },
  {
    "path": ".github/workflows/submit-sitemap.yml",
    "content": "name: Submit Sitemap to Google\n\non:\n  workflow_run:\n    workflows:\n      - Publish Blog Article\n    types:\n      - completed\n  workflow_dispatch:\n    inputs:\n      sitemap_url:\n        description: \"Override sitemap URL (optional)\"\n        required: false\n\npermissions: {}\n\nenv:\n  SITEMAP_URL: https://magicui.design/sitemap.xml\n  SITE_URL: sc-domain:magicui.design\n\njobs:\n  submit-sitemap:\n    if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v5\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 22\n\n      - name: Install dependencies\n        run: npm install --no-save googleapis google-auth-library\n\n      - name: Publish Sitemap\n        run: node .github/scripts/submit-sitemap.mjs\n        env:\n          GOOGLE_SEARCH_CONSOLE_JSON_KEY: ${{ secrets.GOOGLE_SEARCH_CONSOLE_JSON_KEY }}\n          SITE_URL: ${{ env.SITE_URL }}\n          SITEMAP_URL: ${{ inputs.sitemap_url || env.SITEMAP_URL }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# 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\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# IDE Files\n.idea\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*\n.env*.local\n!.env.example\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n\n\n# turbo cache\n.turbo\n"
  },
  {
    "path": ".prettierignore",
    "content": "yarn.lock\nnode_modules\n.next\n.source\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# Project Context\nUltracite enforces strict type safety, accessibility standards, and consistent code quality for JavaScript/TypeScript projects using Biome's lightning-fast formatter and linter.\n\n## Key Principles\n- Zero configuration required\n- Subsecond performance\n- Maximum type safety\n- AI-friendly code generation\n\n## Before Writing Code\n1. Analyze existing patterns in the codebase\n2. Consider edge cases and error scenarios\n3. Follow the rules below strictly\n4. Validate accessibility requirements\n\n## Rules\n\n### Accessibility (a11y)\n- Don't use `accessKey` attribute on any HTML element.\n- Don't set `aria-hidden=\"true\"` on focusable elements.\n- Don't add ARIA roles, states, and properties to elements that don't support them.\n- Don't use distracting elements like `<marquee>` or `<blink>`.\n- Only use the `scope` prop on `<th>` elements.\n- Don't assign non-interactive ARIA roles to interactive HTML elements.\n- Make sure label elements have text content and are associated with an input.\n- Don't assign interactive ARIA roles to non-interactive HTML elements.\n- Don't assign `tabIndex` to non-interactive HTML elements.\n- Don't use positive integers for `tabIndex` property.\n- Don't include \"image\", \"picture\", or \"photo\" in img alt prop.\n- Don't use explicit role property that's the same as the implicit/default role.\n- Make static elements with click handlers use a valid role attribute.\n- Always include a `title` element for SVG elements.\n- Give all elements requiring alt text meaningful information for screen readers.\n- Make sure anchors have content that's accessible to screen readers.\n- Assign `tabIndex` to non-interactive HTML elements with `aria-activedescendant`.\n- Include all required ARIA attributes for elements with ARIA roles.\n- Make sure ARIA properties are valid for the element's supported roles.\n- Always include a `type` attribute for button elements.\n- Make elements with interactive roles and handlers focusable.\n- Give heading elements content that's accessible to screen readers (not hidden with `aria-hidden`).\n- Always include a `lang` attribute on the html element.\n- Always include a `title` attribute for iframe elements.\n- Accompany `onClick` with at least one of: `onKeyUp`, `onKeyDown`, or `onKeyPress`.\n- Accompany `onMouseOver`/`onMouseOut` with `onFocus`/`onBlur`.\n- Include caption tracks for audio and video elements.\n- Use semantic elements instead of role attributes in JSX.\n- Make sure all anchors are valid and navigable.\n- Ensure all ARIA properties (`aria-*`) are valid.\n- Use valid, non-abstract ARIA roles for elements with ARIA roles.\n- Use valid ARIA state and property values.\n- Use valid values for the `autocomplete` attribute on input elements.\n- Use correct ISO language/country codes for the `lang` attribute.\n\n### Code Complexity and Quality\n- Don't use consecutive spaces in regular expression literals.\n- Don't use the `arguments` object.\n- Don't use primitive type aliases or misleading types.\n- Don't use the comma operator.\n- Don't use empty type parameters in type aliases and interfaces.\n- Don't write functions that exceed a given Cognitive Complexity score.\n- Don't nest describe() blocks too deeply in test files.\n- Don't use unnecessary boolean casts.\n- Don't use unnecessary callbacks with flatMap.\n- Use for...of statements instead of Array.forEach.\n- Don't create classes that only have static members (like a static namespace).\n- Don't use this and super in static contexts.\n- Don't use unnecessary catch clauses.\n- Don't use unnecessary constructors.\n- Don't use unnecessary continue statements.\n- Don't export empty modules that don't change anything.\n- Don't use unnecessary escape sequences in regular expression literals.\n- Don't use unnecessary fragments.\n- Don't use unnecessary labels.\n- Don't use unnecessary nested block statements.\n- Don't rename imports, exports, and destructured assignments to the same name.\n- Don't use unnecessary string or template literal concatenation.\n- Don't use String.raw in template literals when there are no escape sequences.\n- Don't use useless case statements in switch statements.\n- Don't use ternary operators when simpler alternatives exist.\n- Don't use useless `this` aliasing.\n- Don't use any or unknown as type constraints.\n- Don't initialize variables to undefined.\n- Don't use the void operators (they're not familiar).\n- Use arrow functions instead of function expressions.\n- Use Date.now() to get milliseconds since the Unix Epoch.\n- Use .flatMap() instead of map().flat() when possible.\n- Use literal property access instead of computed property access.\n- Don't use parseInt() or Number.parseInt() when binary, octal, or hexadecimal literals work.\n- Use concise optional chaining instead of chained logical expressions.\n- Use regular expression literals instead of the RegExp constructor when possible.\n- Don't use number literal object member names that aren't base 10 or use underscore separators.\n- Remove redundant terms from logical expressions.\n- Use while loops instead of for loops when you don't need initializer and update expressions.\n- Don't pass children as props.\n- Don't reassign const variables.\n- Don't use constant expressions in conditions.\n- Don't use `Math.min` and `Math.max` to clamp values when the result is constant.\n- Don't return a value from a constructor.\n- Don't use empty character classes in regular expression literals.\n- Don't use empty destructuring patterns.\n- Don't call global object properties as functions.\n- Don't declare functions and vars that are accessible outside their block.\n- Make sure builtins are correctly instantiated.\n- Don't use super() incorrectly inside classes. Also check that super() is called in classes that extend other constructors.\n- Don't use variables and function parameters before they're declared.\n- Don't use 8 and 9 escape sequences in string literals.\n- Don't use literal numbers that lose precision.\n\n### React and JSX Best Practices\n- Don't use the return value of React.render.\n- Make sure all dependencies are correctly specified in React hooks.\n- Make sure all React hooks are called from the top level of component functions.\n- Don't forget key props in iterators and collection literals.\n- Don't destructure props inside JSX components in Solid projects.\n- Don't define React components inside other components.\n- Don't use event handlers on non-interactive elements.\n- Don't assign to React component props.\n- Don't use both `children` and `dangerouslySetInnerHTML` props on the same element.\n- Don't use dangerous JSX props.\n- Don't use Array index in keys.\n- Don't insert comments as text nodes.\n- Don't assign JSX properties multiple times.\n- Don't add extra closing tags for components without children.\n- Use `<>...</>` instead of `<Fragment>...</Fragment>`.\n- Watch out for possible \"wrong\" semicolons inside JSX elements.\n\n### Correctness and Safety\n- Don't assign a value to itself.\n- Don't return a value from a setter.\n- Don't compare expressions that modify string case with non-compliant values.\n- Don't use lexical declarations in switch clauses.\n- Don't use variables that haven't been declared in the document.\n- Don't write unreachable code.\n- Make sure super() is called exactly once on every code path in a class constructor before this is accessed if the class has a superclass.\n- Don't use control flow statements in finally blocks.\n- Don't use optional chaining where undefined values aren't allowed.\n- Don't have unused function parameters.\n- Don't have unused imports.\n- Don't have unused labels.\n- Don't have unused private class members.\n- Don't have unused variables.\n- Make sure void (self-closing) elements don't have children.\n- Don't return a value from a function with the return type 'void'\n- Use isNaN() when checking for NaN.\n- Make sure \"for\" loop update clauses move the counter in the right direction.\n- Make sure typeof expressions are compared to valid values.\n- Make sure generator functions contain yield.\n- Don't use await inside loops.\n- Don't use bitwise operators.\n- Don't use expressions where the operation doesn't change the value.\n- Make sure Promise-like statements are handled appropriately.\n- Don't use __dirname and __filename in the global scope.\n- Prevent import cycles.\n- Don't use configured elements.\n- Don't hardcode sensitive data like API keys and tokens.\n- Don't let variable declarations shadow variables from outer scopes.\n- Don't use the TypeScript directive @ts-ignore.\n- Prevent duplicate polyfills from Polyfill.io.\n- Don't use useless backreferences in regular expressions that always match empty strings.\n- Don't use unnecessary escapes in string literals.\n- Don't use useless undefined.\n- Make sure getters and setters for the same property are next to each other in class and object definitions.\n- Make sure object literals are declared consistently (defaults to explicit definitions).\n- Use static Response methods instead of new Response() constructor when possible.\n- Make sure switch-case statements are exhaustive.\n- Make sure the `preconnect` attribute is used when using Google Fonts.\n- Use `Array#{indexOf,lastIndexOf}()` instead of `Array#{findIndex,findLastIndex}()` when looking for the index of an item.\n- Make sure iterable callbacks return consistent values.\n- Use `with { type: \"json\" }` for JSON module imports.\n- Use numeric separators in numeric literals.\n- Use object spread instead of `Object.assign()` when constructing new objects.\n- Always use the radix argument when using `parseInt()`.\n- Make sure JSDoc comment lines start with a single asterisk, except for the first one.\n- Include a description parameter for `Symbol()`.\n- Don't use spread (`...`) syntax on accumulators.\n- Don't use the `delete` operator.\n- Don't access namespace imports dynamically.\n- Don't use namespace imports.\n- Declare regex literals at the top level.\n- Don't use `target=\"_blank\"` without `rel=\"noopener\"`.\n\n### TypeScript Best Practices\n- Don't use TypeScript enums.\n- Don't export imported variables.\n- Don't add type annotations to variables, parameters, and class properties that are initialized with literal expressions.\n- Don't use TypeScript namespaces.\n- Don't use non-null assertions with the `!` postfix operator.\n- Don't use parameter properties in class constructors.\n- Don't use user-defined types.\n- Use `as const` instead of literal types and type annotations.\n- Use either `T[]` or `Array<T>` consistently.\n- Initialize each enum member value explicitly.\n- Use `export type` for types.\n- Use `import type` for types.\n- Make sure all enum members are literal values.\n- Don't use TypeScript const enum.\n- Don't declare empty interfaces.\n- Don't let variables evolve into any type through reassignments.\n- Don't use the any type.\n- Don't misuse the non-null assertion operator (!) in TypeScript files.\n- Don't use implicit any type on variable declarations.\n- Don't merge interfaces and classes unsafely.\n- Don't use overload signatures that aren't next to each other.\n- Use the namespace keyword instead of the module keyword to declare TypeScript namespaces.\n\n### Style and Consistency\n- Don't use global `eval()`.\n- Don't use callbacks in asynchronous tests and hooks.\n- Don't use negation in `if` statements that have `else` clauses.\n- Don't use nested ternary expressions.\n- Don't reassign function parameters.\n- This rule lets you specify global variable names you don't want to use in your application.\n- Don't use specified modules when loaded by import or require.\n- Don't use constants whose value is the upper-case version of their name.\n- Use `String.slice()` instead of `String.substr()` and `String.substring()`.\n- Don't use template literals if you don't need interpolation or special-character handling.\n- Don't use `else` blocks when the `if` block breaks early.\n- Don't use yoda expressions.\n- Don't use Array constructors.\n- Use `at()` instead of integer index access.\n- Follow curly brace conventions.\n- Use `else if` instead of nested `if` statements in `else` clauses.\n- Use single `if` statements instead of nested `if` clauses.\n- Use `new` for all builtins except `String`, `Number`, and `Boolean`.\n- Use consistent accessibility modifiers on class properties and methods.\n- Use `const` declarations for variables that are only assigned once.\n- Put default function parameters and optional function parameters last.\n- Include a `default` clause in switch statements.\n- Use the `**` operator instead of `Math.pow`.\n- Use `for-of` loops when you need the index to extract an item from the iterated array.\n- Use `node:assert/strict` over `node:assert`.\n- Use the `node:` protocol for Node.js builtin modules.\n- Use Number properties instead of global ones.\n- Use assignment operator shorthand where possible.\n- Use function types instead of object types with call signatures.\n- Use template literals over string concatenation.\n- Use `new` when throwing an error.\n- Don't throw non-Error values.\n- Use `String.trimStart()` and `String.trimEnd()` over `String.trimLeft()` and `String.trimRight()`.\n- Use standard constants instead of approximated literals.\n- Don't assign values in expressions.\n- Don't use async functions as Promise executors.\n- Don't reassign exceptions in catch clauses.\n- Don't reassign class members.\n- Don't compare against -0.\n- Don't use labeled statements that aren't loops.\n- Don't use void type outside of generic or return types.\n- Don't use console.\n- Don't use control characters and escape sequences that match control characters in regular expression literals.\n- Don't use debugger.\n- Don't assign directly to document.cookie.\n- Use `===` and `!==`.\n- Don't use duplicate case labels.\n- Don't use duplicate class members.\n- Don't use duplicate conditions in if-else-if chains.\n- Don't use two keys with the same name inside objects.\n- Don't use duplicate function parameter names.\n- Don't have duplicate hooks in describe blocks.\n- Don't use empty block statements and static blocks.\n- Don't let switch clauses fall through.\n- Don't reassign function declarations.\n- Don't allow assignments to native objects and read-only global variables.\n- Use Number.isFinite instead of global isFinite.\n- Use Number.isNaN instead of global isNaN.\n- Don't assign to imported bindings.\n- Don't use irregular whitespace characters.\n- Don't use labels that share a name with a variable.\n- Don't use characters made with multiple code points in character class syntax.\n- Make sure to use new and constructor properly.\n- Don't use shorthand assign when the variable appears on both sides.\n- Don't use octal escape sequences in string literals.\n- Don't use Object.prototype builtins directly.\n- Don't redeclare variables, functions, classes, and types in the same scope.\n- Don't have redundant \"use strict\".\n- Don't compare things where both sides are exactly the same.\n- Don't let identifiers shadow restricted names.\n- Don't use sparse arrays (arrays with holes).\n- Don't use template literal placeholder syntax in regular strings.\n- Don't use the then property.\n- Don't use unsafe negation.\n- Don't use var.\n- Don't use with statements in non-strict contexts.\n- Make sure async functions actually use await.\n- Make sure default clauses in switch statements come last.\n- Make sure to pass a message value when creating a built-in error.\n- Make sure get methods always return a value.\n- Use a recommended display strategy with Google Fonts.\n- Make sure for-in loops include an if statement.\n- Use Array.isArray() instead of instanceof Array.\n- Make sure to use the digits argument with Number#toFixed().\n- Make sure to use the \"use strict\" directive in script files.\n\n### Next.js Specific Rules\n- Don't use `<img>` elements in Next.js projects.\n- Don't use `<head>` elements in Next.js projects.\n- Don't import next/document outside of pages/_document.jsx in Next.js projects.\n- Don't use the next/head module in pages/_document.js on Next.js projects.\n\n### Testing Best Practices\n- Don't use export or module.exports in test files.\n- Don't use focused tests.\n- Make sure the assertion function, like expect, is placed inside an it() function call.\n- Don't use disabled tests.\n\n## Common Tasks\n- `npx ultracite init` - Initialize Ultracite in your project\n- `npx ultracite fix` - Format and fix code automatically\n- `npx ultracite check` - Check for issues without fixing\n\n## Example: Error Handling\n```typescript\n// ✅ Good: Comprehensive error handling\ntry {\n  const result = await fetchData();\n  return { success: true, data: result };\n} catch (error) {\n  console.error('API call failed:', error);\n  return { success: false, error: error.message };\n}\n\n// ❌ Bad: Swallowing errors\ntry {\n  return await fetchData();\n} catch (e) {\n  console.log(e);\n}\n```"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to MagicUI\n\nThank you for your interest in contributing to MagicUI! We appreciate your support and look forward to your contributions. This guide will help you understand the directory structure and provide detailed instructions on how to add a new component to MagicUI.\n\nRead the [example PR](https://github.com/magicuidesign/magicui/pull/780) to learn which files you need to add. **You only need to change 5 files to add a new component or effect** and it only takes around 10 minutes of work!\n\nOnce done, open a pull request from your forked repo to the main repo [here](https://github.com/magicuidesign/magicui/compare).\n\n## Getting Started\n\n### Fork and Clone the Repository\n\n1. **Fork this repository**  \n   Click [here](https://github.com/magicuidesign/magicui/fork) to fork the repository.\n\n2. **Clone your forked repository to your local machine**\n\n   ```bash\n   git clone https://github.com/<YOUR_USERNAME>/magicui.git\n   ```\n\n3. **Navigate to the project directory**\n\n   ```bash\n   cd magicui\n   ```\n\n4. **Create a new branch for your changes**\n\n   ```bash\n   git checkout -b my-new-branch\n   ```\n\n5. **Install dependencies**\n\n   ```bash\n   pnpm i\n   ```\n\n6. **Create a `.env.local` file**\n\n   ```bash\n   touch .env.local && echo \"NEXT_PUBLIC_APP_URL=http://localhost:3000\" > .env.local\n   ```\n\n7. **Run the project**\n   ```bash\n   pnpm dev\n   ```\n\n## Adding a New Component\n\nTo add a new component to MagicUI, you will need to modify several files. Follow these steps:\n\n### 1. Create Component\n\nCreate the main component in `registry/magicui/example-component.tsx`\n\n```typescript\nimport React from 'react'\n\nexport default function ExampleComponent() {\n  return (\n    <div>\n      This is your component.\n    </div>\n  )\n}\n```\n\n### 2. Create Component Demo\n\nProvide a basic example to showcase your component in `registry/example/example-component-demo.tsx`\n\n```typescript\nimport ExampleComponent from '@/registry/magicui/example-component'\n\nexport default function ExampleComponentDemo() {\n  return (\n    <div className=\"relative justify-center\">\n      <ExampleComponent />\n    </div>\n  )\n}\n```\n\n### 3. Update Sidebar\n\nAdd your component to the sidebar in `config/docs.ts`\n\n```typescript\n{\n    title: \"Example Component\",\n    href: `/docs/components/example-component`,\n    items: [],\n    label: \"New\",\n}\n```\n\n### 4. Create docs\n\nCreate an MDX file for documenting your component in `content/docs/components/example-component.mdx`\n\n````md\n---\ntitle: Example Component\ndate: 2024-06-01\ndescription: Example component for Magic UI\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"example-component-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/example-component\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"example-component\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\n<Step>Add the following animations to your global CSS file inside the `@theme inline` block (e.g., `app/globals.css` or similar)</Step>\n\n```css title=\"app/globals.css\" {1-2,4-18}\n--animate-example: example var(--duration) infinite linear;\n\n@keyframes example {\n  from {\n    transform: translateX(0);\n  }\n  to {\n    transform: translateX(calc(-100% - var(--gap)));\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Props\n\n| Prop    | Type     | Default  | Description                |\n| ------- | -------- | -------- | -------------------------- |\n| `color` | `String` | `\"blue\"` | The color of the component |\n````\n\n### 5. Update Registry\n\nExport your component and example in the registry files:\n\nIn `registry/registry-ui.ts`:\n\n```typescript\nexport const ui: Registry = [\n  // ... existing components ...\n  {\n    name: \"example-component\",\n    type: \"registry:ui\",\n    title: \"Example Component\",\n    description:\n      \"A versatile component that can be used to display various types of content such as text, images, or videos.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"registry/magicui/example-component.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    // Add CSS variables for the component\n    cssVars: {\n      theme: {\n        \"animate-example\": \"example var(--duration) infinite linear\",\n      },\n    },\n    // Add CSS keyframes for the component\n    css: {\n      \"@keyframes example\": {\n        from: {\n          transform: \"translateX(0)\",\n        },\n        to: {\n          transform: \"translateX(calc(-100% - var(--gap)))\",\n        },\n      },\n    },\n  },\n];\n```\n\nIn `registry/registry-examples.ts`:\n\n```typescript\nexport const examples: Registry = [\n  // ... existing examples ...\n  {\n    name: \"example-component-demo\",\n    description: \"An example of the example-component\",\n    type: \"registry:example\",\n    registryDependencies: [\"example-component\"],\n    files: [\n      {\n        path: \"registry/example/example-component-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n];\n```\n\nMake sure to add any necessary dependencies, tailwind configurations, or other properties as needed for your specific component.\n\n### 6. Build registry\n\n```bash\npnpm build:registry\n```\n\n## Adding to the showcase\n\n### 1. Create your showcase as a MDX file\n\nCreate your showcase in `content/showcase/website-name.mdx`\n\n```mdx\n---\ntitle: website-name.com\ndescription: Website description\nimage: /showcase/website-name.png\nhref: https://website-name.com\nfeatured: true\naffiliation: YC S25, raised $10M\n---\n```\n\n### 2. Create an image\n\nUpload an image of your site to `public/showcase/website-name.png`\n\n## Ask for Help\n\nFor any help or questions, please open a new GitHub issue.\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) Magic UI\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": "<img alt=\"Magic UI - UI Library for Design Engineers\" src=\"https://cdn.magicui.design/bento-grid.gif\" width=\"100%\">\n<h3 align=\"center\">Magic UI</h3>\n<p align=\"center\">\n    UI Library for Design Engineers\n</p>\n<div align=\"center\">\n  <a href=\"https://github.com/magicuidesign/magicui/stargazers\"><img alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/magicuidesign/magicui\"></a>\n  <a href=\"https://twitter.com/magicuidesign\"><img alt=\"Twitter Follow\" src=\"https://img.shields.io/twitter/follow/magicuidesign\"></a>\n  <a href=\"https://github.com/magicuidesign/magicui/blob/main/LICENSE.md\"><img alt=\"License\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\"></a>\n  <a href=\"https://discord.com/invite/87p2vpsat5\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/1151315619246002176\"></a>\n  \n</div>\n\n## Documentation\n\nVisit https://magicui.design/docs to view the documentation.\n\n## Contributing\n\nVisit our [contributing guide](https://github.com/magicuidesign/magicui/blob/main/CONTRIBUTING.md) to learn how to contribute. It only takes ~5 minutes to add your own!\n\n## Community\n\nHave questions, comments or feedback? [Join our discord](http://magicui.design/discord).\n\n## Authors\n\n<a href=\"https://github.com/magicuidesign/magicui/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=magicuidesign/magicui\" />\n</a>\n\n## Stats\n\n![Alt](https://repobeats.axiom.co/api/embed/38b63c4514a8a4cd7d1307985af2889c78d67bcc.svg \"Repobeats analytics image\")\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=magicuidesign/magicui&type=Date)](https://www.star-history.com/#magicuidesign/magicui&Date)\n\n## License\n\nLicensed under the [MIT license](https://github.com/magicuidesign/magicui/blob/main/LICENSE.md).\n"
  },
  {
    "path": "apps/www/.env.example",
    "content": "NEXT_PUBLIC_APP_URL=http://localhost:3000\n"
  },
  {
    "path": "apps/www/.gitignore",
    "content": "# App-specific ignores\n.next\nout\nbuild\nnode_modules\n.turbo\n.vercel\n*.tsbuildinfo\nnext-env.d.ts\n.source\n"
  },
  {
    "path": "apps/www/.prettierignore",
    "content": "registry/__index__.tsx\n"
  },
  {
    "path": "apps/www/app/(blog)/blog/[...slug]/page.tsx",
    "content": "/* eslint-disable @next/next/no-img-element */\nimport type { Metadata } from \"next\"\nimport Link from \"next/link\"\nimport { notFound } from \"next/navigation\"\nimport { mdxComponents } from \"@/mdx-components\"\nimport { ArrowLeftIcon } from \"lucide-react\"\nimport type { BlogPosting, BreadcrumbList, WithContext } from \"schema-dts\"\n\nimport { siteConfig } from \"@/config/site\"\nimport { blogSource } from \"@/lib/source\"\nimport { absoluteUrl, calculateReadingTime, formatDate } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { MobileTOC } from \"@/components/blog/mobile-toc\"\nimport { BlogTableOfContents } from \"@/components/blog/table-of-contents\"\nimport { SidebarCTA } from \"@/components/sidebar-cta\"\n\nexport const revalidate = false\nexport const dynamic = \"force-static\"\nexport const dynamicParams = false\n\ninterface PageProps {\n  params: Promise<{\n    slug: string[]\n  }>\n}\n\nexport function generateStaticParams() {\n  return blogSource.generateParams()\n}\n\nasync function getDocFromParams({ params }: PageProps) {\n  const { slug } = await params\n  const page = blogSource.getPage(slug)\n  if (!page) notFound()\n  const doc = page.data\n  if (!doc.title || !doc.description) {\n    notFound()\n  }\n\n  return { doc, page }\n}\n\nexport async function generateMetadata({\n  params,\n}: PageProps): Promise<Metadata> {\n  const { doc, page } = await getDocFromParams({ params })\n\n  if (!page) {\n    return {}\n  }\n\n  return {\n    title: `${doc.title} | ${siteConfig.name}`,\n    description: doc.description,\n    openGraph: {\n      title: doc.title,\n      description: doc.description,\n      type: \"article\",\n      url: absoluteUrl(page.url),\n      images: [\n        {\n          url: doc.image ?? \"\",\n          width: 1200,\n          height: 630,\n        },\n      ],\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title: doc.title,\n      description: doc.description,\n\n      images: [doc.image ?? \"\"],\n      creator: \"@dillionverma\",\n    },\n  }\n}\n\nexport default async function BlogPage({ params }: PageProps) {\n  const { doc, page } = await getDocFromParams({ params })\n  const content = await doc.getText(\"raw\")\n  const MDX = doc.body\n\n  const toBreadcrumbLabel = (segment: string) =>\n    segment\n      .split(\"-\")\n      .filter(Boolean)\n      .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))\n      .join(\" \") || segment\n\n  const slugSegments = page.url\n    .replace(/^\\/blog\\/?/, \"\")\n    .split(\"/\")\n    .filter(Boolean)\n  const intermediateCrumbs = slugSegments\n    .slice(0, -1)\n    .map((segment, index) => ({\n      name: toBreadcrumbLabel(segment),\n      url: `/blog/${slugSegments.slice(0, index + 1).join(\"/\")}`,\n    }))\n  const breadcrumbs = [\n    { name: \"Home\", url: \"/\" },\n    { name: \"Blog\", url: \"/blog\" },\n    ...intermediateCrumbs,\n    { name: doc.title, url: page.url },\n  ] as const\n\n  // Generate structured data for individual blog post\n  const structuredData: WithContext<BlogPosting> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BlogPosting\",\n    headline: doc.title,\n    description: doc.description,\n    url: absoluteUrl(page.url),\n    datePublished: doc.publishedOn,\n    dateModified: doc.publishedOn,\n    author: {\n      \"@type\": \"Person\",\n      name: doc.author ?? \"Magic UI Team\",\n      url: siteConfig.links?.twitter,\n    },\n    image: doc.image ? [doc.image] : undefined,\n    publisher: {\n      \"@type\": \"Organization\",\n      name: siteConfig.name,\n      url: siteConfig.url,\n      logo: {\n        \"@type\": \"ImageObject\",\n        url: `${siteConfig.url}/logo.png`,\n      },\n    },\n    mainEntityOfPage: {\n      \"@type\": \"WebPage\",\n      \"@id\": absoluteUrl(page.url),\n    },\n    wordCount: content ? content.split(/\\s+/).length : 0,\n    timeRequired: `PT${calculateReadingTime(content || \"\")}M`,\n    keywords: (() => {\n      const docTag = doc.tags\n      if (!docTag) return undefined\n      return Array.isArray(docTag) ? docTag : [docTag]\n    })(),\n    inLanguage: \"en-US\",\n  }\n\n  const breadcrumbStructuredData: WithContext<BreadcrumbList> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BreadcrumbList\",\n    itemListElement: breadcrumbs.map((breadcrumb, index) => ({\n      \"@type\": \"ListItem\",\n      position: index + 1,\n      name: breadcrumb.name,\n      item: absoluteUrl(breadcrumb.url),\n    })),\n  }\n\n  const serializedStructuredData = JSON.stringify(structuredData).replace(\n    /</g,\n    \"\\\\u003c\"\n  )\n  const serializedBreadcrumbStructuredData = JSON.stringify(\n    breadcrumbStructuredData\n  ).replace(/</g, \"\\\\u003c\")\n\n  return (\n    <>\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{ __html: serializedStructuredData }}\n      />\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{\n          __html: serializedBreadcrumbStructuredData,\n        }}\n      />\n      <div className=\"mx-auto mt-5 max-w-6xl px-5 xl:px-0\">\n        <div className=\"mb-4\">\n          <Link href=\"/blog\" className={buttonVariants({ variant: \"link\" })}>\n            <ArrowLeftIcon className=\"mr-2 h-4 w-4\" />\n            Back to Blog\n          </Link>\n        </div>\n        <article className=\"mx-auto mt-5 max-w-6xl rounded-xl\">\n          {doc && (\n            <div>\n              <div className=\"relative overflow-hidden rounded-xl p-5\">\n                <img\n                  src={doc.image}\n                  alt={doc.title}\n                  className=\"border-border size-full rounded-xl border object-cover object-left\"\n                />\n              </div>\n              <div className=\"mx-auto flex flex-col items-center justify-center gap-y-2 p-5\">\n                <div className=\"mx-auto flex max-w-3xl flex-col items-center justify-center gap-y-4\">\n                  <h1 className=\"text-center text-3xl font-semibold tracking-tighter text-balance md:text-5xl\">\n                    {doc.title}\n                  </h1>\n                  <p className=\"text-secondary-foreground text-center text-balance md:text-lg\">\n                    {doc.description}\n                  </p>\n                  <div className=\"text-secondary-foreground flex items-center justify-center gap-x-2 text-sm\">\n                    {doc.publishedOn && (\n                      <time>{formatDate(doc.publishedOn)}</time>\n                    )}\n                    {doc.publishedOn && <span>·</span>}\n                    <span>{calculateReadingTime(content)} min read</span>\n                  </div>\n                </div>\n              </div>\n              <div className=\"text-secondary-foreground flex items-center justify-center gap-x-2 p-3 text-sm\">\n                {(() => {\n                  const docTag = doc.tags\n                  const tags = docTag\n                    ? Array.isArray(docTag)\n                      ? docTag\n                      : [docTag]\n                    : []\n\n                  return (\n                    tags.length > 0 && (\n                      <div className=\"flex flex-wrap items-center justify-center gap-1\">\n                        {tags.map((tag) => (\n                          <Link\n                            key={tag}\n                            href={`/blog?tag=${encodeURIComponent(tag)}`}\n                          >\n                            <Badge\n                              variant=\"secondary\"\n                              className=\"border-border border text-xs\"\n                            >\n                              {tag}\n                            </Badge>\n                          </Link>\n                        ))}\n                      </div>\n                    )\n                  )\n                })()}\n              </div>\n            </div>\n          )}\n          <div className=\"grid grid-cols-1 gap-x-1 lg:grid-cols-7\">\n            <div className=\"article-content col-span-5 p-5 lg:p-10\">\n              <MDX components={mdxComponents} />\n            </div>\n            <div className=\"text-primary sticky top-16 col-span-2 hidden h-fit w-full flex-col items-start justify-start p-5 lg:flex\">\n              <BlogTableOfContents />\n              <div className=\"h-10\" />\n              <SidebarCTA />\n            </div>\n          </div>\n        </article>\n        <MobileTOC />\n      </div>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(blog)/blog/layout.tsx",
    "content": "import { SiteFooter } from \"@/components/site-footer\"\nimport { SiteHeader } from \"@/components/site-header\"\n\nexport default function Layout({ children }: { children: React.ReactNode }) {\n  return (\n    <>\n      <SiteHeader />\n      <main className=\"min-h-screen w-full\">{children}</main>\n      <SiteFooter />\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(blog)/blog/page.tsx",
    "content": "/* eslint-disable @next/next/no-img-element */\nimport type { Metadata } from \"next\"\nimport Link from \"next/link\"\nimport type { Blog, BreadcrumbList, WithContext } from \"schema-dts\"\n\nimport { siteConfig } from \"@/config/site\"\nimport { blogSource } from \"@/lib/source\"\nimport {\n  absoluteUrl,\n  calculateReadingTime,\n  constructMetadata,\n  formatDate,\n  normalizeTag,\n  pluralize,\n} from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\n\nexport const revalidate = false\nexport const dynamic = \"force-static\"\nexport const dynamicParams = false\n\nexport function generateStaticParams() {\n  return []\n}\n\nconst BLOG_DESCRIPTION =\n  \"Latest articles about UI components, animations, and web development best practices.\"\n\nexport const metadata: Metadata = constructMetadata({\n  title: `Blog | ${siteConfig.name}`,\n  description: BLOG_DESCRIPTION,\n})\n\nexport default async function Page({\n  searchParams,\n}: {\n  searchParams?: Promise<{ tag?: string }>\n}) {\n  const params = await searchParams\n  const selectedTag = params?.tag ?? \"\"\n\n  const posts = blogSource.getPages().sort((a, b) => {\n    const dateA = new Date(a.data?.publishedOn || 0).getTime()\n    const dateB = new Date(b.data?.publishedOn || 0).getTime()\n    return dateB - dateA\n  })\n\n  const filteredPosts = selectedTag\n    ? posts.filter((p) => normalizeTag(p.data?.tags).includes(selectedTag))\n    : posts\n\n  const breadcrumbs = [\n    { name: \"Home\", url: \"/\" },\n    { name: \"Blog\", url: \"/blog\" },\n  ] as const\n\n  const breadcrumbStructuredData: WithContext<BreadcrumbList> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BreadcrumbList\",\n    itemListElement: breadcrumbs.map((breadcrumb, index) => ({\n      \"@type\": \"ListItem\",\n      position: index + 1,\n      name: breadcrumb.name,\n      item: absoluteUrl(breadcrumb.url),\n    })),\n  }\n\n  // Generate structured data\n  const structuredData: WithContext<Blog> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"Blog\",\n    name: `${siteConfig.name} Blog`,\n    description: BLOG_DESCRIPTION,\n    url: `${siteConfig.url}/blog`,\n    inLanguage: \"en-US\",\n    publisher: {\n      \"@type\": \"Organization\",\n      name: siteConfig.name,\n      url: siteConfig.url,\n      logo: {\n        \"@type\": \"ImageObject\",\n        url: `${siteConfig.url}/icon.png`,\n      },\n    },\n    blogPost: filteredPosts.slice(0, 10).map((post) => ({\n      \"@type\": \"BlogPosting\",\n      headline: post.data?.title,\n      description: post.data?.description,\n      url: `${siteConfig.url}${post.url}`,\n      datePublished: post.data?.publishedOn,\n      dateModified: post.data?.publishedOn,\n      author: {\n        \"@type\": \"Person\",\n        name: post.data?.author,\n        url: siteConfig.links?.twitter,\n      },\n      image: post.data?.image ? [post.data?.image] : undefined,\n      keywords:\n        normalizeTag(post.data?.tags).length > 0\n          ? normalizeTag(post.data?.tags)\n          : undefined,\n      publisher: {\n        \"@type\": \"Organization\",\n        name: siteConfig.name,\n        url: siteConfig.url,\n      },\n    })),\n  }\n\n  const serializedStructuredData = JSON.stringify(structuredData).replace(\n    /</g,\n    \"\\\\u003c\"\n  )\n  const serializedBreadcrumbStructuredData = JSON.stringify(\n    breadcrumbStructuredData\n  ).replace(/</g, \"\\\\u003c\")\n\n  return (\n    <>\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{ __html: serializedStructuredData }}\n      />\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{\n          __html: serializedBreadcrumbStructuredData,\n        }}\n      />\n      <main className=\"container mx-auto px-10 py-10 md:py-14\">\n        <header className=\"mb-12 space-y-3\">\n          <div>\n            <h1 className=\"text-3xl font-semibold tracking-tight\">Blog</h1>\n            <p className=\"text-muted-foreground mt-2 text-lg\">\n              {BLOG_DESCRIPTION}\n            </p>\n          </div>\n\n          {filteredPosts.length > 0 && (\n            <Badge variant=\"default\" className=\"text-xs shadow-none\">\n              {selectedTag\n                ? `${pluralize(filteredPosts.length, \"article\")} tagged with \"${selectedTag}\"`\n                : `${pluralize(filteredPosts.length, \"article\")} total`}\n            </Badge>\n          )}\n        </header>\n\n        {/* {tags.length > 0 && (\n          <nav className=\"mb-8\">\n            <div className=\"flex flex-wrap gap-2\">\n              <Link\n                href=\"/blog\"\n                className={`rounded-full border px-3 py-1.5 text-sm font-medium transition-colors ${\n                  !selectedTag\n                    ? \"bg-primary text-primary-foreground\"\n                    : \"text-muted-foreground hover:bg-muted hover:text-foreground\"\n                }`}\n              >\n                All\n              </Link>\n              {tags.map((tag) => (\n                <Link\n                  key={tag}\n                  href={`/blog?tag=${encodeURIComponent(tag)}`}\n                  className={`rounded-full border px-3 py-1.5 text-sm font-medium transition-colors ${\n                    selectedTag === tag\n                      ? \"bg-primary text-primary-foreground\"\n                      : \"text-muted-foreground hover:bg-muted hover:text-foreground\"\n                  }`}\n                >\n                  {tag}\n                </Link>\n              ))}\n            </div>\n          </nav>\n        )} */}\n\n        {filteredPosts.length === 0 ? (\n          <div className=\"py-16 text-center\">\n            <p className=\"text-muted-foreground text-lg\">\n              {selectedTag\n                ? `No articles found for \"${selectedTag}\".`\n                : \"No posts yet.\"}\n            </p>\n            {selectedTag && (\n              <Link\n                href=\"/blog\"\n                className=\"text-primary mt-4 inline-flex items-center hover:underline\"\n              >\n                View all articles\n              </Link>\n            )}\n          </div>\n        ) : (\n          <div className=\"grid gap-8 sm:grid-cols-2 lg:grid-cols-3\">\n            {filteredPosts.map(async (post) => {\n              const content = await post.data?.getText(\"raw\")\n              return (\n                <article\n                  key={post.url}\n                  className=\"group flex flex-col rounded-lg border\"\n                >\n                  <Link href={post.url} className=\"flex h-full flex-col\">\n                    {post.data?.image && (\n                      <div className=\"overflow-hidden rounded-t-lg border-b\">\n                        <img\n                          src={post.data.image}\n                          alt={post.data?.title ?? post.url}\n                          width={640}\n                          height={360}\n                          className=\"h-auto w-full object-contain transition-transform duration-300 group-hover:scale-[1.02]\"\n                        />\n                      </div>\n                    )}\n\n                    <div className=\"flex flex-1 flex-col space-y-3 p-6\">\n                      <div className=\"flex-1 space-y-2\">\n                        <h2 className=\"group-hover:text-primary line-clamp-2 text-xl leading-tight font-semibold transition-colors\">\n                          {post.data?.title ?? post.url}\n                        </h2>\n                        {post.data?.description && (\n                          <p className=\"text-muted-foreground line-clamp-2 text-sm leading-relaxed\">\n                            {post.data.description}\n                          </p>\n                        )}\n                      </div>\n\n                      <div className=\"text-muted-foreground flex items-center gap-2 text-xs\">\n                        {post.data?.publishedOn && (\n                          <time dateTime={post.data.publishedOn}>\n                            {formatDate(post.data.publishedOn)}\n                          </time>\n                        )}\n                        {post.data?.publishedOn && <span>·</span>}\n                        <span>\n                          {calculateReadingTime(content ?? \"\")} min read\n                        </span>\n                      </div>\n\n                      {normalizeTag(post.data?.tags).length > 0 && (\n                        <div className=\"flex flex-wrap gap-1.5\">\n                          {normalizeTag(post.data.tags)\n                            .slice(0, 3)\n                            .map((tag) => (\n                              <Badge\n                                key={tag}\n                                variant=\"secondary\"\n                                className=\"border-border border text-xs\"\n                              >\n                                {tag}\n                              </Badge>\n                            ))}\n                        </div>\n                      )}\n                    </div>\n                  </Link>\n                </article>\n              )\n            })}\n          </div>\n        )}\n      </main>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(docs)/docs/[[...slug]]/page.tsx",
    "content": "import type { Metadata } from \"next\"\nimport Link from \"next/link\"\nimport { notFound } from \"next/navigation\"\nimport { mdxComponents } from \"@/mdx-components\"\nimport { IconArrowLeft, IconArrowRight } from \"@tabler/icons-react\"\nimport type { BreadcrumbItem } from \"fumadocs-core/breadcrumb\"\nimport { getBreadcrumbItems } from \"fumadocs-core/breadcrumb\"\nimport { findNeighbour } from \"fumadocs-core/server\"\nimport type { BreadcrumbList, TechArticle, WithContext } from \"schema-dts\"\n\nimport { getNeighboursFromConfig } from \"@/config/docs\"\nimport { siteConfig } from \"@/config/site\"\nimport { replaceComponentSource } from \"@/lib/docs\"\nimport { source } from \"@/lib/source\"\nimport { absoluteUrl } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Contribute } from \"@/components/contribute\"\nimport { DocsCopyPage } from \"@/components/docs-copy-page\"\nimport { DocsTableOfContents } from \"@/components/docs-toc\"\nimport { SidebarCTA } from \"@/components/sidebar-cta\"\n\nexport const revalidate = false\nexport const dynamic = \"force-static\"\nexport const dynamicParams = false\n\nexport function generateStaticParams() {\n  return source.generateParams()\n}\n\ninterface DocPageProps {\n  params: Promise<{\n    slug: string[]\n  }>\n}\n\nasync function getDocFromParams({ params }: DocPageProps) {\n  const { slug } = await params\n  const page = source.getPage(slug)\n  if (!page) notFound()\n  const doc = page.data\n  if (!doc.title || !doc.description) {\n    notFound()\n  }\n\n  return { doc, page }\n}\n\nexport async function generateMetadata({\n  params,\n}: DocPageProps): Promise<Metadata> {\n  const { doc, page } = await getDocFromParams({ params })\n\n  if (!doc) {\n    return {}\n  }\n\n  const ogUrl = new URL(absoluteUrl(\"/og\"))\n  ogUrl.searchParams.set(\"title\", doc.title ?? \"\")\n  ogUrl.searchParams.set(\"description\", doc.description ?? \"\")\n\n  return {\n    title: `${doc.title} | React Components & Templates`,\n    description: doc.description,\n    openGraph: {\n      title: doc.title,\n      description: doc.description,\n      type: \"article\",\n      url: absoluteUrl(page.url),\n      images: [\n        {\n          url: ogUrl.toString(),\n          width: 1200,\n          height: 630,\n        },\n      ],\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title: doc.title,\n      description: doc.description,\n      images: [ogUrl.toString()],\n      creator: \"@dillionverma\",\n    },\n  }\n}\n\nexport default async function DocPage({ params }: DocPageProps) {\n  const { doc, page } = await getDocFromParams({ params })\n  const MDX = doc.body\n  const content = await doc.getText(\"raw\")\n  const configNeighbours = getNeighboursFromConfig(page.url)\n  const treeNeighbours = findNeighbour(source.pageTree, page.url)\n  const neighbours = {\n    previous: configNeighbours.previous ?? treeNeighbours.previous,\n    next: configNeighbours.next ?? treeNeighbours.next,\n  }\n  const breadcrumbs = getBreadcrumbItems(page.url, source.pageTree, {\n    includeRoot: { url: \"/docs\" },\n    includePage: true,\n  })\n  const lastBreadcrumb = breadcrumbs.at(-1)\n\n  const resolveBreadcrumbName = (item: BreadcrumbItem): string => {\n    if (typeof item.name === \"string\") {\n      return item.name\n    }\n\n    if (typeof item.name === \"number\") {\n      return `${item.name}`\n    }\n\n    return doc.title\n  }\n\n  const breadcrumbStructuredData: WithContext<BreadcrumbList> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BreadcrumbList\",\n    itemListElement: breadcrumbs.map((item, index) => ({\n      \"@type\": \"ListItem\",\n      position: index + 1,\n      name: resolveBreadcrumbName(item),\n      item: absoluteUrl(item.url ?? page.url),\n    })),\n  }\n\n  const docStructuredData: WithContext<TechArticle> = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"TechArticle\",\n    headline: doc.title,\n    name: doc.title,\n    description: doc.description,\n    url: absoluteUrl(page.url),\n    inLanguage: \"en-US\",\n    datePublished: doc.date?.toString(),\n    dateModified: doc.lastModified?.toString(),\n    mainEntityOfPage: absoluteUrl(page.url),\n    publisher: {\n      \"@type\": \"Organization\",\n      name: siteConfig.name,\n      url: siteConfig.url,\n      logo: {\n        \"@type\": \"ImageObject\",\n        url: `${siteConfig.url}/logo.png`,\n      },\n    },\n    author: {\n      \"@type\": \"Organization\",\n      name: siteConfig.name,\n      url: siteConfig.url,\n    },\n    isPartOf: {\n      \"@type\": \"CreativeWorkSeries\",\n      name: \"Magic UI Documentation\",\n      url: absoluteUrl(\"/docs\"),\n    },\n    wordCount: content ? content.split(/\\s+/).length : 0,\n  }\n\n  const serializedDocStructuredData = JSON.stringify(docStructuredData).replace(\n    /</g,\n    \"\\\\u003c\"\n  )\n  const serializedBreadcrumbStructuredData = JSON.stringify(\n    breadcrumbStructuredData\n  ).replace(/</g, \"\\\\u003c\")\n\n  return (\n    <>\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{ __html: serializedDocStructuredData }}\n      />\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{\n          __html: serializedBreadcrumbStructuredData,\n        }}\n      />\n      <div\n        data-slot=\"docs\"\n        className=\"flex items-stretch text-[1.05rem] sm:text-[15px] xl:w-full\"\n      >\n        <div className=\"flex min-w-0 flex-1 flex-col\">\n          <div className=\"mx-auto flex w-full max-w-3xl min-w-0 flex-1 flex-col gap-8 px-4 py-6 text-neutral-800 md:px-0 lg:py-8 dark:text-neutral-300\">\n            <div className=\"flex flex-col gap-2\">\n              <div className=\"flex flex-col gap-2\">\n                {breadcrumbs.length > 1 ? (\n                  <nav\n                    aria-label=\"Breadcrumb\"\n                    className=\"text-muted-foreground\"\n                  >\n                    <ol className=\"flex flex-wrap items-center gap-1 text-sm\">\n                      {breadcrumbs.map((item) => {\n                        const label = resolveBreadcrumbName(item)\n                        const key = item.url ?? label\n                        const isLast = item === lastBreadcrumb\n\n                        return (\n                          <li key={key} className=\"flex items-center gap-1\">\n                            {isLast ? (\n                              <span\n                                aria-current=\"page\"\n                                className=\"text-foreground font-medium\"\n                              >\n                                {label}\n                              </span>\n                            ) : item.url ? (\n                              <Link\n                                href={item.url}\n                                className=\"hover:text-foreground transition-colors\"\n                              >\n                                {label}\n                              </Link>\n                            ) : (\n                              <span>{label}</span>\n                            )}\n                            {!isLast ? <span aria-hidden=\"true\">/</span> : null}\n                          </li>\n                        )\n                      })}\n                    </ol>\n                  </nav>\n                ) : null}\n                <div className=\"flex items-start justify-between\">\n                  <h1 className=\"scroll-m-20 text-4xl font-semibold tracking-tight sm:text-3xl xl:text-4xl\">\n                    {doc.title}\n                  </h1>\n                  <div className=\"docs-nav bg-background/80 border-border/50 fixed inset-x-0 bottom-0 isolate z-50 flex items-center gap-2 border-t px-6 py-4 backdrop-blur-sm sm:static sm:z-0 sm:border-t-0 sm:bg-transparent sm:px-0 sm:pt-1.5 sm:backdrop-blur-none\">\n                    <DocsCopyPage\n                      page={await replaceComponentSource(content)}\n                      url={absoluteUrl(page.url)}\n                    />\n                    {neighbours.previous && (\n                      <Button\n                        variant=\"secondary\"\n                        size=\"icon\"\n                        className=\"extend-touch-target ml-auto size-8 shadow-none md:size-7\"\n                        asChild\n                      >\n                        <Link href={neighbours.previous.url}>\n                          <IconArrowLeft />\n                          <span className=\"sr-only\">Previous</span>\n                        </Link>\n                      </Button>\n                    )}\n                    {neighbours.next && (\n                      <Button\n                        variant=\"secondary\"\n                        size=\"icon\"\n                        className=\"extend-touch-target size-8 shadow-none md:size-7\"\n                        asChild\n                      >\n                        <Link href={neighbours.next.url}>\n                          <span className=\"sr-only\">Next</span>\n                          <IconArrowRight />\n                        </Link>\n                      </Button>\n                    )}\n                  </div>\n                </div>\n                {doc.description && (\n                  <p className=\"text-muted-foreground text-[1.05rem] text-balance sm:text-base\">\n                    {doc.description}\n                  </p>\n                )}\n              </div>\n            </div>\n            <div className=\"w-full flex-1 *:data-[slot=alert]:first:mt-0\">\n              <MDX components={mdxComponents} />\n            </div>\n          </div>\n          <div className=\"mx-auto hidden h-16 w-full max-w-3xl items-center gap-2 px-4 sm:flex md:px-0\">\n            {neighbours.previous && (\n              <Button\n                variant=\"secondary\"\n                size=\"sm\"\n                asChild\n                className=\"shadow-none\"\n              >\n                <Link href={neighbours.previous.url}>\n                  <IconArrowLeft /> {neighbours.previous.name}\n                </Link>\n              </Button>\n            )}\n            {neighbours.next && (\n              <Button\n                variant=\"secondary\"\n                size=\"sm\"\n                className=\"ml-auto shadow-none\"\n                asChild\n              >\n                <Link href={neighbours.next.url}>\n                  {neighbours.next.name} <IconArrowRight />\n                </Link>\n              </Button>\n            )}\n          </div>\n        </div>\n        <div className=\"sticky top-[calc(var(--header-height)+1px)] z-30 ml-auto hidden h-[calc(100svh-var(--footer-height)+2rem)] w-84 flex-col gap-4 overflow-hidden overscroll-none xl:flex\">\n          <div className=\"h-(--top-spacing) shrink-0\" />\n          {doc.toc?.length ? (\n            <div className=\"no-scrollbar overflow-y-auto px-8\">\n              <DocsTableOfContents toc={doc.toc} />\n              <Contribute page={page} />\n              <div className=\"h-8\" />\n              <SidebarCTA />\n            </div>\n          ) : null}\n        </div>\n      </div>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(docs)/docs/layout.tsx",
    "content": "import { Suspense } from \"react\"\n\nimport { SidebarProvider } from \"@/components/ui/sidebar\"\nimport { DocsSidebar } from \"@/components/docs-sidebar\"\n\nexport default function DocsLayout({\n  children,\n}: {\n  children: React.ReactNode\n}) {\n  return (\n    <div className=\"container-wrapper flex flex-1 flex-col px-2\">\n      <SidebarProvider className=\"3xl:fixed:container 3xl:fixed:px-3 min-h-min flex-1 items-start px-0 [--sidebar-width:220px] [--top-spacing:0] lg:grid lg:grid-cols-[var(--sidebar-width)_minmax(0,1fr)] lg:[--sidebar-width:240px] lg:[--top-spacing:calc(var(--spacing)*4)]\">\n        <DocsSidebar />\n        <Suspense>\n          <div className=\"h-full w-full\">{children}</div>\n        </Suspense>\n      </SidebarProvider>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(docs)/docs/loading.tsx",
    "content": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n  return (\n    <div className=\"flex items-stretch text-[1.05rem] sm:text-[15px] xl:w-full\">\n      <div className=\"flex min-w-0 flex-1 flex-col\">\n        <div className=\"mx-auto w-full max-w-3xl px-4 py-8 md:px-0\">\n          <div className=\"flex flex-col gap-8\">\n            {/* Breadcrumb skeleton */}\n            <div className=\"flex items-center gap-2\">\n              <Skeleton className=\"h-4 w-16\" />\n              <Skeleton className=\"h-4 w-24\" />\n              <Skeleton className=\"h-4 w-24\" />\n            </div>\n\n            {/* Title and description skeleton */}\n            <div className=\"flex flex-col gap-4\">\n              <Skeleton className=\"h-16 w-full\" />\n            </div>\n\n            {/* Content skeleton */}\n            <div className=\"flex flex-col gap-4\">\n              <div className=\"my-4\">\n                <Skeleton className=\"h-64 w-full\" />\n              </div>\n\n              <Skeleton className=\"h-4 w-full\" />\n              <Skeleton className=\"h-4 w-5/6\" />\n              <Skeleton className=\"h-4 w-full\" />\n              <Skeleton className=\"h-4 w-4/5\" />\n            </div>\n          </div>\n        </div>\n      </div>\n      {/* Right sidebar skeleton */}\n      <div className=\"sticky top-[calc(var(--header-height)+1px)] z-30 ml-auto hidden h-[calc(100svh-var(--footer-height)+2rem)] w-84 flex-col gap-4 overflow-hidden overscroll-none xl:flex\">\n        <div className=\"h-(--top-spacing) shrink-0\" />\n        <div className=\"no-scrollbar overflow-y-auto px-8\">\n          {/* Table of contents skeleton */}\n          <div className=\"flex flex-col gap-3\">\n            <Skeleton className=\"h-4 w-24\" />\n            <Skeleton className=\"h-3 w-32\" />\n            <Skeleton className=\"h-3 w-28\" />\n            <Skeleton className=\"h-3 w-36\" />\n            <Skeleton className=\"h-3 w-30\" />\n            <Skeleton className=\"h-3 w-34\" />\n            <Skeleton className=\"h-3 w-26\" />\n            <div className=\"h-6 w-full\" />\n            <Skeleton className=\"h-3 w-38\" />\n            <Skeleton className=\"h-3 w-32\" />\n            <Skeleton className=\"h-3 w-28\" />\n          </div>\n          <div className=\"h-8\" />\n          {/* CTA block skeleton */}\n          <Skeleton className=\"h-64 w-full\" />\n        </div>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(docs)/docs/not-found.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\n\nimport { Button, buttonVariants } from \"@/components/ui/button\"\nimport { Icons } from \"@/components/icons\"\n\nexport default function NotFound() {\n  const router = useRouter()\n  return (\n    <section>\n      <div className=\"container mx-auto flex min-h-[calc(100vh-8rem)] items-center px-6 py-12\">\n        <div className=\"mx-auto flex max-w-sm flex-col items-center text-center\">\n          <p className=\"rounded-full bg-blue-50 p-3 text-sm font-medium dark:bg-gray-800\">\n            <Icons.warning className=\"size-6\" />\n          </p>\n          <h1 className=\"mt-3 text-2xl font-semibold text-gray-800 md:text-3xl dark:text-white\">\n            Page not found\n          </h1>\n          <p className=\"mt-4 text-gray-500 dark:text-gray-400\">\n            The page you are looking for doesn&apos;t exist.\n          </p>\n\n          <div className=\"group mt-6 flex w-full shrink-0 items-center gap-x-3 sm:w-auto\">\n            <Button\n              onClick={() => router.back()}\n              className={buttonVariants({ variant: \"secondary\" })}\n            >\n              <Icons.chevronLeft className=\"size-4 transition-transform group-hover:-translate-x-1\" />\n              <span>Go back</span>\n            </Button>\n\n            <Link href=\"/\" className={buttonVariants({ variant: \"default\" })}>\n              Take me home\n            </Link>\n          </div>\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(docs)/layout.tsx",
    "content": "import { SiteBanner } from \"@/components/site-banner\"\nimport { SiteFooter } from \"@/components/site-footer\"\nimport { SiteHeader } from \"@/components/site-header\"\n\ninterface MarketingLayoutProps {\n  children: React.ReactNode\n}\n\nexport default async function MarketingLayout({\n  children,\n}: MarketingLayoutProps) {\n  return (\n    <>\n      <SiteBanner />\n      <SiteHeader />\n      <main className=\"flex-1\">{children}</main>\n      <SiteFooter />\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(marketing)/layout.tsx",
    "content": "import { SiteBanner } from \"@/components/site-banner\"\nimport { SiteFooter } from \"@/components/site-footer\"\nimport { SiteHeader } from \"@/components/site-header\"\n\ninterface MarketingLayoutProps {\n  children: React.ReactNode\n}\n\nexport default async function MarketingLayout({\n  children,\n}: MarketingLayoutProps) {\n  return (\n    <>\n      <SiteBanner />\n      <SiteHeader />\n      <main className=\"flex-1\">{children}</main>\n      <SiteFooter />\n      <div className=\"before:animate-rainbow pointer-events-none absolute inset-0 h-24 w-full before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-4/5 before:w-3/5 before:-translate-x-1/2 before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:bg-size-[200%] before:opacity-20 before:filter-[blur(calc(4*1rem))]\" />\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(marketing)/page.tsx",
    "content": "import { Hero } from \"@/components/sections/hero\"\nimport { Showcase } from \"@/components/sections/showcase\"\nimport { Testimonials } from \"@/components/sections/testimonials\"\nimport { VideoTestimonials } from \"@/components/sections/video-testimonials\"\n\nexport default function Home() {\n  return (\n    <>\n      <Hero />\n      <Showcase />\n      <Testimonials />\n      <VideoTestimonials />\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(marketing)/showcase/[...slug]/page.tsx",
    "content": "import { Metadata } from \"next\"\nimport { notFound } from \"next/navigation\"\n\nimport { showcaseSource } from \"@/lib/source\"\nimport { absoluteUrl } from \"@/lib/utils\"\nimport { ShowcaseCard } from \"@/components/sections/showcase\"\n\nexport const revalidate = false\nexport const dynamic = \"force-static\"\nexport const dynamicParams = false\n\nexport function generateStaticParams() {\n  return showcaseSource.generateParams()\n}\n\ninterface PageProps {\n  params: Promise<{\n    slug: string[]\n  }>\n}\n\nasync function getDocFromParams({ params }: PageProps) {\n  const { slug } = await params\n  const page = showcaseSource.getPage(slug)\n  if (!page) notFound()\n  const doc = page.data\n  if (!doc.title || !doc.description) {\n    notFound()\n  }\n\n  return { doc, page }\n}\n\nexport async function generateMetadata({\n  params,\n}: PageProps): Promise<Metadata> {\n  const { doc, page } = await getDocFromParams({ params })\n\n  if (!page) {\n    return {}\n  }\n\n  const ogUrl = new URL(absoluteUrl(\"/og\"))\n  ogUrl.searchParams.set(\"title\", doc.title ?? \"\")\n  ogUrl.searchParams.set(\"description\", doc.description ?? \"\")\n\n  return {\n    title: doc.title,\n    description: doc.description,\n    openGraph: {\n      title: doc.title,\n      description: doc.description,\n      type: \"article\",\n      url: absoluteUrl(page.url),\n      images: [\n        {\n          url: ogUrl.toString(),\n          width: 1200,\n          height: 630,\n        },\n      ],\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title: doc.title,\n      description: doc.description,\n      images: [ogUrl.toString()],\n    },\n  }\n}\n\nexport default async function PagePage({ params }: PageProps) {\n  const { doc, page } = await getDocFromParams({ params })\n\n  return (\n    <article className=\"container max-w-2xl py-14\">\n      <h2 className=\"text-foreground mb-4 text-center text-5xl leading-[1.2] font-bold tracking-tighter\">\n        {doc.title}\n      </h2>\n      <h3 className=\"text-foreground/80 mx-auto mb-8 text-center text-lg font-medium tracking-tight text-balance\">\n        {doc.title} uses Magic UI to build their landing page.\n      </h3>\n      <ShowcaseCard\n        title={doc.title ?? \"\"}\n        href={doc.href ?? page.url}\n        image={doc.image ?? \"\"}\n        affiliation={doc.affiliation ?? \"\"}\n      />\n    </article>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/(marketing)/showcase/page.tsx",
    "content": "import { showcaseSource } from \"@/lib/source\"\nimport { ShowcaseCard } from \"@/components/sections/showcase\"\nimport { BlurFade } from \"@/registry/magicui/blur-fade\"\n\nexport default function Page() {\n  const showcases = showcaseSource.getPages()\n  return (\n    <article className=\"container max-w-[120ch] py-14\">\n      <h2 className=\"text-foreground mb-2 text-center text-5xl leading-[1.2] font-bold tracking-tighter\">\n        Showcase\n      </h2>\n      <h3 className=\"text-foreground/80 mx-auto mb-8 text-center text-lg font-medium tracking-tight text-balance\">\n        Companies choose Magic UI to build their landing pages.\n      </h3>\n      <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n        {showcases.map((showcase, idx) => (\n          <BlurFade key={idx} delay={0.25 + idx * 0.05}>\n            <ShowcaseCard\n              {...showcase}\n              href={showcase.url}\n              title={showcase.data.title ?? \"\"}\n              image={showcase.data.image ?? \"\"}\n              affiliation={showcase.data.affiliation ?? \"\"}\n            />\n          </BlurFade>\n        ))}\n      </div>\n    </article>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/api/blog-webhook/route.ts",
    "content": "import { NextRequest, NextResponse } from \"next/server\"\n\nconst REPO_OWNER = \"magicuidesign\"\nconst REPO_NAME = \"magicui\"\nconst BRANCH = \"main\"\nconst WORKFLOW_FILE = \"publish-article.yml\"\n\nexport async function POST(request: NextRequest) {\n  const auth = request.headers.get(\"authorization\")\n  if (!auth || auth !== `Bearer ${process.env.BLOG_WEBHOOK_ACCESS_TOKEN}`) {\n    return NextResponse.json({ error: \"Unauthorized\" }, { status: 401 })\n  }\n\n  // Get the raw payload from the incoming webhook\n  const body = await request.json()\n  const payload = JSON.stringify(body)\n\n  // Call GitHub Actions workflow_dispatch\n  const ghResp = await fetch(\n    `https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/actions/workflows/${WORKFLOW_FILE}/dispatches`,\n    {\n      method: \"POST\",\n      headers: {\n        Accept: \"application/vnd.github+json\",\n        Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        ref: BRANCH,\n        inputs: { payload },\n      }),\n    }\n  )\n\n  const text = await ghResp.text()\n\n  if (!ghResp.ok) {\n    return NextResponse.json(\n      { error: \"GitHub error\", details: text },\n      { status: 500 }\n    )\n  }\n\n  return NextResponse.json({ message: \"Workflow dispatched\", details: text })\n}\n"
  },
  {
    "path": "apps/www/app/layout.tsx",
    "content": "import type { Viewport } from \"next\"\nimport { Metadata } from \"next\"\nimport { Provider as JotaiProvider } from \"jotai\"\n\nimport { fontVariables } from \"@/lib/fonts\"\nimport { absoluteUrl, cn, constructMetadata } from \"@/lib/utils\"\nimport { Toaster } from \"@/components/ui/sonner\"\nimport { TooltipProvider } from \"@/components/ui/tooltip\"\nimport { Analytics } from \"@/components/analytics\"\nimport { PHProvider } from \"@/components/posthog-provider\"\nimport { ThemeProvider } from \"@/components/theme-provider\"\n\nimport \"@/styles/globals.css\"\n\nexport const metadata: Metadata = constructMetadata({\n  title: \"Magic UI\",\n  description:\n    \"Beautiful UI components and templates to make your landing page look stunning.\",\n  image: absoluteUrl(\"/og\"),\n})\n\nexport const viewport: Viewport = {\n  colorScheme: \"dark\",\n  themeColor: [\n    { media: \"(prefers-color-scheme: light)\", color: \"white\" },\n    { media: \"(prefers-color-scheme: dark)\", color: \"black\" },\n  ],\n}\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode\n}) {\n  return (\n    <html lang=\"en\" suppressHydrationWarning className=\"layout-fixed\">\n      <head />\n      <body\n        className={cn(\n          \"text-foreground group/body overscroll-none font-sans antialiased [--footer-height:calc(var(--spacing)*14)] [--header-height:calc(var(--spacing)*14)] xl:[--footer-height:calc(var(--spacing)*24)]\",\n          fontVariables\n        )}\n      >\n        <JotaiProvider>\n          <PHProvider>\n            <ThemeProvider attribute=\"class\" defaultTheme=\"light\">\n              <TooltipProvider>\n                {children}\n                <Toaster position=\"top-center\" richColors toastOptions={{}} />\n                <Analytics />\n              </TooltipProvider>\n            </ThemeProvider>\n          </PHProvider>\n        </JotaiProvider>\n      </body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/llm/[[...slug]]/route.ts",
    "content": "import { notFound } from \"next/navigation\"\nimport { NextResponse, type NextRequest } from \"next/server\"\n\nimport { replaceComponentSource } from \"@/lib/docs\"\nimport { source } from \"@/lib/source\"\n\nexport const revalidate = false\n\nexport async function GET(\n  _req: NextRequest,\n  { params }: { params: Promise<{ slug?: string[] }> }\n) {\n  const slug = (await params).slug\n  const page = source.getPage(slug)\n\n  if (!page) {\n    notFound()\n  }\n\n  let mdx = await page.data.getText(\"raw\")\n\n  // Replace component tags with actual source code\n  mdx = await replaceComponentSource(mdx)\n\n  return new NextResponse(mdx, {\n    headers: {\n      \"Content-Type\": \"text/markdown; charset=utf-8\",\n      \"Cache-Control\": \"public, s-maxage=60, stale-while-revalidate=300\",\n    },\n  })\n}\n\nexport function generateStaticParams() {\n  return source.generateParams()\n}\n"
  },
  {
    "path": "apps/www/app/not-found.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\n\nimport { Button, buttonVariants } from \"@/components/ui/button\"\nimport { Icons } from \"@/components/icons\"\n\nexport default function NotFound() {\n  const router = useRouter()\n  return (\n    <section>\n      <div className=\"container mx-auto flex min-h-[calc(100vh-8rem)] items-center px-6 py-12\">\n        <div className=\"mx-auto flex max-w-sm flex-col items-center text-center\">\n          <p className=\"rounded-full bg-blue-50 p-3 text-sm font-medium dark:bg-gray-800\">\n            <Icons.warning className=\"size-6\" />\n          </p>\n          <h1 className=\"mt-3 text-2xl font-semibold text-gray-800 md:text-3xl dark:text-white\">\n            Page not found\n          </h1>\n          <p className=\"mt-4 text-gray-500 dark:text-gray-400\">\n            The page you are looking for doesn&apos;t exist.\n          </p>\n\n          <div className=\"group mt-6 flex w-full shrink-0 items-center gap-x-3 sm:w-auto\">\n            <Button\n              onClick={() => router.back()}\n              className={buttonVariants({ variant: \"secondary\" })}\n            >\n              <Icons.chevronLeft className=\"size-4 transition-transform group-hover:-translate-x-1\" />\n              <span>Go back</span>\n            </Button>\n\n            <Link href=\"/\" className={buttonVariants({ variant: \"default\" })}>\n              Take me home\n            </Link>\n          </div>\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/app/og/geist-regular-otf.json",
    "content": "{\"base64Font\":\"T1RUTwAMAIAAAwBAQ0ZGIN9uOmAAABXMAACeZkdERUZBTj+sAAC0NAAAAT5HUE9Ttn3F0QAAtXQAABvSR1NVQpIcrgQAANFIAAASlE9TLzJPyiLTAAAL3AAAAGBjbWFwrm6KhgAADtQAAAbWaGVhZCrsuiMAAADUAAAANmhoZWEM9AjIAAALuAAAACRobXR487+RWAAAAQwAAAqqbWF4cAKrUAAAAADMAAAABm5hbWU8hhcjAAAMPAAAApdwb3N0/58AMgAAFawAAAAgAABQAAKrAAAAAQAAAAEAg2zs2StfDzz1AAMD6AAAAADhcDrwAAAAAOFwOvD/0/8kCSIDuAAAAAcAAgAAAAAAAAGuAFAA+gAAAqAAFQKgABUCoAAVAqAAFQKgABUCoAAVAqAAFQKgABUCwwAVAqAAFQKgABUD0QAVAqkAXAK+ADECvgAxAr4AMQK+ADECvgAxAr4AMQK/AFwDFwAxAr8AXAMXADECXABcAlwAXAJcAFwCXABcAlwAXAJcAFwCXABcAlwAXAJcAFwCXABcAtIAMQJZADICWQAyAk8AXALFADECxQAxAsUAMQLFADECxQAxAsUAMQLFADEC8wAxAsAAXANkAFwCwABcARAAXAMSAFwBEABcARD//QEQABABEABbARAADgEQAAgBEAAwARD/4AJWAEMCVgBDAlYAQwKNAFwCjQBcAo0AXAJFAFwCRQBcAh4AXAJFAFwCaAAWA24AXALjAFwC4wBcAuMAXALjAFwC4wBcAuMAXALsADEC7AAxAuwAMQLsADEC7AAxAuwAMQLsADEC8QAxAuwAMQQ+ADECiwBcAm0AXALmADECoQBcAqEAXAKhAFwCoQBcAokAOwKJADsAvAAxAokAOwKJADsCiQA7AokAOwK2AFwCQgAZAkIAGQJCABkCQgAZAkIAGQKyAE0CsgBNArIATQKyAE0CsgBNArIATQKyAE0CsgBNArIATQKyAE0CsgBNAp4AFQOQABUDkAAVA5AAFQOQABUDkAAVAnUAGwJ3ABUCdwAVAncAFQJ3ABUCdwAVAncAFQIfABsCHwAbAh8AGwIfABsCRQBcAuMAXAKnAFwCpwBcAqcAXAKnAFwBtgAxAbYAMQG2ADEBtgAxAbYAMQG2ADEBtgAxAbYAMQG2ADECvgAxAr4AMQK+ADECvgAxAr4AMQK+ADECoAAVAr4AMQJcAFwCXABcAsUAMQEQAAEBEABTAuwAMQKyAE0DkAAVAncAFQIfABsBtgAxAbYAMQK+ADEEVgAVBGgATQJAAC8CQAAvAkAALwJAAC8CQAAvAkAALwJAAC8CQAAvAkAALwJAAC8CQAAvA6QALwJXAFACKQAvAikALwIpAC8CKQAvAikALwIpAC8CVwAvAlMALwL4AC8CjAAvAjgALwI4AC8COAAvAjgALwI4AC8COAAvAjgALwI4AC8COAAvAjgALwI4AC8CWQAyAlkAMgGPADwCVgAvAlYALwJWAC8CVgAvAlYALwJWAC8CVgAvAnoALwJGAFACPAAZAkb/8AD2AE4A9gBQAPYAUAD2//AA9gADAPYATgD2AAEB8QBOAPb/+wD2ACIA9v/TAQX/+wEF//sBBf/7AQX/+wJPAFACT//tAk8AUAEcAFABHABQAZoAUAEcAEYBegBQA24AUAJGAFACRgBQAkYAUAJGAFACRgBQAkYAUAJEAC8CRAAvAkQALwJEAC8CRAAvAkQALwJEAC8CNgAMAkQALwPEAC8CVwBQAlcAUAJXAC8BfwBQAX8AUAF/ADcBfwAbAhMALwITAC8AvAAxAhMALwITAC8CEwAvAhMALwJPAFABjQA3AY0ANwHGADcBjQA3AY0ANwJAAFACQABQAkAAUAJAAFACQABQAkAAUAJAAFACQABQAkAAUAJAAFACQABQAhoAFgM0ABYDNAAWAzQAFgM0ABYDNAAWAksALwIaABYCGgAWAhoAFgIaABYCGgAWAhoAFgImADkCJgA5AiYAOQImADkBHABGAkYAUAIyACoCMgAqAjIAKgIyACoCMgAqAjIAKgIyACoCMgAqAjIAKgIyACoCMgAqAlcALwJXAC8CVwAvAlcALwJXAC8CVwAvAlcALwJXAC8CVwAvAlcALwJXAC8BDgBcAQ4AXAGeAFABDgAnAXoAUAJAAC8CKQAvAjgALwI4AC8CVgAvAPYARgD2//QA9gBGAfEARgD2ACIBBf/7AkQALwJAAFADNAAWAhoAFgImADkCMgAqAlcALwKwADwCvQA3AoUAPAKXADwCQAAvAkQALwKgABUC5AAxAj0AFQKUADcCZQAyAqAANgGBACgCawA8AmUAMgJ8ADICcgA8AnAAPAJJACgCXAAoAnAAPANAAC8DQAAvA0AALwNAAC8DQAAvA0AALwNAAC8DQAAvA0AALwNAAC8DQAAvA0AALwNAAC8DQAAvA0AALwNAAC8DQAAvA0AALwNAAC8DQAAvAqAANgGzABkCWAAUAlgAfgJYADsCWAAqAlgAMAJYADkCWAA4AlgAOwJYABoCWAA4AlgADQPQADEDwgAxA7oAMQO9ADEDzQAxA7cAMQPAADED0AAxA8sAMQSwAKYCWACVAlgAsgJYAKACWACgAlgAhAJYAKUCWAClAlgApgJYAJ8CWACoAlgAlQJYALICWACgAlgAoAJYAIQCWAClAlgApQJYAKYCWACfAlgAqAD6AAABYgAvCWAAPgcIAD4EsAA+AMsALwDLAC8BJQBcASUAXAI9AC8A2QA2ANkANgI3AC8CNwAvAMsALwEpAC8BtAAvAXgALwHe//YB4wAoAd4AMgKCACgBtAAvA44ALwHeADIAywAvAMsALwEUADYB3v/2AwIALwDLAC8CNwAvAWQALwC4AC8AywAvAeMAKADSAC8BLABcAS0AXAJFAC8A0gAvANIALwI3AC8CNwAvANIALwI0AC8A0gAvARQALwDSAC8CNwAvANMALwGqAC8BsAAvAlYALwOSAC8CNAAvA1sALwLQAC8BOQAvATkALwGoAC8BqAAvAVEALwFRAC8BZwAvAWcALwFxAC8BcQAvAagALwGoAC8BjQAvAY0ALwIOAC8CDgAvAY8ALwGPAC8BjQAvAY0ALwFnAC8BZwAvAVEALwFRAC8BOQAvATkALwDPADEBdgAxAXYAMQF2ADEAzwAxAM8AMQIaAC8CGgAvAVAALwFQAC8BaAAxALwAMQIDADwCgQBcBLAAPgcIAD4JYAA+BwcAPgNAAC8DQAAvA5IAMQJuACgCUQAjAi4AOwNEADECWgAxAloAMQN6AFwBjAAvAPwALwF3AC8BCABcAQgAXAI7AFwCOwBcBEQAXAJYAE8DWQAxAlgANAIpAC8CSwAxAokAOwLgADsCogA7AtEALgKoAFwDBwBcAmgAOwJ3ABUCOgAvAjoALwHnAC8COgAvApQAXAI6AC8CKQAxAiUALwI6AC8COgAvAjoALwIaAC8CGgAvAeUALwGSAC8DSQAvAXsAAAKMABUCaAAZAhIAGwJjABYCVQAvAlIAWgMCAC8ESAAvAtAAMQJ2ADEDKAAxAnYAMQLQADECdgAxAygAMQJ2ADEEFgAxAtAAMQKVADECqAAxAqgAMQKYADECmAAxAp8AMQKfADECnwAxAqQAMQKfADEDIgAVAaYAMQJeADEDBgAxAl4AMQGmADECXgAxAwYAMQJeADEDSgAxAaYAMQNUADEDVAAxA1QAMQIdADEDXQAVAzcAXANdABUDNwAVA10AFQM3AFwDXQAVAzcAFQAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAAAvAAAALwAAAC8AAADHAAAALwAAAC8AAAAvAUgALwC4AC8A/AAvAPwALwF2AC8BdAAvAXQALwF6AC8BGQAvAa4ALwFeAC8BNgAvAQUALwFnAC8AyAAvAM8AMQD8AC8AuAAvAlgAAANAAC8ALwAAAAEAAAOY/yQAZAlg/9P9mQkiAAEAAAAAAAAAAAAAAAAAAAKqAAQCTQGQAAUACAKKAlgAAABLAooCWAAAAV4AMgEJAAAAAAAAAAAAAAAAoQAA/wAB5fsAAAAQAAAAAFVLV04AwAAg/10DmP8kAGQDmADcIAAAkwAAAAACEgLGAAAAIAAEAAAAFgEOAAEAAAAAAAEABQAAAAEAAAAAAAIABwAFAAEAAAAAAAQADQAMAAEAAAAAAAUAIQAZAAEAAAAAAAYADQA6AAMAAQQJAAEACgBHAAMAAQQJAAIADgBRAAMAAQQJAAMAMABfAAMAAQQJAAQAGgCPAAMAAQQJAAUAQgCpAAMAAQQJAAYAGgDrAAMAAQQJABAACgBHAAMAAQQJABEADgBRAAMAAQQJAQAAEgEFAAMAAQQJAQEACgEXAAMAAQQJAQIACgEhAAMAAQQJAQMACgErAAMAAQQJAQQACgE1AAMAAQQJAQUACgE/AAMAAQQJAQYAFAFJAAMAAQQJAQcAFgFdAAMAAQQJAQgAFgFzR2Vpc3RSZWd1bGFyR2Vpc3QgUmVndWxhclZlcnNpb24gMS4wMDI7R2x5cGhzIDMuMS4yICgzMTUxKUdlaXN0LVJlZ3VsYXIARwBlAGkAcwB0AFIAZQBnAHUAbABhAHIAMQAuADAAMAAyADsAVQBLAFcATgA7AEcAZQBpAHMAdAAtAFIAZQBnAHUAbABhAHIARwBlAGkAcwB0ACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAyADsARwBsAHkAcABoAHMAIAAzAC4AMQAuADIAIAAoADMAMQA1ADEAKQBHAGUAaQBzAHQALQBSAGUAZwB1AGwAYQByAE4AbwAgAHQAYQBpAGwAIABhAEEAbAB0ACAAYQBBAGwAdAAgAGwAQQBsAHQAIABSAEEAbAB0ACAASQBBAGwAdAAgAEcAQQBsAHQAIABhAHIAcgBvAHcAcwBSAG8AdQBuAGQAZQBkACAAZABvAHQAQQBsAHQAIABuAHUAbQBiAGUAcgBzAAAAAAIAAAADAAAAFAADAAEAAAAUAAQGwgAAANgAgAAGAFgALwA5AH4BEwErATcBPgFIAU0BfgGPAZIBtwHOAekB7wIbAjcCWQKSArkCvALIAt0DBAMIAwwDEgMoAzUDmwOpA7sDwA4/HiEehR6eHr0e8x75IBQgGiAeICIgJiAwIDMgOiBEIHAgeSCJIKogrCC0ILkgvSEHIRchIiFVIV4hmSGdIaohsSG1IeUh5yICIgYiDyISIhoiHiIrIkgiYCJlI84kDCRoJOok/yWzJbclvSXBJcwlzyY6J34wAzARMBcwHKeM/wP/Cv8P/xv/IP89/z//W/9d//8AAAAgADAAOgCgARYBLgE5AUEBSgFQAY8BkgG3Ac0B5AHuAhgCNwJZApICuQK8AsYC2AMAAwYDCgMSAyYDNQObA6kDuwPADj8eIB6AHp4evB7yHvggEyAYIBwgICAmIDAgMiA5IEQgcCB0IIAgqiCsILQguSC9IQchFiEiIVMhWyGQIZ0hqSGwIbMh5CHnIgIiBiIPIhEiGiIeIisiSCJgImQjziQLJGAk6iT/JbIltiW8JcAlyiXPJjkndjACMAgwFDAcp4v/Af8F/wz/Gv8f/zv/P/9b/13//wAAAUAAAAAAAAAAAAAAAAAAAAAA/pQAh/5tAAAAAAAAAAD+s/52/j7/7f/pAAAAAAAAAAAAAP98/2n/Xf3Q/cP9sv2u89sAAAAA4cgAAAAAAADh2wAAAAAAAOGc4ibh+OHc4VbhP+E/4SXhkeGL4YThgeF84GgAAOEGAADgRgAA4MTgu+C24LXgfuCE4FHgSeBBAADgOOAv4CPgAd/jAADeZAAA3SXcmtx7AAAAAAAAAAAAANyn2+baBQAAAAAAANHVAAAAAAAAAAAAAAAAAAACpwKiAqEAAQDYAAAA9AF8AmICjAKeAqgCtgK8AAAAAAAAAxIDFAMeAyAAAAAAAAAAAAAAAxwDIAMqAzIDNgAAAAAAAAAAAAAAAAAAAAADKgMsAAADNAM2AzgAAAM4AzwDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKAAAAygAAAMqAAAAAAAAAAAAAAAAAAAAAAAAAyoAAAAAAAAAAAAAAyIAAAMiAAAAAAAAAx4DIAMiAyQDJgAAAAAAAAMkAyYDOAAAAzwDPgNCA0wDUgNUA1YAAAAAAAAAAAABAcMCFwHLAjYCVQIiAhgB8wH0AckCPgG/AewBvgHMAcABwQJFAkICRAHFAiEAAgAOAA8AFQAZACYAJwAvADIAPAA/AEIARwBIAE4AWABaAFsAXwBnAGwAdwB4AH0AfgCEAfcBzQH4AkwB8AKYAK4AugC7AMEAxQDSANMA2wDeAOkA7QDwAPUA9gD8AQYBCAEJAQ0BFQEaASUBJgErASwBMgH1AiwB9gJKAbkBxAI0AjwCNQI9Ai0CJAKWAiUBaQITAksB7QImAqACKQJIAbEBsgKZAlQCIwHHAqEBsAFqAhQBngGbAZ8BxgAIAAMABgAMAAcACwANABIAHwAaABwAHQA4ADQANQA2ABYATABSAE8AUABWAFECQABVAHEAbQBvAHAAfwBZARQAtACvALIAuACzALcAuQC+AMsAxgDIAMkA5ADgAOEA4gDCAPoBAAD9AP4BBAD/AkEBAwEfARsBHQEeAS0BBwEvAAkAtQAEALAACgC2ABAAvAATAL8AFADAABEAvQAXAMMAGADEACAAzAAeAMoAIQDNABsAxwAqANYAKADUACwA2AArANcAMQDdADAA3AA7AOgAOQDmADoA5wA3AN8AMwDlAD4A7ABBAO8AQwDxAEUA8wBEAPIARgD0AEkA9wBLAPkASgD4AE0A+wBUAQIAUwEBAFcBBQBcAQoAXgEMAF0BCwBgAQ4AZAESAGMBEQBiARAAagEYAGkBFwBoARYAdgEkAHMBIQBuARwAdQEjAHIBIAB0ASIAegEoAIABLgCBAIUBMwCHATUAhgE0AAUAsQAuANoAKQDVAEAA7gAlANEAZQETAGsBGQKbApwCpwKdApcCngKiAp8CmgKEAoUCiAKMAo0CigKDAoICiwKGAokALQDZAHwBKgB5AScAewEpACIAzgCCATAAgwExAhECEgINAg8CEAIOAi4CLwHIAjACJwGcAZ0BoAJdAlcCWQJbAl8CYAJeAlgCWgJcAlECPwJHAkYCMwIxAnoCfgJ7An8CfAKAAn0CgQJ5AncCeAG6AcoB+QH6AgECAgH/AgACBQIGAfsB/AIDAgQCBwIIAGEBDwHUAdkB1QHWAc4B2gILAgwBzwHTAfIB1wHcAdIB2wHYAdACCQHRAgoAAAADAAAAAAAA/5wAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQEOR2Vpc3QtUmVndWxhcgABAQEp+BEA+eMB+eQC+BgE+xEMA177cBwJIvpMBRwrGg8cLhIRqR0AAI1CEgHKAgABAAcADgAVABwAIgAoADMAPQBDAEkATwBZAGAAZwBuAHUAfACDAIkAjwCaAKEAqwCyALkAvQDIAMoA1ADbAOIA6ADzAP4BBQEMARIBGAEfASUBKwEyATUBQgFJAU8BVQFcAWIBaQFxAXwBgwGKAY4BlAGbAaIBqAG1AbwBwwHIAc4B1AHfAegB7gH5Af8CBgIMAhYCJQI0AjoCRQJQAlwCYgJtAn0CiwKaAqUCsQK9AsgCzgLZAukC9QMEAxADHgMtAzsDSgNZA2cDdgOEA5IDoAOuA70D0APkA/gEAAQIBA4EFQQcBCMEKQQvBDoERARKBFAEVgRgBGcEbgR1BHwEgwSKBJAElgShBKgEsgS5BMAExATPBNgE2gThBOgE7gT1BQAFCwUSBRkFHwUlBSwFMgU4BT8FQgVPBVYFXAViBWkFbwV2BX4FiQWQBZQFmgWhBagFrgW7BcIFyQXOBdQF2gXlBe4F9AX/BgUGDAYSBhwGKwY6BkAGSwZWBmIGcgaABosGlwajBq0GuAa+BskG1AbgBvAG/gcJBxUHIQcrBzYHPAdHB1IHXgdpB3cHhgeUB6MHsge4B8YH1AfbB+cH7Qf7CAkIFwglCDQIRwhaCGIIaghxCHgIfgiFCIsIjQiUCJsIogipCLAItwi+CMUIzAjTCNoI4QjoCO8I9gj9CQQJCwkSCRkJIAkpCTEJOAk+CUQJTAlTCVoJYAloCXAJdwl+CYUJjAmTCZoJoQmoCa8Jtgm9CcQJywnSCdkJ4AnnCe4J9Qn8CgMKCgoRChgKHwomCkcKYQp0CnsKggqJCpAKlwqeCqUKrAqzCroKwQrICs8K1grdCuQK7wr5CwcLFAsfCy4LOwtMC18LZgtyC34LiguWC6ILqQuwC7cLvgvFC8wL0wvaC+EL6AvvC/YL/QwEDAsMEgwZDCAMJwwuDDUMPAxDDEoMWgxxDI8MpwyuDLcMvgzEDMoM0QzYDN8M5gzqDPEM+Az/DQYNDg0aDSMNLg02DT4NRQ1MDVUNXA1nDW4NdQ18DYYNjQ2WDZ0Npg2tDbYNvw3GDc0N1A3bDeIN6Q3wDfcN/g4MDhMOHw4rDjoORg5UDmAObg56DogOlg6dDqMOqg6xDrgOvw7GDs0O1A7bDuIO6Q7wDvcPAA8JDxAPGw8iDykPMA83D0APRw9OD1UPXA9jD2oPeQ+FD5EPng+sD7MPug/BD8sP1w/pD/oQB0FicmV2ZXVuaTAxQ0RBbWFjcm9uQW9nb25la0NhY3V0ZUNjYXJvbkNjaXJjdW1mbGV4Q2RvdGFjY2VudERjYXJvbkRjcm9hdEVjYXJvbkVkb3RhY2NlbnRFbWFjcm9uRW9nb25la3VuaTFFQkN1bmkwMThGdW5pMDFCN3VuaTAxRUVHYnJldmVHY2Fyb25HY2lyY3VtZmxleHVuaTAxMjJHZG90YWNjZW50dW5pMUUyMHVuaTAxRTRIYmFySGNpcmN1bWZsZXhJSklkb3RhY2NlbnRJbWFjcm9uSW9nb25la0l0aWxkZXVuaTAwNEEwMzAxSmNpcmN1bWZsZXh1bmkwMUU4dW5pMDEzNkxhY3V0ZUxjYXJvbnVuaTAxM0JOYWN1dGVOY2Fyb251bmkwMTQ1RW5nT2h1bmdhcnVtbGF1dE9tYWNyb25SYWN1dGVSY2Fyb251bmkwMTU2U2FjdXRldW5pQTc4QlNjZWRpbGxhU2NpcmN1bWZsZXh1bmkwMjE4dW5pMUU5RVRiYXJUY2Fyb251bmkwMTYydW5pMDIxQVVicmV2ZVVodW5nYXJ1bWxhdXRVbWFjcm9uVW9nb25la1VyaW5nVXRpbGRlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNXZ3JhdmVZY2lyY3VtZmxleFlncmF2ZXVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMDEzQi5sb2NsTUFIdW5pMDE0NS5sb2NsTUFIUi5zczA0UmFjdXRlLnNzMDRSY2Fyb24uc3MwNHVuaTAxNTYuc3MwNEkuc3MwNUlhY3V0ZS5zczA1SWNpcmN1bWZsZXguc3MwNUlkaWVyZXNpcy5zczA1SWRvdGFjY2VudC5zczA1SWdyYXZlLnNzMDVJbWFjcm9uLnNzMDVJb2dvbmVrLnNzMDVJdGlsZGUuc3MwNUcuc3MwNkdicmV2ZS5zczA2R2NpcmN1bWZsZXguc3MwNnVuaTAxMjIuc3MwNkdkb3RhY2NlbnQuc3MwNnVuaTFFMjAuc3MwNkFkaWVyZXNpcy5zczA4Q2RvdGFjY2VudC5zczA4RWRpZXJlc2lzLnNzMDhFZG90YWNjZW50LnNzMDhHZG90YWNjZW50LnNzMDhJZGllcmVzaXMuc3MwOElkb3RhY2NlbnQuc3MwOE9kaWVyZXNpcy5zczA4VWRpZXJlc2lzLnNzMDhXZGllcmVzaXMuc3MwOFlkaWVyZXNpcy5zczA4WmRvdGFjY2VudC5zczA4SWRpZXJlc2lzLnNzMDUuc3MwOElkb3RhY2NlbnQuc3MwNS5zczA4R2RvdGFjY2VudC5zczA2LnNzMDhBX0kuZGxpZ1VfSS5kbGlnYWJyZXZldW5pMDFDRWFtYWNyb25hb2dvbmVrY2FjdXRlY2Nhcm9uY2NpcmN1bWZsZXhjZG90YWNjZW50ZGNhcm9uZGNyb2F0ZWNhcm9uZWRvdGFjY2VudGVtYWNyb25lb2dvbmVrdW5pMUVCRHVuaTAyNTl1bmkwMjkydW5pMDFFRmdicmV2ZWdjYXJvbmdjaXJjdW1mbGV4dW5pMDEyM2dkb3RhY2NlbnR1bmkxRTIxdW5pMDFFNWhiYXJoY2lyY3VtZmxleGkubG9jbFRSS2lqaW1hY3JvbmlvZ29uZWtpdGlsZGV1bmkwMjM3dW5pMDA2QTAzMDFqY2lyY3VtZmxleHVuaTAxRTl1bmkwMTM3bGFjdXRlbGNhcm9udW5pMDEzQ25hY3V0ZW5jYXJvbnVuaTAxNDZlbmdvaHVuZ2FydW1sYXV0b21hY3JvbnJhY3V0ZXJjYXJvbnVuaTAxNTdzYWN1dGV1bmlBNzhDc2NlZGlsbGFzY2lyY3VtZmxleHVuaTAyMTl0YmFydGNhcm9udW5pMDE2M3VuaTAyMUJ1YnJldmV1aHVuZ2FydW1sYXV0dW1hY3JvbnVvZ29uZWt1cmluZ3V0aWxkZXdhY3V0ZXdjaXJjdW1mbGV4d2RpZXJlc2lzd2dyYXZleWNpcmN1bWZsZXh5Z3JhdmV1bmkxRUY5emFjdXRlemRvdGFjY2VudHVuaTAxM0MubG9jbE1BSHVuaTAxNDYubG9jbE1BSGEuc3MwMWFhY3V0ZS5zczAxYWJyZXZlLnNzMDF1bmkwMUNFLnNzMDFhY2lyY3VtZmxleC5zczAxYWRpZXJlc2lzLnNzMDFhZ3JhdmUuc3MwMWFtYWNyb24uc3MwMWFvZ29uZWsuc3MwMWFyaW5nLnNzMDFhdGlsZGUuc3MwMWEuc3MwMmFhY3V0ZS5zczAyYWJyZXZlLnNzMDJ1bmkwMUNFLnNzMDJhY2lyY3VtZmxleC5zczAyYWRpZXJlc2lzLnNzMDJhZ3JhdmUuc3MwMmFtYWNyb24uc3MwMmFvZ29uZWsuc3MwMmFyaW5nLnNzMDJhdGlsZGUuc3MwMmwuc3MwM2xhY3V0ZS5zczAzbGNhcm9uLnNzMDN1bmkwMTNDLnNzMDNsc2xhc2guc3MwM2FkaWVyZXNpcy5zczA4Y2RvdGFjY2VudC5zczA4ZWRpZXJlc2lzLnNzMDhlZG90YWNjZW50LnNzMDhnZG90YWNjZW50LnNzMDhpLnNzMDhpZGllcmVzaXMuc3MwOGkubG9jbFRSSy5zczA4aWouc3MwOGlvZ29uZWsuc3MwOGouc3MwOG9kaWVyZXNpcy5zczA4dWRpZXJlc2lzLnNzMDh3ZGllcmVzaXMuc3MwOHlkaWVyZXNpcy5zczA4emRvdGFjY2VudC5zczA4YWRpZXJlc2lzLnNzMDEuc3MwOGFkaWVyZXNpcy5zczAyLnNzMDhmX2YubGlnYXRfdC5saWdhZmkubGlnYWZsLmxpZ2FMYW1iZGF1bmkwM0E5bGFtYmRhcGl1bmkyMTA3dW5pMjRGRnVuaTI3NzZ1bmkyNzc3dW5pMjc3OHVuaTI3Nzl1bmkyNzdBdW5pMjc3QnVuaTI3N0N1bmkyNzdEdW5pMjc3RXVuaTI0RUF1bmkyNDYwdW5pMjQ2MXVuaTI0NjJ1bmkyNDYzdW5pMjQ2NHVuaTI0NjV1bmkyNDY2dW5pMjQ2N3VuaTI0Njh6ZXJvLnNzMDlvbmUuc3MwOXplcm8udGZvbmUudGZ0d28udGZ0aHJlZS50ZmZvdXIudGZmaXZlLnRmc2l4LnRmc2V2ZW4udGZlaWdodC50Zm5pbmUudGZ1bmkyMTUzdW5pMjE1NHVuaTIxNTV1bmkyMDgwdW5pMjA4MXVuaTIwODJ1bmkyMDgzdW5pMjA4NHVuaTIwODV1bmkyMDg2dW5pMjA4N3VuaTIwODh1bmkyMDg5dW5pMjA3MHVuaTAwQjl1bmkwMEIydW5pMDBCM3VuaTIwNzR1bmkyMDc1dW5pMjA3NnVuaTIwNzd1bmkyMDc4dW5pMjA3OXVuaTAwQTB1bmkzMDAyaHlwaGVuX2h5cGhlbl9oeXBoZW5fZ3JlYXRlci5saWdhaHlwaGVuX2h5cGhlbl9ncmVhdGVyLmxpZ2FoeXBoZW5fZ3JlYXRlci5saWdhdW5pMzAwM3VuaUZGMDZ1bmlGRjBBdW5pRkYyMHVuaUZGM0N1bmlGRjFBdW5pRkYwQ3VuaUZGMDF1bmlGRjAzdW5pRkYwNXVuaUZGMEV1bmlGRjFGdW5pRkYwMnVuaUZGMDd1bmlGRjFCdW5pRkYwRnBlcmlvZC5zczA4Y29sb24uc3MwOHNlbWljb2xvbi5zczA4ZWxsaXBzaXMuc3MwOGV4Y2xhbS5zczA4ZXhjbGFtZG93bi5zczA4cXVlc3Rpb24uc3MwOHF1ZXN0aW9uZG93bi5zczA4cGVyaW9kY2VudGVyZWQuc3MwOHVuaUZGM0Z1bmlGRjFBLnNzMDh1bmlGRjAxLnNzMDh1bmlGRjBFLnNzMDh1bmlGRjFGLnNzMDh1bmlGRjFCLnNzMDh1bmkwMEFEdW5pMzAxQ3VuaUZGMER1bmkzMDA4dW5pMzAwOXVuaTMwMTB1bmkzMDExdW5pRkY1QnVuaUZGNUR1bmkzMDBDdW5pMzAwRHVuaTMwMEF1bmkzMDBCdW5pMzAxNHVuaTMwMTV1bmkzMDBFdW5pMzAwRnVuaTMwMTZ1bmkzMDE3dW5pRkYzQnVuaUZGM0R1bmlGRjA4dW5pRkYwOXVuaTBFM0ZsZXNzX2h5cGhlbi5saWdhbGVzc19oeXBoZW5faHlwaGVuLmxpZ2FsZXNzX2h5cGhlbl9oeXBoZW5faHlwaGVuLmxpZ2FsZXNzX2h5cGhlbl9ncmVhdGVyLmxpZ2F1bmkyNjM5c21pbGVmYWNldW5pMjExN21pbnV0ZXNlY29uZHVuaTIxMTZ1bmkyNDBDdW5pMjNDRXVuaTI0MEJFdXJvdW5pMjBCNHVuaTIwQkR1bmkyMEI5dW5pMjBBQW5vdGVxdWFsZ3JlYXRlcmVxdWFsbGVzc2VxdWFsYXBwcm94ZXF1YWxpbmZpbml0eWludGVncmFsdW5pMjIwNnByb2R1Y3RzdW1tYXRpb25yYWRpY2FscGFydGlhbGRpZmZ1bmkwMEI1YXJyb3d1cHVuaTIxOTdhcnJvd3JpZ2h0dW5pMjE5OGFycm93ZG93bnVuaTIxOTlhcnJvd2xlZnR1bmkyMTk2YXJyb3dib3RoYXJyb3d1cGRudW5pMjE5RHVuaTIxRTR1bmkyMUU1dW5pMjFBOXVuaTIxQUF1bmkyMUIwdW5pMjFCMXVuaTIxQjN1bmkyMUI0Y2FycmlhZ2VyZXR1cm51bmkyMUU3YXJyb3d1cC5zczA3dW5pMjE5Ny5zczA3YXJyb3dyaWdodC5zczA3dW5pMjE5OC5zczA3YXJyb3dkb3duLnNzMDd1bmkyMTk5LnNzMDdhcnJvd2xlZnQuc3MwN3VuaTIxOTYuc3MwN2Fycm93Ym90aC5zczA3YXJyb3d1cGRuLnNzMDd1bmkyNUNGY2lyY2xldW5pMjVDQ2xvemVuZ2V0cmlhZ3VwdW5pMjVCNnRyaWFnZG51bmkyNUMwdW5pMjVCM3VuaTI1Qjd1bmkyNUJEdW5pMjVDMXVuaTAzMDh1bmkwMzA3Z3JhdmVjb21iYWN1dGVjb21idW5pMDMwQnVuaTAzMEMuYWx0dW5pMDMwMnVuaTAzMEN1bmkwMzA2dW5pMDMwQXRpbGRlY29tYnVuaTAzMDR1bmkwMzEydW5pMDMyNnVuaTAzMjd1bmkwMzI4dW5pMDMzNXVuaTAzMjYubG9jbE1BSHVuaTAzMDguc3MwOHVuaTAzMDcuc3MwOGRpZXJlc2lzLnNzMDhkb3RhY2NlbnQuc3MwOHVuaTAyQkN1bmkwMkI5dW5pMDJDOE51ZXZvR2xpZm9ibGFja0NpcmNsZWRibGFja0NpcmNsZWRTdHJva2Vjb3B5cmlnaHQgbWlzc2luZ0dlaXN0IFJlZ3VsYXIBAQIAAQAFABAAFgAcACIAKAA2AD4ARABrAHUAfgCHAJ8AogCvALoAwQDJANEA1gDkAO8A+wECAVABZQF7AYUBjgGTAZoBpgGwAbMBwwHLAdUB3QHkAeoCBAIQAisCRAJWAmUCcAJ4AoECjwKWAp8CpwKtArICwwLOAtsC6wLwAwYDDwMbAyUDLAM0AzsDQwOCA84D0gQIBBQEGAQgBC0ESwRlBHYEewSGBI8ElwSfBKgErwS2BL0ExQTNBNUE4ATnBQQFSwWGBbYFvgXjBfYGFAYaBikGOAZRBmkGdAZ5BoUGiwaWBqAGqgazBsAGzQbZBt8G5wdJB6gH8ggfCHoIowkQCUcJpQoCCj4KhQrYCxwLKAtVC50LvQv/DDMMPwx5DLAM5g0DDRANJQ03DVgNhw2lDdEN7Q31DiEORQ5eDmcOjA6sDroO4Q8EDyoPPA9dD4APjg+hD8IP0g/xEBAQGRA5EEYQWhBfEHoQlxCaELYQyRDSEO0Q9xEQESoRRBFdEXQRjBGkEbwR0hHoEf8SFhIlEjwSUhJnEnsSjxKjErcSyRLTEuYS7hL/ExATIhMmEzcTQRNSE1YTZhN1E4UTlROlE7UTwxPSE+ET8BP+FAwUGhQoFDYUPhRHFFAUXRRqFHcUhBSRFJ4UphSrFLcUwRTJFNEU3BTnFPIU/RUIFRMVHhUpFTL5WhULFXwdPQZONk7gBQ4V5ewxBg5/3fga3Qt74fjO4QuL4fiu4QsVyga6mZ+mo5d6epweCxX3lMv7lAYO9wxorhILFW2idKqpo6KpqnOhbWx0dWwe9zEWbaJ0qqmjoqmqc6FtbHR1bB4O9wv37vcL++4FC3/d9zzX9ybdC/cHHesG9xQdC0cHv21Vpz0b+y5F+xj7Jfsl0fsY9y4fC+8dDvcQogVoBylHUjWHHgugdvdd4ffu2It3C93Dq8GoHwt/02R2+GDdC3/XS9f4FN0L0kT3OwvD+AoV5oQFx5u3rM0bC9i9YDOMH/subwUL9xj3IRXXy4rZmh4L+yrX+PB3C9YD+DR/Ffdg9zn3Ofdh91/7Ofc5+2D7YPs5+zn7X/th9zn7OfdgH/u6+AYV9zj3FfcV9zn3OfcV+xX7OPs5+xX7Fvs5+zn7FfcW9zkeC6+aoKWzGspWuUZHVV1MY6Bxr3weC573TBWpop6traJ4bWl0dWlpdKGtHg74hBb4pjX70AcL9x8d9/Ldf3cLd+4oHQtbeG9kWhoL4wODHfc58vH3Nh4LjTgF2ffUBuQdC+gdDjkHxXNPr0Mb+x0rIfsrHwvnIB39WuMHCxXOBub3FgUsBgv7cMGtdtK4Cy9SzvcAHwv3z9sByQu6950VVR3x5cnvqh5tHfsnK/sA+z0f6HAdC40d9z0r9wD7J74dC/hc+KYVLwb7EfxH+xH4RwUvBvc3/KYF9wAGC/cJ+CT3CfwkBfcABvc3+KYFLwb7EfxHBQs+h2i3tBoxFmEd3o3Lt6G8CAvnxEj7AIkf+wCKUkgyGwvb+KYV/Kbh+KYHC0LIXtuQHR4Lzgbm9xYFLAYOEtv/AE+AAP//sIAA4Qvp48HZqR8Li/cNJ3b5WncL+z3r+wD3JwvhNuA33wvjA34dC/mMXx37cvjQFeuMBfuOzwcL+PX3FgG69zKHHQ73WxV8HT0GTjZO4AUO/wAxgADjd6B3Evclz1m9CxX3AB0L95zH+1EGjKKmpbGlp54YxbKutsAaCxWUHWqkc6wfCyAdNgb8ff1aBeAGCwHn4wPnIB39Wgss4VP0iR4Ldvex4feR4QsoSntJTRoL+xp29y/3AgsVIgdOxuZl4hv3MPcA5fcT9wQ45PsKmB/3UvdXBe/8fTX4EAf7WPtfBTQHwYwF743RVDoaPkRVJkIvudNDHgsB5+P34OcD9/4gHfui/Vrj97H3QQbytXZLkR+d+1wF5AZ392WE1m2vRZYZyp3Eyt4a9xgu3vspHvtK++cV95H3SgfrwV06OlVeKx8LA38dC/Md97H3OwaWBvc2+7EF7Ab7Pfe+BeymwdLuGvcbLtv7Mx77O/vnFfeR9zsH8sRdOjpSXiQfC8wD+DR/FXUdiR0fCwO1HQtFHcb7FkUdDs1ZuUVBVVo+gh7nHQsvkgVUc1hrUxsxVcn1gx/4EwaKsgX3UoIi1vsIGwsD+JD5AhXj/GQ19/4H/A/8qQUw+H3h/BoHC/f3FfvK98sF+wUG96P7owULvPcKHQtTlkagvxq9uqjFC/fL+8sF9wUGC2qkc6yUHR4OErrl95xWHQv7YPs59zn3YQuae3eYZhsL+wb6OwG6C/UyrPsMogt/3Vp2+GTZC/sFOEokdh8Le8d0dvdFxAvh+wwF9Abi9wwFCwG65gNJHQv4B/f8FTX3Wwf7B4dGMvsStB33SvT3D/dkH7gHC/km934VLZEF+wF2Rk4kG/s1RvcZ9yv3LM/3Gvc27M9UKKIf6JEF9yBsKOn7Kxv7YvsI+zr7Yvth9wn7Ofdh9zjs8PcppR8Lf9dgdvimd+73FhLb4feI4TndE3w8HRO8KVRXOj9rv+0e99A1++kH+wTFMvcKHhO60Miqz6cfE3o0BwvhOd0TeQA8HRO5AClUVzo/a7/tHvfQNfvpB/sExTL3Ch4TuIDQyKrPpx8TdIA0BwtgHfhb9wEdC/j594wV+GMz/GMH+wZKS/sH+wdKy/cGHvhjM/xjB/s28iX3OQtycIBsbRpatGe9pKWTn6QezAcLtpiisbAaxVa5RkxUYVWDHsyHBaGOop2uG6ukc20L3Pt/4B0LA/dh+XcVLAZM+xYFzgYL+OcH9+f85wX3FPlaMwYL91/3Ofc592D3YPc5+zn7X/th+zn7OftgC9sgHfzyB021Yckex9ddBnWBlaEf+O4HC9+UFe/3GQX7GQcO9xXvHQv3tn8V9yfr9wD3PQslHdr3DAtxeXpvaXOtnX0eC9vIuNS8brFcnwvrjAX7js/4GAcLFTv4cNsH/HALKss+3NzL2OzsS9g6C6yko6yscqNqanJzagtFT2gx+wRJy+p4HgtfdKq7Hw4zHc73FpodC+E24DndE/aA962nFc7FrsOlHzQHQlNkLkpeqLx1HjGFBS6k3073BRv3H+vV9yAfE+6A+HIHE+4gOQYT9iBDHRP2gPsr7CH3HR77JPeVFfcAxM7nHhP2QE4dE/aARx0T94AL4TbgOd0T94D3racVzsWuw6UfNAdCU2QuSl6ovHUeMYUFLqTfTvcFG/cf69X3IB8T74D4cgcT7yA5BhP3IEMdE/eA+yvsIfcdHvsk95UV9wDEzuceE/dATh0T94BHHQt0HRO5NR0TvOC1YDOMH/subQX7CnQ5cPsCGizhU/QeE7rfxbi7oR8Teku7esEeE3mw13UGdYGVoR/3aAf3Ij7b+x0eE7l6HYYdC+E33zzaE7hANx0TuIAvHRO4QE0dE3hAQR0TuQA2HRO4QPsJdjhw+wQaE7YAC3/dRdH4Hs1J2c73FhK65fe84f//sIAA/wBPgAA92ROsgPib+KYVE64ANQYTngAtHROdADEdE1yAjkEF2QYTnID8EvedFfK16/cC9wG2KiUpYCr7AfsCYevuHgsSteX3nOE33zzaE7k3HRO6Lx0TuU0dE3lBHRO8Nh0TufsJdjhw+wQaC6B291jT9z/T91t3AYH4gQOvFtQGr/dYBfcZBmf7WAXUBq/3WAXcBpbTBTwGq/c/BdcGltMFQQaw91tBimf7WgX7GQaw91tBimf7WgUyBoBDBeEGbPs/BTcGgEMF3Qbh0xWr9z8F9xgGbPs/BQ6F9wb4qOESuufo9wj7Ad/05xPs94P3YBXfBsKeu72tHubJxh1bdlReHkxWdEtBGhP0hPstFXMd4fjK4QHV5/fg5wP3K/d9FS+FBfskl/cGLPcwG/cU9w3P9xj3ASPL+xSvHzSjIqLiGs7Gtdvsz1EzmB7nkQX3F3wm6vstG/scK0D7DPsH9VL3B24f9yFnyWBDGpUdC/huFfsm6iX3IdfKrsuyHvs4fUswIhtPXKa7dB8uhAUnruBV8hv3Yc/3XPdp9wNy5VjAH8BXTKFNG/snIyr7Lx/nFuzM0OceE/jqzUYqiR8sikZIKxsT9DNNzuofDov3Avim4RK65+D3ASvj8ucT7PeB92AV4wbQnK3BsB7ixsYdXHhYYB5EUXVaMxoT1H77YBX3AfcC+wEGDvtS9xbcdvhm1393Uh33juET1tv4phX8puH30QcT5uzCv9/aq1cqHvvR4ffpB/cEUeT7DR4T6kJNa0RwHxPaiOYFsP1kRR0O+wfb+VXbAfdV3LTJA/gN96cV4AdPiWDD3BreB/BB0iEeXDsG9Y+zckYaLwcxvkrSfR6KB0J9WkkwGi8HRmNyIY8eO7oH9dXS8B/eB9y2w8eJHg4VypEFyHlarFQbIGP7BfsKKrY06NfFweLfVcJGHxP09xodE+ypnn5wlR/7HftCFbuMqaqxG7eibFtacmtgYm+rvIwfDiMdAbrl98blA0odDvtr00P3axK6NB0TYPcoXhWquAUTUFEGZWEFE5CEHROg9yIdHxNgn5ujmZ8eDvgKexX3X/cO9yH3efd7+w73Iftf+1/7Dvsh+3v7efcO+yH3Xx/7ffgGFfdG4vcA9yb3JuL7APtG+0Q0+wD7JvsmNPcA90QeC/tS9xbH9wgdE65EHRO2iB0TzvzyB/vt+PIFxv4YRR0O+IYV54UF6p7FwOAb2sJbR1RUVUJcH/sLP/suPvtrGviH4fwaBo7S9x/rwKoI9s3d0fMa9wgr4fsW+yIuKvsXeB4ORh0S92PDE3DyWxWnZgW2lax7axoT8I8dE3BhZAUT8F6yqnW7G8K2tL/AY7BSH7a6BVYGDjgd7vcWAaH4gmodC/sbFfsg9wT7Bvcg9yD3BPcG9yD3H/sE9wX7IPsg+wT7BfsfHsQW9uPi9vXkNCD7ADIzISAz4/cAHgv4mcf3GXcBuvfqA/gZ+NUV+wsGx/JXqU8kT/JXbcckBfsLT/cLBk8kv23H8sckv6lP8gX3CwYO+N3D1sMBusPWwwP3IfjdFb61s8C/YbVYV2FhV1a1Y78fZekVnpydoJ+ceXh3enl3dnqdnx4Oi/cC+Ox3EsH3ASzjE9DP2h0l/VoV9wH3AvsBBg73AB0T+IUdcnJvZx8L+1L3FsfX+Q53AdvhA4odK/4YRR0OoHb4pnfs8hLR9Sv3Ax0rjB0O8B0soh/nkQX3IGwo6fsrG/ti+wj7Ovti+2H3Cfs592ELofimFfdV/JwFqAZ4WgVygXyBchtOP9EGx7GlxJ8f92r46QUwBvst/Er7MvhKBQvX+A7XAfcY4QP3GPkeFfsMPj/Y+8wHMMBY6x7sHQv7Atv5UNsSuveHOd0T0Pe2+YIVE+D7hzsGE9D3Nf1QBhPg+zU7BhPQ94cGDvfyXh0T6Fn78hW0BmT7LwW9BsT3LwX3AvsBBw4wHe73Fs0dC6B2+Vp37vcWAfek4wOgIB33j/w4Bfu24/e2B/eO+DgFIwb7Uvvb+1P32wULYB3j94EH5e/3jfvlBfYG+734Jveq98gF+wMG+9D78gX38gcLEufj+A/jE15EHRNuiB0TnvzyB/vt+PIFC4VeHVH4MhVzHfsnK/sA+z1VHR/7LfepFfcOw9Ts7MNC+w77DlNCKipT1PcOHgv3yfv/FZMdOks+Kh7YFsalsLW1pmZQUHBmYWFxsMYeC/tS9xbH7R33Ef4YRR0OTp29asIb5cTk9yLsYOIuP1FVNDfBVNAfE/SyqZumnx9AgmpgXBsLJR3a9xYB90PjA/gTIB373DX3DPyu+xI19+jh+xL4rvcMBgvhA/cX+McVakQ/0vxa4fha9xnX+xmsB7ejpq0e3dc5BiheUTIfC6B2+KZ38uwS2eUz9wMdM94iHSAdE7CP+5sFyQaj90sF2wf7mjsVo/tLBckGj/ebBTEGDrDC0Br3CSnd+yD7ECgq+xV/HueFBeGWw8fcG+HDXEmKH0kL+PX3FgG696yHHcIWUR0VtaqouLiqbmFlbHNeXmyjsR4LE+igIB33j/w4Bfu24/e2B/eO+DgFIwb7Uvvb+1P32wUL+JsgHTX7jOod1cuswKgfCyAdNfgpB/si+0kv+2n7ehrnBvd87/dp9yL3Sx7dBw4gY/sF+wof0GAVu4ypqrEbt6JsW1pya2Bib6u8jB8OEqD5ChPcLB0L4ffLB+zCv9/aq1cqHvvL4ffpB/cEUeT7DUtNcVNsHguF9wYBuvcIA/SFXh0O+PPyAbr1A+/48xX3Fh1sonapHw7VHRPwC/ladwG85QO8IB37HAeZ+1kFyQaZ91kF9xwHDgHq4QP3SYgV+Kk1/KkHYHRvaB5hP78G5LjF5B8L2R0O4RPo90mIFfipNfypB2B0b2geYT+/BuS4xeQfC/caHamefnCVH8qRBch5WqxUGwsVT/dcB+sdBw4D93r5yRX7S/xn90v8aAXdBvtL+Gj3S/hnBQsV91wG6x37qAcLIB37egcvljCQLx7DBpDnlubnGvd6BxPgC/gU+AIV5ZEF8no0ziEb+w45SyUj83DrdR8LSpHDXdQb28PD3dhXx0Jwd4N3dx+Y7QX3LAvPFft64/d6B+eA5obnHlMGhi+AMC8aE+AL+wL58AGz+A4Ds/sCFd0G97z58AU4Bg4VvwbkuMXkH/ipNfypB2B0b2geYQYT9gsV1cuP2Zke9xChBYYH+xBHTzU+aK20Hgv4cBUiBvc++1z7PvtcBfQG9x33NgXXBwsV9+jh+xL4rvcM4fvcNfcM/K77EgYO+1L3FgG69zID92FPFSwGTPsWBc4GDvcoNdX7FPsCNUgmdh7ohAXBmLqyyxsLFfcOxtjo6MY++w77DFBALi5Q1vcMHgugdvimd+73FgHb4QNPHQvMiAW5lKGitBuqo3Zsbn51ZnMfa3YFCxVCyVLb28nE1B5JBmZqbmBgaqiwHgvX90h3AfeK2wP3iiAd+0j7Lj/3LgsGvG5NqkQb+x41IPs++z7hIPceC0ErXfsD+w0azAb3E8D3CNnvHrgL2Nc+BmF2obcf98z3Itf7IvcMBwvh+QR3AefjA+cW+E7h+/b5BDMGC/kEywG695QDuvlEFUv3lMsHDhVsonap9xYdHgsb+zVG9xn3K/csz/ca9zbxy1ALdvlad/cJHQv3GAf3O94y+0n7Rzgy+zsfDgHn4/fb5wP37yAd+5P9WuML4Vp296bh96zhErzn+EHgR88L9wYdDkB/UmBJGypT1PcO9w7D1OwL9yYdu2i4XZkfC+H8A/d49+/f++/3dvf74QcL9wodDuET6Nv4phX8puH4pgcT8AsB94njA/i9IB38pDX3cAsHMMBY6x7Y1z4GYXahtx8LFfsC9wH3AmIHsvcvBVkGC6AW6wbR910F974G0ftdBQvzOHb45/cHi3cS5+P4D+MLAefhA+cgHf1a4flaBwsV55nAwd4bysZn+wKaHwvH97zHAfcpyfdGyQP3wAv7FXb58HcB59sD5/laFQt/2vfZ3RK75ffN7DjeC/cz6N33HvcbLtv7Mx8LEtv/AE2AAP//soAA4Qv3ZRXm+xYFzgZM9xYFC8f3McXRxwH4B8wD+C0LJB3KKB285wv3AgG69wEDugv7lPlaBfsKBgugdvladwH30t8D9/wLqaKgqql0oG1tdHZtC7Soa1qKH1uKbGxlGwu+9x33JLz7JOn3Lb0L9wIBvPcBxfcBA/fZC2Rue3F3H8qTpsHAGwtkHfeH9wIBC/cjHe4L+F/3AvcvdwG89wELBvug+6EF9wUGDvs23eh2r90L9wB643X3AAv47BVSQAYT8PcnC4J0dH96G3d+mp4Li/M4dvjn9weLdwuL+VoBoPnHA/c1C535OAH3Pd8D92cLTI/HWtgb18e/zQv3ids792H3G9sSC/j1FTD7pr/1tAYL9y3X+y33SAcOAQABAAAiAACrAAGHAQCsAgGJAQCvAQCKAAAjAQGLAQCxAAGNAQAlAACaAAGPAQAmAACyAAGRAACzAQGSAAC1AAGTBQAnAQGZBgApAAGgAQAqAAGiAAC2AgGjAAC5AAGkAgArAAGnAQAsAAGpAQAtAAGrAgCMAAAuAQGuAgC6AAGxAAAwAAC7AwGyAQCNAAC/AACOAAAxAACdAAAyAQG0AgA0AAG3AQDAAAG5AwA1AAG9AwA2AADBAAHBAADCAgHCBAA3AQHHAwA5AQDFAAHLAADGAAHMAQA7AAHOAADHAAHPJgBCAADIAAH2AQDJAgH4AQDMAQCQAABDAQH6AQDOAAH8AQBFAACnAAH+AQBGAADPAAIAAADQAQIBAADSAAICBQBHAQIIBgBJAAIPAQBKAACRAADTAgIRAADWAAISAwBLAAIWAgBMAAIZAQBNAAIbAgCSAABOAQIeAgDXAAIhAABQAADYAwIiAQCTAADcAACUAABRAACiAABSAQIkAgBUAAInAQDdAAIpAgCVAABVAAIsAwBWAADeAAIwAADfAgIxBABXAQI2AwBZAQDiAAI6AADjAAI7AQBbAAI9AADkAAI+MwCLAACPAAJyBAARCQJ3HwBjAACbAAKXAQCeAACjAAKZAAFAAwKaGAAPAAANAAAbAQB5AAACAABgAAAgAAB7AAByAAB0AAALAAKzAAAEAAAQAAA9AAK0HQAOAALSAABvAACJAABAAALTAQAJAQBcAABeAAA8AAA+AALVEwB1AQBpAAB3AABBAAAIAABqAAB4AABrAQADAABoAABlAALpBgAhAAAHAABzAABmAACqAAClAALwAACZAAChAALxAQBdAACgAABwAQLzAwBhAABnAAAFAAL3BABiAABkAAAMAACmAACoAACfAAAeAAL8AAAfAAAdAAL9AQCcAAL/AABfAACXAAA/AAMABwAGAAB6AAMIPgCDAACCAAB8AQCGAAB+AACIAACBAACEAAB/AQCFAACHAANHBwKrAgABAU4BUQFlAXYBkgGwAdUB+AIIAiwCXwJ+AqQC6QNAA0kDWgNrA9MD6wP6BCkELQRhBGUEawR0BIIEnQS8BNIE2wTxBSkFSwWvBbwF0AXqBgEGLAZSBocGpgbLBu8HSgdwB8AH9QgBCCYILghLCGYIfAiECJcIvgjgCOkI+gkaCR8JKwk2CTsJTgltCXAJngnaCfgKBQoQChMKRwqDCo4KlwruCwELCgsTCyYLogvDDCwMOwx0DN0M5AzwDP0NCg0PDUQNSA2FDc8OFg4hDn8OhA6nDrgPAg8ODxkPIg82D1gPbQ92D38PlA/GD90P/xArEDwQVBB1EI4QpRDdEPsRAxEdEUwRUhGPEZkRqxG5EcoRzRHQEdcR4xHwEf4SGRIkEkYScRKNEpcSuRLpExATIRM9E2UTfROYE7IT1RP6FBQUOBRdFHUUixSeFLIUyxTgFQcVIhU6FVUVchWQFZMVnBWyFb8V+BY1Fj0WcRbJFzIXeRf9GE4YWBhqGHwYuRjQGOQY/xlSGX8Z8xn5GgIaEBpHGlwabxp4Go8ayBr9G1cbZBt4G4cbsRvuHB8cXhxzHIUcmRziHPUdMR1THVcdah1yHY8dpx2rHbMd4R37Hi0eVh5nHm4efB6YHp0erB63HsEe0R7lHukfIh92H5Ufph+2H7kf8yAwIDMgPCBVIGsgcyB7IJMg/yFIIX4h3iI3IqEiuyLLItoi6yLxI0gjTCOjI+gkCCQVJHwkgiStJN4lLyU7JVclYCWDJbMl0yXcJeUmFyZjJo8m0yb+Jw8nKCdKJ2QnfSe1J78nxygQKCEoJyhDKEkoVyhkKHQoeCh7KJ4opyi6KMcpGClZKWEppCn+KjMqciqVKp4qsSrhKxwrTitWK4orzywDLEssUSxdLHgshSyuLNos7S0ELRctKS0tLUgtTC11LaYtty3PLfAuCS4dLkQubS6ALrYu8C8pL04vUS9UL3Yv3TAiMFIwwzDRMPcxCDEYMSoxPDFTMWExcjGIMbkx3zH5MhkyOTJMMm8yfTK6MvMzUzN9M58zyTP8NBY0QzRaNIs04zUeNTM1QTVWNWc1dzWJNZs1sjXANdE15zX1Nio2ZjauNvU3UjeCN8A4DDhTOJY4nji2OMo46zkdOSY5PzlQOZI5pDmuOcY52zoxOlg6Yjp8Oos6xTrZOtw7FzsuO0U7WDtiO2Y7fTuPO647sjvLO848JDwwPFI8Vjx5PH08gTyFPIg8jDyXPJs8rjyyPLY8ujy+PMg8yzzePP89ET0VPRk9Kz1BPW49cj2MPY896D35Pfw+DT4RPhU+GD4tPjE+NT5IPlw+Xz6oPrs+vz7DPsc+yz7PPtM+3D7oPws/Lj8yPzY/TT9lP4Q/pz/SP/pAKkBZQJVA0EDUQNhA3EDgQO9BAkEXQUZBUUFVQXtBo0GvQb5B0UHzQkZCvELLQt5C8UMbQ11Dr0O6Q71D6USERSRFT0VwRbVF8EX0RgRGEEYlRjRGVUbJRvBHNUdnR+pIYEkPSZZKD0pSSqlK9ktpS6RLyEvbTA9MMkxNTJ1MwEzmTQZNLk1gTf9OUU5pTpZPFU9TT4JPtU/hUA1QSFCOUJJQ+FEbUUpRYFGJUapR1VH5UiNSTFKPUuBTB1MuU3lTx1PqVA1UMVRTVHdUr1THVOhVB1UnVT5VXVV7VZtVxlXzViVWf1fkWCFYMVhHWFVYaliIWKlYx1jpWO1Y8Vj1WPlY/VkBWQVZCVkNWRFZFVkZWSlZLVkxWTVZS1lPWVNZV1lbWV9ZY1lnWWtZb1lzWXdZe1l/WYNZh1mLWY9Zk1mXWZtZvFm+WclZ1vtr+yrGqLOonqizp7+noLueqJ+oqnSiqKKoqqiip6unxRLby0v3DPsM90Y1p2/3SfsPp2/3D0jOE6orAvf1IB37pf3w96UG+2XGFRNAAQCoB8ezBU8GEyABAqj3IgcTQAACbnAHT2MF4gYTqgECbgf7IvcJFez3IioH+yL3KRXsBxMGACCnRgYTBAAI4bQGEwQABG93BhMGAIJtu+EGEwoBAioH+yL3CBUTAUEIqPcGxAcTAkACpzUGEwEBAPsivBUTAIEAqMOqUwcTACECqPciBxMAgAJuBxMAgAhTBhMBKQhPBzX3BBXkBxMACALhBhMAEAJPwwcTACkCbgf7IvcEFRMABQCnw6tTBxMAAwKn9yIHEwAEAm9Ta8MHEwAIAm8HExAAEPsG/JEVExAAQOGzBhMQABA1BhMAECD4FgQTABCAp6oGEwAQIG8GDvwfDqYwHRKg+QoT2CwdT/w7FRPoKh0OprkdT/w7FRPsKh37L/iKIAqmMB3uyxL3Vi4KE94sHTj3ZegdYP0MFRPuKh0OpjAd7vcMzR0491sVfB09Bk42TuAFVP0CFRPsKh0OpjAd7igdoPkKE9osHTvaFdkGE9bI4AUT6sg2BWUKSf0CFSodDqYwHfLsEvds5cHlE94sHU7eFeXsMQaM/O8VE+4qHSz4jiIdprkdTPcQHS/9DBUT7CodDqYwHfcGyxKg+Qr8T/eUE9wsHRPqRukV95TL+5QGlPzZFSodDsn7a9P3OHb3XeH37tiLdxL4mzQdE+r3Bx2xPAoT7CcKqrj7lPlaBfsKBk/8OxUT8iodDqYwHdbD1sMS94bD1sMT3ywdT/w7FRPvKh37afjPUgqmMB3sJgr3PCoKE9ssHRPX+wHaJh0T2yMKE9ckChPrvPyKFSodDvfgi+H3B+Gm3/d24TjeEviD4xO0+CUgHfwQ/VoF7gYT9PL3XQX3pPtd+D3h++UGE7TtCgcT7P0Z/DsV90X36AW+++gGDq/vCvfR503nE/TnFvexBvcv4tP3FedRyCuYHxP42Jm6wNoa9xg3zPs8HvuJBuP9BBX3fPdZBxP068FhQEFVYisf+1n30hX3cPcxBxP49sBmQUVSZCQfDsQkHQG852cdDsQkHcr3FgG852cd+9f4vyAKxCQdyvcMAbznZx38Qfk3IR3ERh2i30x2+SLhErzn957DE0/5Jvd+FS2RBRNX+wF2Rk4kG/s1RvcZ9yv3LM/3Gvc27M9UKKIf6JEF9yBsKOn7Kxv7YvsI+zr7YvtU8vsx90p4HxPvbGmoCp6gBRNP9zCR5+6k9yUIDsT3Eh0T6H8d/D74vxXZBhPYyOAFE+ghCsT3AAr3TeVnHfvg+MMiHcUlHQHn4/gS5wP3zCAd+3D9Wvd2Bvds9wz3E/d393j7D/cU+28f+xj9BBX4rvId9yaQCsWOHQHn4/gS5wP3zCAd+3D9Wvd2BtYK+xj9BBX4rvcYB/c73jL7SftHODL7Ox/7GPnLIR33JpAKYiwKgh0OYqsK+5bbFVEdYiwK2/cMgh38APdcIR1iLArbKB3n4xP0PQr7/dsV2QYT7MjgBRP0IQpiLArf7BLn45zlweUT+j0KE/776t8V5ewxBvckKiIdYiwK3+wB5+Pn5QM9Cvuf3xXl7DEGDmKrCvvs92YoCmIsCurLEufjlPeUE/g9ChP8+/LqJx1i+2vT9yOCChLn4/d/NB0uxRN5Ygr4IQcT+mVhVgoT/CcKE3mquAXh/AP3ePfv3/vv93b3++EHDmIsCtnLkMsS5+NsKgoT5D0KE+r8GtsVdwoT9SMKE+okCg7Ye+H3f+H3jeEB+NjoA/jY+BsV/KcGjFcF+5OX9x4n9y0b91D3GPct9273dvsS9yX7Vvsa+wI3+xliH+yCBemwz7neG/cL7SD7IpUf/Eg1FfhHBvsrdDo3+w4b+wdA3/creB8OX3vh+L7hZgr3UGUdDl974fi+4dr3DGYK91BlHfL5ZSEdVaB298Xf93/hYB3j98X36d/76fd/9/vhBw7Le/QdE3o4ChO8NAoTulMdE3qT+wgFDstKCsrLErzn4y4KxOBHzxN8QDgKE7yANAoTvEBTHRN/QJP7CAX7/vorQh3LSgrK9wwSvOf4QeBHzxN9OAoTvjQKE71THRN9k/sIBfv++iEhHctKCsooHbzn+EHgR88TeoA4ChO7ADQKE7qAUx0TeoCT+wgF+/v5qRXZBhO2gMjgBRO6gCEKyykKt/QdEz04ChNeNAoTXVMdE72T+wgF+9D7UhVRHctKCs7sErzn903l9y7gR88TfoA4ChO/ADQKE76Aegr7nfmtIh3LSgrZyxK85/H3lNLgR88TfIA4ChO9ADQKE7yAegr78Pm4Jx33Anvh19e/4fes4QG85/hB4wP4B/f8FTX3WweKeYl6h3oI+1Q/9zMGXGpVbkPwHTaiH+eRBfcWbCjp+ysb+2L7CPs6+2LqCvcR5MXzth/e104GkKiOqqwauAcOxqB2987h98p3Aefj9+zjA+cW4/fO9+z7zuP5WjP7yvvs98ozBg73c6B299Ph9w/hNfdKEvcv4/gS4xPc9y8gHRPsK0wHE9w1yvyk4/fT+BL70+P4pMoHE+zhTAcT3OszBxPsK/wSBxPc6wf7xQT3D/gS+w8HDsagdvfO4ffKPh3n4/fs4xP25xbj98737PvO4/laM/vK++z3yjMG9w3aFdkGE+7I4AUT9iEK/AmgIgpgHeP5WgcO9yF74VoiChLn49bl96jjE7znIB0TfP1a4/laB9b8dBUTvLMKDvwJyAo72iAK/AmgdvlaPh3n4xPoTQr7S9oV2QYT2MjgBRPoIQr8CaAiCvLsEpuACucgHf1a4/laBxP0+zjeJQr8CaAiCvLsEublMuMT6E0KE/Ay3iId/AnICvs6Vwr8CaAiCvcGywHn4wNNCvtA6Scd/An7a9P3OCIKErs0HfsP4xPkYgoHE+ipPAoT8CcKE+SquAX5WgcO/AmgIgrsJgprysjjyMoT5E0KE9z7aNomHRPmIwoT3CQKDlx74fkUd58KDlx74fkUd+73Fp8K97H4uyAKXHvh+RQ+Hc7l96jjE+ypCvdK+LsV2QYT3MjgBRPsIQqToKEKDpOgIgru9wy7HZFaHZMpCtyhCtP+GCAKS4vtHQ5Li+H5BHfu9xYB5+MD8QqT2iAKJIvh+J/wJvcWEufjE9DxCvdCJhXOBhOw5vcWBSwGDkvAHW6L4fkEdwH3E+MDofgIFbA9z6sF+9r4TuH79vetB/cv02bZ+wpUBfeMM/u1Bw73fYvrQHb4qfdFi3cS5+P4muMTXEQdE2z4qQf3XPypBfcKBvdc+KkF/Knj+Vr7DgcTnPt1/Pr7dfj6BQ7pi/cIHRNcRB0TbPjnB/fn/OcF9xT5WjMGE5zMCg7p9xwd9xa8HfcM2iAK6fccHfcMvB2ZWh3pqR3p9yMd7CYK5+OhKgqg4xNaQEQdE2pAiB0Tl0DMCn/aJh0TWsAjChNXQHYdE5dAT2RYOx8O6fsq4eB2+Of3B4t3Eufj+A/jE9xEHRPs+OcH+A/85wWEB2V2eGEeJDXyBujFw+Mf+WAz/LcH+/D4twUO8iQdAbzn+GZRCg7yagr3WfhHIAry9xId+GbnE+z4CtUK93v7Dvch+1/7X/sO+yH7e/t59w77IfdfH/t9+AYV90bi9wD3Jvcm4vsA+0b7RDT7APsm+yY09wD3RB7p+EcV2QYT3MjgBRPsIQry9wAK9wXlweX3C1EK9wX4SyUK8moK9wP4ySgK8moK9yP4R2sd8iQd2csBvOf095T0UQr0+FYnHfcAJB0Bwef4ZucD+A/VCvcLa+lQzB/R6QU3BmZZBatZTp1DG/tf+w77Ift7+wCmM71MHzn7AwXgBrnJBWO/znXbG/t9+AYV90bi9wD3Jr23fnOuHvvT/EIFb7p8yNQa4/t/FffX+EgFr1ueRjca+0Q0+wD7JlFanKtlHg7yJB3Iy5DLErznzCoKzOcT3agdzPhHJh0T7yMKE90kCg74TXvhRYIKReESvOf4YOYz4xO1+Ad7FfLZtM6/HxN1L/g94QcTdvvl7QoGE3X8NS8GE27OVz20JBv7YvsI+zr7Yh8TteoKHvt6+AYVE673L9b3F/cv9y/W+xf7L/suP/sW+y4eE7X3AQqRoHb3p+H3m+HzHfenrwpzoHb3KOH3m+H3E3cB5+P3vecD90gW9yj3HQf3Dh37HfcTM/1aBuP3fhX3m/cdB/bAYDUyVl4gHw7sJB0BvOf4YOcD+Ad7Fbi0k5mvH8VABecGNfcDBePNu/cH9xca92L7CPc6+2L7YvsI+zr7Yvth9wn7OfdhHvt6+AYV9y/W9xf3L/cv1vsX+y8majFKWB5B6wUvBu/7FQWFd3WIcxv3AQqnoGIdZh0Op18K9xZmHU74NiAKp18K9wxmHfs7+K4hHacpCtxiHWYdIPzFIAqPf6AdDo9/4fjK4cr3FgHV5/fg5wP3K/d9FS+FBfskl/cGLPcwG/cU9w3P9xiBCh9bCpUd9yT4wCAK/F3SHY9/4fjK4cr3DAHV5/fg5wP3K/d9FS+FBfskl/cGLPcwG/cU9w3P9xiBCh9bCkVPaDH7BEnL6ngesfk4IR2PRh1e9zBMdvke4RLV5/dew9XnE1eA9yv3fRUvhQUTT4CW+xfqMfcaewgT74BoZaIK9xGO9wfP9xUa9wEjy/sUrx5bChNXgJUdDo9/4fjK4cooHdXn9+DnE+z3K/d9FS+FBfskl/cGLPcwG/cU9w3P9xiBCh9bCkVPaDH7BEnL6ngetPjAFdkGE9zI4AUT7CEKjykKu6Ad4Pw7IAq8i+H3ntT3W+EB5+P3/uUD+BDhFfsaNfcaBvcv7OX3F/cQ+wDe+zKIH/du91MF6fu3B/sPPTr7FR/8iOP4iAfbtLfTHvdDBvto+04FNAfzjAX3BIzRWDYaO01YJx4OSKC9Cg5IoHb3ytf3guH3BB37gvsYP/cY+8rj98r3Gdf7GfeC93AGDkigdvkE4dr3DMUK/Cr3sSEdSEYdxXb5BOES94njg8MTfPi9IB38pDX3cP0EnwZfWwUT+qdmBbaVrHtrGnF5em9pc62dfR4TfGFkBRP6XQoTfK2wBZr5BPdwBg5IKQrcvQr7/P3CIAq4MwoB2OP3/EAdDrhtCvvE+LEgCrgzCu3LAdjjsS4KsUAd/C75M0IduDMK7fcMaK4S2OP3/OMT7GwK/Cv4sRXZBhPcyOAFE+whCrgzCvHsAdjjx+XB5c1AHfwY+LUlCrhtCvwa+TMoCrhtCvv6+LFrHbgzCvcFywHY47/3lL9AHfwg+MAnHbj7a9P3E+H5FXcS2OP3KDQduOMT9oMdlZSLjJQec3BWChP6JwqptgUT9vWsyuX3ExoOuDMK1cPWwwHY4+HD1sPiQB37/vj2Ugq4MwrrJgrY45cqCpfjE+lsChPd/Ej4sSYdE+sjChPdJAoOpIvtPnb5WncSoPkIE3CgIB33lP1aBfcIBveU+VoFKgYTsPtt/Pj7bvj4BQ73n1QdEqD5+hNwRgoTsEcKDvefVB3u9xYSoPn6E3hGChO4Rwr3w9ogCvefVB3uKB2g+foTdEYKE7RHCvdc2hXZBhNsyOAFE3QhCvefVB3y7BL35OXB5RN8RgoTvEcK92/eJQr3n1Qd7vcWEqD5+hN4RgoTuEcK921XCnugIgoBpvjTA/iIIB37TPuv+033rwUlBvd7+/X7ffv5Be8G90/3svdO+7IF8Qb7fff493v39gUOfaAiCgH3pOMDoCAd94/8OAX7tuP3tgf3jvg46woOfbod9y/aIAp9oHb5Wj4d96TjyR2/2hXZBhPYyOAFE+ghCn2gIgry7BL3WIAKoCAd94/8OAX7tuP3tgf3jvg4BSMG+1L72/tT99sFE/TS3iUKfbod0FcKfaAiCuwmCvcoysjjyMoT5KAgHfeP/DgF+7bj97YH9474OAUjBvtS+9v7U/fbBRPcotomHRPmIwoT3CQKDiUlHQGm+H1uHQ4lJR3a9xYBpvh9bh33CflTIAoljh0Bpvh9bh2W+cshHSUlHd7sAfd+5W4d9wD5VyIdS8Ad6akdraBiHWgdDq1fCvcWaB1Y+DYgCq1fCvcMaB37MfiuIR2tKQrcYh1oHfsD/MUgCvtjJR0B90PjA/gTIB373DX3DPyu+xI1YAoGDvtjwh37XPc5FVEd+2OOHWiuEvdD4xPoVAr7w/c5FdkGE9jI4AUT6Mg2BWUKDvtjJR3e7BLugAr4EyAd+9w19wz8rvsSNWAKBhP0+7D3PRXl7DEG9yQqIh37YyUd3uwS90LlMuMT6FQKE/D7Zfc9FeXsMQYO+2PCHfuy97soCvtjJR3pywH3Q+MD+BMgHfvcNfcM/K77EjVgCgb7uPdIJx37Y/tr0/cj4fiu4RL3Q+OFNB0TcN4KBhPk9648ChPoJwqquAXhBxNw+xL4rvcMBg77YyUd2MuQyxK+ylDGyOPIyhPGVAoT2vvg9zkVdwoT5yMKE9okCg7Ee+H3YOH3rOEBvOf4QVcdDsR74fdg4fes4crLAbzn4y4KxOMDfh38QfjDQh3Ee+H3YOH3rOHK9wxorhK85/hB4xP2fh38PvhBFdkGE+7I4AUT9iEKxCkKt+H3YOH3rOEBvOf4QVcd/BP8uiAKxHvh92Dh96zhzuwBvOf3TeX3Llcd++D4RSIdxHvh92Dh96zh2csBvOfx95TSVx38M/hQJx2mMB3q9RL3XSsKE94sHT/3FBU/Cpv8uxUT7iodKvi7FT8KDsQkHcjyAbzn90X1A38d++j48RVsonapqaKgqql0oG1tdHZtHg5iLArX9RLn4433ALz3ABPoPQoT9vv59xUpHWIsCtnyAefj3/UDPQr7p/cWFWyidqmpoqCqqXSgbW10dm0eDstKCsjyErzn90X19ybgR88TdIA4ChO1ADQKE7SAegr7pfnbLh38CaAiCur1Eoz3IB0T6E0KE/T7R/cUKR38CaAiCuzyEt71KuMT6E0KE/AqjB0O8iQdxvUBvOftKwryUQrt+HgpHbgzCun1AdjjuCsKvUAd/Cf44ikd959UHer1EvfVKwoTfEYKE7xHCvdg9xQpHX2gIgrq9RL3SfcgHckdE/TD9xQpHSUlHdjyAfd29QP4kPkCFeP8ZDX3/gf8D/ypBTD4feH8Ggfv+YUuHftjJR3W9RLf9wB643X3ABPIVAoT9Pu/92opHftjJR3Y8hL3OvUq4xPIVAoT8Ptt92suHcR74fdg4fes4cjyAbzn90X19yZXHfvo+HMuHfhli+H3B+H35eEB+ePjAywdT/w7FSod9577s+Id+Hd74UXh+K7hEtjj9/zj95DjE7xsChN89xL7jOIdRoYKRpcd9wH4aiAKRjMdzssSuuWOLgp0iAoTtgCO+OxCHUYzHc73DJodjvjiIR1GMx3O9wxornQdE7SANR0TtgA1ChO1ADoKE3UATAoTdIA+ChO0gEUKkfhqFdkGE6yAyOAFE7SAIQpGMx3S7BK65aTlweWQVh0TtEA1HRO9ADUKE7SAOgoTdIBLu3rBHhN0QD4KE7RAeh0TvECGHRO2AKT4biUKRpcdovjsKApGMx3dyxK65Zz3lIJWHRO4gDUdE7oANQoTuQA6ChN5AEwKE3iAPgoTuIBFChO8AJz4eScdRvto0/cU10vXVHahdvhf3XQdPdITRkA1HRNHADUKE0aAOgoTDoBUrne3hh4TliBnY1YKJwoTFkCotQWNBhMmQNd1B3WBlaEf92gH9yI+2/sdHhNGQEUKDkYzHbbD1sMSuuW+w9bDpVYdE74gNR0TvoA1ChO+QDoKE35ATAoTfiA+ChO+IEUKvvivFVa1Y78eE78gvrWzwL9htVgfE74gV2FhVx/DjBWenJ2gHhO/IJ+ceXh3enl3HxO+IHZ6nZ8fDkYzHcwmCrrldCoKWlYdE7QgNR0TtIA1ChO0QDoKE3RATAoTdCA+ChO0IHodE6ogxfd/Jh0TtQAjChOqICQKE7Qgovxq4B0O97N/00Pd9zzX9ybdErrl957/AB2AAP//4oAA7hN6w/gKFeEK2L1gM4wf+y5vBTkKYR0TfPWN0MCe6IyNGC2v2lP1G/Hlye+qHy+SBVRzWGtTGxN6rgo3R2dNYR/MaEisNhv7AjVIJnYfE7rc+30V18uK2ZoeLx0+h2i3tBr4A/dB9wIdXXkd9zx3EtvZPf8AT4AA//+wgADh97zlE7PbIB0Tc/1aBxN12QYTtY7VBVaoy2rVG/ce4fb3Pvc+Nfb7Hh8Ts0RNbFpuH/eMBxO5g/xR5R0OLyMdAbrlA0QKDi8jHc73FgG65QNECvs795UgCi8jHc73DAG65QNECvul+A0hHS9GHabbUHb4at0SuuX3UcMTT8YK+zDdI/cUfB8T72hlqAqipfSS4tSb9wUZMJEFE1f2HR8TT8rEY0eWHw4v5goT6EQK+6L3lRXZBhPYyOAFE+ghCi8jHdLsAbrl9wDlA0QK+0T3mSIdXXkd9zx3Errl97zhPdkTvModE3wtChO6vwoOWfcNHRPwvAr3AevD97X7FfdH0KQYdMssaVa6Q6wrlRl2PMOGvHu0chkgZaJKBRPo9yXAu1WlQ4w1GRPw0wrWhchfmD+C+xFBOSyTMpRTzZXvCA73B3kdzvAm9xYSuuX3vOE92RO2yh0Tdi0KE7W/Cvg29+wVzgYTrub3FgUsBg6SeR201z/3ExK65fdU91I14T3ZE60A+JsgHTUGE7UAWAcTtgAjBhOuAD8HE60A8/sN6h0fE6yA1cuswKgfE2yAjkEFE20A2fjbygYTtQDXTAf8EvweFfcOxtjoHhOsgOjGPvsO+wxQQC4fE7UALlDW9wwfDj4rHX0dDj6OCvtB97kgCj4rHcz3DH0d+6v4MSEdPisdzCgduuYT9Lr3nRVVHfHlye+qHi+SBVRzWGtTG64KTgof6HAd+6j3uRXZBhPsyOAFE/QhCj4rHdDsAbrmq+XB5QNJHfuV970lCj4rHdDsAbrm9uUDSR37Sve9Ih0+jgr7l/g7KAo+Kx3byxK65qP3lBP4SR0T/Pud98gnHT77a9P3F933PNf3Jt0Suubr0kT3OxP6ywoekgZwbQWEHRP8JwqquNCiwsCi1RltHRP6Tgof6HAdDj4rHcrLkMsSuuZ7yvdmyhPlywrx5cnvqh5tHU4KHxPr1vfqJh0T9SMKE+skChPjnfu59wIdPn/d9ybX9zzdAfhC5gP4nfedFfc9K/cA+yclMU0nbB7nhAXCo76rwxvlwU0hkx/8EwaMZAX7UpT0QPcIG/cn6/cA9z0f/BBaFfezBi99VlU4G0xQr/cCfB8OX/tY4fi+4WYKk2UdDl/7WOH4vuHa9wxmCpNlHfL5ZSEd+4qgdvha1/PXAfcXwx0OXD0dYwoT9gBQChPuAPhyBxPsgDkGE/SAQx0T9gBVChP1AE4dE/YARx0OXD0d7ssSuuWSLgqP4TbgOd0T9kBQChPuQPhyBxPuEDkGE/YQQx0T9kBVChP2IE4dE/ZARx0T9YCS+FpCHVw9He73DGMKE/cAUAoT7wD4cgcT7kA5BhP2QEMdE/cAVQoT9oBOHRP3AEcdkvhQIR1cPR3u9wxormMKE/WAUAoT7YD4cgcT7SA5BhP1IEMdE/WAVQoT9UBOHRP1gEcdlffYFdkGE/OAyOAFE/WAIQpcPR33BvcCErrl8fcB35kd8ffn0ApcPR3y7BK65fPl8Jkd8/fcIh1cPR33BssSuuWg95SdmB2g9+cnHYD3Hx33Ddf3Ld1/d2MKE/sAUAr3R8PXUwcT9wD3cwcT9kA5BhP6QEMdE/sAVQoT+oDhwlEskR/7Wz/3VQY/e1deQhsT+wBHHQ5MoHb4YN33PHcB2+H3juEDqgoOQqB2+GDdtNc/9xMS2+E191v3HeET2tsgHRPqWFQHE9o/wvzbzh33DwcT1vcFBhPm1wcT6vsFBhPavgcOTKB2+GDd9zw+Hdvh947hE/aqCvtK2hXZBhPuyOAFE/YhCvwjxB38I0MKAdvhA9v4phX8puH4pgcO/CPmHTzaIAr8I6B2+KY+HdvhE+hPHftK2hXZBhPYyOAFE+ghCvwjQwry7BKO5X7heOUT6E8dE/T7N94lCvwjxB38I+Yd+zlXCvso+yrX6nb4pnfy7BLZ5TPh9zflM+ET9U8dE/kz3hXl7DEG9y398N8d7flDIh38I0MK9wbLAdvhA9v4phX8puH4pgf7P+knHfwj+2vT9zh2+KZ38uwSrTQd+w/lM+ET8X8KBxP0pzwKE/gnChPxqrgF+KYHE/Iz3iId/CNDCuwmCl7KyeHJyhPk2/imFfym4fimBxPc+2faJh0T5iMKE9wkCg78FDgd8uwS6OUz0R0z+PwiHfwUOB3THQ78FDgd7vcW0x08+PggCvwU+yrX+PA+HerVHftK+PgV2QYT2MjgBRPoIQpVoJ4KDlVDCvdcd+73DKQK+01aHVUpCtyeCq/+GCAK+/2L1/kOd7oKDvv9i9f5Dnfu9xa6CjvaIAr7f4vX+KjxJfcWEtvhE9CKHbLkCvv9sh37n4vX+Q53Afcy4QP3MiAd+8IHPWerRrmgBftwB021Yckex9ddBnWBlaEf95QH6bZr0E1uBfebBw73faB2+GbXf3dSHfd64fd64ROuWQoTzui7w9zKsVMuHvvR4ffRB+q6wd3LsFUsHvvR4ffpB/cUTdQgOFRkRHQe0XRUsz4bE9ZCVWdLch8TtojjBQ5MoHb4Ztd/d1Id947hE6xZChPMcwoT1GgKE7SI5gUOTKB2+GbXf3fu9xaXCuzaIApMoHb4Ztd/d+73DJcKglodTKMdTKB2+GbXf3fsy5DLUh1gKgpg4ROyQFkKE9JAcwoT1EBoChO0QIjmBRPJQGjaJh0T0oAjChPJQCQKDkz7Ktfqdvhm1393Uh33juET1lkKE+biCvvYB2JzcWQeOD/cBujFw+Mf9+8H9wRR5PsNHhPqaAoT2ojmBQ5Kph1Kawr3CffsIApK5gr3xuUT7EodmffsFdkGE9zI4AUT7CEKSiMd0uwBuuWs5cHlsuUDSh2s9/AlCkprCqr4bigKSmsKyvfsax1KIx3dyxK65aT3lKTlE/RKHRP8pPf7Jx08Ix0BuuX3xuUDjR3TeshruR/d7QUyBmNcBalkWZxRG04KRJxOql0fOCgF5Aa0uwVssr56xRv7LfepFfcOw9TssKqAd6Me+3b7ogV+qIWvtBrG+zcV93j3owWXbZJnYRr7DlNCKmVslqByHg5KIx3MJgq65XwqCnzlE+mNHfc9K/cA+ydOClUdHxPV+zz5ASYdE+ojChPVJAoT6Zr77BX3DsPU7OzDQvsO+w5TQioqU9T3Dh4O99MrHQG65ffG5gP3tn8V4tCxzbUfSbXQZeIb8eXJ76ofbR00RmVJYR/NYUaxNBu+HfgjcB0OXe4K29c//wBPgAD//7CAAOH3uucT09v7KhXh93EGVKjCb9Qb9zPR9xj3JfclRfcY+zMfE9U+U2tSbh8T5YjYBRPjPQYT2df7nRXtt+z3APcBtisoKGAr+wH7AF/s7R4OXfsVdvce3fge2fc8dxLb2T3j97rlE/bbIB398OP3aAdcqsBw1xv3LtH3GPcl9yVF9xj7Lj9VcFltH/eJBxP6gfxRFfG27PcB9wK1KyQoYSv7AvsBYOztHg5d7gq65/e64f//sIAA/wBPgAA/1xPc+Jv7KhUT7Pk8BxPqPQYT2og+BcRuU6s+G/szRfsY+yX7JdH7GPczHxPc1MKnwqgf+3EH+7r4MxXutuv3AR4T2fcAtyopKV8q+wAfE9z7AWDr7h8O+5qgdvha1/cPHRPQzwoT4EZkbUp6H4jqBQ77mqB2+FrX2vcWbwqQ2iAK+5qgdvha19r3DG8KJlod+5opCtx2+FrXbwr7Ff1kIAr7Bn+NCg77BiMdzvcWAcfl94jlA/gU+AIV5ZEF8no0ziEb+w45SyUj83DrdR/HfdWFTBpVSHtZPFmzyoAeMYUF+wKT60b3Ehvv9rfyeB0fcR3FxmhQlx77L/eHIAr8XdId+wYjHc73DAHH5feI5QP4FPgCFeWRBfJ6NM4hG/sOOUslI/Nw63Ufx33VhUwaVUh7WTxZs8qAHjGFBfsCk+tG9xIb7/a38ngdH3EdxcZoUJce+5n3/yEd+wZGHV73LFF2+GndEsfl9y7DreUTT4DbHRNXgM4KE0+AkinXSvR+CBPvgGhkogrsjvC37xp4HR5xHR4TT4DFxmhQlx8O+wYjHc4oHcfl94jlE+yRCvuW94cV2QYT3MjgBRPsIQr7BikKu40K+2j8wCAKVd3/AP6AAN3/AN2AABL3Os5I2BPQ973dFd/Zs9/nO7QviR9figXeB7eKBd6JusTPGsFVuEYeE+BAVl0vH/yKNfiKB/cg59v3DvcQ4kP7AUNlTkZ0HuN0ykgrGvsY+wxI+xgeS90GDvuMi7YdDvuMi9f3PNf3GtcB9xjhA/YK+xo+P9gl9wUd8fci1/si9xr3Itf7IvcMBw77UzIK2bVh9xYS9xjhE+j3GPkeFfsMPj/Y+8wHMMBY6x7sHbRhFc4GE9jm9xYFLAYO+4xGHbDX+A7XEvcY4b/DE372CvvMB0apXcN5HldSp2YFtpWse2saE/6PHRN+YWQFE/5dCq2xBYqRkYuRG9jXPgZhdqG3H/fM9yLX+yL3DAcO+4wpCse2HTv93CAKRjsKEtvh94jhOd0TeDwdE7hTChO0WgoTdDQHDkaAHfs6+PUgCkY7Cu7LEtvhcy4Ke4Ed+6T5dxVCyVLbHhO2ANvJxNQf8AoORjsK7vcMaK4S2+H3iOE53RN2PB0TtlMKE7VaChN1NAf7ofj1FdkGE67I4AUTtiEKRjsK8uwS2+GJ5cHll4Ed+474+RXl7DEGE7sA9yQqIh1GgB37kPl3KApGgB37cPj1ax1GOwr3BssS2+GB95SJ4TndE3o8HRO6UwoTudDIqs+nHxN5NAcTtPuW+QQV95TL+5QGDkb7a9P3F9dgdvimdxLb4fdaNB37DeE53RPZADwdKVRXOj9rv+0e99A1++kH+wTFMvcKHhPYgFoKE7iANAcTugCjBmVhVgoT3AAnCg5GOwrWw9bDEtvho8PWw6zhOd0TfIA8HRO8gFMKE7xAWgoTf0A0B/t0+TpSCkY7CuwmCtvhWb1ZyvdmymHhOd0TdEA8HRO0QFMKE7QgWgoTaiA0B/u++PUVE6lAdwoTtIAjChOqQHYdE2ogT2RYOx8OIIvlRnb4pncSofiCE3D4mPimFS8GE7D7L/xM+y/4TAUvBvdV/KYF9wAGDvdDSwoSofmcE7BLHRPQTB0O90NLCu73FhKh+ZwTuEsdE9hMHfti+JYgCvdDSwruKB2h+ZwTtEsdE9RMHfvJ+JYV2QYTrMjgBRO0IQr3Q0sK8uwS97flweUTvEsdE9xMHfu2+JolCvdDSwru9xYSofmcE7hLHRPYTB37uPkYKApRQwoBuviBA/g9+KYV+xf7VPsY91QFIgb3TPuW+1b7pAX0Bvci92H3IfthBfQG+1T3o/dL95cFDiA4HQGh+IJqHQ4grB33C9ogCiD7Ktf48D4dofiCE+ih+KYV91X8nAWoBnhaBXKBfIFyG04/0QbHsaXEnx/3avjpBTAG+y38Svsy+EoFm9oV2QYT2MjgBRPoIQogOB3y7AH3KeXB5Wodrt4lCiCsHaxXCiA4HewmCvAqChPstR0T3H7aJh0T7CMKE9wkCg4sMgpyCg4sMgra9xZyCuX4qRVRHSwyCtr3DHIKe/khIR0sMgre7AH3e+XCCtz4rSId+/2yHUyjHTgyHRK15fecQgoTsjcdE7QvHROyTR0TckEdE7g2HROyOQoOOIcK91L4aCAKODIdzssSteWFLgp9mx3f+OpCHTgyHc73DJ0d3/jgIR04Mh3OKB215fecQgoTtIA3HRO1AC8dE7SAPodot7QaMRZhHd6Ny7ehvAgTdICNOAXZ99QG5B0TtgA2HRO0gDkK4vhoFdkGE6yAyOAFE7SAIQo4Mh3S7BK15ZvlweWZQgoTvIA3HS8dPodot7QaMRZhHRO0QN6Ny7ehvAgTdEBBHRO1ADYdE7yAOQoTtkD1+GwlCjiHCvP46igKODId3csSteWT95SLQgoTuIA3HRO5AC8dE7iAPodot7QaMRZhHd6Ny7ehvAgTeIBBHRO6ADYdE7iAOQoTvADt+HcnHTj7a9P3F9Nkdvhg3RK15fduNB37DUIKE1hANx0TWIAvHRNYQE0dEzhAjTgFE7oAnzwKE9wAJwoTWECquAX31Af3KDXV+xT7AjVIJnYe4QoTWQA2HRNYQDkKDjgyHbbD1sMSteW1w9bDrkIKE78gNx0Tv0AvHRO/IE0dE38gQR0Tv4A2HRO/IDkK9xj4rVIKODIdzCYKteVrKgpjQgoTtCA3HRO0QC8dE7QgTR0TdCBBHRO0gDYdE7QgOQoTqiDF+GgmHRO1ACMKE6ogJAoOXTAKErrl97wvChOpMQoTrDUGE5wtHROaMR0TWS0KE5k2Cg5dnB33CPfsIApdMArOyxK65ZUuCo2KCpX4bkIdXTAKzvcMErrl97wvChOsgDEKE64ANQYTngAtHROdADEdE1yALQoTnIA2CpX4ZCEdXTAKzigduuX3vC8KE6pAMQoTqwA1BhObAC0dE5qAMR0TWkAtChOaQDYKmPfsFdkGE5ZAyOAFE5pAIQpdMArS7BK65avlweWpLwoTryAxChOvgDUGE5+ALR0Tn0AxHRNfIC0KE58gNgqr9/AlCl2cHan4bigKXTAK3csSuuWj95SbLwoTrEAxChOtADUGE50ALR0TnIAxHRNcQC0KE5xANgoTnkCj9/snHV37a9P3F91advhkzUnZErrl947Sci8KE1RAMQoTVQA1BhNNAC0dE0yAMR0TLECOQQUTrgCfPAonChMsQKq4BRNMQDYKDl0wCrbD1sMSuuXFw9bDvi8KE6+QMQoTr8A1BhOfwC0dE5+gMR0TX5AtChOfkDYKxfgxUgpdMArMJgq65XsqCnMvChOqEDEKE6pANQYTmkAtHROaIDEdE1UQLQr8Ivj1Jh0TmoAjChOVEHYdE1UQT2RYOx8TmhCb++zHCg78C6DxHQ78C6DZCvcJHTzaIAr7e6B2+PTxJfcWEtvhE9DbIB39WuH5Wge25Ar8CykK3PEd+x/+GCAK+5+gIgoB9zHhA/cxIB37wwc+aKtGuKAF+9jh9/8H6rdr0ExuBfebBw5GMx3K9RK65ZUrCoCIChO+AJX4mxU/CvcxFm2idKqpo6KpqnOhbWx0dWweDi8jHczyAbrl7/UDRAr7TPfHLh0+Kx3I9RK65pwrChP6SR0T/vuk9+opHT4rHcryAbrm7vUDSR37UvfrLh1cPR3s8hK65ev16Jgd6/gKLh38I7Md/CNDCur1En/3AHvhdvcAE+hPHRP0+0b3FCkd/COzHfso+yrX6nb4pnfs8hLR9Svh9y/1K+ET9U8dE/nJCvc1/b3fHeX5cS4d/CP7a9P3OHb4pnfs8hKtNB37F/Ur4RPxfwoHE/SnPAoT+CcKE/GquAX4pgcT8skKDvwUOB3s8hLg9SvRHSv5Ki4dSiMdyvUSuuWdKwqi5RPySh0T/p34HSkdRjsK6vUS2+F69wC89wCHgR37nfkmFT8KE7oA9zEWPwoO90NLCur1EveoKwoTvEsdE9xMHfvF+McpHSA4Her1Afca9wC89wBqHZ/3FCkdLDIK2PIB93P1A/h5+EcV6vw2P/faB/vk+/0FLvhI1/vrB9T42y4dODIdyvUSteWMKwqJmx3m+JkVPwr3MRZtonSqqaOiqapzoW1sdHVsHg5dMArK9RK65ZwrCpmKCpz4HSkdtqB2+FrX89cB9xfh91/hA/cX+McVakQ/0vxa4fha91/ACmr7X6wHt6OmrR7d1zkGKF5RMh8OwzIKP/dYEvcY4fdu4RO49xj5HhUT2PsMPj/YzQr3bs0K9yLX+yIHE7j3DDUHE9j7DPtuBxO49wwHDougdvha197sP9cS9xfh95jlM+ET2vcX+McVakQ/0sAKE+z37r0V5QYT3OwxBxPajf1aFeH4pjUGDp0yCvPXAfcX4feGwx333PxfFU21Yckex9ddBnWBlaEf+O41Bw5GhgpKph2moHb5DdgBoPkKA/fk+Q0V92/9DQXrBvcUHfuU/VoF6wYO6ovh+L7hErznMfeh7/ehMecT5PgG+RQV9yfdJPtB+zA8+w4nHxPoNfeh4fsWBxPk3cS97fcPGvdv+xD3I/tZ+1n7EPsj+2/7D70p3VIeE9T7FjX3oeEGE+QnPPcO9zD3Qd3y9ycfDkOL1/jC1wGg+KcD+JoWrddoBmeAnq59H/tE+FIF6WZnszcbXD/BBq+WeGiZH6dD+1r8kAXlBvcs+CLz+5wFKrGqZt0bDpoyCgH3NuH3T+EDwvimFT/2/Frh+Fr3T/vHBzK4UfcBHqvXawZfc6a3H/fH8dcHDmt73f8BD4AA2/8A4oAA3RK95UnlE/D4x+MVVNMFU1s2ZUcbJUrC3N/MwfGJH8GKBdwHVYoFE+hJij6s5xrKwrPjyNRnW7UexNEFw1orszMb+x0rP/sBO7VX33IfE/AoblhHLxr7EPI09y7u9LbIvx4OpiQdAcHn+BDnA/fklgr7mKB2+KHW9wJ3EvdP40bQE+js9yEd/KHj+VoGE+hGBj5qaj8eDnGL4fi+4QHH9wH3uOcD1Koda+AKveb3xudI5hPo98GLCoKgdvcl4fhzdwH4NeMD+I2xCnh74ffT3/cr4QH4bucD+JqVCnZ74ffc4fcw4RLH5THr99DnE/T4aYwKT6B2+QThAfdn5wOzyx1ie+H3nOP3buESs/MK98KJCnZ74fcw4ffc4RLH5/fQ6zHlE/THoR33KMf3vMcB96DJ90bJA/g39ygV3wr7E8U76B/8CPdmFYkd+2D7Ofc592Ee96+IFaAK/wGagABpChL4Hs9ZvRPAXAr7Cvg6FZEdE6BZBlJra1IeE8ByBg73NMf3rccB96/W9w5pHfsZ90AVXR1sHWMdDvcox/cYxfbHEveqQQoT9FwK+x73pBWxHXJRBhP0NwoO94DHAfg8aR37RPeMFfdMQMzWt8df95FYBvta+5oFix33Jcf3McXRxwH4e2kd+xv3oG4K9yjH9zTH1scS963GUND3HMwT7FwK+xv37OMKE/TWHRPszB34fccB9/ppHfse+InUHfcox/cZxPTHEvenQAoT8vg0fxV1Hfdfewr3Ofs5+1/7Yfs5+zn7YB/7IfeqFVAdE+w6HRPyPx1IChPsOx33KMfWx/c0xxL3rX4K+DR/FXUd9197Cvc5+zn7X/th+zn7OftgH/sb95IVwR14Ch4T+PcXHRP0lh1/1uDH97zH4tYButb3I8n3Rsn3Izkd9yOIFfsTxTvo6MXb9xP3FFHcLi5ROvsUHskW66zAw56bhYCYHvsU+2EFhZ+IpKcatPsWFfcU92IFkXaOcW4aLWpWU3h7kZZ+Hg5/1v8BW4AAaQr3U9YSutb3pM9ZvfeM1hP6Twr3RL8VkR0T9kkKE/pyBg5/1uzH963H5dYButb3Ntb3Dsz3ODkd9zb7WhVdHWwdYx0Of9bgx/cYxfbH4dYSutb3MEEK9y/WE/7ATwr3MClcHRP/QHAKE/7ANwoOf9b3Qcf399YButb3wsz3cTkd9wr7DhX3TEDM1rfHX/eRWAb7WvuaBd+UFe/3GQX7GQcOf9bdx/cxxdHH8NYButb4Acz3Mjkd9zMlbgp/1uDH9zTH1sfj1hK61vczxlDQ9xzM9zPWE/3ATwr3M3HjChP+wNYdE/3AzB1/1vg+x/HWAbrW94DM97M5Hfcw9xfUHX/W4Mf3GcT0x+PWErrW9y1ACvct1hP+YE8K9y0vFVAdE/2gOh0T/mA/HUgKE/2gOx1/1uDH1sf3NMfj1hK61vczzPcdz1HF9zPWE/9ATwr3M/sIFU6dvWrCG+XE5Pci7GDiLj9RVTQ3wVTQHxP+wLKpm6afH0CCamBcG3gKHhP/QPcXHRP+wJYdpiQdAcHn+BDnA/fkowqvq4J5pR77jPxTBXS6fsrZGuL7jxX3jvhZBadbmkc1GvtKRyX7DmJplqFvHg77Zovh+EvW9wJ3EvdN40bQE+jqsgpeJB0Bn+f4EOcD98KWCl6L4fhL1vcCdxL3suNG0BPo91iyCl6L4fi+4QHG9wH3uOcD06odXuAKteb3xudI5hPo97mLCl6gdvcl4fhzdwH4M+MD+IuxCl574ffT3/cr4QH4a+cD+JeVCl574ffc4fcw4RLD5THr99DnE/T4ZYwKXqB2+QThAfd65wPGyx1ee+H3nOP3buESpfMK97SJCl574fcw4ffc4RLD5/fQ6zHlE/TDoR1eoCIKAZj40gP4318dDvffi8f3rcf/AKuAAFsd+FbW9w7ME/SAWB0T7ID4GAcT6oBJChPtgHIG+Pr9AhVdHWwdYx0O99F7x3R290TF9sf/AKuAAFsd+DtBChN9UFgdE7tQ+BgHE7rQSQoTu1ByBvjf/KJcHRO7YHAKE7tQNwoO98l7x3R290TF5sdfx/edx3t3ErzW9w7M99FBChNz0PmEXx37avfZFV0dE7XQbB0Tc9BjHRO10PjX+3lcHROt4HAKE7XQNwoO98yL9xtPx/8BtYAAWx343swTtVgdE634GAcTq0kKE21yBvjK/LcV90wGE61AzAcTbda3BxOtx1/3kVgHE237WvuaBROtix333Iv3G0/H90LH9xjaCvh9zBOrYPmcXx37gvg5XB0TraC2ChO1oHJyb2ceclEGE3VgNwr4mfvxFfdMBhOtYEDMBxNtYNa3BxOtYMdf95FYBxNtYPta+5oFE61gix33xnvHdHb3XcXRx/8At4AAWx35BMwTfUBYHRO7QPgYBxO6wEkKE7tAcgb42vyjbgr3z3sd9Mf/AK2AAFsd+DRAChN9SFgdE7tI+BgHE7rISQoTu0hyBvjY/JwVUB0TuzA6HRO7SD8dSAoTuzA7Hfffex3Wx23H8doK99NAChNy2fmcXx37gvg5XB0Ts2m2ChO1aXJyb2ceclEGE7VZNwr4p/vWFVAdE6tWOh0TtVk/HROzWUgKE6tWOx332nsd08dwx/cQxdHHEveTzPfUQAoTt5D5lyAdNgYTd5DyCvt9+DWbCvii+9IVE7eQUB0Tr2A6HRN3kD8dE7eQSAoTr2A7Hfi/ex30x/ePxxL3isz4UUAKE75A+gsgHTYGE35A8gr7fPke2R344vz0FRO+QFAdE72AOh0TfkA/HRO+QEgKE72AOx1efPcLHXyTCl6gdv8A+YAAaQoS96bPWb0T4Pdf97++Cl6Lx/etxwH3NNb3DswD9zn3p5kKXnvH9xjF9scS9zRBChP497z3fhVyUQYT9DcKSogFsR0OXov3G0/HEvfQzBOg+BH4GBVYBhNg+1r7mgVY90wHE6BAzAcTYNa3BxOgx18H+zkW5Qpee/cRHfgZmgpee8f3NMfWxxL3OcZQ0PcczBPs+Af3v6UdXp9299zHAfeKzAP3OvgX1x1ee8f3GcT0xxL3M8xdzPcGzF3ME/L3wHsVkB0fE+w6HRPyPx1CyF7bHj/3DhW1qqi4uKpuYWVsc15ebKOxHhPsOx1ee8fWx/c0xxL3PH4K93zfkgpe98r3Cx33ypMKXv8CPIAAaQrkdxL3ps9ZvRPg91/5Ar4KXvfZx/etxwH3NNb3DswD9zn47JkKXvfJx/cYxXJ39yzHEvc0QQoT3Pe8+MMVclEGE9o3CkqIBfcmHR8TurtouF2ZHhO8tpiisbAaxVa5RkxUYVWDHsyHBaGOop2uG6ukc20fE9xycm9nHg5e+CLH95F3AffQzAP4EflbFVgG+1r7mgVY90xAzNa3x18H+zkW5Qpe98b3ER35W5oKXvfLx/c0x9bHEvc5xlDQ9xzME+z4B/kGpR1e+R7HAfeKzAP3Ovla1x1e98vH9xmra8Ryd/cqxxL3M0AKE5yA98D3yxWQHR8TmwA6HROcgD8dQshe2x4TzIA/9w7IHROrADsdXvfLx9bH9zTHEvc8fgr3fPgvkgr8Hw77t/sD1PcG1AG61fcE1QP3RvsDFdLFxdLTUcZEQ1BQQ0TGUdMfUvcVFaqlpqqqo3BsbHNybGxxpKoeDhwG20gdHAjkAxwJIm8dHPe0OxwISmEKHASDSB0cBowDHAbKbx0c+gw7HAXyYQr4v0gd+sgDHARybx3+MDv6LmEK/E6L9wIBun0KDvxOtQr79Iv3AveH9wIB5/cBA+f3AnkK94dYCvv09xsd5/cBA+f4Y3kK/GNxCkOL9wIBuvcB1vcB2H0K1vsCFfcB9wL7AQb3TvsCWAr8QLAd/ED7IXb47PcCEsH3ASzjE9DP3R19+AZYCj2iHT37NuH4pvcCErrn6vcBJuPt5xPs9973/BUzBkZ6aVVmHjRQZlRGGvsJ7Tn3IPcQ7uz3FZceL5EFNYBTTzobNVO6zYwfzbqevrYe0sWhvOMaE/Ar6VgK/E73hvcTHff0ZAoO+/D3Q/dbAbr3XwP3KfdDFcS3tMXFX7VSUV9hUVG3YsUfDvtlrh37ofet91wBuveuA/dh+HUVLAZM+1wFzgbEFs4G5vdcBSwGDvs7nh37Nt4d+zu7CoiECvtlrh33negKut0K+NqDCvs7uwr8Tov3AveH9wIBun0K+wH3h1gK/E61CvwFsB37O54d9xGFCvxOh/cTHfVkCg49oh37tfhT95uLdxK64+HjE3D3b8Ud/GH4U/ebi3cSuuUTYLogHT8HE6CZ+08FyQaZ908F1wcO/E73Gx269wEDuvhjeQr8Y3EK+zbeHfxHzx377YX3BveH9wYB5/cIA/cqvR377GQd94T3BhLn9wj7APcBE/D3KrgdS4X3BgG69wjR9wjQ9wgD9IVeHfcUxHUK900WaqRzrKyko6yscqNqanJzah4O/EeYCvxH+yF2+O73BhK69wj7AeMT0MHdHYT4QZ0KPZ8dPfs24fio9wYSuufb9wgw3+/nE6z33Pf8FTcGVHhbWWkeME1mVEYa+wntOfcg9xDu7PcVlx4vkQU1gFNPOhs1U7rNjB/Nu6DCuB7KwKLL1RoT9PsB9y0Vcx38R/eE9wYBuvcIA/T3hF4dDjrUCvxHhfcG94f3BgG69wgD9L0d/AWYCvxHzx09nx38RmQd94T3BhK69wj7APcBE/D0uB37b9EK+2nRClz3kNsBuviMA7r34BU7+IzbBw73ofeQ2wG6+cgDuvfgFTv5yNsHDjrUCvdq93/3UAG6+ZED+Y74KhW9SQVFQkFoQBtceZHD+wMfolxVmmQbR1dwSlEfWtAF3+XDptsbtcV8drQfUPcHmoa5G8i2oMnPHw7W98vbAbr5BgO6+BsVO/kG2wcO++CmCvvgpQr7cY8K+3GkHfvIpwr7yLcd+7J3Hfed2B0O+7J3HfedA/cVygoO+6hM+gwBuvcgA/fW+c0V+6f+DPenBvtI97OL98/3SPeyCA77qEz6DAH3SvcgA/fW+c0V+6cG90j7sov7z/tI+7MI96cGDvtxjwr7caQd+4z5ftsBut0Duvd9Fd34lfdx2/vDBg77jCTbAfeg3QP38vh+FTn8lftxO/fDBg77C3cd+ETYHSn8ZxX3S/xoBd0G+0v4aPdL+GcFOQYO+wt3HfhEA/e8ygr8RPxoFd0G90v4aPtL+GcFOQb3S/xnBQ77ivsm+ngBut0D97355hX7jvtzBfy3B/eQ+3bAxftz910F+HUH93H3WgUO+4r7Jvp4Afei3QPx+eYVVlH3cftaBfx1B/tz+13AUfeQ93YF+LcHDvuM932z+B2z27MBurPbs/KzA7r3fRX3NPhF9yP3NPvDBrP8vRX4lfdzO/sj/EUHDvuMJLPbs/gdswG6s/Kz27MD9/L4fhX7NPxF+yP7NPfDBvubsxXb9yP4Rdv8lQcO+7JMs/m8swG6s72zA/fM+c0V+53+DPedBvtI97OL98/3SPeyCPt1/eQV+bz3Lgf7H/ugi/uj9x/7oQgO+7JMs/m8swH3SrO9swP3zPnNFfudBvdI+7KL+8/7SPuzCPedBvtWsxX3H/ehi/ej+x/3oAj3Lv28Bg77yKcK+8i3Hfvgpgr74KUK/EpkHQG89wED9zIWXgoO+6P7Gnb3L/cZHRZeCvtv9y9xCvuj9x0dxfcBA7z4zfcGHfcC+53QCvuj+Oz3GR347BX3AvsB+wK0B2T7LwW9Bvtv9y8VtAZk+y8FvQbE9y8F9wL7AQcO/Er3HR0DvPjN9R38SrcKINf4JAG6+FC4CmP7ghX3Hfs2BfQG+z73XPc+91wFIgb7Hfs2BQ4g1/gkAbr4UAP39uEd/FD7ghX0Bvcd9zYF1wf7Hfc2BSIG9z77XAUO+8nX+CQBuveGuAoO+8nX+CQBuveGA/cs4R0O+7H4U/ebi3cSvOPh4xNw93HFHfxd+FP3m4t3ErzlE2C8+VoVPwcToJn7TwXJBpn3TwXXBw77ForX+A/X89cB/wDogAD/AFKAAAPHFsSK5om9upXkGa/31QX3Pdf7NQaRvQWuj6Cerxvp1gY0jDCMWV2BMhmGXQU0P9oGZ/vZBWiHdnhnG0oGDofvCt7X9wrnTecT+ucW9z8w1+YG9yiM59n3DhrnUMkqlx4T/NeavcPWGvcHQND7G5Ye7D8s+z8H4/0EFfd83vt8Bzj30hX3cN77cAcT+tf70hX3fAfqisBhQRpFUl8wih4T/PfUBPdrB9eCtWVOGk9hZj+BHg74v0gd+sh0Cvou2/4wfAocBINIHRwGjHQKHAXy2xz6DHwKHAbbSB0cCOR0ChwIStsc97R8ChwEgkgdHAaLAxwGyW8dHPqlBvej96MF+wUG+8r7y3Id+6L3owUcBVdhCn/W94PQtu/3HdYButb3JfDy8PceOR3q+y8V1AbLo7muxhvGuWhLox/UBvJzPcwnGyc9SiRzH733mhV2CvdgFnYKDn/W7tD3S+/3HdYButb3JfDy8PceOR3cgxX7AJvlO/cCG/cC5dv3AJsfRAZGe1BZRRtFUL3Qex+E9wcVdgr3YBZvonSnpqKip6Z0oXBvdHVwHg73oegKvN0K+NyDCnSEClegdvkO1wH3qtfS1wP4iSAd+3MG+yktPfsQ+xDpPfcpH/vG1/kO0v0O1wcONPsB3fkG3RLX5TTl94HlNOUT1Pgu+I0V45EF9wF8+wXINRv7BC5UJFypaMdxHxPoSm9vXlQaP79j9yhoHul0r29jGl9db0RAU7LLgR4yhQUile5B9w0b8vO87cB7tkuqHxPUw6GmsL0a51m0+y+yHimlcJ20GrO4p8fZu2dRlR4T5PuI+2YVs7inx8Hfd01fXHFEHi2VbKy0Gg73U3/UQvcw9zn/AGaAAP8AnIAA9zJC1BK81UH3PviC1RNz+Dr4zBXz0VAslB9AhgXCg2KuUBs8WlcxMLxW2sm1sMmTH9aFBSeBRU0gG/sRPdz3GPcY2dr3ER8TjfwJ+2cV+2D3Ofs592D3YHsK+zn3Oftg+2D7Ofs5+2Ae1Rb3NvcZ9xr3Nvc19xr7Gvs2+zb7Gvsa+zX7NvsZ9xr3Nh4OYOkK6r/xvuXEA/e49ygdyyEFxgZE9wUFsZWhp7EawGCrRB77h60d9yfcCmDpCvcCv/G+1sQD98f3KB3Ts6nAv1+sRR/7lq0d9zbcCveJ9/vJ93zEAfdfx/c0x/eTxwPnIB1S9wP7usf3uvcDxAe8+/MVx/eDBuX7gwXXBuT3gQX7gcf38zoHIfu1Ife1BTkGDvuN+BjV9y7VAbrW9yzWA/da+BgV3s/P3t5Hzzg4R0c4OM9H3h8/9ysVta2utbWtaGFhaWhhYWmutR4O/B1ZHfui+PX3FgG6962HHcMWUR38EfcMHf3w2/nwBw78EfcMHfv32/f3Bzv98BXb9/c7Bg5BoHb4Wukd/Frb+Fr3KR1B+xV29zjX+ADpHfwA+y4/9y77ONv3OPct1/st+AD3KR34U4vbyNn3VNn19weLdxLn4/gP48rYTveWT9cT70BEHRP3QPjnB/fn/OcF9xT5WjP88gb77fjyBfiE/B8VIMNI5OTDzvb2U84yMlNIIB4T7oCb+88V95bb+5YGE+9AyPd/Fcmjrbe3pGlNTXJpX19zrckeDl73ZLzpva+86b0B2r73Xr4D9+D4JRX73vcYHQf8XSYV9xgd+2AGDvdo93z3INv3RgH4NuXb9yAD9+b3fBX4Gvgi+yD7lvuO9wMG+0n7SfdJ+0oF+7X3ShX4BfgFBftv5feW98D8wvwa+3EHDl73870B+Ca+A/i4+CUV+4VZ6vusvves6gb8hPerFfD73gXBBvD33gVVBkH7j0H3jwUOLzD3NU52qnb4s3cSuuXY/wBLgAD//+uAANcTOvg59/QV5ZF/60TLNJ4Zk+cFPwaDMwX7GX82IvszGvsfzCn1bR4TnIMyBdcGE1yS2vcDjOrVnPcLGTCRBROagERXYU2GrfgTGBM6t32uaJNXCPuwNBX3ALfQ2JoeavwKBVOma8rnGg5R7NX3kNW4dwHo1feQ1QP3uewVtbGYoasf2jzBwTzaBaCrmLG0GrR+snarHtraVcE8PAWga2SYYhtiZX52ax882lVV2jwFdWt+ZWEaYphkoGsePT3BVdnZBXarsn60G/sS91wV0MTE0M/FUkZGUVJHRlLE0B4OjzD3OjXhSnaidvkd4YV3EtXn9xXX9xPnExeA9yv3fRUvhZb7Fegx9xh6GROHgDnXBxMngNsH9wiV8s73Dhr0Ksv7Dq8e94EHyHe0WZVJ55EYfvcDQOH7CKIIExuA4D88B/sWhzBB+wka+wf1UvcHbh77jwcTF4A7nVvEe9oImve+FRMbgMvBtNaPHvt1BxMXgEefTqnNGhNHgPdh/FwV93wH42uyZFIaS1loPoYeDuZ74fc419nX90ThAfcj5wP5SPd0FS2RBS54TEg6Gy1M0OpwH/cyBpbXBftLBoqZipqaGpaLl4yWHvdVBpbXBftUBvCkytbuG9fIUDahH+eRBfcWbCzp+xEb+yMj+wL7LGofKz/gBoqAi3+AGnyMfIx9HjU/7Qb7Jq/yI/cfG/cd6fD3H6UfDqh/4fc019nX0Xf3EuEB4Of30OcDxvd+FbEGg3yHeXoa+wfwOvck9xPu0PcCqx4mkwVNcE1kQhs0TrjMnJGcl5sf+DjX/MAG2QT4wNdbBpaekqKgGvcOK9j7LfsGMEH7Cmwe7IIF1avBtMwb4MdcSXGEd3p6H/wuBg7Xi/dZP9fZ4feb4RL3NuMz91/3aOcTuvg1IB37k/yV+wgGE3o/9wgHE7r7DeMHE3r3DQcTdvcHBhO21wcTuvsH2a8KrqB296fh6Nfp4T/XEuf4ohP0+BwW9w8G+8L3pwXVBvcj5M33BZwf3dc6BhPshbR8rnOnCPcSBhP01/yiNfdXB+a/bEyZH/v0P/fzBk18V2wyG/tXNQYO9xaL4Piw4AHn49vj2uPb4wP4ASAd+6X9WuP5BfdPBrCidGYf/C7j+CkH51HFLx4i/VoV96UG58XF5x/4xDP8yQdmdHRmHvtP+GozBg5ui+T3d9f3jOES9xLmYOE194oT8Pfm+WoV+wotNvsEaZNlml0fkXgFKz8GE+j3BQaMfox+fxo3ZE9AXh4yB/iFjgXh/DgH6bWx5YLqCBPk9zTXBhPw+0UGe7+Bs6oa1Me/zMS9a1SdHvGSBd18Qt/7IxsOfaB29yLbzNv363cB96TjA6AgHfdh++sF+w479zxK+zw79zz7IuP3Ivcy2/syzPcy2/sEBvdg9+vrCg5A95Pb91p3AfeJ2wO69+MVO/da+1rb91r3Wtv7WvdaO/taBw5A95PbAbr4cAO69+MVO/hw2wcO+zL1+B4BuvgdA/L4iBVTUvcg+yD7IPsgw1L3IPcg9yD7IMTE+yD3IPcg9yBSxPsg+yAFDkDg9wbh2+j3BgH3ffcIA7r4ARU7+HDbB/u2+3N1CvgJBHMdmvcw2/cS2wHn+HAD5/hOkh37shX4cNv8cAYOQPcw2/cS2zv3PBK6+HATsPfc+KYVE9BwMwX7kgYTsDv3egdk+xIF+1M79zsGYfscBdoGtfccBfd62/tiBrL3EgX3OwYT0Nv7IwcTsKbjBQ4vq/iWAfhA1wO8+LYVMwf4D/s9/A/7PQUzB/hb918F9wAHDiur+JYButcD+Ir4thX8W/tfBfsAB/hb+18F4wf8D/c9+A/3PQUOQPUKutuSHdwV+HD3FwX3AAf8cPcXBTgH+Bol/BolBQ5A9Qr4n9sV/HA7+HAG/HD3uBX4cPsXBd4H/Brx+BrxBd4H/HD7FwUOQK7b92HbO/dmEveJ2xPQuvcHkh33YRX3WvsW2/cW91rb+1oGE7D3FjsHE9D7FvtaBw4g3dc/90j7PvdHP9ep1z/3R/s+90g/1xK62/ew2xOJwLr3yhUTgsDbBhOJwMqbtLGsnHJxnx5toqZrxhvbvtbzHxOEwDsGE4nATXtiZWd6qKd1Hqd1cKdUGztYQCIfEynA+24E2wYTmcDKm7OxqZx2cp4ebKOlZ8ob277X8x8TScA7BhOZwEx7YmVhe7Ksbh6hd3GeXRsTKcA7WEAjHw4g93/aPPdO+0T3TjzaErrb97DbE5y694kVEyzbBhOczJu1sbGbaWykHnCgp3K+G9u+2fcAHxNMOwYTnEp7YWVqeqWmdx6qdHCsUBs7WD37AB8O+zT3f9sB9/rbA7r3zxU798v7Pdv3jQcO+4f4E/e2OtwSuvfIE6D3o/gTFd8GE2An97YF+wAGE6An+7YF3wYTYNH3ZQUO91jq2fdX2j3ZErrl+MvlE7j4CvejFUtmWGlTG1dit8HBtLe/H8SKvWmwTAj72xYq2Tzq29q02bUeO7XcZNwb6Nfa7B8T2Ow/2i4eN4o+YmA9CBO412A/tzkbLD08Kh8T2Pg4FrHLv63Eigi9irNgVhpWY19Zih5RileuZssIDvue+yrY+VbYAYv4DwP7KQS6iuaJvbqV5BnN+OiPrqCgr4kZuomS2FyMMI1ZXIEyGUr86IdodndnjBlbjQUOkovb+MHUi3cSoPj2E7Cg2xU7+PbbB/uM+QoF+wYG+zf9ChUT0Pdw+MH3cPzBBQ5u+xV2+aDbEqT3Uzvb91DbO/dPE+T44yAd/Mo7BhPY9wP9oNv5oPdQ/aDb+aAGE9T2Bg77ByUdAab4cAOmIB02B/dJ+6L7SfuiBTb4cOH8Cwf3SPeh+0j3oQX4C+EGDmn7FXb5pNcBofjLA/jhIB37rQb7HP1XR/fhBTkG8Px6BfAG9yv5pAX3agYOW/cNHRPovAr3L/ccuvik/Ei4djwY90J89fsLjftC0woIE/DWhchfmD+C+xFBOSyTCBPoMpRTzZXvCA5Y+xV29x7XYHb4pncS5eH3iOE53RO8+I4W+KY1+9AHE9wvV1E3Q2e97x730DX9POH3XAdlnLVzvBsT2sjBscikHxO6NAcO9xGFCvhXwwqv2Pcd1xOr8PocFtzL2OzsS9g6Oks+KirLPtwf/e34rRUTGwCTHR4Tq/A6Sz4qHxNGAKz8uRXsBvia+XYFKgYTGwD8bvtRFcalsLW1pmZQUHBmYWFxsMYeE6Dwvx332tIKDtb3FR35WhX7y/vKBfsFB/eh96EF/MDf+L4H96H7oAX3BQcOfPkM2wH/AfSAAP8AUIAAA/jZ+VsV/EyMPDsF+BAG/B38HcZQ+Bz4HIz8ENvbBQ73N/fM3wG8+VoD+YvbCvzAN/i+9x4dfOcK+In/AE+AAAP42I0VjPhMO9oF/BAH/B34HVBQ+Bz8HPwQits7BQ7W9xUdFvfL98sF9wUH+6H7oAX4vjf8wAf7ofehBfsFBw585wr/ADGAAP8AT4AAA72NFfhLBtvb/BCM+Bz4HFDG/B38HQX4EAc7PAUO9zf3zN8BvPlaA7z39hVyHfug96EF+L7f/MAG96H3oQX7BQYOfPkM2wG8/wBQgAADvPlbFfxLB9s7jPgQ+Bz8HMbG/B34HQX4EAY82wUO+CX3zN8BvPpIA/p52wr9FAb3ofehBfsFBvvK+8tyHfug96EF+RD3Hh3W+yB2AffS3wP3/Ps1FffL98oF9wUH+6H7oQX5FAf3ofuhBfcFB/vL98r7y/vLBfsFB/eh96AF/RAH+6H3oAX7BQcOm/c82vcZ2QG8+McDvPfIFd8GnsSzp6x4rHiIZZFkkGmXaLdxz2Tcs8Hl4lgYdfeD+2so3VtrVWlwa54ZbpuJqoithrGEtVipO7n7CEB6IAgOrvfO2wG82wP3Off2FfdX+zYF9w73o9v7pPcOB/vK+/kV2/gaOwYOrvfO2wH4u9sD+Jf39hX7Vvc2BfsO+6Q796P7Dgf3e2oV2/gaOwYOnvcnHfir2xOw+B/3iRX3D+zn9wr3Cirn+w8f+7s797sG2clSQkJNUj0f+1sGE3D3EvcRBfsBBvs4+zn3Ovs6BfcABhOw+xH3EgUOnvcnHbzbE7D3ofeJFfdZBvsR+xIF9wAG9zr3OgUTcPs49zkF+wEGE7D3EvsRBftbBj1NxNTUycTZH/e72/u7BvsPKi/7CvsK7C/3Dx8OpaB2+CffAfiu3wO8+FEV91f7NgX3DPe6/Cff+Hv8D/cMBw6loHb4J98BvN8D+QL4URX7Vvc2BfsM/A/8e9/4J/e6+wwHDqX3c9/4J3cBvN8D+QL3nRX7V/c2BfsM+7r4Jzf8e/gP+wwHDqqgdvkK2wH4PdsD+GUW9zb3VgX7DviY/Fw7+Az8R/sOBg6l93Pf+Cd3Afiu3wO8950V91b7NgX3DPgP+Hs3/Cf7uvcMBw73Mdv3mgH3zPdIA/fM+DoV++r3SPfq8Af7U/dT+1T7UwX7UTsV+BH4D/gP/A8F+2X76vvo9+oGDvtz9yUd+UoV+zb7VgX3DPx23/h19wwGDmT5XXcBvPiQA/jB+V0V+5B04Db76fvpx1D36Pfp4DUFDvcV99XfAbz5OAP5aff/FftW9zYF+wz8djf4dfsMBw5kjviQAbz4kAP4wY4VdPeQNjb76ffpUE/36fvoNTYFDvtz9yUdnRX3NvdXBfsM+HU3/Hb7DAYOZI34kAG8+JADvI0V95GiNeD36ffoUMf76fvpNuAFDvcV99ffAbz5OAO8+AEV91f7NgX3DPh13/x29wwHDmT5XHcBvPiQA7z5XBWi+5Hg4ffo++nHxvvp9+ng4AUO91n3wN8BvPl8A7z36hX3Vvs2BfcM9/j7DAf3Vvc2+1f3NgX7DPv29wwHDvtzj3b5fHcB9z3fA/dnehX3NvdWBfsM9/j3DAb7NvdW+zb7VwX3DPv2+wwGDvdjlHb5dncBvPmGA/g+fxX3afc49y/3afdr+zj3L/tp+2n7OPsv+2v7afc4+y/3aR8O92N/0/jm0wG81fjy1QP4Pn8V92n3OPcv92n3a/s49y/7aftp+zj7L/tr+2n3OPsv92kf+8P4BBX3QfcY9xH3P/c/9xj7EftB+z/7GPsR+z/7P/sY9xH3Px4O92OQ1fjg1W93p3cSvNX48tUTnPkV9zoVv1ecnJuemaAZTbSAen99fXwZ/OT3XBVyjnKQdB7UmgWGnomeoBpI0xXUfo6ekZ6SnRlHp4F1hHOHchmj+20VlXWYdZl3x7cYgJqBnIOdCGf31xXJYpacl5mZmhlXv3p6e3h9dhnB/GwVnXqefKB+sskYepZ8l3yZCBMojPidFbROmpadlJ6TGW/PdIF1gHd9GdT9IRWigqOFpIaX1Bh3j3iQeZIIE8Sv+RQVmUMFjp+ejZ8b1Qdyc4iHcx/U/W0VpKOOj6MffdMFiHd4iXcbExS/+OEVn4eehp2EptAYdJRzkXKQCL/9FBWnR6KVoZafmRliyHyAeYJ4gxm6+KEVnICaf5p9vcEYeZx4mnaYCLr7JBWWfJV6k3nPqRiBoX6hfZ8Ib/vYFc9vlaGSo4+kGUKYiHiFeIR5GZr3QhWQeI14dhrVjAWkiKSGoh4OI4vQW3b409ASvPhPE3D3bvkYFfs9+9b3PfvWBfQG9z331vs999YF+0771hX3GveR9xn7kQUTsPsZ+5EFDvds9Ar5WhX4Lv1aBf3HBg73RmcK5/laA/m29/gV/Vr3+AX9XQcO92z0Chb8LflaBfnHBg73RmcKoPlaA6D3+BX5Wvv5BfldBw73bPckHdsV+LAG+6P4awX8Lfy7Ffgt+Vr4Lv1aBQ73RmcK59sD+bb3+BX9Wvf4Bf1dB9v3FRX4Wwf4V/t3BQ73bPckHfkKFfeh/Gv3o/hrBf082xX5xwb8Lv1aBQ73RmcK+R/bA6D3+BX5Wvv5BfldB/yn+/gV+Ff3dwX8WwcO/RnBCv0Z1wr9GcQK/RlZHf0Zxx39GVkd/RmtCv0ZtAr9GawK/RmvHf0ZlAr9Ge4d/Rn5BPcCAbr3AQO6+XL1Hf0Z4x39Gasd/RmnHf0Z94vXAfdb+DQD91v31xU/+DTXBw79GeMd/RmcCv0Z0B370cEK/GHXCvwdxAr8HVkd+6PHHfulrQr7pbQK+5+sCvwArx37a5QK+7vuHfvjqx38FKcd+7KcCvxR0B38SrcK/B1ZHfxh+Hv3c4t3ErrlE2C6IB0/BxOgmfsnBckGmfcnBdcHDl4Of/l2Abr5dgNcCg5/1vjg1gG61vjgOR0Of5f4ppf3PJsG+zaXBx6gN/8MCYsMC/nUFPkZFakTANkCAAEABAAKAA8AJwAvADkAPgBIAFQAWQBeAGQAaABuAHMAgQCLAJEAlwCdAKsAwwDKANsA5QDuAPUA/QEDAQsBHwEnATABNwE9AUMBWwFgAYABlQGaAaIBrQG2AbwBwwHLAhcCPwJEAmsCggKIApsCnwKjAqwCsgK5AuoC9AMEAxMDGAMiAywDMgM9A0YDTwNWA10DZANqA3cDhgOQA50DoAOzA74D0QPYA+gD9QP+BBAEHQQsBDEEOwREBE4EVwRgBGcEbwR3BH8FKwW6BegGBQYNBi4GlQa5BxcHdAeCB4oH2wgNCCkIQQhQCHQIuAjOCOUI/AkOCRgJHwk4CTsJRQlPCX4JgwmUCcMJ7woaCkQKbQp5CoQKjwqXCrIKzgrjCv0LCQsqC0QLZgt+C4sLjwugC74L3AvjC/4MGgwhDDMMOgxVDGkMgwydDKsMtwzKDOEM6wzvDQUNDA0VDR0NMQ1ADVINZA13DYoNmw2mDbgNxw3LDdEN3g3vDf4ODg4dDi0OPQ5HDlEOYA5tDnUOfQ6LDpkOpw6wDr0Oyg7XDuQO8A78DwgPEA8bDyYPMQ88D0cPUEUdDsg2BWUKDnb5WncLepugebYbx7LA2h9MBlx+dnBvf6Gedh4Ldh1PZFg7HwsV5ewxBvckKiIdy5DLEgv3Ih2fm6OZnx8LFeb7FgXOBkz3FgUO+1L3FgvK92bKC/cAvPcAC4uCCguOQQXZBgvN9yzNC+H//7CAAP8AT4AAPdkLf91F0fgezUnZC/ib+KYVC4vX+A7XC3vh+RV3C/dbBvsHhEYy+w+0HR8L4LVgM4wf+y5tBfsKdDlw+wIaLOFT9B4L/BL3nccKC6QGtqxsZGhscGNia6OqiB8L+SMW9/z7sDUHC/sJdjhw+wQaC9/FuLuhHwt/12B2+KZ3CwZlYVYKC2IK+Fv3AR0LsNd1BnWBlaEf92gH9yI+2/sdHgttonSq7AoeC8xdzPcGzF3MC8z3GMxZzAvhN9882gugdvimdwvGClUd9wTs1fcMnB8wkQX2HcrEY0eWHwt6HYYdC6D5WhX3Tv1aBfcCBvcf+Kf3H/ynBfcCBvdO+VoFKgYL+yP84fsm+OEFKAb7Jfzh+yT44QULzI/IHQtZBlJra1IeC3vhWnb3puH3rOELi+r3xfcWi3cLS7t6wR4LYgrj+VoHC/snK/sA+z0L+DR/Ffdg9zn3Ofdh91/7Ofc5+2D7YPs5+zn7X/th9zn7OfdgH/u6+AYV9zj3FfcV9zn3OfcV+xX7OPs5+xX7Fvs5+zn7FfcW9zkeC/etpxXOxa7DpR80B0JTZC5KXqi8dR4xhQUupN9O9wUb9x/r1fcgHwvnA6gdCxVWtWO/vrWzwL9htVhXYWFXHsOMFZ6cnaCfnHl4d3p5d3Z6nZ8eDilUVzo/a7/tHvfQNfvpB/sExTL3Ch4L3gpgCgYL+yvsIfcdHvsk95UV9wDEzuceCwWEHQv3EB0OFfcB9wL7AQYO2Ar30QcL0Miqz6cfCzSjIqLiGs7Gtdvsz1EzmB7nkQX3F3wm6vstG/scK0D7DPsH9VL3B24f9yFnyWBDGgv4NH8VdR2JHR8LXrKqdbsbwra0v8BjsFIfC/cC+wH7ArQHZPsvBb0GC6BiHdoL9+jh+xL4rvcMCwb7ovujBfcFBg7nIB39WgsSuuX3u+E24DndCxX7AvcB9wIHC9kGNPcMBSIGCwH4X+cDvQufdvlddwELQk1rRHAfC/8AMYAACyQdyvcWAbzn+GZRCgsjHc73FgG65ffG5QNKHQuDHfc58vH3Nh4LMwrt9xYB2OP3/EAdC5sKDvcPHRPozwoT8EZkbUp6H4jqBQuFHXJyb2cfclEGCxW0BmT7LwW9BsT3LwX3AvsBBw4BxPhIwgoL4gr70eH36Qf3BFHk+w0eCwPJ9/cVch37ovejBQsVaqRzrJQdHgtvonSnpqKip6Z0oXBvdHVwHgvKBrqZn6ajl3p6nB4LbXiYpoEfjPdCFbykq7YLZAr7AQtTHRN+gJP7CAUL9zn3Ofdg92ALBvej96MF+wUGDvcBA7r3AmQKC8z3Hc9RxRP4C9v4phX8pgvlfeN35RPoC/cBI8v7FK8L4fd43/d24Qv4fhWHVgWydluiThv7FUUn+wF/HxPewPsCfsMo9xUbz9CyvKIfE79Amvsb96GJlfe+CPdpkvs39zv7bBv7hPtY+0j7eoMff/vR96T7O/fb9xF60hj7syH7b/cTlfefCPdQkvc19yj3XBv3QvcY+yD7P4UfhvsoJ01kx3+cjrmNoQgT3sCd93oF++j7XBXZk7TT5xsT30DmqEI+hB9Bg2FBMBsT3sAvb9TWkh8Of/l3Afdc9y0D97X5ahXsgtsvaCR5V19WRmD3NvtiGKOrlMyHwuWDGDtxOWRcHuEkBSMGZ7cFZ2RNd0Yb+yol0fcW36+95MkfmJQFXch4xL0a9OHP5YMe+zT8rhVByl3vu7aapJ8e+z/3bgVfblBgSRrS+AYVbJlkrlsey6izubYauXGsYI4eW45mZIxdCA7DChNXwPjq+WoV/Jr9dgXsBvia+XYFE5vA/Rz7URWTHTpLPioe2NIKE7vAvx0OMx10HROyNR0TuDUKE7Q6ChN0TAoTcj4KE7JFCg4yHc73Fp0dC1YdE7hANR0TuQA1ChO4gDoKE3iATAoTeEA+ChO4QEUKC3sV9y33Adz3FuJYzzauHxPsy6exudMa9wQs3vsZ+xgrOPsEQ7BdzG8eE/I2aVhHMxr7FvcBOvctHvs+924V3M2+8/PNWDo6SVgjI0m+3B4T7K333RXOv7Xf379hSEhXYTc3V7XOHg4vChOsIDEKE6yANQYTnIAtHROcQDEdE1wgLQoTnCA2ChOfIAv4OBVVjAU0B8GMBRP03o3jYywaLDNmOEY4rOGDHjCFBfsJkfI59yIb9y73AOL3EOdUzyioHxPo4aS3wNoa9wEp1/sg+wstRCd+HueFBcOUv67UG+XDZU4vO21JjB8O+LsV55IF9wFrM8b7ABv7YUf7XPtp+wOkMb5XH1W/ynXJG/cn8+z3L/cmLPH7IT9MaEtkH/c4mcvm9BvNvGtSoB8T7PvN+88V6ozQzusb48lILCpKRi8sSdDsjR8O3fga3QHH5feI5QORCgsrHcz3Fn0dC/sH2/lV2wG6ybTcA7r3/BU2B8eNtlM6GjgHJtVE9R662wYhh2Ok0BrnB+ZazUKZHowH0pm+zOUa5wfQs6T1hx7bXAchQUQmHzgHOmBTT40eDovh93vX93vhAfdI4/gS5wO8+B0VP/cX+9H3dgfWCvtw+9EG4/vHFfd79yvX+yv3e/Id2x3OCvsCk+tG9xIb7/a38ngdH3EdxcZoUJceCxVLhQXBHRP4eAq0qGtaih5bimxsZRuWHRXfCvsTxTvoHzL3YxWgCvjzJgq6KgoTcPcr+TgVo5d6epwfE7AjChNwJArKBrqZn6YeDiAd/BsGVPwkBeoGvaHCqMwb8MtNKC5MSi43RLbXgB8vhQX7CZX1OfciG/cj9PD3I/ciKvL7HU5NdWRpH6j3aAX3zgYOowr3Ds8k+0v7Skcl+w77Dkfx90oeDlId947hE7ZZChPWcwoT2mgKE7qI5gULhfcG+O53Err3CPsB4xPQwdodLP0nnQoV5x1jHV0dzVm5RUFVWj6CHg4VuQpKiAXcHQYOFdwdx7kKC/jx9QG6KwoD8PjxFewKbaJ0qh/ywBU/Cg51Cg52+KZ391x3pAoLAc7l96jjA6kKC+uswMOem4WAmB77FPthBYWfiKSnGrT7FhX3FPdiBZF2jnFuGi1qVlN4e5GWfh4OIgq7HQuwChNPgGFkBRPvgF0KoqQFC3sV90H3Afcj93f3efsB9yP7QftB+wH7I/t5+3f3Afsj90Ef+1L4BhX3S8/y9w4LAdvhA9sgHf1a4fcbB/H3A/c++4oF9Qb7bffF92P3dQX7CQb7j/uvBfhjBwv7AvnwAfdD5wP3E/mCFTsG9z77s4v7svs++7MI2wb3Tveoi/fI+073qAgO+wL58AG65wP3nvmCFTsG+077qIv7yPdO+6gI2wb7Pvezi/ey9z73swgO+wLb+VDbErrdOfeHE+C6+YIV/fAHE9D3h9sGE+D7NflQBhPQ9zXbBg6wChNPYWQFE+9dCgv3MfeCFTGDBbMKC9sgHf1azh33jgcLLArb9xaCHQv49csBui4KA/cF+XcVSQZCyVLb28nE1B7wCg749SgduveqE6D3i/j1FWUKNfsMBdkGE2DI4AUOMVXJ9YMf+BMGirIF91KCItb7CBsL9zsG9w4d+zv78RX3m/c7B/bAYDUyVl4gHw6nZgW2lax7axqPHQsgHS0G+/38cwU1+AP7JeP3JdzhOgf77xb3l/fsBfvsBw73IR38S/s0NfgV4fsd+QQGE+hGBj5qaj8eDvskjOgl9xgb9yDj8fc2H/hiM/xiB/sGWUsxNVrH9wCKHgv49fcMAbr3qgP3i/ltFU42TuAFPQZ8HQ5kHQG69wED9zAWXgoOhR0fC/js9wIBvPcBA/cy+OwVXgoOA/dM+HAV+x37NgU/B/cd+zYF9Ab7Pvdc9z73XAUL+2IGbPt2BckGr6GjjaEbsqloX11ta2RobaCshB8LAdvhA4odC/sC+fABvfgOA/hA+wIV+7v58AU4Bve8/fAFDvfJ+G4V+yeYJjV++yx++yLoIPcmf8WFwZ6/tgt2+QThxQoLFXJZBpEdE9BZBhPgUmtrUh4O/BL3neUdC/xa4fha9xnX+xmsB7ejpq0e3dc5BiheUTIfC/j57AG65cHlA7ogHSrl7AfBKiIdA/h5+EcV6vw2P/faB/vk+/0FLvhI1/vrBwuL2UZ2967Zmtn3VNmadxK62Pcd1+vY9x3XC/j19xYBuvcyA7r5dygK9wQd/QTj+QT3cAYL+Dn39BXlkQX3Bn0o0fsAG04KCxXytev3AvcBtiolKWAq+wH7AmHr7h4LoNkKYB3j+VoHCyuMHQv5yRU5BvdL/Gf7S/xoBd0G90v4aAULuvedFVUdC/zyB/vt+PIFC/vM9wUd98wLx33VhUwaVUh7WTxZs8qAHjGFBQvYCvfQB+awutwev9dXBgsV9wH3AmIGsvcvBVkGUvsvBQ73kNsBuvfgA7r34BU79+DbBw4WxqWwtbWmZlBQcGZhYXGwxh4LbspUsUOSCPs/+3wVkuvPyeSDC/sQ2wG6+GoDul8VO/hq2wcOexX3X/cO9yH3eQv3bPcM9xP3d/d4+w/3FPtvHwv4+ewBuuUDuiAdKuXsBw5/CuELIgru9xYLxXJ39yzHe3cSvEEKC/f2FfvK98sF+wUG96H7oQULlhXaugeun35ycXd8aB8O1fcI2veSz1HO9yLVE77AC/gTIB373DX3DPyu+xI1C+jF2/cT9xRR3C4uUTr7FAt74f8BCIAA4f8A24AA4RIL6IQFwZi6sssbC+zCv9/aq1cqHgsVKrY06NfFweLfVcJGHgslFc4GE7Dm9xYFLAYO7/cZBfsZBw4jHc4oHbrlC43/AFCAAP8Bw4AAdwELJtf1yE/R97TG9x3VEgv3cMX3N7fauMbFAbzEC/th9wn7OfdhCwUjBvtS+9v7U/fbBQupo6KpqnOhbWx0dWwL93j30d/70fd2993hC/sVdvce3fga0UXdEguL4fd84fdw4RLn4wtJBmZqbmBgaqiwHgvnFvhO4fv2+QQzBgv8ff1aBeAGC+dR5/ek51HnE/ILi/laAaD5xwP4QguL2/hXdwG6+HADC/cY+R4V+ww+P9gLe+H4zuHO7AG85wv7Lj/3FvcuHw4AAAABAAIADgAAAAAAAAEmAAIALgACAAwAAQAPACIAAQAkACUAAQAnAC0AAQAvAC8AAQAxAEYAAQBIAEwAAQBOAFYAAQBaAGAAAQBiAGUAAQBnAHYAAQB4AHwAAQB+AKsAAQCsAK0AAgCuALkAAQC7AMAAAQDFANEAAQDTAQUAAQEJAQ4AAQEQARMAAQEVASQAAQEmASoAAQEsAWQAAQFlAWgAAgFpAWoAAQG6AboAAQG7Ab0AAgHAAcEAAQHDAcQAAQHHAcgAAQHSAdIAAQHUAdQAAQHbAdsAAQHeAeUAAQHnAegAAQHqAesAAQIRAhIAAQIbAh4AAgIoAikAAQIwAjAAAQI0AjYAAQI9Aj0AAQJBAkEAAQJUAlQAAQJ2AncAAQKCApUAAwABAAEAAAAIAAIAAgKCAo4AAAKUApUADQAAAAEAAAAKAOwB4AACREZMVAAObGF0bgAwAAoAAU1BSCAAFgAA//8AAwAAAAwAGAAA//8AAwABAA0AGQA6AAlBWkUgAEZDUlQgAFJLQVogAF5NQUggAGpNT0wgAHZOTEQgAIJST00gAI5UQVQgAJpUUksgAKYAAP//AAMAAgAOABoAAP//AAMAAwAPABsAAP//AAMABAAQABwAAP//AAMABQARAB0AAP//AAMABgASAB4AAP//AAMABwATAB8AAP//AAMACAAUACAAAP//AAMACQAVACEAAP//AAMACgAWACIAAP//AAMACwAXACMAJGtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2mtlcm4A2m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1hcmsA4m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7m1rbWsA7gAAAAIAAAABAAAABAACAAMABAAFAAAAAQAGAAcAEADIC3oNdg2aGBwZKgACAAgAAQAIAAIAOAAEAAAASABeAAQABQAA/+wAAAAAAAAAAAAA/9gAAAAAAAAAAAAA//YAAAAAAAAAAAAA//EAAQAGAXIBdwG+Ab8B3QIXAAIAAwFyAXIAAwF3AXcAAgIXAhcAAQACAA0ADwAPAAEAJwAnAAEATgBOAAEAWgBaAAEAXwBfAAEAZwBnAAQBcAFwAAEBdgF2AAEBdwF3AAQBeAF4AAMBjgGOAAEBvwG/AAICJQIlAAEAAgAIAAIACgB+AAEAFAAEAAAABQAiACwAMgBIAE4AAQAFAA4AGQAmAGcBCQACABn/7AEV/+wAAQBI//YABQDS//YA6f/sAV3/7AFl//YCGf/2AAEAAv+mAAkAu//YAMH/2ADF/9gA0//YAPz/2AEI/9gBDf/YATj/5wFD/9gAAgYuAAQAAAbMCFwAHQAbAAD/8f/d/+L/pv/x/7oACv/Y//H/2P/E/+L/7P/OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7AAA/+wAAP/sAAAAAAAAAAD/8QAA//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAA/7AAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAD/+wAA/+wAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+L/nAAA/7AAAAAA/9j/xP/iAAD/5//YABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/7AAA/+IAAP/2AAAAAP/YAAAAAP/x/+L/7AAA/9j/5//s/+z/7AAAAAAAAAAAAAAAAP+wAAAAAAAAAAD/5wAA/+cAAAAAAAD/9gAA/7oAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8QAA//H/9gAA/+IAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+/+wAFAAAABn/2P/s/7oAAAAAAAD/0//2AAAAAP/sAAAAAP+c//b/nP/i/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8f+w/+IAAAAAAAr/7AAA/84AAAAAAAAAAAAA/7oAAAAAAAAAAP+wAAD/sP/nAAAAAAAAAAD/7AAA/9gAAAAAAAD/9gAA/84AAAAAAAAAAP/iAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAP/YAAD/7AAAAAD/9gAAAAD/4gAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA/+IAAAAAAAAAAAAA/9j/2AAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7P/OAAD/9v/nAAAAAAAAAAAAAAAA//gAFAAAAAAAAAAAAAAAAAAAAAD/2AAA/+wAAP/x//EAAP/nAAD/8f/sAAAAAP/2//YAAAAA/+wAAAAAAAD/8QAAAAAAAAAAAAD/ugAA/84ABf/sAAD/2P/iAAD/9v/n//b/9v/OAAD/7AAA//sAAAAAAAAAAP/xAAAAAAAAAAAAAAAAAAD/7P/2/+IAAP/xAAAAAAAA/+L/7AAAAAAAAP/E/+L/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/sAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAA//H/9gAAAAD/7AAA/+cAAAAAAAAAAAAA/84AAAAAAAAAAP/OAAD/xAAAAAAAAAAAAAAAAAAA//b/7AAAAAD/9v/T/84AAP/sAAD/7AAAAAD/9gAAAAAAAAAAAAAAAAAAAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ugAA/84AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEATQACAA4ADwAVABkAJAAmACcALwAyADwAPwBCAEcASABNAE4AWABaAFsAXwBnAGwAdwB4AH0AfgCEAIoArgC6ALsAwQDFANIA2wDeAOkA7QDwAPUA9gD7APwBBgEIAQkBDQEVARYBGgElASYBKwEsATIBOAFDAU4BWAFdAWUBZgFrAW0BbwFwAXEBcwF5AY4BzAHNAhkCIgIlAmsAAgBCAA4ADgABAA8ADwACABUAFQAIABkAGQADACQAJAAXACYAJgAEACcAJwAFAC8ALwAQADIAMgAQADwAPAAMAD8APwAOAEIAQgAHAEcASAAGAE0ATQAGAE4ATgAIAFgAWAAJAFoAWgAIAFsAWwAKAF8AXwAIAGcAZwALAGwAbAAMAHcAeAANAH0AfQAOAH4AfgANAIQAhAAPAIoAigAKAK4ArgASALoAuwAUAMEAwQAQAMUAxQAUANIA0gARANsA2wATAN4A3gAQAOkA6QAQAO0A7QAaAPAA8AASAPUA9gATAPsA+wATAPwA/AAUAQYBBgAUAQgBCAAQAQkBCQAVAQ0BDQAUARUBFgAWARoBGgAYASUBJgAZASsBKwAaASwBLAAZATIBMgAbATgBOAATAUMBQwATAU4BTgAQAVgBWAAQAV0BXQAQAWUBZQARAWYBZgAWAW8BbwAXAXABcAAIAXEBcQAGAXMBcwAXAXkBeQAIAY4BjgAIAcwBzAANAhkCGQARAiICIgAcAiUCJQAIAAIATgACAAIADwAOAA4AAQAPAA8AAwAVABUAAQAZABkAAQAkACQADAAmACYAEwAnACcAAwAvAC8AEwAyADIAEwA8ADwAAgA/AD8AAQBCAEIAAQBHAEgAAQBNAE0AAQBOAE4AAwBYAFgAAQBaAFoAAwBbAFsAAQBfAF8AAwBnAGcABABsAGwABQB3AHgABgB9AH0AEgB+AH4ABgCKAIoAAQCuAK4ABwC6ALoAEwC7ALsACQDBAMEACQDFAMUACQDSANIACADTANMACQDbANsAFQDeAN4AEwDpAOkAEADtAO0AFQDwAPAAGQD1APYAFQD7APsAFQD8APwACQEGAQYAFQEIAQgACQEJAQkAFQENAQ0ACQEVARYACwEaARoADQElASYADgErASsAEQEsASwADgEyATIAGgE4ATgABwFDAUMACQFOAU4AEwFYAVgAFQFdAV0AEAFlAWUACAFmAWYACwFrAWsADwFtAW0ADwFvAW8ADAFwAXAAAwFzAXMADAF0AXQAGAF2AXYAAwF3AXcABAGOAY4AAwG+Ab4AFgG/Ab8AFAHFAcUACgHMAcwADwHNAc0ABgHdAd0AFgHjAeMACgIZAhkACAIiAiIAFwIlAiUAAwJrAmsADwAEAAAAAQAIAAEMrgAMAAMAVACiAAEAIgHAAcEBwwHEAccByAHSAdQB2wHeAd8B4AHhAeIB4wHkAeUB5wHoAeoB6wIRAhICKAIpAjACNAI1AjYCPQJBAlQCdgJ3ABMAAA2+AAANxAAADcoAAA3QAAAN1gAADdwAAA3iAAAN6AAADegAAA3uAAAN9AAADfoAAA4AAAEMzgABDMIAAgzIAAEMzgAADgYAAA4MACIAzgAAAAAAzgAAAAAA4AAAAAAAAADUAAAA5gAAAAAA2gAAAAAA5gAAAAAA4AAAAAAA5gAAAAANoAAAAAAA7AAAAAAA8gAAAAABFgAAAAABFgD4AAABEAAAAAAA/gEEAAABFgAAAAABCgAAAAABFgAAAAABEAAAAAABFgAAAAABHAAAAAANyAAAAAABIgAAAAABKAAAAAABLgE0AAAL7AvyAAABOgAAAAAKHgpIAAAKigqQAAABQAAAAAAAAAAAAUYBTAAAAAABTAAAAAAAAQCMAhIAAQBqABIAAQCIAhIAAQBqAhIAAQBfAhIAAQCPAhIAAQEbAhIAAQBiABIAAQEYAhIAAQEmACIAAQBgAhIAAQERAhIAAQBiAhIAAQBKAhIAAQHHAhIAAQC4AhIAAQFcAsYAAQFbAAAAAQEXAhIAAQCCAhIAAQH6AAAAAQGqAhIABAAAAAEACAABC8IADAABC9gAEgABAAEBugABAAQAAQCOAB8ABAAAAAEACAABCo4ADAADCqgAmgACABcAAgAMAAAADwAiAAsAJAAlAB8AJwAtACEALwAvACgAMQBGACkASABMAD8ATgBWAEQAWgBgAE0AYgBlAFQAZwB2AFgAeAB8AGgAfgCrAG0ArgC5AJsAuwDAAKcAxQDRAK0A0wEFALoBCQEOAO0BEAETAPMBFQEkAPcBJgEqAQcBLAFkAQwBaQFqAUUBRwqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAqECooAAAAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAAB6wHsgAAB7gHvgAAB6wHsgAAB7gHvgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgg2CDwIQgAAB8QAAAAAB8QAAAAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAAB8oAAAAAB8oAAAhICE4IVAhIB9AIVAhICE4IVAhICE4IVAhICE4IVAhICE4IVAhICE4IVAhICE4IVAhICE4IVAhICE4IVAAAB9YAAAAAB9YAAAAAB9YAAAAAB9wH6AAAB9wH6AAAB9wH6AAACE4IGAAACE4IGAAACE4IGAAACE4IGAAAB+IH6AAACB4IJAAACB4IJAAACB4IJAAACB4IJAAACB4IJAAACFoIYAAACFoIYAAACFoIYAAACFoIYAAACFoIYAAACFoIYAAACFoIYAAAB+4H9AAACFoIYAAACJwIogAAB/oIAAAAB/oIAAAAB/oIAAAAB/oIAAAACAYIMAAACAYIMAAACAYIMAAACAYIMAAACAYIMAAACAYIMAAACAwIEgAACAwIEgAACAwIEgAACAwIEgAACAwIEgqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAqwCrYKvAAACGYIbAAACGYIbAAACGYIbAAACGYIbAAACGYIbAAACHIIeAAACHIIeAAACHIIeAAACHIIeAAACHIIeAAACHIIeAAACH4IhAAACH4IhAAACH4IhAAACH4IhAAACE4IGAAACB4IJAAACCoIMAAACCoIMAAACCoIMAAACCoIMAiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgiKCJAIlgAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogAACJwIogqECooAAAAACJwIogg2CDwIQgg2CDwIQgAACJwIoghICE4IVAhICE4IVAAACFoIYAqwCrYKvAAACGYIbAAACHIIeAAACH4IhAiKCJAIlgiKCJAIlgAACJwIognCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgnCCcgJzgioCK4ItAAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2glECUoJ2gi6CMAIxgAACMwAAAAACMwAAAAACVAAAAAACVAAAAAACVAAAAAACVAAAAAACVAAAAAACVAAAAAACVAAAAAACVAAAAAACSAAAAAACSAAAAAACSAAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCVYAAAlcCWIAAAlcCWIAAAlcCWIAAAAACWgAAAAACWgAAAAACWgAAAAACWgAAAAACSAI0gAACSAI0gAACSAI0gAACQ4JXAAACQ4JXAAACQ4JXAAACQ4JXAAACTgI2AAACN4I5AAACRQJGgAACRQJGgAACRQJGgAACRQJGgAACRQJGgAACRQJGgAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gAACdQJ2gjqCPAI9gAACPwJJgAACPwJJgAACPwJJgAACPwJJgAACQIJCAAACQIJCAAACQIJCAAACQIJCAAACQIJCAAACQIJCAAAAAAK4gAAAAAK4gAAAAAK4gAAAAAK4gAAAAAK4gluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegluCXQJegAACYAJhgAACYAJhgAACYAJhgAACYAJhgAACYAJhgAACYwAAAAACYwAAAAACYwAAAAACYwAAAAACYwAAAAACYwAAAAACZIJmAAACZIJmAAACZIJmAAACZIJmAAACQ4JXAAACRQJGgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmeCaQJqgmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAmwCbYJvAAACSwJMgAACSwJMgAACSAJJgAACSwJMgAACTgJPgnCCcgJzgAACdQJ2glECUoJ2glECUoJ2gAACVAAAAlcCWIAAAlcCWIAAAlcCWIAAAlcCVYAAAlcCWIAAAAACWgAAAAACdQJ2gluCXQJegAACYAJhgAACYwAAAAACZIJmAmeCaQJqgmwCbYJvAnCCcgJzgAACdQJ2gABAUICxgABAUgAAAABAZoCxgABAaAAAAABAScCxgABAWACxgABApoCxgABAd4CxgABAUgCxgABAKsCxgABAVwAAAABAXsCxgABAXsAAAABAVECxgABAV8AAAABAUsCxgABASECxgABASEAAAABATkAAAABAXICxgABAXEAAAABAUwCxgABAUwAAAABAiMAAAABAT0CxwABAT8AAAABALQAAAABAIgCxgABAIgAAAABAXYCxgABAXYAAAABAcgCxgABAcgAAAABATwCxgABATwAAAABARcCxgABARcAAAABAYUAAAABANsCxgABANsAAAABAXMCxgABAXMAAAABAtoAAAABAo4CEAABAo4AAAABAMoCEgABARYCEgABARYAAgABAScCEgABASoAAAABAPQAAAABAbcCEgABAbcAAAABAvoAAAABAq4CEAABAq4AAAABAMUCEgABAQkCEgABAQwAAAABAHoCxgABASMCEgABASMAAAABAHsCxgABAHsAAAABAIcCxgABAIcAAAABAMgCxgABAMgAAAABAW4AAAABASICEAABAR4CEgABAXYCEgABAKYAAAABAHsCEgABAIoCEgABAfAAAAABARwCEgABARwAAAABAZsCEgABAZsAAAABAQ0CEgABARQCEgABARQAAAABAeIAAAABAQwCEgABAQoAAAABAgcAAAABASECEgABAR4AAAABAh0AAwABARoCEgABARkAAAABASICEgABASIAAAAFAAAAAQAIAAEADAAcAAMAJgCGAAIAAgKCApEAAAKTApUAEAABAAMArACtAWYAEwABAUoAAQFQAAEBVgABAVwAAQFiAAEBaAABAW4AAQF0AAEBdAABAXoAAQGAAAEBhgABAYwAAgBaAAIATgAAAFQAAgBaAAEBkgABAZgAAQCrAAAAAQCzAAAAAQCPAAAAAwAIADQAZgACAA4AFAAAABoAIAAmAAECiwAAAAEBUALGAAEEJQAAAAEDewLGAAEDewAAAAIADgAUABoAIAAmACwAAQG9AAAAAQFZAsYAAQFZAAAAAQQ3AAAAAQONAsYAAQONAAAAAgAAAAAADgAAAAAAFAABAOoAAAABAhoAAAAGABAAAQAKAAAAAQAMABwAAQAiALQAAgACAoICjgAAApQClQANAAEAAQKlAA8AAAA+AAAARAAAAEoAAABQAAAAVgAAAFwAAABiAAAAaAAAAGgAAABuAAAAdAAAAHoAAACAAAAAhgAAAIwAAQCnAhIAAQBcAhIAAQCpAhIAAQBTAhIAAQCJAhIAAQBBAhIAAQC6AhIAAQC9AhIAAQCNAhIAAQDXAhIAAQCvAhIAAQBeAhIAAQC2AhIAAQBkAhIAAQAEAAEAbQISAAAAAQAAAAoCsAmaAAJERkxUAA5sYXRuAHoACgABTUFIIAA6AAD//wAVAAAADAAYACQAMAA8AFIAXgBqAHYAggCOAJoApgCyAL4AygDWAOIA7gD6AAD//wAWAAEADQAZACUAMQA9AEgAUwBfAGsAdwCDAI8AmwCnALMAvwDLANcA4wDvAPsAOgAJQVpFIABqQ1JUIACcS0FaIADOTUFIIAEATU9MIAEyTkxEIAFkUk9NIAGWVEFUIAHIVFJLIAH6AAD//wAVAAIADgAaACYAMgA+AFQAYABsAHgAhACQAJwAqAC0AMAAzADYAOQA8AD8AAD//wAWAAMADwAbACcAMwA/AEkAVQBhAG0AeQCFAJEAnQCpALUAwQDNANkA5QDxAP0AAP//ABYABAAQABwAKAA0AEAASgBWAGIAbgB6AIYAkgCeAKoAtgDCAM4A2gDmAPIA/gAA//8AFgAFABEAHQApADUAQQBLAFcAYwBvAHsAhwCTAJ8AqwC3AMMAzwDbAOcA8wD/AAD//wAWAAYAEgAeACoANgBCAEwAWABkAHAAfACIAJQAoACsALgAxADQANwA6AD0AQAAAP//ABYABwATAB8AKwA3AEMATQBZAGUAcQB9AIkAlQChAK0AuQDFANEA3QDpAPUBAQAA//8AFgAIABQAIAAsADgARABOAFoAZgByAH4AigCWAKIArgC6AMYA0gDeAOoA9gECAAD//wAWAAkAFQAhAC0AOQBFAE8AWwBnAHMAfwCLAJcAowCvALsAxwDTAN8A6wD3AQMAAP//ABYACgAWACIALgA6AEYAUABcAGgAdACAAIwAmACkALAAvADIANQA4ADsAPgBBAAA//8AFgALABcAIwAvADsARwBRAF0AaQB1AIEAjQCZAKUAsQC9AMkA1QDhAO0A+QEFAQZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZhYWx0BiZjY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5jY21wBi5kbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRkbGlnBjRmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmcmFjBjpmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBmd2lkBkBsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsaWdhBkZsb2NsBkxsb2NsBmRsb2NsBmRsb2NsBmRsb2NsBlJsb2NsBl5sb2NsBlhsb2NsBl5sb2NsBmRsb2NsBmRvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpvcmRuBmpwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJwbnVtBnJzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzaW5mBnhzczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAxBn5zczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAyBohzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczAzBpJzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA0BpxzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA1BqZzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA2BrBzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA3BrpzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA4BsRzczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zczA5Bs5zdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdWJzBthzdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt5zdXBzBt50bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuR0bnVtBuQAAAACAAAAAQAAAAEAAgAAAAEAEAAAAAEACwAAAAEAEgAAAAEAEQAAAAEAAwAAAAEABgAAAAEABwAAAAEABQAAAAEABAAAAAIADAANAAAAAQAOAAAAAQAJAAYAAQATAAABAAAGAAEAFAAAAQEABgABABUAAAECAAYAAQAWAAABAwAGAAEAFwAAAQQABgABABgAAAEFAAYAAQAZAAABBgAGAAEAGgAAAQcABgABABsAAAEIAAAAAQAIAAAAAQAKAAAAAQAPAB8AQAHiA5QD3gPyBAYEKARKBIAEgASOBJwFMAVuBZAFqAXABe4GfgbsBvoHEgcqB0IHcgecB7QIkgioCL4I2AABAAAAAQAIAAIAzgBkAWkAnQCeAJ8AoACXAJgAmQCaAJwAjgCPAJAAkwCUAJUAlgA9AIgAiQFqAKQAigCLAIwAjQBlAGsApQCmAKcAqACpAKoAqwFUAVUBVgFXAVkBWgFbAVwBTgFPAVABUgE3AWoBXgETARkBXwFgAWEBYgFjAWQB0wHgAeIB5AHlAc8B1QHcAdEB5wHoAekB6gHrAfIB5gILAgwB/QH+AgkCCgHZAdoB0AHOAdYCbAJtAm4CbwJwAnECcgJzAnQCdQKUApUCkwKjAqQAAQBkAAIABwAUAB0AHgAnACgAKgArAC0AMgA0ADUAOAA5ADoAOwA8AEUASwBOAFEAWwBcAF0AXgBjAGoAcAB7AIEAhwCRAJIAmwDAAMkAygDYAOIA4wDlAOcA8ADxAPIA9AD5APwA/wERARgBHgEpAS8BNQE9AUgBvwHCAcQBxgHHAckBywHMAc0B0gHUAdcB2AHbAewB8AHzAfQB9QH2AfcB+AIXAhgCIQIiAlUCVwJYAlkCWgJbAlwCXQJeAl8CYAKCAoMCjwKWApcAAwAAAAEACAABAV4AKgBaAGAAZgBsAHQAegCAAIYAjACUAJoAoACmAKwAsgC4AL4AxADOANgA4ADoAPAA+AEAAQgBEAEYARwBIAEkASgBLAEwATQBOAE8AUABRgFMAVIBWAACAJsAoQACAJEAogACAJIAowADAWkBOAFDAAIBOQFEAAIBOgFFAAIBOwFGAAIBPAFHAAMBPQFIAVMAAgE+AUkAAgE/AUoAAgFAAUsAAgFBAUwAAgFCAU0AAgDjAVgAAgDrAV0AAgE2AVEABAGlAa8BkAGOAAQBpgGwAZEBjwADAacBsQGSAAMBqAGyAZMAAwGpAbMBlAADAaoBtAGVAAMBqwG1AZYAAwGsAbYBlwADAa0BtwGYAAMBrgG4AZkAAQFwAAEBcQABAXIAAQFzAAEBdAABAXUAAQF2AAEBdwABAXgAAQF5AAIB1wHdAAIB0gHeAAIB2wHfAAIB1AHhAAIB2AHjAAIADAAsACwAAAA2ADcAAQCuALgAAwDeAN4ADgDpAOkADwDzAPMAEAFwAXkAEQGQAZkAGwG+Ab4AJQHAAcEAJgHDAcMAKAHFAcUAKQAGAAAAAgAKABwAAwAAAAEFGAABADAAAQAAABwAAwAAAAEFBgACABQAHgABAAAAHAABAAMCkAKRApIAAgACAoIChgAAAogCjgAFAAEAAAABAAgAAQAGAAQAAQABAo8AAQAAAAEACAABAAYABQABAAEA3gABAAAAAQAIAAIADgAEAGUAawETARkAAQAEAGMAagERARgAAQAAAAEACAACAA4ABACIAIkBNgE3AAEABABFAEsA8wD5AAYAAAABAAgAAQR+AAIACgAcAAEABAABADQAAQAAAAEAAAAdAAEABAABAOAAAQAAAAEAAAAdAAEAAAABAAgAAQEuADUAAQAAAAEACAABASAAPwAEAAAAAQAIAAEAfgAFABAARABQAGYAcgAFAAwAFAAcACQALAGbAAMBzAFyAZwAAwHMAXMBngADAcwBdAGgAAMBzAF1AaEAAwHMAXgAAQAEAZ0AAwHMAXMAAgAGAA4BnwADAcwBdAGiAAMBzAF4AAEABAGjAAMBzAF4AAEABAGkAAMBzAF4AAEABQFxAXIBcwF1AXcABgAAAAIACgAkAAMAAQB8AAEAEgAAAAEAAAAeAAEAAgACAK4AAwABAGIAAQASAAAAAQAAAB4AAQACAE4A/AAEAAAAAQAIAAEAFAABAAgAAQAEAjAAAwD8Ab4AAQABAEgAAQAAAAEACAABAAb/4AACAAEBkAGZAAAAAQAAAAEACAABAAYAIAACAAEBcAF5AAAABAAIAAEACAABAB4AAgAKABQAAQAEAKwAAgAyAAEABACtAAIAMgABAAIAAgBsAAQACAABAAgAAQB8AAQADgAoADIAUgADAAgADgAUAWUAAgDSAWcAAgDeAWgAAgDwAAEABAFmAAIBFQADAAgAEgAaAbsABAHsAewCRAG8AAMB7AJEAb0AAgJEAAQACgAUABwAJAIdAAQB7AHsAewCHAADAewB7AIeAAMB7AJEAhsAAgHsAAEABADSARUB7AJFAAEAAAABAAgAAgA0ABcB1wHTAdIB2wHUAdgBzwHVAdwB0QHyAeYCCwIMAf0B/gIJAgoB2QHaAdABzgHWAAEAFwG+Ab8BwAHBAcMBxQHJAcsBzAHNAewB8AHzAfQB9QH2AfcB+AIXAhgCIQIiAlUAAQAAAAEACAABABQAigABAAAAAQAIAAEABgCVAAIAAQCuALgAAAABAAAAAQAIAAEABgBeAAIAAQDwAPQAAAABAAAAAQAIAAEABgAvAAIAAQBbAF4AAAABAAAAAQAIAAIAGAAJAI4AjwCQAJEAkgCTAJQAlQCWAAIAAgAyADIAAAA0ADsAAQABAAAAAQAIAAIAEgAGAJcAmACZAJoAmwCcAAEABgAnACgAKgArACwALQABAAAAAQAIAAEABgAVAAIAAQJXAmAAAAABAAAAAQAIAAIAbAAzAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAd0B3gHfAeAB4QHiAeMB5AHlAecB6AHpAeoB6wKUApUCowKkAAEAMwAHABQAHQAeACwANgA3AFEAcAB7AIEAhwCRAJIAmwCzAMAAyQDKANgA3gDiAOMA5QDnAOkA/wEeASkBLwE1AT0BSAG+AcABwQHCAcMBxAHFAcYBxwHSAdQB1wHYAdsCggKDApYClwABAAAAAQAIAAEABgAeAAEAAgFwAXEAAQAAAAEACAABAAYAAQABAAIA3gDpAAEAAAABAAgAAgAKAAIAPQDrAAEAAgA8AOkAAQAAAAEACAACAA4ABAFpAWoBaQFqAAEABAACAE4ArgD8\"}"
  },
  {
    "path": "apps/www/app/og/geist-semibold-otf.json",
    "content": "{\"base64Font\":\"T1RUTwAMAIAAAwBAQ0ZGIHIR/08AABlsAAC8I0dERUZznnHMAADVkAAAAdZHUE9TY4mY0QAA12gAACqMR1NVQsbFMjAAAQH0AAANHE9TLzI+rl/YAAANbAAAAGBjbWFwVC6iugAAEUQAAAgGaGVhZCxmteIAAADUAAAANmhoZWENAAmoAAANSAAAACRobXR4MmWPlAAAAQwAAAw8bWF4cAMPUAAAAADMAAAABm5hbWVgE49UAAANzAAAA3Zwb3N0/58AMgAAGUwAAAAgAABQAAMPAAAAAQAAAAEzMy4X/pdfDzz1AAMD6AAAAADiJx99AAAAAOInH33/3/8ZCSIDuAAAAAcAAgAAAAAAAAHbAFgA7AAAAs4AFwLOABcCzgAXAs4AFwLOABcCzgAXAs4AFwLOABcCzgAXAs4AFwLOABcEAAAXArcAUALVACsC1QArAtUAKwLVACsC1QArAtUAKwLJAFACyQBQAxkAKwMZACsCZwBQAmcAUAJnAFACZwBQAmcAUAJnAFACZwBQAmcAUAJnAFACZwBQAugAKwJYAFAC1gArAtYAKwLWACsC1gArAtYAKwLWACsC1gArAwEAKwLOAFADBwAeAs4AUAEiAFADiwBQASIAUAEi//MBIv/uASIATgEiAAwBIgAAASIAKgEi/+kCaQA3AmkANwJpADcCrwBQAq8AUAKvAFACSgBQAkoAUAJKAFACSgBQAmwABQOGAFAC7ABQAuwAUALsAFAC7ABQAuwAUALpAFAC/AArAvwAKwL8ACsC/AArAvwAKwL8ACsC/AArAv8ALQL8ACsEUAArApgAUAJ6AFAC9gArArEAUAKxAFACsQBQArEAUAKcADUCnAA1ApwANQKcADUCnAA1ApwANQLVAFACZgAbAmYAGwJmABsCZgAbAmYAGwK7AEECuwBBArsAQQK7AEECuwBBArsAQQK7AEECuwBBArsAQQK7AEECuwBBAs0AFwPEABcDxAAXA8QAFwPEABcDxAAXArIAHAKhABcCoQAXAqEAFwKhABcCoQAXAqEAFwJCABwCQwAcAkIAHAJCABwAwAArAkoAUALsAFACugBQAroAUAK6AFACugBQAcoAKwHKACsBygArAcoAKwHKACsBygArAcoAKwHKACsBygArAs4AKwLOACsCzgArAs4AKwLOACsCzgArAs4AFwLVACsCZwBQAmcAUALWACsBIv/xASIATgL8ACsCuwBBA8QAFwKhABcCQgAcAcoAKwHKACsCzgArBJcAFwSEAEECVgApAlYAKQJWACkCVgApAlYAKQJWACkCVgApAlYAKQJWACkCVgApAlYAKQO6ACkCbwBGAkkAKQJJACkCSQApAkkAKQJJACkCSQApAm8AKQKLACkCpgApAl8AKQJTACkCUwApAlMAKQJTACkCUwApAlMAKQJTACkCUwApAlMAKQJTACkCUwApAbAAMgJvACkCbwApAm8AKQJvACkCbwApAm8AKQJvACkCkQApAlkARgJ1ADICWf/oAQ0ARAENAEYBDQBGAQ3/6AEN/+MBDQBEAQ0AAgEN//YBDQAfAQ3/3wI3AEQBNP/9ATT//QE0//0BNP/9AnQARgJ0/+gCdABGAToARgE6AEYBQABGAToARgFAAAADfABGAlkARgJZAEYCWQBGAlkARgJZAEYCWQBGAl8AKQJfACkCXwApAl8AKQJfACkCXwApAl8AKQJQABoCXwApA+AAKQJvAEYCaABGAm8AKQGcAEYBnABGAZwAPQGcAEECMAApAjAAKQIwACkCMAApAjAAKQIwACkCewBGAa0ALQGtAC0BrQAtAa0ALQGtAC0CVQBGAlUARgJVAEYCVQBGAlUARgJVAEYCVQBGAlUARgJVAEYCVQBGAlUARgJJABYDRwAWA0cAFgNHABYDRwAWA0cAFgJ1AC8COgAWAjoAFgI6ABYCOgAWAjoAFgI6ABYCRAA5AkQAOQJEADkCRAA5AMEAKwE6AEYCWQBGAkoAJAJKACQCSgAkAkoAJAJKACQCSgAkAkoAJAJKACQCSgAkAkoAJAJKACQCbwApAm8AKQJvACkCbwApAm8AKQJvACkCbwApAm8AKQJvACkCbwApAm8AKQEgAFABIABQATcATgEgAEoBlQBGAlYAKQJJACkCUwApAlMAKQJvACkBDQBEAQ3/5wENAEQBDQAfAioARAE0//0CXwApAlUARgNHABYCOgAWAkQAOQJKACQCbwApAwAAMgK9ADIC2AAyAwoALQGuACsBrgArAs4AFwKiAFACtwBQAmUAUAJlAFACMwBQApoAPANHADICZwBQAmcAUAJnAFAEAAAcAqUALwLpAE0C6QBNAq0AUAKtAFADCAA3A4YAUALJAFAC/AArAskAUAKYAFACzwArAmYAGwJUABcCVAAXA1kAKwKxABwCmQAlAx0AUAO4AFAECgBQAskAUAKiAFADhwBQAu4APASIADcESQBQApwANQLyACwC8gArASIAUAEi/+8CaQA3AxoAGwQIAFACugA1Ax0AGwLrADIC8gAcAvwAKwL8ABcEHwAcAtYAUAMIAFACoQAXAqIAFwLgABwC2QAlApkAUAEiAFAC6AArAukATQL8ACsCVAAXAlwAKQJxACsCYgBGAfAARgHwAEYBxwBGAh8AMgLUACUCVAApAlQAKQJUACkDtAAvAioAHgJMAEYCTABGAkwARgJ4AEYCeABGAqcAMgLjAEYCUgBGAl8AKQJbAEYCbwBGAkkAKQJDACkCOgAWAjoAFgK8ACkCdQAvAnkARgK0AEYDRgBGA5gARgJbAEYCWgBGA00ARgKaADID9AAyA58ARgIwACkCVwApAlcAKQENAEQBDf/lATT//QJ1ADIDRwBGAmUARgKAADICswAyAuMALwJfACkCbwAWA8EALwKOAEYCqQBGAkkAFgJJABYCmwAvAr4ARgJZAEYBIABQAlMAKQJMAEYCXwApAjoAFgLIABcC9AArAnAAFwKbAC0CVQAlArAAMAGrACYCggA7An8ALwKZAC8CkAA5AogAOQJQACUChgAlAosAOQM1ACkDNQApAzUAKQM1ACkDNQApAzUAKQM1ACkDNQApAzUAKQM1ACkDSQApA0kAKQNJACkDSQApA0kAKQNJACkDSQApA0kAKQNJACkDSQApArAAMAHoABsCdQAWAnUAcQJ1AEACdQArAnUAKwJ1ADkCdQA7AnUAQAJ1ABMCdQA5AlgADANFACsDLQArA2gAKwMNACsDOgArA2AAKwM3ACsDagArA1kAKwM0ACsBkwAtAQ4AHgFqAC0BfAAtAX8AKwFtAC0BawAtAUsAHgF/AC0BcAAtAZMALQEOAB4BagAtAXwALQF/ACsBbQAtAWsALQFLAB4BfwAtAXAALQDsAAAJYAA+BwgAPgSwAD4A5QApAOUAKQEyAFABMgBQApIAKQDzADAA8wAwAkkAKQJJACkA5QApAUIAKQGtACkBhwApAij//wH8ACIB+gArAOMAKQEwAFABNwBQAn4AKQDnAC4A5wAuAkkAKQJJACkA4wApAaYAKQJWACkDkgApAjQAKQNgACkBQgAsAUIAHAGhACsBoQAcAYcAUAGHABwBfwApAX8AKgFrACoBawApAYQAKQGEACkCVgApAlYAKgGKACoBigApAYIAKQGCACoBcwApAXMAKQDnACoBsAArAbAAKwGvACsA6QArAOcAKgJoACoCaAApAXQAKgF0ACkBdwArAMIAKwIMADIClgBQBLAAPgcIAD4JYAA+BwcAPgNJACkDSQApAlgACAOxACsCqAAlAnkAIwJLADUDOQArAk8AKwJPACsDdgBQAZgAKQEBACkBtAAqARwAUAEcAFACQABQAkMAUAROAFACWABMA3YAKwJYADECSQApAkMAKwKcADUC4QA1Ar0ANQLWACoCuwBQA0YAUAJ8ADUCoQAXAi8AKQIvACkB8AAqAi8AKQJ8AFACLwApAiEAKwIdACkCLwApAi8AKgJAACkCDgApAg4AKQHaACkBnQApA1gAKQGrAAkCkwAXAqkAGwIkABwCmgAWAmQAKQJoAFMDMAApBHwAKQLFACsCeQArAx0AKwJ6ACwCxQArAnoAKwMdACwCeQAsBCwAKwLFACwCiQArApwAKwKcACsCkwArApMAKwKWACsClgArApYAKwKYACsClgArA14AFwHOACsCYQAsAvsAKwJhACwBzgArAmEAKwL7ACsCYQAsA1wAKwHOACwDSQArA0kAKwNJACsCPgArA2IAFwMuAFADYgAXAy4AFwNiABcDLgBQA2IAFwMuABcAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAA3AAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAAApAAAAKQAAACkAAABsAAAAKQAAACkBmQApANgAKQEQACkBEAApAbIAKQGOACkBjgApAYEAKQEZACkBoAApAXQAKQFJACkBHgApAY4AKQDXACkA5gA3AQEAKQC+ACkDNQApA0kAKQABAAADmP8kAGQJYP/f/hQJIgABAAAAAAAAAAAAAAAAAAADDwAEAmoCWAAFAAgCigJYAAAASwKKAlgAAAFeADIBCQAAAAAAAAAAAAAAAKEAAv9AAeX7AAAAAAAAAABWUkNMAMAAIPsCA5j/JABkA9ABBiAAAJcAAAAAAhYCxgAAACAABAAAABUBAgADAAEECQABABwAAAADAAEECQACAA4AHAADAAEECQADADIAKgADAAEECQAEABwAAAADAAEECQAFAD4AXAADAAEECQAGABwAmgADAAEECQAIAJAAtgADAAEECQAJAGABRgADAAEECQALADABpgADAAEECQAMADABpgADAAEECQAQAAoB1gADAAEECQARABAB4AADAAEECQEAABIB8AADAAEECQEBAAoCAgADAAEECQECAAoCDAADAAEECQEDAAoCFgADAAEECQEEAAoCIAADAAEECQEFAAoCKgADAAEECQEGABQCNAADAAEECQEHABYCSAADAAEECQEIABYCXgBHAGUAaQBzAHQAIABTAGUAbQBpAEIAbwBsAGQAUgBlAGcAdQBsAGEAcgAxAC4AMgAwADAAOwBWAFIAQwBMADsARwBlAGkAcwB0AC0AUwBlAG0AaQBCAG8AbABkAFYAZQByAHMAaQBvAG4AIAAxAC4AMgAwADAAOwBHAGwAeQBwAGgAcwAgADMALgAyACAAKAAzADIANAA5ACkARwBlAGkAcwB0AC0AUwBlAG0AaQBCAG8AbABkAEIAYQBzAGUAbQBlAG4AdAAuAHMAdAB1AGQAaQBvACwAIABWAGUAcgBjAGUAbAAsACAAQQBuAGQAcgDpAHMAIABCAHIAaQBnAGEAbgB0AGkALAAgAEcAdQBpAGQAbwAgAEYAZQByAHIAZQB5AHIAYQAsACAATQBhAHQAZQBvACAAWgBhAHIAYQBnAG8AegBhAEIAYQBzAGUAbQBlAG4AdAAuAHMAdAB1AGQAaQBvACwAIABBAG4AZAByAOkAcwAgAEIAcgBpAGcAYQBuAHQAaQAsACAATQBhAHQAZQBvACAAWgBhAHIAYQBnAG8AegBhAGgAdAB0AHAAcwA6AC8ALwBiAGEAcwBlAG0AZQBuAHQALgBzAHQAdQBkAGkAbwAvAEcAZQBpAHMAdABTAGUAbQBpAEIAbwBsAGQATgBvACAAdABhAGkAbAAgAGEAQQBsAHQAIABhAEEAbAB0ACAAbABBAGwAdAAgAFIAQQBsAHQAIABJAEEAbAB0ACAARwBBAGwAdAAgAGEAcgByAG8AdwBzAFIAbwB1AG4AZABlAGQAIABkAG8AdABBAGwAdAAgAG4AdQBtAGIAZQByAHMAAAAAAAIAAAADAAAAFAADAAEAAAAUAAQH8gAAAPwAgAAGAHwALwA5AH4ArAETASsBNwE+AUgBTQF+AY8BkgHOAekCGwI3AlkCuQK8AsgC3QMEAwgDDAMSAyYDKAM1A5sDqQO7A8AEDAQaBCMELwQzBDUEOQQ6BEMEXwRjBGsEdQSTBJcEmwSjBLMEtwS7BMAEzwTZBOME6QTvDj8eIR6FHp4evR7zHvkgFCAaIB4gIiAmIDAgMyA6IEQgcCB5IIkgqiCsILQguSC9IQchFyEiIVUhXiGZIZ0hqiGxIbUh5SHnIgIiBiIPIhIiGiIeIisiSCJgImUjziQMJGgk6iT/JbMltyW9JcElzCXPJjonfjADMBEwFzAcp4z4//sC//8AAAAgADAAOgCgAK4BFgEuATkBQQFKAVABjwGSAc0B5AIYAjcCWQK5ArwCxgLYAwADBgMKAxIDJgMnAzUDmwOpA7sDwAQABA4EGwQkBDAENAQ2BDoEOwREBGIEagRyBJAElgSaBKIErgS2BLoEwATPBNgE4gToBO4OPx4gHoAenh68HvIe+CATIBggHCAgICYgMCAyIDkgRCBwIHQggCCqIKwgtCC5IL0hByEWISIhUyFbIZAhnSGpIbAhsyHkIeciAiIGIg8iESIaIh4iKyJIImAiZCPOJAskYCTqJP8lsiW2JbwlwCXKJc8mOSd2MAMwCDAUMByni/j/+wH//wAAAcEAAAAAAAAAAAAAAAAAAAAAAAD+lADqAAAAAAAA/q/+dABSAE4AAAAAAAAAAAAA/+H/zv/P/8P+Uf5E/jP+LwAAAAD9XQAA/XkAAP1+AAD9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD85P0YAAAAAAAAAAD0PgAAAADhxQAAAAAAAOJFAAAAAAAA4hziiuJc4j/h1+HA4cDhpuH14e/h6OHl4eDg6QAA4WoAAODHAADhKOEf4RrhGeDi4OjgteCt4KUAAOCc4JPgh+Bl4EcAAN7IAADdpt0b3PwAAAAAAAAAAAAA3QvcSdqG0kcAAAAA0j8AAAmFBmEAAQD8AAABGAGgAbgCggKsAr4CyALWAtwAAAAAAzQDNgNAAAAAAAAAAAADPgNCA0wDVANYAAAAAAAAAAAAAAAAAAAAAANMA2QAAAN6AAADjgAAA44AAAOMA8IDxAPGA8wD0gPUA9YD2APiA+QAAAAAA+ID5APmA+gAAAPoA+oAAAPyA/QD9gAAA/YD+gP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPmAAAD5gAAA+gAAAAAAAAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAD4AAAA+AAAAAAAAAD3APeA+AD4gPkAAAAAAAAAAAD4APyAAAD9gAAAAAAAAABAkMCegJLApoCuQKGAnsCXAJdAkkCogI/AlcCPgJMAkACQQKpAqYCqAJFAoUAAgAOAA8AFQAZACQAJQAtADAAOgA9AEAARQBGAEwAVgBYAFkAXQBkAGkAdAB1AHoAewCBAmACTQJhArACWgL9AKwAuAC5AL8AwwDOAM8A1wDaAOUA6QDsAPEA8gD4AQIBBAEFAQkBEAEVASABIQEmAScBLQJeApACXwKuAjoCRAKYAqACmQKhApECiAL7AokBZQJ2Aq8CigMFAo0CrAIyAjMC/gK4AocCRwMGAjEBZgJ3Ah8CHAIgAkYACAADAAYADAAHAAsADQASAB8AGgAcAB0ANgAyADMANAAYAEoAUABNAE4AVABPAqQAUwBuAGoAbABtAHwAVwEPALIArQCwALYAsQC1ALcAvADJAMQAxgDHAOAA3ADdAN4AwgD2APwA+QD6AQAA+wKlAP8BGgEWARgBGQEoAQMBKgAJALMABACuAAoAtAAQALoAEwC9ABQAvgARALsAFgDAABcAwQAgAMoAHgDIACEAywAbAMUAKADSACYA0AAqANQAKQDTAC8A2QAuANgAOQDjADcA4QA4AOIANQDbADEA5AA8AOgAPwDrAEEA7QBDAO8AQgDuAEQA8ABHAPMASQD1AEgA9ABLAPcAUgD+AFEA/QBVAQEAWgEGAFwBCABbAQcAXgEKAGEBDQBgAQwAXwELAGcBEwBmARIAZQERAHMBHwBwARwAawEXAHIBHgBvARsAcQEdAHcBIwB9ASkAfgCCAS4AhAEwAIMBLwAFAK8ALADWACcA0QA+AOoAYgEOAGgBFAMAAwEDDAMCAvwDAwMHAwQC/wLpAuoC7QLxAvIC7wLoAucC8ALrAu4BcAFxAZcBawGPAY4BkQGSAZMBjAGNAZQBdwGBAYgBZwFoAWkBagFuAW8BcgFzAXQBdQF2AYIBgwGFAYQBhgGHAYsBigGJAZABlQGWAbABsQG5AcUBxgHIAccByQHKAc4BzQHMAdMB2AHZAbIBswHaAa0B0gHRAdQB1QHWAc8B0AHXAboBuAHEAcsBmAHbAZkB3AGaAd0BmwHeAWwBrgFtAa8BnAHfAZ0B4AGeAeEBnwHiAaAB4wGhAeQBogHlAaMB5gGlAegBpgHpAacB6gGoAesAKwDVAHkBJQB2ASIAeAEkACIAzAB/ASsAgAEsAnQCdQJwAnICcwJxApICkwJIApQCiwIdAh4CIQLBArsCvQK/AsMCxALCArwCvgLAArUCowKrAqoClwKVAt4C4gLfAuMC4ALkAuEC5QLdAtsC3AJiAmMCaAJpAmYCZwJsAm0CZAJlAmoCawJuAm8AhQExAAAAAwAAAAAAAP+cADIAAAAAAAAAAAAAAAAAAAAAAAAAAAEABAIAAQEBD0dlaXN0LVNlbWlCb2xkAAEBASn6RQD6RgH6RwL6SAT7EQwDavt7HAki+kwFHC4oDxwxIxG+HQAArEESAi4CAAEABwAOABUAHAAiACgAMwA9AEMASQBPAFkAYABnAG4AdQB7AIEAjACTAJ0ApACrAK8AugC8AMYAzQDUANoA5QDwAPcA/gEEAQoBEQEXAR0BJAEnATQBOwFBAUcBTgFUAVwBZwFuAXUBeQF/AYYBjQGTAaABpwGuAbMBuQG/AcoB0wHZAeQB6gHxAfcCAQIIAhcCJgIsAjcCQgJOAlQCXwJvAn0CjAKXAqMCrwK6AsACywLbAucC9gMCAxADHwMtAzwDSwNZA2gDdgOEA5IDoAOvA8ID1gPqA/ID+gQABAcEDgQVBBsEIQQsBDYEPARCBEgEUgRZBGAEZwRuBHQEegSFBIwElgSdBKQEqASzBLwEwwTKBNAE0gTZBOQE7wT2BP0FAwUJBRAFFgUcBSMFJgUzBToFQAVGBU0FUwVbBWYFbQVxBXcFfgWFBYsFmAWfBaYFqwWxBbcFwgXLBdEF3AXiBekF7wX5BgAGDwYeBiQGLwY6BkYGVgZkBm8GewaHBpEGnAaiBq0GuAbEBtQG4gbtBvkHBQcPBxoHIAcrBzYHQgdNB1sHagd4B4cHlgecB6oHuAfEB8sH0QffB+0H+wgJCBgIKwg+CEYITghVCFwIYwhqCHEIeAh/CIYIjQiUCJsIogipCLAItwi+CMUIzAjTCNoI4QjoCO8I9gj9CQQJCwkSCRkJIAknCS4JNQk8CUMJSglRCVgJXwlmCW0JdAl7CYIJiQmQCZcJngmlCawJswm6CcEJyAnPCdYJ3QnkCesJ8gn5CgAKBwoOChUKHAojCioKMQo4Cj8KRgpNClQKWwpiCmkKcAp3Cn4KhQqMCpMKmgqhCqgKrwq2Cr0KxArLCtIK2QrgCucK7gr1CvwLAwsKCxELGAsfCyYLLQs0CzsLQgtJC1ALVwteC2ULbAtzC3oLgQuIC48LlgudC6QLqwuyC7kLwAvHC84L1QvcC+ML6gvxC/cL/gwEDAYMDQwUDBsMIgwpDDAMNww+DEUMTAxTDFoMYQxoDG8Mdgx9DIQMiwySDJkMogyqDLEMtwy9DMUMzAzTDNkM4QzpDPAM9wz+DQUNDA0TDRoNIQ0oDS8NNg09DUQNSw1SDVkNYA1nDW4NdQ18DYMNig2RDZgNuQ3TDeYN7Q34DgIOEA4dDigONw5EDlUOaA5vDnYOfQ6EDosOkg6ZDqAOpw6uDrUOvA7DDsoO0Q7YDugO/w8dDzUPPA9FD0wPUw9ZD18PZg9tD3QPew9/D4YPjQ+UD5sPow+vD7gPww/LD9MP2g/hD+oP8Q/8EAMQChAREBsQIhArEDIQOxBCEEsQVBBbEGIQaRBwEHcQfhCFEIwQkxChEKgQtBDAEM8Q2xDpEPURAxEPER0RKxEyETgRPxFGEU0RVBFbEWIRaRFwEXcRfhGIEY8RlhGfEagRrxG6EcERyBHPEdYR3xHmEe0R9BIDEgoSERIYEiQSMBI9EksSUhJZEmASbBJ+EoUSlhKkEqxBYnJldmV1bmkwMUNEQW1hY3JvbkFvZ29uZWtDYWN1dGVDY2Fyb25DY2lyY3VtZmxleENkb3RhY2NlbnREY2Fyb25EY3JvYXRFY2Fyb25FZG90YWNjZW50RW1hY3JvbkVvZ29uZWt1bmkxRUJDdW5pMDE4RkdicmV2ZUdjYXJvbkdjaXJjdW1mbGV4dW5pMDEyMkdkb3RhY2NlbnR1bmkxRTIwdW5pMDFFNEhiYXJIY2lyY3VtZmxleElKSWRvdGFjY2VudEltYWNyb25Jb2dvbmVrSXRpbGRldW5pMDA0QTAzMDFKY2lyY3VtZmxleHVuaTAxRTh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQk5hY3V0ZU5jYXJvbnVuaTAxNDVFbmdPaHVuZ2FydW1sYXV0T21hY3JvblJhY3V0ZVJjYXJvbnVuaTAxNTZTYWN1dGVTY2VkaWxsYVNjaXJjdW1mbGV4dW5pMDIxOHVuaTFFOUVUYmFyVGNhcm9udW5pMDE2MnVuaTAyMUFVYnJldmVVaHVuZ2FydW1sYXV0VW1hY3JvblVvZ29uZWtVcmluZ1V0aWxkZVdhY3V0ZVdjaXJjdW1mbGV4V2RpZXJlc2lzV2dyYXZlWWNpcmN1bWZsZXhZZ3JhdmV1bmkxRUY4WmFjdXRlWmRvdGFjY2VudHVuaUE3OEJ1bmkwMTNCLmxvY2xNQUh1bmkwMTQ1LmxvY2xNQUhSLnNzMDRSYWN1dGUuc3MwNFJjYXJvbi5zczA0dW5pMDE1Ni5zczA0SS5zczA1SWFjdXRlLnNzMDVJY2lyY3VtZmxleC5zczA1SWRpZXJlc2lzLnNzMDVJZG90YWNjZW50LnNzMDVJZ3JhdmUuc3MwNUltYWNyb24uc3MwNUlvZ29uZWsuc3MwNUl0aWxkZS5zczA1Ry5zczA2R2JyZXZlLnNzMDZHY2lyY3VtZmxleC5zczA2dW5pMDEyMi5zczA2R2RvdGFjY2VudC5zczA2dW5pMUUyMC5zczA2QWRpZXJlc2lzLnNzMDhDZG90YWNjZW50LnNzMDhFZGllcmVzaXMuc3MwOEVkb3RhY2NlbnQuc3MwOEdkb3RhY2NlbnQuc3MwOElkaWVyZXNpcy5zczA4SWRvdGFjY2VudC5zczA4T2RpZXJlc2lzLnNzMDhVZGllcmVzaXMuc3MwOFdkaWVyZXNpcy5zczA4WWRpZXJlc2lzLnNzMDhaZG90YWNjZW50LnNzMDhJZGllcmVzaXMuc3MwNS5zczA4SWRvdGFjY2VudC5zczA1LnNzMDhHZG90YWNjZW50LnNzMDYuc3MwOEFfSS5kbGlnVV9JLmRsaWdhYnJldmV1bmkwMUNFYW1hY3JvbmFvZ29uZWtjYWN1dGVjY2Fyb25jY2lyY3VtZmxleGNkb3RhY2NlbnRkY2Fyb25kY3JvYXRlY2Fyb25lZG90YWNjZW50ZW1hY3JvbmVvZ29uZWt1bmkxRUJEdW5pMDI1OWdicmV2ZWdjYXJvbmdjaXJjdW1mbGV4dW5pMDEyM2dkb3RhY2NlbnR1bmkxRTIxdW5pMDFFNWhiYXJoY2lyY3VtZmxleGkubG9jbFRSS2ltYWNyb25pb2dvbmVraXRpbGRlaWp1bmkwMjM3dW5pMDA2QTAzMDFqY2lyY3VtZmxleHVuaTAxRTl1bmkwMTM3bGFjdXRlbGNhcm9udW5pMDEzQ25hY3V0ZW5jYXJvbnVuaTAxNDZlbmdvaHVuZ2FydW1sYXV0b21hY3JvbnJhY3V0ZXJjYXJvbnVuaTAxNTdzYWN1dGVzY2VkaWxsYXNjaXJjdW1mbGV4dW5pMDIxOXRiYXJ0Y2Fyb251bmkwMTYzdW5pMDIxQnVicmV2ZXVodW5nYXJ1bWxhdXR1bWFjcm9udW9nb25la3VyaW5ndXRpbGRld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN3Z3JhdmV5Y2lyY3VtZmxleHlncmF2ZXVuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pQTc4Q3VuaTAxM0MubG9jbE1BSHVuaTAxNDYubG9jbE1BSGEuc3MwMWFhY3V0ZS5zczAxYWJyZXZlLnNzMDF1bmkwMUNFLnNzMDFhY2lyY3VtZmxleC5zczAxYWRpZXJlc2lzLnNzMDFhZ3JhdmUuc3MwMWFtYWNyb24uc3MwMWFvZ29uZWsuc3MwMWFyaW5nLnNzMDFhdGlsZGUuc3MwMWEuc3MwMmFhY3V0ZS5zczAyYWJyZXZlLnNzMDJ1bmkwMUNFLnNzMDJhY2lyY3VtZmxleC5zczAyYWRpZXJlc2lzLnNzMDJhZ3JhdmUuc3MwMmFtYWNyb24uc3MwMmFvZ29uZWsuc3MwMmFyaW5nLnNzMDJhdGlsZGUuc3MwMmwuc3MwM2xhY3V0ZS5zczAzbGNhcm9uLnNzMDN1bmkwMTNDLnNzMDNsc2xhc2guc3MwM2FkaWVyZXNpcy5zczA4Y2RvdGFjY2VudC5zczA4ZWRpZXJlc2lzLnNzMDhlZG90YWNjZW50LnNzMDhnZG90YWNjZW50LnNzMDhpLnNzMDhpZGllcmVzaXMuc3MwOGkubG9jbFRSSy5zczA4aW9nb25lay5zczA4aWouc3MwOGouc3MwOG9kaWVyZXNpcy5zczA4dWRpZXJlc2lzLnNzMDh3ZGllcmVzaXMuc3MwOHlkaWVyZXNpcy5zczA4emRvdGFjY2VudC5zczA4YWRpZXJlc2lzLnNzMDEuc3MwOGFkaWVyZXNpcy5zczAyLnNzMDhmX2YubGlnYXRfdC5saWdhdW5pMDQxMHVuaTA0MTF1bmkwNDEydW5pMDQxM3VuaTA0MDN1bmkwNDkwdW5pMDQ5MnVuaTA0MTR1bmkwNDE1dW5pMDQwMHVuaTA0MDF1bmkwNDE2dW5pMDQxN3VuaTA0MTh1bmkwNDE5dW5pMDQxQXVuaTA0MEN1bmkwNDFCdW5pMDQxQ3VuaTA0MUR1bmkwNDFFdW5pMDQxRnVuaTA0MjB1bmkwNDIxdW5pMDQyMnVuaTA0MjN1bmkwNDBFdW5pMDQyNHVuaTA0MjV1bmkwNDI3dW5pMDQyNnVuaTA0Mjh1bmkwNDI5dW5pMDQwRnVuaTA0MkN1bmkwNDJCdW5pMDQyQXVuaTA0MDl1bmkwNDBBdW5pMDQwNXVuaTA0MDR1bmkwNDJEdW5pMDQwNnVuaTA0MDd1bmkwNDA4dW5pMDQwQnVuaTA0MkV1bmkwNDJGdW5pMDQwMnVuaTA0NjJ1bmkwNDZBdW5pMDQ3MnVuaTA0NzR1bmkwNDk2dW5pMDQ5QXVuaTA0QTJ1bmkwNEFFdW5pMDRCMHVuaTA0QjJ1bmkwNEI2dW5pMDRCQXVuaTA0QzB1bmkwNEQ4dW5pMDRFMnVuaTA0RTh1bmkwNEVFdW5pMDQzMHVuaTA0MzF1bmkwNDMydW5pMDQzM3VuaTA0NTN1bmkwNDkxdW5pMDQ5M3VuaTA0MzR1bmkwNDM1dW5pMDQ1MHVuaTA0NTF1bmkwNDM2dW5pMDQzN3VuaTA0Mzh1bmkwNDM5dW5pMDQ1RHVuaTA0M0F1bmkwNDVDdW5pMDQzQnVuaTA0M0N1bmkwNDNEdW5pMDQzRXVuaTA0M0Z1bmkwNDQwdW5pMDQ0MXVuaTA0NDJ1bmkwNDQzdW5pMDQ1RXVuaTA0NDR1bmkwNDQ1dW5pMDQ0N3VuaTA0NDZ1bmkwNDQ4dW5pMDQ0OXVuaTA0NUZ1bmkwNDRDdW5pMDQ0QnVuaTA0NEF1bmkwNDU5dW5pMDQ1QXVuaTA0NTV1bmkwNDU0dW5pMDQ0RHVuaTA0NTZ1bmkwNDU3dW5pMDQ1OHVuaTA0NUJ1bmkwNDRFdW5pMDQ0RnVuaTA0NTJ1bmkwNDYzdW5pMDQ2QnVuaTA0NzN1bmkwNDc1dW5pMDQ5N3VuaTA0OUJ1bmkwNEEzdW5pMDRBRnVuaTA0QjF1bmkwNEIzdW5pMDRCN3VuaTA0QkJ1bmkwNENGdW5pMDREOXVuaTA0RTN1bmkwNEU5dW5pMDRFRkxhbWJkYXVuaTAzQTlsYW1iZGFwaXVuaTIxMDd1bmkyNEZGdW5pMjc3NnVuaTI3Nzd1bmkyNzc4dW5pMjc3OXVuaTI3N0F1bmkyNzdCdW5pMjc3Q3VuaTI3N0R1bmkyNzdFdW5pMjRFQXVuaTI0NjB1bmkyNDYxdW5pMjQ2MnVuaTI0NjN1bmkyNDY0dW5pMjQ2NXVuaTI0NjZ1bmkyNDY3dW5pMjQ2OHplcm8uc3MwOW9uZS5zczA5emVyby50Zm9uZS50ZnR3by50ZnRocmVlLnRmZm91ci50ZmZpdmUudGZzaXgudGZzZXZlbi50ZmVpZ2h0LnRmbmluZS50ZnVuaTIxNTN1bmkyMTU0dW5pMjE1NXVuaTIwODB1bmkyMDgxdW5pMjA4MnVuaTIwODN1bmkyMDg0dW5pMjA4NXVuaTIwODZ1bmkyMDg3dW5pMjA4OHVuaTIwODl1bmkyMDcwdW5pMDBCOXVuaTAwQjJ1bmkwMEIzdW5pMjA3NHVuaTIwNzV1bmkyMDc2dW5pMjA3N3VuaTIwNzh1bmkyMDc5dW5pMDBBMGh5cGhlbl9oeXBoZW5faHlwaGVuX2dyZWF0ZXIubGlnYWh5cGhlbl9oeXBoZW5fZ3JlYXRlci5saWdhaHlwaGVuX2dyZWF0ZXIubGlnYXVuaTMwMDNwZXJpb2Quc3MwOGNvbG9uLnNzMDhzZW1pY29sb24uc3MwOGVsbGlwc2lzLnNzMDhleGNsYW0uc3MwOGV4Y2xhbWRvd24uc3MwOHF1ZXN0aW9uLnNzMDhxdWVzdGlvbmRvd24uc3MwOHBlcmlvZGNlbnRlcmVkLnNzMDh1bmkzMDFDdW5pMzAwOHVuaTMwMDl1bmkzMDEwdW5pMzAxMXVuaTMwMEN1bmkzMDBEdW5pMzAwQXVuaTMwMEJ1bmkzMDE0dW5pMzAxNXVuaTMwMEV1bmkzMDBGdW5pMzAxNnVuaTMwMTd1bmkwRTNGbGVzc19oeXBoZW4ubGlnYWxlc3NfaHlwaGVuX2h5cGhlbi5saWdhbGVzc19oeXBoZW5faHlwaGVuX2h5cGhlbi5saWdhbGVzc19oeXBoZW5fZ3JlYXRlci5saWdhdW5pMjYzOXNtaWxlZmFjZXVuaUY4RkZ1bmkyMTE3bWludXRlc2Vjb25kdW5pMjExNnVuaTI0MEN1bmkyM0NFdW5pMjQwQkV1cm91bmkyMEI0dW5pMjBCRHVuaTIwQjl1bmkyMEFBbm90ZXF1YWxncmVhdGVyZXF1YWxsZXNzZXF1YWxhcHByb3hlcXVhbGluZmluaXR5aW50ZWdyYWx1bmkyMjA2cHJvZHVjdHN1bW1hdGlvbnJhZGljYWxwYXJ0aWFsZGlmZnVuaTAwQjVhcnJvd3VwdW5pMjE5N2Fycm93cmlnaHR1bmkyMTk4YXJyb3dkb3dudW5pMjE5OWFycm93bGVmdHVuaTIxOTZhcnJvd2JvdGhhcnJvd3VwZG51bmkyMTlEdW5pMjFFNHVuaTIxRTV1bmkyMUE5dW5pMjFBQXVuaTIxQjB1bmkyMUIxdW5pMjFCM3VuaTIxQjRjYXJyaWFnZXJldHVybnVuaTIxRTdhcnJvd3VwLnNzMDd1bmkyMTk3LnNzMDdhcnJvd3JpZ2h0LnNzMDd1bmkyMTk4LnNzMDdhcnJvd2Rvd24uc3MwN3VuaTIxOTkuc3MwN2Fycm93bGVmdC5zczA3dW5pMjE5Ni5zczA3YXJyb3dib3RoLnNzMDdhcnJvd3VwZG4uc3MwN3VuaTI1Q0ZjaXJjbGV1bmkyNUNDbG96ZW5nZXRyaWFndXB1bmkyNUI2dHJpYWdkbnVuaTI1QzB1bmkyNUIzdW5pMjVCN3VuaTI1QkR1bmkyNUMxdW5pMDMwNi5jeXVuaTAzMDh1bmkwMzA3Z3JhdmVjb21iYWN1dGVjb21idW5pMDMwQnVuaTAzMEMuYWx0dW5pMDMwMnVuaTAzMEN1bmkwMzA2dW5pMDMwQXRpbGRlY29tYnVuaTAzMDR1bmkwMzEydW5pMDMyNnVuaTAzMjYubG9jbE1BSHVuaTAzMjd1bmkwMzI4dW5pMDMzNXVuaTAzMDguc3MwOHVuaTAzMDcuc3MwOGRpZXJlc2lzLnNzMDhkb3RhY2NlbnQuc3MwOHVuaTAyQkN1bmkwMkI5dW5pMDJDOGJsYWNrQ2lyY2xlZGJsYWNrQ2lyY2xlZFN0cm9rZTAwMS4yMDBjb3B5cmlnaHQgbWlzc2luZ0dlaXN0IFNlbWlCb2xkU2VtaUJvbGQA6QIAAQAMABEAFgAcADEAPABEAEgATgB1AH4AgQCHAIwAkQCUAJkAngC0ALgAwwEMARMBGwEgASgBMAFcAWABdQGCAYoBkQGYAaIBqwH2AhUCLwJFAk8CVAJbAmECkAKpAsAC0QLcAuYC7QL0AwADBgMlAysDLwNBA04DWgNoA3MDfQOGA48DlgOdA6QDrAQPBGUEaASCBL0E5QTtBQgFJgUpBTYFOQVEBU4FVgVdBWQFfgWGBcIFzgX2Bf0GCAZOBlkGewaaBqgGxQbOBucG7AcWBysHOgdKB2YHeAd/B4MHjAeTB5wHpweyB70HwwfMB9UH4QfpB/QH/whCCIEI2AlHCakKDQprCsYLIAt3C6wLtQvBC+8MNwx/DMgM8w0tDWANeg24DdAOEQ5NDokOlQ7LDuwPHg8jD0UPaw+AD6kPsw/JD/EQCxAzEFoQfxCTELcQwBDjEPYRGBE6EUIRYRGBEaARvhHZEdwR9BINEiYSPhJDElMSahKAEpYSmxKjErASuxLMEt8S8BMDExUTJRM2E0cTWBNpE3oThxOME5wTrBO8E8sT2hPpE/gUBxQVFCMUMRQ/FE0UWxRoFHUUghSPFJwUqRS0FMAUzBTYFOQU7BT3FQIV7wbl9yEF+xQGDhK09xkLAdv3FgugdvladwsV9xH3BvsRBvde+wYV9xD3BvsQBg4V7wZO9yEF+xUGDhX3tez7tQYOe/cFC/cmUsQSCxWxqKaysW6lZWVucWVkqHCxH/dJFrGoprKxbqVlZm1xZWSpcLAfDktjWTeJH88GC8kdDvcauvcaCxLR9xQLEtv3FgsVgh1/9w8dC8/3W84Lohb3HAbG9zwF960Gxvs8Bfcc9wAdC4uTHQv3d38V48+xxKUfC/g4dRX3Zvc99z33Z/dl+z33Pftm+2X7Pvs9+2X7Z/c++z33ZR/dBPs6+xf3GPc69zn3F/cY9zr3OvcY+xj7Ofs6+xj7GPs6Hwv7Ku743XcLf+hPdvhT7gug9w0dC3/zL+f4TncL9yf3IPsnBgv38XsV90P3AvP3Oh/4XfsW/F0HJlNTKClTw/Ae+F37FvxdB/s69wIj90IeC6axHQuymqKnshrKVbhCQlReTGSib7J8Hgv7NuzXdq/v99TjM+8L1lPW9NZT1gvZxa7FqR8L4c2zxqcfC8fwBez7DCCuBw4StPcZ9273FAv4D3sV9zz3GfL3gB+2+8Qk90AHK4NQRSMb+x1N9wb3I/ckyPcH9x7iwlc1oB/3G5IF9ypqIun7Mhv7ZfsT+zb7Zvtl9xT7NfdkHwtXeW5lWRpDyVzgHs8EYG6isLGop7a1qG9lZm50YR8L2xb4evcF+/j3T/fk9wT75PdN9/D3BfxyBgtxS6UGs6pvaGpucmZlbaCniR9AiAUL9wn4qvsU+8cGC3fbKB0L97n3DgHJC05raE8eC/fDfxX3D+bL86gf+xeTBVx8ZHBSGz9auumGH5kd+zEl+wP7PPs98fsC9zQejx0L+xX8pvsY+KYF+w0G+xb8pvsW+KYF+x4GCzgHxXFRsD4b+xgu+wD7Lfsv6SP3GR8LBfsmBvs7+8L7PPfCBfsmBguQIAXf+AL7wiYGC4v3SPszdvladwtETm1Bbx8L9xT7CvcKCwG09xn3i/cZA0wdCwZ1b3wdCzCj2k73IBuJ97QVP1vJ7e25ydnZvE4oih8nWk8+HgsiHQNGHQsVWR0LtKqptLRsp2Jja29iYqttsx8L98D7NhX3LO/T9x0fCxXayL/NvWe4WpcfCwX7Hwb7yvvL98v7ywULe/cF9zry94v3BQsB0fcUA9EW9xQL92j3E/ch93kL9wb3Bfv7+wUL+3jO2rxaC1yctWnNGw73BhK09xkLe/cE+Jr3BAsBz/cY96/3GAP38XsV9zT13PcW9UvR+1O0H/sSqGmhxRrCubHX5L5WPpQe9xeRBfcdfC3u+z0b+zQrNfsQ+wjNWfdEYx/3JWmnalQaTlpsOChVvud+HvsYgwX7KJf2KPdFGwshHfeP9xT//4WAAP8AeoAAE573m38VE51AHRNdjjoFE273Dfiq+xQGE54/B8JtU6w+G/snQfsQ+y/7Mdb7DvcnH7HzFTRj3ejrs9ri5a0/KCxqOzAfCxWzHQG09xkD98R/Ffce69z3FJof+xiRBYYdlh0L28jF3dlUx0RxdoN6eh+W3wX3L8/7bgZr+3gF0garnqGQohuvp2thYG9uZ2pvnqmGH0CIBUiRx1zUGw7WA/gufxX7YPs59zn3Yfdf9zn3Ofdg92D3Ofs5+1/7Yfs5+zn7YB8L0B1zdXNqHwsV1gb3ErX3BtnrHr/7qEf3VQdFLWH7BfsFGg7RFvcYBvdQ9+QF++T3FPiq+xIH+1b77QX37fsUBwtYHQ75qxXvBuX3IQX7FAYOiR0OoHb3ofcF92v3BQv7VPuSBU33SAcLtvcb9xr3GQufdvlddwEL9xf3gPcWC/e2fxX3HOjE8uRUufs8pR+0HSKT3kD3MhsLOR3g9yGuHQv4EnsVXx33efsT9yP7aPtn+xT7I/t5+3n3FPsh92cf9wUE+xQ/6vc29zbX7PcU9xTXKvs2+zY/LPsUHwsBzPcW98n3FgM7HQugdviqd+b3BhLP9xn7F/cUE+jRFvcU+Kr7FAYT8InSFfcZ9wb7GQYOIh333MwdC5cds7SXmZwe3x0L+Ah7FfdI9fH3O6cf+xySBSV7U04iG/sKPuz3NPcy1vD3De3EUi6cH/cckgX3NW0q6vtJG/tc+xf7JPt4+3z3HPse91UfC/fEfxXyHewd8wQLAaf4nwOnFvif9wX8BQb3+fh5BfcE/IT7BfflB/v0/HkFC1Cav2bGG5T3XxVkdai1tqKpsrCmbWCKH2GKb25oGw4V1tO0z2L3jEwGch2NHeTEwOOPHz4GXYZxeGEbYXCeuYYfPQYzj8VW5RsOs7SXmZwf3x0L97X39wX7Lwb7rvvuBffu+xb9WvcW9+8HC7YV3R0LQIFeZ00bOFzL9wP3ArrM3sm4Z0eVH/cYkgX3E3sq1fscG/szI/sD+zwL90oEa3afqaignauqoHlubXZ3bB8LIx3i9xr7E9c/9xw21xILFdIGzvdCBfcQ+yf7IMgHC/cW+JsG98L8mwX3MPla+xb8qgb7xviqBfssBgv4B/cF+wz4eGAd9wf8ePsNBgstHfdcUx0L9xAdDvQd9xH7FPsRC/cK993oHQvW9xHZRNIT+Av7KveANeH5BHcSC6B296D3Bvdr9wUL9wX3T/cE9033BQv3DR0SogvTQ9r3EdUT7Av7PfP7AvczHwsFcGt8bWUaVbJqzgv7MyP7Avs9C/gQqAb3SCb1+y0L+xb7vPu/97z7FgshHfeN9xX7FPcU+xH3ERPugFodE/aA+HsHE/ZA+xEGE+5ATh0T7wDQyK2/pB9HB0BfaTxGbqK0fh77GIIFE+6AVh0L9xX7FPcU+xH3ERPuQFodE/ZA+HsHE/Yg+xEGE+4gTh0T7oDQyK2/pB9HB0BfaTxGbqK0fh77GIIFE+5AVh0L9xT7BPcEE7iA93F/FUEdE3SAjzQFE3kA9wL32Ab3Ij3b+yz7GTVL+wR2HvcXhQXBl62oyhvOrmRAH/tFaAX7CXRSWi8aE7iALtVW9wMeE7kAPB0TtgALFfdm9z33Pfdn92X7Pfc9+2b7Zfs++z37Zftn9z77PfdlH90E+zr7F/cY9zr3OfcX9xj3Ovc69xj7GPs5+zr7GPsY+zofK/fxFaijo6ioc6FubnN1bm6jc6gf91oWqKOjqKhzoW5udHVubqJzqB8OErb3G/gK9xL//6mAAP8AVoAAE734BHsV7uG81a8fE31QHRO+90QGLIVLQiIb+x5O9wH3KPckyfcH9xvxu1Q4mx/3G5IF9yVtL+77SBv7ZPsP+zP7aR8Tvftt9w37LfdgHgt7FfdA9wbT9x7oVcwzqB8T7M6ltL7UGvcGLtz7M/szLzr7BkKzWM5xHhPyM29VSS4a+x73BkP3QB73BgQvULHW0r+67u+/XERAT2UvHxPs99wEQGCqysS0r9jYtWdSTF9sQB8O9xT//4WAAP8AeoAAE5xA95t/FUAdE1pAjjoFE2qA9w34qvsUBhOcgD8Hwm1TrD4b+ydB+xD7Lx8TnED7Mdb7DvcnHhOcgLHzFTRj3ejrs9ri5a0/KCxqOzAfE5sAC3/w9xTh9yHxAbT3GfeL9xkD97j4thX7DzBLI24f9xeDBbqasqbEG9e8XC2QH/wQbgb7SPAh9y33MfH3A/c89z0l9wL7NB77CvvdFfeLBjiBXF5GG0dctOKFHw579wb3pfH3EPcFAfhk9xoD99p7Ffc39wHu9yv3HS7x+yVLVHZnaB+h90kF99b3BfxHBlr8LgX3GAa2nrunxxviv1U4NVdZNT9arM6AH/sZhAX7EJbnOPc6Gw57Ffcw9wHn9zL3Iivp+yMfE/Q+Umpgax/3KZjF0ugbzqpuWpsf9w+VBfcCcD/R+xkbE+z7ZDX7SfuB+2Ho+wv3RB/3AQQ4VsXe3cfB3NfAVTkzVFY8Hw6gdvhO86vbO/cYEvcB9xT3YfcUE9y9+NYVxvzWyh33CPcFBxPs2/sFBxPcv/sUBxPsV1AHDvcZE/lMHRP2CwG29xv3GPcZA30dCxXnxub3IO9b3zE7T1Q1N8FU0h8T9K+nmqSdH0WDbmNhG3B5mKSDH0GEBRP4gB0W+KH3BfwFBo+3xMf3CsoI9x/Vvr73ARr3Ei/h+zEeE9j7Nikx+yh9H/cagwXhlru63BvXsmFQT2hvKlgfE+j7VyVLKPtAGg4V6cnb9xP3FE3cLSxNOvsU+xPJO+ofzwR6fJCVfx/3DPdUBZB4jnRxGjNsWFYetvedFfsL+1MFhZ2JoaQa5qm9wZuahoGXHg73GgPbFvcW96D3PgbVqHJSjx+a+04F9xgGefdhhdRms0iVGdChwMngGvcWKd77LR77vQb3tfvcFfsz92v3LQbfumVFRlxlPR8L+yD2rO7493cS0fcVQvcM+wz3LBPw91sWE+Ta7gYT8NsdMPt7FRPo2QZCHWEd5xL3adYTsPc6+3gVz8GvzR8T0L1tsUmQHhOwqLYFPAZpUq9oBcSXenNzeH1sa3qYpn8fTnEFYh2MHRO894p/FRO62sKtzqYfE3qNMgUTfEgdE7wzY1xGTW6z5R73zPsU++wH+xPOQPcBHgv7IPbBdvladyId9wP3DOzMHfdz/kEV2QZCHTYd4PchAaH4owP3APsqFeYG2bOnzaIf92X44gX7GQb7E/wd+xv4HQX7GAb3UvyVBbAGfWYFcoF9gWgbRwYL6BVYb6K1sKKjxJYf9x6nBW0HOlVVNh4L9xoD2xb3Fveh9x0GlAb3J/uhBfchBvs297cF5am71ega9yAq3fs8HvunBveh+9wV+x/3a/cfBuG+ZURFWGc1Hwv3pM/7TAaOoaWjrqKnnhjEsay1vhrOVbpEQlFZPoIe14cFtZOgoK4bqKB5b3B8dmp2H2t2BShKe0VNGg46mG+cthqyqqbIxq9pVZQe9xaRBfJ8Qdj7JBv7KD1GKDC+X/c4bx/uep17ZxphZ3lPQWirw4Ie+xeFBQszHc33IVcd91rNJR0jHQGn+Q4Dpxb3Kwb3OfeX9zv7lwX3Kwb7g/f694D39AX7Kwb7NvuT+zn3kwX7Kwb3gPv2BQ6gdviqd+T3FRLP9xn7F/cUE+jRFvcU+Kr7FAYT8MvQKx3yFvcDBtK3qMyhH/dy+PwF+xsG+x78IPsh+CAF+xwG91X8kAW4BnZTBXODeX9sGzsGCyMdwR0OoHb3wfcF97x3Ih33v/cWA9sW9xb3wfe/+8H3Fvlamh0GDl4d9ycG3+T3MPuABfckBvts98z3ZfdyBfsyBvtv+4UF+DX7FAcLi/cF+Hj3Bcz3IQH3OPcWA7YWix0LA9sW9xb3bgbb5vdw+8kF9ykG+6/4Ivee98wF+y4G+6r72AX32PsWBwvRFsod94z7FAcL90P4aPtD+GcF+xIG90L8Z/tC/GgFCxL19xn7FvcUE+iI+yoV1wb3C7i39wIf+Kb7FPyiB112fmUeVgYT8AsB96T3FgP3pBb3FvesBveM+EJPHfeN/EIFCwHR9xYD+D4W9zMG+4T3n/d4958F+zEG+2z7lQX3lfsW/Kr3FveWBwsV9yrt8/c5H/hd+xb8XQckYFZAQWG/84ke+xeEBfssjOj7AvcvGwsW9xb3IuD3BTb4W/srBvvj/GIFIff4B/tq9wUV92r3sgX7sgcO97AW9wbujh03KN/7rgchvFz1HgsjW/sA+w8nuzfmH43PFWVyqbaMH7WMpqiuG7OhbmFgc21kHw6JHfuP+zKJHQ4B93v3GQOnFvif9wX8BQb3+fh5BfcE/IT7BfflB/v0/HkFCxWxqKaxsG6mZWZucGZlqHCwHwv3FPfJBuK3udHJqGA0HvvM9xT36wf3C0zf+wpIUnBSbx4L+xb7dQY5S1UqN2C94B73dvsW+44H+xzfNfcn3tGvwq0eC/cWA9sWih0LoHb46fcFAfeG9xYD94YW9xb46fds9wX8xfsF92sGDgH3dvcZA8QW+Gfu+9QG98z33QX1/FQo970H+8j73QUL+S0W+Vr7LAf7xvyqBfiq+xb9WvcwB/fC+JsF/JsHC7eXpbCyGsZVuEJJU2BSgx7WhwWfjqCbqhupoXZwCwP3bPsGFfcSBvtC+Gj3QvhnBfsSBvtD/GcFC9QdDvladwG29QPF+AUV2QaY91wF9yEh+yEHDhX3JAb3JvdBBcEH+yb3QQX7JAb3PvtcBQv3TPebBfsiBvsL+0r7D/dKBfsfBvdO+5oLfxX3GQb4mvl2BfsZBvwp+/0V4tDW7R8L2u7bHQugdviqd+D3IV4d+Kr7FAYL94YG93P3EPcT93f3ePsT9xT7dh/7gAsVPlnP9vcBvM3Z27dO+wb7BV5NPB8LZAZxfZenH/jP+xQHivzcBTK9ZtoeCyMd8B0O7h33jvuOBQv49ewBtPe1A7T49SYd9wgdnZuToKGnHwsiHQPbFvcW+On4DfcF/I8GCwGi+ccDovlaFfgt/Vr4LvlaBQuL9wX3ePcF95R3Ih33qPcaC/sU/Ef7M/hH+w/8R/s0+Ef7FAvRFvcU98gG3bOt3R699wJaBgsV9wz3AGgGwOYFPQZPJgUO9yju+yj3SPsM+0j7KCj3KAuL6fcq6/dWdwHR9xT3e/cYCxX7iwbelbq40BvPumI0kR8L94wG9zLgxfcC9wU2xvsyHwvz9yLcAbTd9yj16PT3I9wDCycd+Jj3BbcoHbb3GwuYHZYdCxVEBkj7QgX7EPcn9yBOBwv3Hwb3y/fL+8r3ywX7HwYL9Qb3KNI8+zj7NkQ8+ygfCwHb9xQD2xb3FPla+xQGCwPbFvhn9wX75fjp+xYGC/cy8/cC9z33PSP3AvsyCxLR/wB5gAD//4aAAPcUC0AGXnabvR/3ovch7vshC/sqFfcWBhN694AHE3wLA9uKFfla9/n9Wvf4BQsG+5T5WgX7MwZ0/EMVC/dwzPcuu86+w8wBtssLz/cmy8bPAfeO1gP3TAv3i/cFyuwStvcbw/e1C/cw+y73GveT9xoT6Av3FfsV9xn3ovcXE+wLEq/3Gfdu9xT7BPcEC9u5vuyVH6n3swX3Rwtw0QWDgHuGeht8f5ML9yD3efcgAdv3JwPbCwbbs3NXWWNzOx8O+D33IPcydwG29ycL9wP3EfcFAfdl9xYLdvc89wP3wPcXi3cLe/cG93vs90/3BRIL8fch4fcU8AszzxXj9woF+woHC/sU+2/7Wfdv+xQLAQABAAAiAACrAAGHAQCsAgGJAQCvAQCKAAAjAQGLAQCxAAGNAQAlAAGPAQCaAAAmAACyAAGRAACzAQGSAAC1AAGTAwAnAQGXBgApAAGeAQAqAAGgAAC2AgGhAAC5AAGiAgArAAGlAQAsAAGnAQAtAAGpAgCMAAAuAQGsAgC6AAGvAAAwAAC7AwGwAQCNAAC/AACOAAAxAACdAAAyAQGyAgA0AAG1AADAAAG2AwA1AAG6AwA2AADBAAG+AADCAgG/BAA3AQHEAwA5AQDFAAHIAADGAAHJAQA7AAHLAADHAAHMJwBCAADIAAH0AQDJAgH2AQDMAQCQAABDAQH4AQDOAAH6AQBFAAH8AQCnAABGAADPAAH+AADQAQH/AADSAAIAAwBHAQIEBgBJAAILAQBKAACRAADTAgINAADWAAIOAwBLAAISAgBMAAIVAQBNAAIXAgCSAABOAQIaAgDXAAIdAABQAADYAwIeAQCTAADcAACUAABRAACiAABSAQIgAgBUAAIjAADdAAIkAgCVAABVAAInAwBWAADeAAIrAADfAgIsBABXAQIxAwBZAQDiAAI1AADjAAI2AQBbAAI4AADkAAI5MQBtAQJrAACLAACPAAJsiQARCQL2HwBjAACbAAMWAQCeAACjAAMYAAFAAwMZFwAPAAANAAAbAQB5AAACAABgAAAgAAB7AAByAAB0AAALAAMxAAAEAAAQAAA9AAMyCAAOAABvAACJAABAAAM7AAAJAQBcAABeAAA8AAA+AAM8DQB1AQBpAAB3AABBAAAIAABqAAB4AABrAQADAABoAABlAANKBwAhAAAHAABzAABmAACqAAClAANSAACZAAChAANTAQBdAACgAABwAQNVAwBhAABnAAAFAANZBABiAABkAAAMAACmAACoAACfAAAeAANeAAAfAAAdAANfAQCcAANhAABfAACXAAA/AANiBwAGAAB6AANqPwCDAACCAAB8AQCGAAB+AACIAACBAACEAAB/AQCFAACHAAOqBgMPAgABAPwA/wEOASYBPAFUAXUBjgGmAcMB/QIXAk0CoAKjAqkCtALCAzMDSgNXA4EDoAOkA6gDrgO7A8gD4wPmA/oD/QQXBEoEfQSABKQE+AUEBRIFRQV2BZsFxgY8Bj8GlAbIBswG6QbxBwwHIQdEB0wHXgeJB7wHvwfTB/AIFwgmCDoIRAhUCHcIegitCLEItwjCCNAI0wkICU4JWgltCYgJngmxCcUJ2gpbCpELFAsXC10LzAvSC98L7QwIDA4MGQwnDHMMlAy3DRcNGg1DDVsNlQ3FDcsN0Q3dDf4OGg4iDisORg6tDscO4A8NDzYPTg9vD4gPoA+jD6YPrg/dD/EP+RBgEGYQdBCCEJAQlBCXEJoQoBCtELsQ1hD0EP4RHBFXEYQRjhGnEeESGRIoElgSeRKgErQSzBLlEvITIRM/E2cTehOUE6kTxBPdE+8T/RQTFC8UQxR3FJkUqxTEFNwU9hUcFTwVVRWyFhoWQRaAFyMXiheQF50XqxfsGAMYEBhBGIEY3BlNGVMZXBlqGYsZnRmrGbQZzRokGoQahxqWGrwayBrWGxIbJxs4G04buBu7G74b3xvjG+8b9xwUHC8cMxw7HEwcYByVHMUcyRzZHPEdFB0dHS0dbB2THaodwx3HHhEebB6HHrce3x7iHzgflh+lH7sf1h/uIAQgGyA0ILAgySEqIS0hjiH1Ig8iICIyIlkiYiJyIoMiyiLuIw8jiSOWI88j/CREJGQkgSSJJJUkxiUhJSklMSVFJX8lsyYNJjomSyZjJoQmnSa1JrgmuybEJxMnJicvJ1onfCeKJ5cnpSepJ60nsCfZJ+Yn8igAKD8oVShiKJso3CkdKXEpkCmdKakptynwKgIqDyo/Knwq0isdKyErLCtNK3MrnSu+K8sr/iwdLDMsNyxSLFYsaiyaLKkswizVLO4tMi1ALVUtaC2TLcMt3C4ILokuwi7RLxUvGC8eLysvRy92L8sv0S/UL9cwAjCGMIwwmTCsMMQw9DD4MPsxBzEjMSYxLDEvMTkxSzG9McAx3TILMigyUzJ8MpIyrzLOMxMzSDNOM600BTQJNB40ITRiNNA1GDVgNZE19TZvNqs26TcSN0U3SDd7N8I37jgqOC44MThMOIc4ozi1OS05ljmoOcE54joNOmY6bDp6Oo461ztHO1Y7bDuLO5E7oTvKPAY8Kzw6PFs8XjxkPIE8hDyWPQQ9Bz0jPVs9cD2dPcw91D3tPg8+Vj65PsI/Cz9hP2U/kz+XP5o/9kBCQKdBBEFwQdBCCUJlQqNC4EL+QzVDXEOPQ5JDlkOZQ7BD4UP5RCREnETiRRhFjEWcRclF2UXtRflF/EYHRhRGH0YiRoNGrkbERt9G7kcCRxtHKkdRR2pHzkf/SB1IV0hxSI5Iw0jcSRRJU0mWSaxJvEnSSeJJ9koCSgVKEEodSihKK0o6SnBKwUsES05LwUv+TEVMoUzgTTBNOE1iTa1NwU3oTfFOBE4VTjVOR05RTntOjk6/TtJO3U7yTwJPSU92T3lPlk+uT8FP0E/jT/dQC1AtUGNQoVD+UV9RcVGTUdRR+FJuUolSp1K2Us9TAVMgU1JTl1P0VGNUdFSLVKFUuFTKVRpVSVV4VdpWO1ZtVqBWrVbAVtRW61cCVxpXP1doV5BXu1frWBtYSVh3WIpYoVjEWNhY5Vj1WTZZSllxWX9ZqFnDWhhal1qvWsta71sUW0VbeVu3XIFdJ11aXgler17fXwVfRV9+X4Jfl1+mX79fz1/zYFRgjGDTYQJhe2HuYpJjD2OVY/FkSGSaZQxlUGVxZYdlu2XgZgBmT2Z2ZpxmyWb2ZyZnpWfuaAZoKGinaOZpFWlEaXJpnWoIalVqomsla09rf2uqa9dsA2w0bFZsgmytbPBtQ21tbZtt5W4xblZue26ibsRu7W8ob0JvZG+Jb6pvwm/icAJwInBPcHxwrnEFco1yxnLPctly4HLqcwJzF3Mvc0dzVXNjc2VzdHN2c4RzhnOIc5ZzpHO1c7dzuXPHc9Rz4XPjc+Vz+nQJdBd0J3QrdDx0QHRQdFR0ZHR0dId0i3SPdJN0l3SodLh0vHTAdNt063T8+077Ks2quKqhqriqxKqiwKCsoaqucaWqpauuq6SqrqrLEuPSRNND9xn7GfdZLKps91z7HKps9xxB1RP/vxX4Gvm0FfvC/kr3wgZB98IVIPsx9gcTEAAg9xJsFRMQAAgsXgYTGgAh6gaq94QVIAcTDgEU+zH2qj/quAYTBgBCbHVqwAYTA2EF6vcIFSz7Maz3EskHqsQVEwGhBWxNSSyqya5NqgcTABBAyegVEwAQEGxoBhMAOEGqBqzOFUjJawcTAC8B+zHuBvcx9w4VbE1oyWz7MaoHE+AGgcmuTqoG9zD9XRVsbQdIXgXsbAYT4AEA+zGqBs24BUmqBg78PQ7EoJQd+TMT2DIdE+gvCg7EOB3g9yESovkzE9wyHRPsLwr7NPiEIB3EOB3g1xKi+TMT3DIdE+wvCiX4hC8dxDgd2/cmEqL5MxPcMh0T7C8K+5j5ESEKxDgd2ygdovkzE9oyHRPqLwr7mPh/FekGE9bM5AUT2iAKxDgd5vcGEvdYKQoT3jIdE+4vCvud+IokHcQ4HeD3IRKi+TMT3DIdE+wvCvsl+IQlHcQ4He7sEqL5M/x097UT3DIdE+wvChPa+4v4kiYdxPtr3vctlB35WPtg9RPsohb3HAbG9zwFE+r3rQbG+zwFrFUdq7QFigb7lPlaBfszBnT8QxUT9C8KDsQ4HczH2McS95fI2MgT3zIdE+8vCiX4cD4KxDgd4iwK900xHRPUwDIdE+TALwpY+I0VE9LAKwoT1MAlChPRwCgKE9jAKh0T0cAmChPkwCcK9/+L9wXK9wuQ9wT3TfcF+wP3AxL4mvcWE7SiFvcfBhPU5vdEBfed+0T4XfcF+9sGE7T3T/fH9wT7x/dN99P3BfzIBxPMM/wzFfcx98QFufvEBg6thArLIgpjCg7LIgq89yFjClVvHcsiCrf3JmMK+y76OCEKy2Ed90f7A/cDMXb5B/cFErb3G/eA1hOP+ANoChPPagqXnfc0l+rvpfcwGfsckgUTlyV7U04iG/sKPuz3NPcy1vD3De3EUi6cH/cckgX3NW0q6vtJG/tc+xf7JPt4+2r3CPsa9z53HxOnd2pJChOPYh3L6x0T6H0d+y75phXpBhPYzOQFE+ggCssiCsL3BqcdTfmxLQq/IwoB24AK2xb3hgb3c/cQ9xP3d/d4+xP3FPt2H/uABveA/OkVIfh4ywq/IwrH9yYB24AK2xbZHQb3gPzpFSH4eO8d+yr5tyEK9xiLCvcYiwpdMx1XHQ5dMx3N9yFXHfdKzSAdXTMdyPcmVx3d92MhCl0zHcgoHdv3FhP0Rh3dyBXpBhPszOQFE/QgCl2PCl0zHdP3Bq8K90HTFfcZ9wb7GQYOXbUdXTMd2+wuHWj3tRP4Rh0T9OrbFfe17Pu1Bg5d+2ve9xiTHS4d91D1Ifc8E/zbFvgSVR0T+qu0BfcF+/j3T/fk9wT75PdN9/D3BfxyBw5dMx3PLArb9xZSMR0T6QBGHfe+1hUT5UArChPpQCUKE+MAKAoT8IAqHRPigCYKE+kAJwrehgpOoHb3t/cE91b3BSIdA9sW9xb3t/fb9wT72/dW9+33BfxvBg7MTAoStvcb+ApKChO6SwoTepAgBd/4AvvCJgYTvPdEBiyFS0IiG/seTvcB9yj3JMn3B/cb8btUOJsf9xuSBfclbS/u+0gb+2T7D/sz+2kfE7pNCg7MTAq8158dlvmrLx3MTAq39yafHfsn+jghCsxMCrcoHbb3G/gKSgoTuoBLChN6gFAdE7sAUwoTuoBNCvsn+aYV6QYTtoDM5AUTuoAgCsz7IPac6AoStvcb9yj3DPVKChNegEsKEz6AUB0TXwBTChNegE0KT/trFdkGE96AQh3MTArC9wYScx32SgoTvoBLChN+gFAdE78AUwoTvoBNClP5sS0KzCcdP3b3nfD3Ax2oSgoTvIBLChN8gFAdE70AUwoTvIBNChO+gPsa+bkmHfcAJx3L1bng94v3BQG29xv4BvcYA/gPexX3D/PC9w66H9jVUgaQpo2oqxq2+8Q290AHe4l8iHwe+ztB9xwGY29dc04b+x1N9wb3I/ckyPcH9x7iwlc+oB/3G5MF9yBqIun7Mhv7ZfsT+zb7Zvtl9xT7NfdkHw7Euh33BqB296b3BfcF9wX7BfdmEuf3F/fd9xYT7Pi8FvcW+IjK9wVMBhPc7PsWBxPsKvvdBxPc7PsXBxPsKk37Bcn8iPcX96b33Qf73fcFFfcF9937BQcOxKB298H3Bfe8SR3b9xb3v/cWE/bbFvcW98H3v/vB9xb5WpodBvcNxxXpBhPuzOQFE/YgCvwHdwr3iicdP3b5WncuHfcbdR0TdNtDChO8+Jb9asMdDvwHvQqSzCAd/AegdvlaSR3b9xZfCi7HFekGE9jM5AUT6CAK/AdnCnn3EXD3FnH3EF8KE/Qp0iQd/AdnCtn3GPsW9xb7FvcXXwoT8InSFRPk9xn3BgYT8PsZBg78B70KocwlHfwHIx3u7AHb9xYD20MKO9omHfwH+2ve9y12+Vp3ErX1R89H9xYT5NsWE/Cl0QoT6IMdE+SrtAX5WvsWBw78B4gddM+u9xatzhPRANtDCvcO1RUTyYArChPRgCUKE8UAKAoT4wAqHRPHACYKE9EAJwpfngpfJx34+Xfg9yEBwnUdA3IK9xFvHV8nHfj5SR3CdR0T7HIKpPmmFekGE9zM5AUT7CAKpdcK924G2+b3cPvJBfcpBvuv+CL3nvfMBfsuBvuq+9gF99j7FgcOpSMd2/cmIh29HfH3YiEKpfsg9sF2+Vp3Ih3n9wy9HfdgdgpAi/cF+Ol3xQoOQIv3Bfjpd+D3IcUKkswgHUCL9wX34/eai3cuHROw2xb4Z/cF++X46fsWBhPQ9237mk8KQKEKYov3BfjpdwH3BvcWA7j3rBXQqwX7zPhn9wX75feYB/cjzWLgJVsF9377Fvu6B/sBWAUO94WWCuIjHXsdDuKgXAp7HfeJzCAd4iMd2/cmex33JfdiIQrirx3iiB3b9xaQMR2A9xYT0kDbFood9/zVFRPKgCsKE9KAJQoTxkAoChPhQCodE8VAJgoT0kAnCt/7M+/bdvlady4d99j3F/sV9xUT+NsW9xb4lQYT9Pfa/JUFhQdodnljHjIn9wgGE/jvysfpH/lf+xf8egf7xfh6BfspBg7yIgoBtvcb+Cw4Cg7yIgq89yEBtvcb+Cw4ClH5OiAd8usd+Cz3GxPseB37Mvk1FekGE9zM5AUT7CAK8iIKwvcGAbb3G7MpCrU4Cvs4+UAkHfIiCrz3IQG29xv4LDgKYPk6JR3yIgq89yEBtvcb+Cw4CvsW+TpHCvIiCsrsAbb3G8b3tcc4Cvsl+UgmHfUiCirsErj3G/gs9xsT2Lx7FfEGssAFaMDMedcbXx0fE7j3CGrpUMweE9jT7AUlBmldBalYTptEG/tn+xT7I/t5+wKpMcFMH/eTkRVbY5ikax/3svgVBaRhmFNHGvs2Pyz7FB77YPeVFfc21+z3FLawgHepHvuv/BEFd7SAvsgaDvIiCr4sCrb3G68xHbH3GxPSQHgdxPlDFRPKwCsKE9LAJQoTxkAoChPjQCodE8dAJgoT0kAnCvhPJx0qkx0q9wUStvcb+Cb3J/sW9xYTtfgPexXo1K3Evx8TdUD4XvcFBxN2+9z3T/fI9wT7yPdN99T3BQYTdfxWBhNtQAfEV0KtLhv7ZfsT+zb7Zh8Ttftl9xT7NfdkHhOu9wUE+x1L9wv3HvcfyvcM9x73Hsr7DPsf+x5L+wv7HR8OjpQKcKB29yn3Bfdj9wX3FHciHfeJ9xsD2xb3Fvcp9wwG9znq2/cf9xss2vs5H/sM9xT7Fgb3FvxUFfdj9wkH4LZpR0ZgZzYfDuwiCgG29xv4JvcaA/iNkhXDRAX3BgYv9wcF38269fcXGvdm+wr3Nvtt+2z7DPs2+2b7afcU+zH3ZL23lJmrHvsS5RX7HUv3C/ce9x/J9wz3H/ceyvsM+x8rcUlbYR9P2gX7Bgbv+xAFhX15iXYbDqeSHW0KDqeSHcz3IW0KNvgdIB2nkh3H9yZtCvtN+KohCqf7IPbBdveg9wb3a/cFIh3q9wzQqx05/PlOCpJkHWUdDpJkHbz3IWUdSW8dkmQdt/cmZR37Ovo4IQqSYR33RjR2+Qb3BBLP9xj3Rdaq9xgTn/feaAoT32oKl5wF9ymR7dv3ERr1S9H7U7QepAoTr78KE5+W+xjgL/ckeAgT33ZoSQoTn2IdkmQdtygdz/cY96/3GBPsgQr7OvmmFekGE9zM5AUT7CAKkvsg9pz3BPia9wQSz/cY5vcM0/cYE3yBCj/7axXZBhP8Qh3Li/cF923o90L3BSId9933GAPb+HMV/HP3FvhzB9iytNMe9ycG+0n7NAX7AAfvjAXqxGNGSVdhNh/7EfsF9xEG9z7u4Pcc9wUv1/sgmB/3Vfc/BfcI+8sH+y40N/snHw5czR1coHb3udz3c/cFAfeG9xYD94YW9xb3ufcT3PsT93PrCvtz+xM69xMGDlw7Csf3JgH3hvcWA/eGFvcW3Qou99MhClz7eM7avMF2+On3BRL3hvcWbdYT+PeGFqIGb1wFE/RJClyctWnNG8/Br829bbFJkB8T+KGsBajdCg5c+yD2wXb46fcFEveG9xb7FvcZ+wz3CRPw94YW9xb46fds9wX8xfsF92sGhv3QwwqxNgp5HQ6xcApRbx2xNgrf13kdjPmrLx2xNgraKB3M9xb3yfcWE+w7Hfsy+aYV6QYT3MzkBRPsIAqxNgrl9wYSzPcWgikKg/cWE/I7HRPs+zf5sSQdsXAKYfmrJR2xcAr7FvmrRwqxNgrt7BLM9xaV97WV9xYT9DsdE/z7JPm5Jh2x+23c9wz3Bfj6dxLM9xbX4TX3SMD3FhP2zPeSFfs49iT3PogeY3BraYxWCFm2ZsCuqZecnh7VBxP6fHd4hHobc32Zn7CtqOq5H+m0weH3CRr4XfsW/F0HJlNTKClTw/Ae+F37FgcOsTYKy8fYxwHM9xbCyNjIwvcWAzsdjPmXPgqxNgrhLArM9xZ+MR1/9xYT0kA7HcX5tJEKw4v3JfsQdvladxKi+TMTcPesFvcxBveV+VoF+xwGE7D7W/zJ+1v4yQX7HQYO98NRHRKi+ikTcPdqFvckBvcQ+Hr3EPx6BfclBvdR+VoF+x0GE7BNHQ73w1Ed4PchEqL6KRN4VwoTuE0d+CXMIB33w1Ed2ygdovopE3RXChO0TR33wccV6QYTbMzkBRN0IAr3w1Ed5vcGEvfSKQoTfFcKE7xNHfe70iQd98NRHeD3IRKi+ikTeFcKE7hNHfg0zCUdqLYdl7kdl6IKkviDIB2XoHb5Wkkd96T3FhPo96QW9xb3rAb3jPhCTx33jfxCBS74fhXpBhPYzOQFE+ggCpdnCvdC9xFw9xZx9xCrCin4iSQdl6IKofiDJR2XiB33Pc+u9xatzhPRAPekFvcW96wG94z4Qk8d9438QgX3DviMFRPJgM6yvuCOH0gGE9GAXYd+fXUbfYCQmnkfE8UAn3J1lmsbE+MAKh0TxwC3jZyZnxublYV8nR8T0QB3o5+BqRsOOCMKfx0OOSMKzPchfx33dfkrIB04IwrH9yZ/HfcE+bghCjgjCtL3Bsgd91/5MS0K/GnTHUChCuKvHbBxHW8KDrBxHcz3IW8KR/gdIB2wcR3H9yZvCvs8+KohCrD7IPbBdveh9wX3a/cFIh3Y9wzash07/PlOCvtfIwoB9zj3FgO2FvgH9wX7DPh4YB33B/x4+w0GDvtfvB33E/kqIB37XyMKxygd9zj3FhPoVQqm+SUV6QYT2MzkBRPoIAr7XyMK0vcGErz3IfsR9xFx9xZw9xD7EPchE+S2FvgH9wX7DPh4BhPxYB0GE+T3B/x4+w0GE+qh+TAkHftfIwrS9wYS9zb3GfsX9xYT6LYW+Af3BfsM+HhgHfcH/Hj7DQYT8PcL+TAtCvtfvB33I/kqJR37XyMK2uwS3/e1+2X3FhPoVQoT8LT5OCYd+1/7a973GPcF+Hj3BRL3OPcWXPUh9zsTcLYWE+j3oFUdE2SrtAWK9wUGE3D7DPh4YB33B/x4+w0GDvtfIwrOLAq820fPrvcWrc4T0oBVCveH+TMVE8rAKwoT0sAlChPGgCgKE+GAKh0TxYAmChPSgCcKxF0dAbb3G/gG9xgDRB0OxF0dvNcBtvcb+Ab3GANEHfmrBOTEwOOPHz4GXYZxeGEbYXCeuYYfPQYzj8VW5RsOxF0dtygdtvcb+Ab3GBP2RB37MvmmFekGE+7M5AUT9iAKxPsg9pz3Bfc68veL9wUStvcb9yn3DPD3GBN+RB1F+2sV2QYT/kIdxF0dwvcGAXMd8vcYA0QdSPmxLQrEJx33OvL3Ax2k9xgT+kQdE/77Jfm5Jh3EOB3k9xYS91ssHRPeMh0T7i8K+1f4iCkdyyIKwPcVpx2P+a8rHV0zHdH3Fi4dWiwdE+pGHRP29yjRFWYKZW5xZWSocLEf90kWZgpmbXFlZKlwsB8OXTMd0fcVrwr3g9EVsaimsbBupmVmbnBmZahwsB8OzEwKwPcVEnMd9koKE7SASwoTdIBQHRO1AFMKE7SATQoTvoCV+a8rHfwHIx3k9xYSfHoKXwoT9G/QKR38ByMd5PcVEtn3GfsX9xYT6NtDChPwy9ArHfIiCsD3FgG29xu3LB28OAou+T4pHbE2CuP3FhLM9xaGLB2K9xYT8jsdE+wv+a8pHffDUR3k9xYS99YsHRN8VwoTvE0d+ALQKR2XIx3k9xYS90V6CqsKb/iHKR04IwrQ9xXIHfeh+S8rHftfIwrQ9xYS0HoKE8hVChP06PkuKR37XyMK0PcVEvc29xn7F/cWE8hVChPw9035LisdxF0dwPcVAXMd8vcYA0QdivmvKx34lov3BcL3A/fS9wUB+gb3FgOiFvccBsb3PAX3rQbG+zwF9xz3AB3y98Dx+8AF98D7q7oK+IMnHSr3Bfh49wUSzPcW98n3Fvd59xYTvDsdE3z4HZu6CkwwCkMdE7g0HRN4MQoTuC4KDkwwCsD3IUMdE7w0HRN8MQoTvC4KePiaIB1MMArA10MdE7w0HRN8MQoTvC4Ks/iaLx1MMAq79yZDHRO8NB0TfDEKE7wuCvsL+SchCkwwCrv3JlLEQx0TtjQdE3YxChO2Lgr7C/iVFekGE67M5AUTtiAKTDAKxmMdXikKTPcUE7k0HRN5MQoTuS4KE7b7EPigJB1MMArA9yFDHRO8NB0TfDEKE7wuCoj4miUdTDAKzuwhHXH3tV73FBO6NB0TekmWtnbFG5ygjY2TH+h6B3eBk6gf91YH9yI92/ss+xk1S/sEdh73F4UFwZetqMobzq5kQB/7RWgF+wl0UlovGhO6LgoTtCL4qCYdTPtr3vcM6PgC7kMd+w31K/cDE/j3d38VE/Ljz7HEpR+SYKBzqYAIE/RxanwdE/irtAXoegd3gZOoH/dWB/ciPdv7LPsZNUv7BHYe9xeFBcGXrajKG86uZEAf+0VoBfsJdFJaLxouCg5MMAqsx9jHIR2eyNjIi/cUE76ANB0TfoAxChO+gC4KE7sAs/iGPgpMMArCLAq09xlaMR1I9xQTqSA0HRNpIDEKE6kgLgrs4AoTpSBIBhOpICUKE6MgKAoTsKAqHROioCYKE6kgJwr3uX/fN/cPHSjuIR33bfci+x/3H/eL9xkTdYD3gH8V74zVsa7SCEW312PsG3wKdAo+THFcXh68Y0qjORv7EjFM+wR2HxNugPcYhAW9lbGsxBvLs2Q+H/sybQX7CXRAaSUaE3WALORR9YoeE7WAq98VSIhws60ayr2R0Jge8J8FaAeKNVVaRIgI+JT3iRUTdoD7iwbelbq40BsTtYDPumI0kR8OZWsK9zh3EtH/AHuAAP//hIAA9xT3j/cZE7b3+X8V9x7i9wH3Pvc+NPcB+x5BUmNbbx/3kPsUBxN2/VoHE3r3DgYTuo7aBRO2UqnEadYbbvMVOVvN9wH3A7vL3tS6S/sD+wFbSUIfDj8kCmgdDj8kCsD3IWgdUfj3IB0/JAq79yZoHfsy+YQhCj9hHfdCO3b4V/MhHfc51hOe97hoChPeagqaofcOlt/ZmfcLGfsYkQUTroYdHxOe+yzfI/cYdx4T3nRlSQoTnmIdP9QKE+iVCvsy+PIV6QYT2MzkBRPoIAo/JArG9waSCkj4/S0KZWsK9zh3ErT3GfePNQoTvDwKE7rVya3EqR8Teo48BRN89w35WvsU+5DVCh8TvLQKDoFrCi33mod3o3chHfePNQoTpwA8ChOmgNXJrcSpHxNmgI48BRNrAPcN+Vr7FPuQ1QofE6cAtAoTkwD3uvf8Twqcawqr2zv3GBK09xn3jzUKE6730/jWFfX7DAbCblCsQRv7GzT7APs/+z/g+wD3HR8TrdXJrcSpHxNtjjwFE273DfjWywYTtttLBxOuv/sUBxO2VyEHefzK2h0OVX/x97zx9353AbT3GfeY9xgD94D4khX3Er2ocKBommEZn2Zhl18b+zsrLPsv+y/rLPc79zrr6vdF9xts9w1D3x/vs3HP+xpVWLBKojuTGWovtYiwg6p/GUBtBer8exU4XMPn57rD3t27UzUnW1U5Hw5JMB1UHQ5JiQr7Q/esIB1JMB259yZUHfun+DkhCkkwHbkoHbT3GfeL9xkT9kwd+6f3pxXpBhPuzOQFE/YgCkkwHcRjHWopCl2mHfus97IkHUkwHcT3BowK+0z3si0KSYkK+zT3rCUdSTAdzOwhHXz3tXD3GRP6TB0T9Pua97omHUn7a973DPH3IeH3FPABtPcZ8fWy9xkD98N/FaSMhIMFb2t6a2AaU7JqzrO0l5mcHvcIHZ+elKGipx/i9J+jm6iUrBl0CvsxJfsD+zz7PfH7Avc0Ho8dDkkwHcD3GvsT1z/3HDbXIR1lMR1a9xkT4UD3w38VfArPChPhIJkd+zEl+wP7PB4T4UD7PfH7Avc0HhPpII8dT/e1FRPlQCsKE+lAJQoT40AoChPwwCodE+LAJgoT6SAnCkmiHft5oHb4Oe7m7gH3EqYKDmU+HbYKE+0AWh0T9QD4ewcT9ID7EQYT7IBOHRPuAGQKE+0AVh0OZT4dwNebHZD4bS8dZT4du/cmmx37Lfj6IQplPh279yZSxLYKE+1AWh0T9UD4ewcT9SD7EQYT7SBOHRPtgGQKE+1AVh37LfhoFekGE+tAzOQFE+1AIAplPh289wAStPcZz/cMyIIKU/hp5R1lPh3GYx3J9xnBggpN+HMtCmU+Hc7sIR1797VznB0T7QD7IPh7Jh2H+zbs13av7/Hb9x7jM+8hHfeN9xX7EfcRE/cA95z3eBX3LgZKe2BmThs/W8nt7bnJ2dO6VzWRH/szBq/8ahX3LO/T9x0f90nB21UHE/sA93YHE/qA+xEGE/aATh0T9wBkCjCj2k73IBsOT5wKa6UdT6B2+E7z9zh32ygd0V4KE/a+HS3HFekGE+7M5AUT9iAK/Bx6HfwcKgpeHfiq+xQGDvwc2B2RzCAd/BygdviqSR3R9xQT6DoKLccV6QYT2MzkBRPoIAr8HCoK5vcGEm73EXH3FHL3EBPoOgoT9CjSJB38HHod/BzYHaHMJR38HCoK7uwB0fcUAzoKO9omHfwc+2ve9y12+Kp35vcGkAqJ0i0K/BwqCuIsCmrPrvcUr84T0QA6CvcO1RUTyYArChPRgCUKE8UAKAoT4wAqHRPHACYKE9EAJwot+yru03b4qnfm9wYSz38K9zv3GfsW9xQT9ToKE/mJ0t8K91D9+VkKE/b3AfkkLQr79ZgK+/U2HQH3AfcUA4j7KlkKDvv1Nh3g9yEB9wH3FAOI+ypZCvcK+R4gHfv1+yru+N1JHfcB9xQT6Ij7KlkKnfkZFekGE9jM5AUT6CAKaioK91h3ux0OaioK91h32/cmux0t92IhCmr7IPbBdviqd/dYdwHR9xTJ9wwD0Rb3FPcnBt/k9zD7gAX3JAb7bPfM92X3cgX7Mgb7b/uFBfg1+xQH90B2Cvvvi+7493cB0fcVA/dbFtruZAZxfZenH/jP+xQHivzcBTK9ZtoeDvvvi+7493fg9yEB0fcVA7kK+w/5myAd++mL7vfx95qLdxLR9xUTsLkKE9C1+FRPCvvvrB376Yvu+Pd3EtP3Ff//f4AA/wCAgAAT4Kn3wxW1mwX7VQcyvWbaHhPQ2u5kBnF9l6cf93oH6K9u1UtzBfeT+xQHivvEBRPgQ28FDvd7oHkK91D3C/dR9xQTrtEW9xT3xgbgsb7IzKNaNB77xvcL98YH4bC9yMmoXzMe+8r3FPfrB/cYR9L7AkFUZERzHtB0VbQ9GxO2SFVmSnEfE9aI5QUTzvsIBg5PoHkK92H3FBOsVgoTtFIdE9SI5wUTzPsIBg5PoHb4Tucv88D3IRLR/wB1gAD//4qAAF4KE7ZWChO6Uh0T2ojnBRPW+wgG90DMIB1PoHb4Tucv87v3JtYK92H3FBO2VgoTulIdE9qI5wUT1vsIBtP3YiEKT4cKT6B2+E7nL/PCLArR/wB1gAD//4qAAPcUSjEdS/cUE6iQVgoTqRBSHRPJEIjnBRPIkPsIBve01RUTpKArChOooCUKE6KQKAoTsFAqHROiUCYKE8iQJwpP+yrn2nb4Tucv8xLR/wB1gAD//4qAAF4KE9b3pvsqFekG7crF540f9+sH9wxL3vsKHhPaUh0T6ojnBRPm+wj8qvcU98IGE9bltr3Q0KNZMR77VYoiB2V0c2UeSAYOVSQKAbT3GfeY9xgDNAoOVSQKwPchAbT3GfeY9xgDNApR+I8gHVXUCveY9xgT7DQK+zL4ihXpBhPczOQFE+wgClUkCsZjHWopCmr3GBPyNAoT7Ps3+JUkHVUkCsD3IQG09xn3mPcYAzQKYPiPJR1VJArA9yEBtPcZ95j3GAM0CvsW+I9HClUkCs7sIR1897V99xgT9DQKE+j7JfidJh1GJAox4RK09xn3mPcYE9ilfxXtBqyzBXGzvX3EG/cy8/cC9z0fE7jYdcxluh7R4QUpBhPYbmgFpGNamVMbmB0/oEqxXB/3YJgVbXKTm3cf91X3gQWTc49uahr7A1tLOR77FvdDFfcCuszeqKSDfJ4e+1T7gAWEo4enqxoOVSQKwiwKtPcZZTEdZ/cYE9JANArE+JiRCvfff/El8/cf4fcR8ybwIR33mPcd94v3GRN398R/Fd7QqsC5H1a40GzfG3wKE7d0CjhIbFZeHsBdRqo4G5gdHxN3+z3z+wL3Mx7zBMgK3btK+wL7A1tLOR8Tb/iW93XoHQ5lhQpe+xV29x73Avfo9wD3OHcS0fcN+w33FveH9xgT9tH7KhX3FvdeBmOqu3PLG/ct2vcR9y73Ljz3EfstR1xzYm8f93n7Fgf3i/z4FRP6M2Xd4uWx3OPksDwvHxP2MmY7Mh4OZfsVdvce8/fy5y/zIR33j/cU+xD3EBPc+L37KhUT7PlABxPq+w8GE9qJPAXGbFCrRRv7LED7Efsu+y7X+xH3LB8T3M/GrL+oH/tzB/sS94YVPVzM9wL3ArrM2dm7UPsI+whcUDwfDvuNoMQKE9DkHRPgSmFsQ3YfiPIFE9D7DAYO+42gdvg89wLM9yGgCubMIB37jaB2+Dz3Asf3JqAKgvdiIQr7jfsg9sHECvsU9xn7DPcHrQqG/ZEVE+TZBsfwBewHE+L7DCCuBg4mf+33/u1iCg4mf+33/u289yFiCkr48yAdJn/t9/7tt/cmYgr7OfmAIQomYR33PEF2+F3tEsH3GfcZ1oL3GROe96VoChPeagqaoQUTrfcPkd3D7BrkVLn7PKUetB0TnpIuzUb3EHwIE950ZUkKE55iHSZ/7ff+7bcoHcH3Gfdb9xkT7HYd+zn47hXpBhPczOQFE+wgCib7IPag7ff+7RLB9xm69wyr9xkTfHYdQftvFdkGE/xCHXGL9wL/ANCAAPcA/wC5gAD3Ai0d93f3FjP3GBP00fhwFfxw9xT4cAfjvbvTHhP4xrllXFJiXkWMH2KMBfsBB7qMBRP03o3LaUAaRklqQR5L+wLLBvcY9yDB9yPpSs0qoR8T+NehtcbTGvcIKtX7Hh4T9PsrKDL7MR8O+3w9CgH3FfcUA8UdDvt8i+73Htv3Cu4B9xX3FAO494EV3zcGIbxc9R7JCtP3INv7IPcK9yHu+yH3EfsU+xE3KN/7CjcHDvt8PQqk7xL3FfcUE9D3sBb3Bu70HQcT8PcR+xQHE9D7ETco330KE/CO+MNPCvt8+3jO2rys7vfk7hL3FfcUqdYT+Lj4RxXf+64GO6ddxXkealMFE/xJClyctWnNG8/Br829bbFJkB+hrAX3Au4GE/iOHTcHDvt8+yD2rO735O4S9xX3FFP3DBPwxR0m+3sVE+jZBkIdSzkdjB0TuPeKfxUTtEIKE3SNMgUTeEgdE7hACg5Ldx2C+PcgHUs5HeDXrh29+PcvHUs5Hdv3JlLEjB0TtveKfxUTtUIKE3WNMgUTdkgdE7ZACvsB+PIV6QYTrszkBRO2IApLOR3m9wYtHUnNSfcR2PcQT8dPUx0TuED3in8VE7ggQgoTeCCNMgUTeEBIHRO4QEAKE7RA+wb4/RUTskD3EfcGBhO1APsRBvde+wYVE7iA9xD3BgYTuQD7EAYOS3cdkvj3JR1Ldx06+PdHCks5He7sLR1cuvdctWGTCiz5BSYdS/tr3vcM80R2+Kp3LR33NfVIUx0T2veKfxUT2UIKE7mNMgUTvJlVHRO6q7QFiviq+xT7xwYT2kAKDks5HczH2MctHYnI2MiOUx0TvID3in8VE7xAQgoTfECNMgUTfIBIHRO8gEAKE7sAvfjjPgpLOR3eLArR9xQ/z0fX91POUVMdE6kQ94p/FROpCEIKE2kIjTIFE2kQSB0TqRBACvD4/BUTpSArChOpICUKE6MQKAoTsFBLY1k3iR8TsJDPBhOikCYKE6kQJwo/i/cV+wB2+Kp3EqH4shNw920W9ysG91j4qgX7HAYTsPsb/Cn7HPgpBfsbBg73RlAKEqH5sBNwRQoTsEYKDvdGUArg9yESofmwE3hFChO4Rgr36MwgHfdGUArbKB2h+bATdEUKE7RGCveExxXpBhNszOQFE3QgCvdGUArm9wYS95UpChN8RQoTvEYK93/SJB33RlAK4PchEqH5sBN4RQoTuEYK9/jMJR1rnQowlwowsB33DPkeIB0w+yru+N1JHaH4oxPo9wD7KhXmBtmzp82iH/dl+OIF+xkG+xP8Hfsb+B0F+xgG91L8lQWwBn1mBXKBfYFoG0cGn/kZFekGE9jM5AUT6CAKMDYd5vcGAfcPKQoDVAqa+SQkHTCwHfcc+R4lHTA2HeIsCvcLMR0T01QK94D5JxUTyysKE9MlChPHKAoT4yodE8cmChPTJwo6PQoBxPhnA8QW+Gfu+9QG98z33QX1/FQo970H+8j73QUOOj0KzPchtQr3RviBIB06PQrH9ya1Ctn5DiEKOj0K0vcGzh33PfiHLQr8aNMd+++sHU+HCkA3HfcGHRO493F/FRO0QR0TdI80BRN49wL32AY3ChO4LtVW9wMePB0OQDcdwPchYQpz+JogHUA3HcDXYQqt+JovHUA3Hbv3JmEK+xD5JyEKQDcduygdr/cZ925gChO293F/FRO1QR0TdY80BRN29wL32AY3ChO2LtVW9wMePB37EPiVFekGE67M5AUTtiAKQDcdxvcGEq/3GVkpClGdHfsV+KAkHUA3HcD3IWEKgviaJR1ANx3O7BKv9xlr97VkYAoTuvdxfxUTuUEdE3mPNAUTevcC99gGNwoTui7VVvcDHjwdE7T7A/ioJh1A+2ve9wzoT3b4U+4Sr/cZ90f1SGAKE9r3cX8VE9lBHRO5jzQFkgYT3HVvfB0T2qu0BYr32AY3Ci7VVvcDHjwdDkA3HazH2McSr/cZmMjYyJFgChO8gPdxfxUTvEBBHRN8QI80BRN8gPcC99gGNwoTvIAu1Vb3Ax48HRO/AK34hj4KQDcdwiwKr/cZVDEdTmAKE6kg93F/FROpEEEdE2kQjzQFE2kg9wL32AY3ChOpIC7VVvcDHjwd5uAKSAYTqUAlChOjICgKE7CgKh0ToqAmChOpICcKZTIKIR33jzUKE5w8ChOaQB0TWo46BRNsWwoTnEQKDmUyCsD3IWYdUfiPIB1lMgrA12YdjPiPLx1lMgq79yZmHfsy+RwhCmUyCrsoHbT3GfePNQoTmwA8ChOagEAdE1qAjjoFE2sAWwoTmwBECvsy+IoV6QYTlwDM5AUTmwAgCmUyCsZjHWcpCmShHfs3+JUkHWUyCsD3IWYdYfiPJR1lMgrO7CEdeve1djUKE50APAoTnIBAHRNcgI46BRNtAFsKE50ARAoTmgD7JPidJh1l+2ve9wzzRHb4Tucv8yEd92f1STUKE80APAoTzIBAHROsgI46BROuAJxVHRO1AKu0Bfiq+xQHE80ARAoOZTIKrMfYxyEdp8jYyKM1ChOeQDwKE54gQB0TXiCOOgUTbkBbChOeQEQKE5/AjPh7FcO2tsPDYLVTU19hU1O3YMMfxwR0e5uioZuboqGbe3V0e3t1Hw5lMgrCLAq09xljMR1gNQoTlJA8ChOUiEAdE1SIjjoFE2SQWwoTlJBECsX4mBUTkqArChOUoCUKE5GQKAoTmFAqHRORUCYKE5SQJwr8Cdwd/AmgXArwHZHMIB378qB2+FT3mot3Etn3FBOw2Rb3FPla+xQGE9D3PvuaTwr8Cfsg9sF2+Vp3Etv3FPsU9xj7DPcIE/DbFvcU+Vr7FAaF/kHDCvuUIx0B9y/3FAPv98MVwqAF+9j3FPgJB+GsbdVTdgX3j/sU+8AHNmoFDkwwCsT3FiEdYiwdU/cUE7k0HRN5MQoTuS4KE7ZW+J4pHT8kCsT3FZIKivj7Kx1JMB3C9xYhHW0sHWX3GRPpTB0T9vtm97AVZgplbnFlZKhwsR/3SRZmCmZtcWVkqXCwHw5JMB3C9xWMCvsK97AVsaimsbBupmVmbnBmZahwsB8OZT4dxPcVIR3J9xnBnB0T70CP+HErHfwctx38HCoK5PcWEnL3GmT3FGH3GhPoOgoT9G/QKR38HLcd/Bz7a973LXb4qnfk9xWQCsvQKx0g+yru03b4qnfk9xUSz38K9y73GfsW9xQT9ToKE/nL0Mkd9wH9hVkKE/b3Q/kiKx379TYd5PcVwB33Q/kiKx1VJArE9xYhHW0sHXL3GBPyNAoT7C74kykdSzkd5PcWLR1NLB1Wkwpg+PspHfdGUArk9xYS95ksHRN8RQoTvEYK98bQKR0wNh3k9xYB9xMsHQP3APsqFeYG2bOnzaIf92X44gX7GQb7E/wd+xv4HQX7GAb3UvyVBbAGfWYFcoF9gWgbRwbh+SIpHTo9CtD3Fc4d93/4hSsdQDcdxPcWEq/3GVwsHVmdHVD4nikdZTIKxPcWIR1rLB1roR0v+JMpHfagdvg57ubuAfcS9xX3ZPcVA/cS+L8VaD8o1/w59xX4Ofdktwpo+2TKCg6zoHb4Oe6Zd+b3BvsA7hL3EvcV94l/ChPNrAr4DPy/FfcUBhOt+Kr7FAcTtonSLQrOi+731u7m7gH3EvcV93qmCvh8/L8V1x0O9wk9CgH3FfcU93D3FAP3sBbJCvei93B9CvcG7o4d+3D3EfsU+xE3KN99Cg77e/gFzUzS913RErbz9wTwON449wITuPc1+AUVE7THs6Kvmx8TdF+TrH+tGxNymZqNjZEfzoIHE3h/hZCfH/cBB+RXuyYyU2ZAfh7vhwWpkZ6brBusnnZkHyJ2BRO4RXxib04aUrtq0R6lzRVwfpegn5qYppEf0ZsFfAdcbXFhHg77e/gF1vdX1gG28vcd8wP3a/gFFfLQz/TyR9AjI0dHIyLQR/If1gRfcq/Jx6Swt7ejZ05Nc2dfHw7EoJQd+TMT2DIdE+gvCg6Yi/cF92/3Bvcr9wUB21IKA9sW96cG9zru3/ce9x8o4Ps6H/sl9yv4DvcF/JAG96H86RX7H/dv9x8G5bplQ0NcZjEfDq2ECls7CuAdDls7Csz3IeAd91fMIB0pOwoiHfdZ9xYD2xb3Fvjp99v3oPsW+y/72wYOkKB296T3Bfdo9wUB9xn3FgPH96QV1Puk9xb3pPd39wX7d/do+A33BfyP+9lCBg73RvsVdvcq9wX4ePcFEr33Fvga9xdg9xcT+L37KhX3FvcqBhP0+HL7KvcX95sGE/gz+On8bQZX/GUFM4FtX1cbaQb3bRagqJizkcCz9/4Y93P8eAYOXTMdVx0OXbUdXY8K9/8jHQH4U/cWA6cW9zoG95H32wX72/cW99wH95L73AX3OQb7qPf3sgoFDpsnHf8A5oAA7f8Ac4AAd+f3BRK69xn3t/ca+wL3GhP69+Z7FfdC9wng9xLqUM8gpR8T/OiivMHbGvcDINX7NPsp+wFA+wJ+HvcYgwW8kr+q2Rvev2pWQExvUYwfQowFKAfUjAUT+tSM02c7GkVPXSswTbXOhR77GYUF+xWS9wk09zsbDt8jHakKDt8jHeDXqQr7OPmbLx2jIx0iHQP4ihb3Lwb7v/f3hB0Oo6BcCiIdA/iKFvcvBvu/9/eEHdz4QCAd9wcjCgH4yvcWA8IW5wbrvMvvlB+y+EUF93b86fcW+Vr8cAZd/KAFXod3b2YbUQYO94WWCr+6HfIiCgG29xv4LDgKDr87CiId97j3FwPbFvcW+On3uPzp9xf5Wvy9Bg6OlArFIgpjCg5czR1Ki/cC+Ox3nwoOSov3Avjsd+DXnwr3V/ktFYId91gjHQG29xv3UfcP91H3GwP4Axb3D9cG91ee9xX3APcsGvcs+xX3APtXnh7X+w8/B/tXefsV+wD7LRr7LfcV+wD3V3ke+1H3qxXk0sj3Cpoe+94H+wqaRMjkGvfM+zkV994H9wp70k4zGjNETvsKex4Op7Ydj6B294L3A/f9dwGw9xb3tPcWA/hbFvcW+VrLHQ73HNkK97j3F3D3FxP42/laFf1aBxP0+KL7KvcX95sGE/gj+On7F/zp+7j46QYO97eL9wX46XciHfdd9xf3XPcWA9sW+az5WscKBg74CdkK9133F/dc9xZv9xcT+vng+yoV9xf3mwYT/CT46ccK/VoGE/r5kAYOv+wKIh3c9xbc9xcD97f7KhX3Fvcq92j5WvsX/On7uPjp+xb9WvdnBg6Y4h0D2/laFf1a96cHswoG9x/8BVoK94biHdT3FgP5SUMK/PkW/Vr3pwezCgb3H/wFWgrkaQr3I/cFAfc5UgoDx/jpFfT86XgK+38G+Ar8BVoK+IdpCvcj9wUB+MpSCgPCFucG67zL75QfsvhFBfd2/Ol4CvxwBl38oAVeh3dvZhtRBvmg93gV47xkP0FbZDIf+x/3eAYO+EhpCvsF9wb3k3cuHfe5UgoT3tsW9xb36fe5++l4CvsWBhO++5P7ufeT+xYHE975SPwFWgqSZB1lHQ7oJx33YPX3YvcFAbf5MAP4E3sV90b3CvD3O6wf+x4GKXFHUiob+wZC1/cUfB/3jvX7jgb3FprU1/cGG+zPUSmlH/ceBvc9avsK7/tGG/to+xP7Ift7+3n3E/sh92gfDugnHfdg9fdi9wUBtvkwA/gIexVfHfd7+xP3Ifto+0b7Cif7PWof9x4G7aXPxewb9wbUP/sWmh/7jiH3jgb7FHxCP/sGGypHxO1xH/seBvs7rPcKJvdGGw78B3cK/AdnCnr3EW/3FnL3EF8KE/Qq0iQdX54K9xmgdvf99wwd97T3FgOm+OkV90r86fcW93UG3cvB7N+2WTYe+3b3FveOB/ccN+H7JzhFZ1RpHvds92L3BfyaBw74BycdP3b3vvcG9133BXt3Lh35GPcbE3bbFvcW977zBhO2+1ie9xD7CvdVG18d93n7E/cj+2j7VfsP+wv7V3cfIwYTrve++xYH+M78+RX7FD/q9zYfE7b3Ntfs9xT3FNcq+zYeE677Nj8s+xQeDrBxHQHY9xr3qPcWA/j9Fvla+6cH+zwqOfsgLrtB5W0f+zb7twX3IQb3J/ehBZQG9x37oQb7H/gSFTVYr9HSvrHhH/cf+2sGDvcci/cF94z3DB33sfcZA/dlFvcW93EG4MrC7Ne8W0E+UVonHvsFB/dH9wTo9yj3Hi3o+x85RmhVaR/3avdi9wX8mvsF90oHDuFpCtfjM/dIEvctUgoT3L34phXy/KbGCtfzBhPs4yMHE9zn+xYHE+wvJAf4CPupWgroOwoB98/3EQP3EPegFSv7oAX3GgbV928Fupqdla0bl/uo9xH3qJYGrZ2BXJkf1vtvBfcaBiv3oHPTYbFSkxn3KvdnBfcF/MP7BQf3KvtnUoRgZXNCGfcC990V97MG+yP7XgUO8icd90L3BFT3BfdA9wUStvcd+Cj3HRO8jgr7CEHZ9xx/H52UnpCejqyPvoO7eggT3PBntYWzkZSMlY2VjggTvPsGdkRJIRv7WfflFfcFoNLN9Bv3CNQ8+xuYHxPce4J6hnqJY4ZrkSqvCBO8XJ5Qk2KFgYqAiH+ICA7yi/cm+xF2+On3BRKi+WITcPesFvcxBvdN+JMFy6KmocEbmvcFXAY0RlUxax8TsPsn/Dj7XPjIBfscBg74HpEd+FP3FvfZ9xYTuPoa+yoV9xYGE3j3gCQH+2X3obIK+6f79wX3Ogb3kffbBfvb9xb33Af3kvvcBdIGDsyRHdv3Fvf69xYTuPjM+yoV9xYGE3j3gPsFB/t396GEHfe4++8FzQYO9wf7KveANeH3a/cF97x3Lh33v/cWVvcWE7r43vUdPvkEmh39WvcW98H3v/vBBhN62AYOl7kdmKB291z3BfghdwH3pPcWA/cF91wV9zP7XPcW91z3M/cF+yAG93n4IU8d93r8IQX7IAYO1pEd+Nb3FhOw+Nb7KhX3FgYTcPeAJAf7Svek94D39AX7Kwb7NvuT+zn3kwX7Kwb3gPv2+4L7+AX3Kwb3OfeX9zv7lwXOBg7P+yr3gDXh9yz3A/f9dxKw9xb3tPcWXfcWE7r4r/UdN/kEyx373QcTet8GDo+gdvf99wP3gnciHfe09xYD92b5WhX7Fv1a9xb3dQbdy8Hs37ZZNh77dvcW944H9xw34fsnOEVnVGkeDvwHdwrehgrfIx3u7BLY9xaV97Wo9xYT9M8dE/z70vmpJh3yJx33XvcE9173BQG2+ToDjgr7BUPV9xR7H/gmBvsUe0NB+wUb+133zhX3E5zT1vcEG/cE00D7E5wfDkqL9wL47Hfu7BKi+Lr8N/e1E/C4HRPovvk7Jh1SMApDHRO4NB0TeDEKE7guCg5ne/P3vPMStvcK+wr3HfcW9wak9xgT1PfOexX3M/cA7fcw9ygn8fstHxPsQ1BsVmcflPcDw6besgjgs6nF4xr7BooFVHlzSW4eE9T7FlJWLvtVGiGkNbpXHkzB03PUG4zzFTpTyOSNH+KMxcbcG9fATzUyVE48Hw5Yi+v3Gbpc3/cR6xLR9xb3WPcY+wL3GBO60Rb3ngb3HdjD6h8T2tNXuTKSHhPc1pO3s8ka6jvA+yIe+4AGE7r3l/xKFfsV9xn3FQbCrXFgZGlyVB8TvHL3bRUj9xHzBsSuc2ZkaHJSHw77OaB2+EfuXh34R/ef7vwfBg77OaB2+EfuzPchXh34R/ef7vwfBvcfzCAd+2KgdvhH7gHR9xT19xYD0Rb3FPhH94D3k/sW+zD7fgYO+wqgdvdl7vcT7gH29xQDvfdlFcT7ZfcU92X3Ke77KfcT95/u/B/7dlIGDsr7KveNKO735O4SsPcU98f3FWD3FRN4sO4VE7j7jfcUBxN09yr4HQcTtPsq9xUHE3T3jQcTeDX4R/wlBlv75wVIgnRuYhv3OBaao5SokLCt94oY9zr75AYOSjAdVB0OSjAduvchVB37NPeoJR1KMB3A9wYhHWspClymHfur964kHfezKgoB+C/3FAO6Fvc1Bvdf944F+473FPeNB/df+40F9zMG+3P3n/dp958F+zMG+1X7jAX3jPsU+40H+1X3jQX7NQb3afufBQ4gf/D3KuH3GuISqfcY91P3GPsG9xcT9PegfxX3I+bH7M9avzigHxP41J21s78a6DfE+xn7EDZUMYEe9xiGBbOPqqK9G8Ctc2Nfa3BXjB9bNbsGE/TJjLNsWRpfYnFMTWOpuIge+xiHBSGQ50n3IRsOQioKAdH3FPdU9xQDbR0OQioK3NcB0fcU91T3FANtHfd0yBWCHUIqCtz3IQHR9xT3VPcUA20d90nIFe8GTvchBfsVBg5uKgrCHQ5uoHb4qnfg9yHCHbz36SAdnYv1993uAfh09xUDvRbgBvcHHfxH9xX4qvw9BmX7+AVchnhyaRtlBg7Zi/cMKHb4qnctHffq9xUTeNEW9xT31Qb3C/vVBfUG9wn31AX71PcV+Kr7MAcTuPsj/DL7I/gyBfsxBg5IoHb3be33b3cB0fcU91n3FAPRFvcU9233Wftt9xT4qvcRHQYOVSQKAbT3GfeY9xgDNAoOUaB2+EfuAdH3FPdi9xUD0Rb3FPhH92L8R/cV+Kr8YwYOZYUKPyQKaB0OOaB2+EfuAfd19xUD93UW9xX4R/dM7vyFKPdMBg4wlwowNh3c1wGh+KMDVAr3RfkaLx2y+xZ2+fF3AbT3F/cM9wr3CvcXA/e4+ysV9wr3Rgb3Lp7q5/cYGvcYLOf7Lp4e91n7CvtYB/sueSou+xka+xnsLvcueR77DPeIFdG4vNabHvuiB0CbXrzRGveC+xsV96IH1Xq3W0UaRV9bQXoeDmudCm+gdvcz9PeidwHR9xT3gPcUA/hGFvcU+KqwCg6q+xZ29yfuKPItHfdi9xVt9xQT1NH4phX8qvhF+yf3FAcTtPeOBxO4KfhD+xUGE9j8R/ti+EcHDvdFi+74R3cB5woD0Rb5Tviq4x0GDveX+xZ29yvu+Ed3EucKcPcUE/r5efsrFfcU944GE/wm+EfjHfyqBhP6+TMGDlH7Fnb3J+4B0fcUsvcUsvcVA/eB+ysV9xT3J/c8+Kr7FfxH+2L4R/sU/Kr3OwYOUOcdA9EWowr3TOcd4PcVA/kaFvcV+Kr7FQb81PyqFaMKkIvp9yrr6u4B9xr3FPd79xgDvfhHFd/8R8EK+2gG99fACvfzi+kt9fce6+ruEvh09xX3evcYE7z4dBbpHfsL91b8PQYTfGX7+AVchnhyaRtlBhO8IeAH9wcdBveD++kV+wL3KvcC9wod956L6fco7irr91Z3LR33WPcU93v3GBPe0Rb3FPeG91j7hveMBvcy4MX3Ah8TvvcFNsb7Mh77DPdW+xQGE977VftY91X7FAf4x/xMFfsDBhO+9yr3Awfbs3NXHxPeWWNzOx4OJn/t9/7tYgoOTX/z9xbl9xbzAbT3HAP3xH8V9xbp1fcUqB/7GwZMemFoUBtEXrregB/3J+X7Jwbelri60hvItGdJnB/3Gwb3FW8s2PsXG+wdDk1/8/cW5fcW8wH4OvccA/e7fxX3M/P3Avc99z0j9wL7M/sXLD77FW8f9xsGzZy0r8gb0rhcOJYf+ycx9ycGOIBeXEQbUGGuynof+xsG+xSo6UH3FhsO/Bx6HfwcKgri9wYScPcRb/cUdPcQE+g6ChP0Ks4V9xH3BvsRBvde+wYV9xD3BvsQBg779ZgKa6Ud90Z/80R2927t9xLzf3ctHfho9xgTdtEW9xT3btkGE7b7IZ3uMvcjG/Id+yMoMvsheR89BhOu9277FAf4ZvxOFThcy/cDHxO29wK6zN7du0r7Ah4TrvsDW0s5Hg5boHb3Wun3KOkB4vcX91n3FAP3WfduFfsT+24F9xwG9wX3WgXr+1r3FPiq+3cG+yk7UfsAR7NX0W0f9wvVFUxoprq6rqbKH+77KAYOdvsq79J2+Er3AK/cOvcZEvcBXgoT7vcBFvcU974G5bW90c2mWy8e+6wHYXRxaB5mJ8YG9wPAx/cAH/fZB/cORtz7AkpRdE5sHvcM9wUHE/bc+wUHE+6/+xQHE/ZXUAcT7jrGBw6pi+n3P+r3P+Mz90wS9zL3Ffd69xgT3PcyFveMBvcv48r3B/cJNMz7MB/7C/c/9gYT7OMgBxPc6/sVBxPsK/sABxPcM/cAB/eD/EkV+wL3P/cCBte3a1RVYG0+Hw7ZoHb3atL3LesB6/cU4PcO4fcUA/cY918VNvtfBfcWBsr3PgWslp2WrhuQ+2r3DvdqjwavnIBqlx/J+z4F9xcGNvdfd7tgp1iRGfcr9y0F6/y5Kwf3KvstV4ZgbnhbGef3fxX3uQb7JvspBQ5Vf/Pq7V/s8/MStPca95b3GRO8fh1AXcDngx+NkpGNkRunj6+FtHoIE9zPbamFpowIE7xOeGJpTxv7DveKFc2btrHKG9i6UiiQH4SKBRPcaod5jDmxCBO8ZJxikWyGCA5li/cW+wF2+EfuEqH42BNw920W9ysG9xn4AAW6nKqjthuV7mcGNUhbL2wfE7Ax+5z7HvgoBfsYBg73wHsK+C/3FPeM9xQTuPmn+ysV9xQGE3j3dT8H+zX3Vfdp958F+zMG+1X7jAX3jPsU+40H+1X3jQX7NQb3afuf+3P7nwX3NQb3X/eOBfuO9xT3jQf3X/uNBbgGDoR7CtH3Fver9xQTuPhz+ysV9xQGE3j3dTIH+0H3Vfd4958F+zEG+2z7lQX3lfsW/Kr3FveWB/d2+5YFwAYOn/sr93VB1fcj7fdvdy0d91n3FGL3FBO6+Hb7KxX3FAYTevd1BxN8NPhg9xEd/Kr3FPdt91n7bQYTeuIGDj/7FXb5QHcB93j3FAP3eBb7KvcU9yoH92T4qswKDj/7KvdbKe34eXcS93j3FBNw9wRaFfcIBhOwJvcUBxNw8PcJBxOw7SkH91H4ecwK90/8eQUqBg6Rewr4gfcUE7D4gfsrFfcUBhNw93UwB/se91nVHftU+6QF5Aq8Bg60+yr3dEHV4PT3onctHfeA9xRg9xQTuvib+yoV9xQGE3r3dAcTfDb4YLAK+4wHE3rgBg5PnAr8CdwdSaIdQioK7uwtHVu791T3FBP0bR0T7NvaJh1Vf/P3Eu33EvMBtPihA34dRV+43H4f95EGOn9eXkYb+xL3dBXbl7e50RvQuF07lx8OMDYd7uwSofij/Cz3tRPwVAoT6Kz5LCYdvqB2+Nf3F4t3EqL5LROwohb3GgYT0Pdb+Nf3W/zXBfcZBvuU+VoF+y0GDuqL/wBwgAD/AfSAAPcFErb3GvsY97Xj97b7GPcZE9S4Fve19wUGE+Qzj0b3AfceGvcu1er3E/cT1iz7LvseRvsBMoceE+j7Bfe29wUH+yKKBRPk4brE7PcTGvdc+xX3I/ti+2H7Fvsj+1z7E8Uq4VweE9T7IowFDmaL7viU7gGi+NYD+K4Wyu5oBmaBoLR5H/s3+C0F62VjtzYbPCi/BrKXdmKcH55c+2j8igX3GQb3Ivfs3ftgBSiyrmLfGw6Ri+734+8B9yn3BPc39wQD+OcWsu5pBmJ0pbUf95/u7/ziJ/P8RvcE+Eb3N/ufByHATvcKHg5Le+//APKAAOv/AMuAAO8SsPcHMPcHE/D3vHsV9PW4zL8fSeUFTVg+ZUsbMFG91NbFuuaJH7uKBewHW4oFE+hPikqt2BrEvLDXxM9mVrUe0uIFylEusy8b+yAsP/sDPLlV3XIfE/ApclVIMBr7EvQz9y4eDqYiCgG79xv31vcaA/fsmQr7fqB2+Hvu9xB3EvdS9xYk8hPw91IW9xb5WgYT6CQGLWptNh5OKAYT8PcsBg54i/cF+Ij3BRLG9wQdxqkddd4KuvcZ95P3GvsD9xsT/PfRiAqP6gr4J/cWA/gnxB2Gox1+6QrE9wUd99qkHUY7CgH3TvcYA/dOrgp89w4dsNMK99egHYGDCvc09yjP96zPAfeS1Pc80wP4L/coFenJ2/cT9xRN3C0sTTr7FPsTyTvqH88EenyQlX8f9wz3VAWQeI50cRozbFhWHrb3nRX7C/tTBYWdiaGkGuapvcGbmoaBlx5f/IE/Cg73NP8BkYAA/wAzgAAS+AXYUMYTwPgufz8KYvdBFdj4GAYToFAGSx0TwH4K9zT3NM/3nc8B96bj9mod+xz3QBWzHfc09yjP9w3L688S96A5ChP0+C5/PwqO9zSNCvc0933PAfg+ah2b90GBHfc09yXP9ybLxs8B+HBqHfcxBGkd9zT3KM/3JM/RzBL3o5Ud+C5/Pwr3NARuCvc0+HXPAff1ah1S90FsHfc09yjP9xLD7M8S95w/HRPy+C5/PwqM9zRBChPsPR0T8kUdE+xICvc09yjM0c/3JM8S96OQHfgufz8Kf/c0qB33SHXd48/3rM/m3AG03fch1Pc80/ch3AM1HYzjFenJ2/cT9xRN3C0sTTr7FPsTyTvqH88EenyQlX8f9wz3VAWQeI50cRozbFhWHrb3nRX7C/tTBYWdiaGkGuapvcGbmoaBlx4O90h13f8BVYAA/wAzgAD3XtwStN33othQxveM3BP6NR1w8BXY+BgGE/ZQBksdE/p+CvdIdd3vz/edz+ncAbTd9zXj9tb3ONwDNR37HO9nHfdIdd3jz/cNy+vP5dwStN33LzkK9y/cE/7ANR2O4xXayL/NvWe4WpcfE/9Aax0T/sBHHUuPyVnaGw73SHXd90HP9/bcAbTd98/W92HcAzUdnfCBHfdIdd3gz/cmy8bP9NwBtN33/9b3MdwDNR3gBGkd90h13ePP9yTP0czn3BK03fcy00Pa9xHV9zPcE/3ANR3jBNvGwuHfVcJEHxP+wLgKE/3Axh33SHXd+DnP9dwBtN33hNb3rNwDNR1S8Gwd90h13ePP9xLD7M/n3BK03fcrPx33K9wT/mA1HYzjFd/JutO8bbFYnh8T/aA9HRP+YEUdE/2gSAr3SHXd48zRz/ckz+fcErTd9zLW9xHZRNL3M9wT/0A1HX/jFefG5vcg71vfMTtPVDU3wVTSHxP+wKcKE/9AgB2mIgoBu/cb99b3GgP37KoKbHCTm3Qf92n4JgWeYZVSRRr7PFIyIx77NfeVFfc8xObzpqOFfqAe+2X8HwV7s4O/yhoO+0GL9fgR7vcQdxL3UPcWJPIT8KaxCmsiCgGh9xv31vcaA/fSmQpri/X4Ee73EHcS96b3FiTyE/D3BbEKa4v3BfiI9wUSy/cEHcupHWveCrb3GfeT9xr7A/cbE/z3zYgKa+oK+CP3FgP4I8Qda6Mda+kKxvcFHffcpB1rOwoB92n3GAP3aa4Ka/cOHZ7TCvfFoB1rgwpOIx0Bl/jTA5cW7AYzCg73RIvP953P/wCigABYCvfE4/bWE9j3KRbsBjMK/HpdChPUUAYT5EsdE+hzBhPbUQr4EfzIZx33LHvPbHb3Qcvrz/8AooAAWAr3nzkKE3YA7hbsBjMK/EhdChO1AFAGE7kATmtoTx4TugBzBhO2oFEK+H382FsdE7ZAax0TtqBHHUuPyVnaGw73Z3vPbHb3Qcvjz0/P95XPe3cStuP21vd6OQoTc9D3MhbsBjMKE7XQv/1qWx0TreBrHRO10EcdS4/JWdob/Rn36Wcd9wyL9yBHz/8Bp4AAWAr4PtYTmvcPFuwGMwr8YF0KE5ZQBhOmSx0TqnMGE5pRCviL/MgV1gYTWtO0BxOaz2L3jEwHE1pyHROajR33OYv3IEfP9z3P9w3Lb3f3JM97dxK2OQr3/dYTrCD3RRbsBhOqIDMKrf1aFdYGE2wg07QHE6wgz2L3jEwHE2wgch0TrWD3EB38ifc9FdrIv829Z7halx8TrKBzChO0oHN1c2oeE7VgRx0TrWBLj8lZ2hsO9197z2x291rLxs//AK6AAFgK+KTWE3aA9xMW7AYzCvxkXQoTtYBQBhO5gEsdE7qAcwYTtoBRCviv/NhxCvc2bArsz/8ApIAAWAr3oD8dE3aQ7BbsBjMK/EZdChO1kFAGE7mQSx0TupBzBhO2kFEK+ID82EEKE7ZgPR0TtpBFHRO2YEgK92lsCtbPXc/uy2939yTPe3cStjkK92U/HRNy2fcwFuwGMwr8UvwlWx0Ts2lzChO1aXN1c2oeE7VZRx0TctlLj8lZ2hsTs1n4hPvZQQoTq1Y9HROzWUUdE6tWSAr3WGwK089gz/cNy8bPEveM1vdaPx0Td5D3LRbsBjMKE7eQsP1qQQoTr2A9HRO3kEUdE69ghx0Tt5D8etMVaR33M2wK7M/3h88S9xDW97E/HRN+QPcDFuwGMwoTvkC1/WpBChO9gD0dE75ARR0TvYCHHfyP4xXWBvcStfcG2esev/uoR/dVB0UtYfsF+wUaDvuWfNwKfKod/Bugdv8A8IAA/wAzgAAS9xTYUMYT4PcUFtj4GAYT0FAGTmtoTx4T4H4K+7+Lz/edzwG44/bWA7gW96TP+0wGjqGlo66ip54YxLGstb4azlW6REJRWT6CHteHBbWToKCuG6igeW9wfHZqdh9rdgUoSntFTRoO+617z/cNy+vPErg5ChP091J7jQr7qov3IEfPEvdz1hOg93MW1gYTYNO0BxOgz2L3jEwHE2ByHROgjR37vHv3Ah17cQr7vnvP9yTP0cwSuJUd90x7FW4K+96fdvfUzwH3A9YD9wOKbB37qnvP9xLD7M8SuD8dE/L3VHtBChPsPR0T8kUdE+xICvu5e8zRz/ckzxK4kB33QHuoHfuW98rcCvfKqh38G/8CM4AAzgr3FNhQxhNg9xT31xXY+BgGE1BQBhOQSx0ToHMGE2BRCg77v/fZz/edzwG44/bWA7j32Wcd+633yc/3Dctvd/ckzxK4OQoTuvdS98lbHRO8cwoT3HN1c2oeE9pHHRO6S4/JWdobDvuq+B/P94x3Afdz1gP3c/fXgR37vPfG9wId98ZxCvu+98vP9yTP0cwSuJUd90z3yxVuCvve+RbPAfcD1gP3A/fWbB37qvfLz/cSw3J39yLPErg/HRO591T3y0EKE7Y9HRO5V3luZVkaQ8lc4B7PBGBuorAfE9mxqKe2tahvZR4TuWZudGEeE9ZICvu598vM0c/3JM8SuJAd90D3yxXnxub3IO9b3zE7T1Q1N8FU0h8T9KcKE/iAHfw9DhwGy0odHAjkA8n3uRUcCBsG+437jgXdHRz34wYOHARzSh0cBowDHAUIhR0c+jv7DhwFwwYO+K9KHfrIA/lEhR3+AfsO+f8GDvxEi/cgAbT3JwO0FjodDvxE+x129zL3IAG09ycDvfsycB3794v3CR0WOh33eQT3J/cg+ycGDvv3+x129zL3CR34BRU6HZT9L3AdiIv3IAG09yfP9yfO9ycDtBY6Hfdr+yAVOh33avsgFTodDvw2i/cg+M53Erv3J/se9xYT0Nr3cBXiBpPPmPcP2xr3b/sW+28HO5n7D5NHHhPgbPtwFTodDvw2+yF2+M73IBK79yf7HvcWE9D3OvfcFTQGg0d9+w87Gvtv9xb3bwfbfvcPg88eE+D7CvdwFfsg9yf3IAcOP4v3IPhw9wIStPcatPcn+x73FMX3GRPs93X3bRX3FAbMmqe+qR7kwK+z4hr3CjPj+yv7Mi0t+xh/HvcahQXblLa12RvOsmJUWH52QGMfRGRwWiQaE/SC+20VOh0OP/s29wL4cPcgIR279yf7HfcUvfcaE+z3/PfvFfsUBkp8b1htHjJWZ2M0GvsK4zP3K/cy6en3GJce+xqRBTuCYGE9G0hktMK+mKDWsx/Ssqa88hoT9JT3bRX7J/sg9ycGDvxE9333IAG09ycDtPd9FTodDvvn90j3gAG094YD9zb3SBXQv77Q0Fe6RkdWXEZGwFjPHw77fPiK/wBXgAD/AISAAHcBtPfuA/cy+AYVxOrELNC0TeYF9wDjBvsAisnmRrVSKlLsRmHHMPsAjAUz9wAHTzAFDvui9633XAG098kDtPetFdgG5/dcBSEG2ftcFdgG5vdcBSEGDvsBoHb3Q/H3KvL3SHcBivi7A/ejFvcHBqj3QwXdBprxBTsGpPcqBdkGmvIFPwap90gF+wgGbftIBfsCBqn3SAX7CAZu+0gFOgZ8JAXaBnL7KgU+BnwlBdcGbvtDBfcHBqj3QwX3AgYu8RWj9yoF9wIGc/sqBQ77LfsC+fABrfg6A637AhX3Egb3vPnwBfsSBg77L/sC+fABtvg6A/hl+wIV+7z58AX7Egb3vP3wBQ78RoP3IAG09yQD9wWDbh37+YP3IPdc9yAB2/ckA/csg1gd9+gEWR0O+/L7HXb3Mvcg91P3IBLb9yT7IPcnE/D3LPffWB1Q/H0VE+jSBs73QgX3EPsn+yDIBw50g/cgAbT3JMn3JMn3JAP3BYNYHfdiFlkd92IWWR0O/EKD9yD41ncSufcW+xb3JBPgz/dwFeEGkuSa5+Qa93D7FvtwBzKZL5MyHhPQvft4bh38QvshdvjW9yASufcW+xb3JBPg9y733BU1BoMyfS8yGvtw9xb3cAfkfOeE5B4T0Gf3eBVja21iYqtvs7Sqp7S0bKliHw4/g/cg+Hj3AhK09xq+9xL7EPcksvcZE/T3dvdwFfcSBsCgtr2rHuLDrb3QGvcLJN/7KPseJiz7F34e9xqFBdOVuL3OG9G4ZVSKH1Fde1tmHkhac045GhPs1ft4bh0/+zb3Avh49yAStPcZsvck+xD3Er73GhPs9/v37BX7EgZWdmBZax40U2lZRhr7C/I39yj3HvDq9xeYHvsakQVDgV5ZSBtFXrHCjB/FuZu7sB7OvKPI3RoT9EH3eBVibG1iYqpvtLOrp7S0a6ljHw78Rvdz9yABtPckA/cF93NuHfuD94L3AAG09+gDtPeCFffo9wD76AYOTPeC9wABtPiYA7T3ghX4mPcA/JgGDveR94L3AAG0+dQDtPeCFfnU9wD91AYOKiD2AbT4dgO0IBX4dvb8dgYO91/3cfcGffcGErT5ohOg+OT3cRXa2LDS1h9I4gVNR2V4URtfdpDCJR8TYKVdT5lfGzhPbzYwH8wxBcjCvafMG7C+fXK6HxOgUPcFoIm6Gw775/sC+fABt/cTA/dI+wIV9wYG+zj3s4v3svc497MI+wYG+0r7q4v7wvdK+6sIDvvn+wL58AH3K/cUA6f7AhX3Bgb3Sveri/fC+0r3qwj7Bgb3OPuzi/uy+zj7swgO+4j7DvcC+ST3BBK23Jn3DhPQ9+r7DhW69wIGMIhlpswa1AflVM06lR6PB9qVxMvlGtUHyrGl5oge9wRcB/sMNz/7AB84BzloZU+MHhPwIQcT0MeMrmQ6GjgH+wDfP/cMHg77iPsO9wL5JPcEEvcx9w6Z3BPg1vsOFfcM39f3AB/eB9yusseKHhPw9QcT4E+KaLHdGt4H9wA31/sMHlz7BAbmjrFxTBpBBzHES9qBHocHOoFUSTEaQgdKZXAwjh77AgcO+6L7AvcA+Rj3ABLb9w/7D/evE9D3//sCFfcABxPg+zT5GAYT0Pc09wAGE+D7r/3wBg77ovsC9wD5GPcAEqf3r/sP9w8T4Kf7AhUT0Pev+fAGE+D7r/sABhPQ9zT9GAYT4Ps0Bg77qvsG+jsBtPfB0R0O+6r7Bvo7AbX3wQP3PPsGFb8dDvu+TPoMAbX3KQP31tgK+6z+DAYO+75M+gwB90D3KQO0TBX3rPoM+6zbCg77pfl05QG06AO0938V6PiJ92nl+8YGDvulJOUB95LoA/fv+HwVLvyJ+2kx98YGDkz7Bvo7AbT4l9Ed+Bn8aBX3Egb7Qvho90L4ZwX7Egb7Q/xnBQ5M+wb6OwG1+JcD+BL7BhW/HTMW90P4aPtD+GcF+xIG90L8Z/tC/GgFDvuf+yb6eAG15wP3ufsmFcfN+2/3WQX4bQf3bfdWT837jftzBfy3Bw77n/sm+ngB95jnA/D7JhX3j/d2Bfi3B/uN93NPSfdt+1YF/G0H+2/7WQUO+6f3fbb4GrbVtgG0t9W18LUDtPd9Ffc0+EX3I/c0+8MGt/y6FfiP921B+yP8RQcO+6cottW2+Bq2AbW18LXVtwP37fiCFfs0/EX7I/s098MGX/i6FfyP+23V9yP4RQcO+7ZMvPmqvAG0v8G/A/fe2Ar7tf4MBvdevBX7Kvmq9yoG+xT7mov7nfcU+5sIDvu2TLz5qrwB90C/wb8DtEwV97X6DPu12wrivBX3FPebi/ed+xT3mgj3Kv2qBg78Qvsddvcy9yABtfcnA777MnAd+3n7HXb3MvcgAbb3J7/3JwP3j/syxx37efcLHb/3JwP3Sfln7R33j/cyFUQGSPtCBfsQ9yf3IE4HDvt6+NP3IAG29ye/9ycD94/4Nccd/ED3Cx0D90n5Z+0dDvxC+NT3IAG19ycDvvg2cB1e1/gkAbX4qQP34NcV+z73XPc+91wF+yQG+yb7QQVVB/cm+0EF+BcW+z73XPc+91wF+yQG+yb7QQVVB/cm+0EFDl7X+CQBtPiqA/ex19Qd/DL7XNId+7XX+CQBtfe2A/fg1xX7Pvdc9z73XAX7JAb7JvtBBVUH9yb7QQUO+7XX+CQBtPe2A7TX0h37svhL96MBtvXZ9APP+EsV2gaP96MF+wA5BvdO+1EV2wai91EF3SAHDvxn+Ev3owG29wADxfhLFdoGmfdSBdz7ADoHDvsdivX3y+7k9RK9+Er7p/cPE/C9Ft2K6InEv5XlGar3qQX3Oe4GE+j7LgaPrQWuj6Cfrxvk9Ab7BYwwjFFXgTIZhVQFLSjeBm/7lAVoh3d3aBtNBg6MzQrR2uf3Eyr3ExO92xb3XDDa5gb3M5Dl1vcNGhPd7E3H+wKUHhPe4ZTDxNsa9wc/zfsjmB7tPCz7XAf3FvzsFRO991zR+1wHRffCFfdQ0ftQB9r7whUT3fdcB9uHtWlNGhO9T19nPYceE773xgT3SAfIgaprWhpabGxOgh4O+K9KHfrIA/iUthX7jfeOBfn/9w7+AcIKHARzSh0cBowD+JS2FfuN944FHAXD9w4c+jvCChwGy0odHAjkAxwJIve5FfcOHPfjB/eO945cHfcfBvuN944FDhwEckodHAaLAxwFB4UdHPsDBveO945cHfcfBvuN944FHAT5Bg73SHXd93/Vs+od93b3ZRXbBsKftarCG8K1bFSeH9sG7XRAySkbKT9NKXQf91b7e54d90h13fTV9z7qHfg79zkV9wLl2vcBmx8/Bkh8UlxHG0dSus58H0AG+wGa5Tz3AhuI+0+eHU6L9xD4B+QBk9n4P9oD9Bb4GgbDtLTDH/gaB8NitFMe/BoGU2JiUx/8GgdTtGLDHnj3EBX3afgH92r8BwUO97Ai6+bbPtf3ltJE3/cF6RK29wXp9wP3aeI07Tza9xXvE89Q+S1OFXXnBXNRRntBG/tD+wPs90T3Yfcj9yf3ZvdO9fsG+zofE6+Q+w9YV2Jnf6qqnYyfjJYeE9dQnfduBRPXMDUGE88wh18FrnRfoVQb+xczIPsaJ8o79wnMx6++qB8TrzBVl7ptxhvu7+L3Rfdi+y73L/t9+5j7Z/tJ+6P7ffc6+xb3dR8Tz1Dc15qo1R/7ZfdzFUdwvsfZt8/VzqdaTUJkQjwfDp579wYp9wEzdvj59wUSsPcbTfcZ9xn3GpH3FhOa96x7FePTn6q1HxM6qGgFEzn3KwYTWS/3Aba8qNiP2Bn7FpcFV4FheHEe+xX3NQUTlvTLur/cGutGz/sW+xVDRyBMpV+5Vh4TmiFGZFIxGvsP4kf3MB6X9wYVOmStwbyirsSxH/cl+0gFeXhof1gbE5b37gRmtn+mrBqzpKW3tKJ0ZGFzb09mHg5voHb5DtcB95b3BdD3BQP3lvfIFfvI9wX5DtD9DvcF+Vr7pwf7KS09+xD7CuE/9x2FHw5B+wHt+ObsEtD3GfsY9xn3V/cZ+xj3GBPU98X7ARUT2PcR8MDxvni0TqgfE9TBoqWwvRrtRrf7LakeOp9znIquCK+JsaW/G8uzalaUH/cUkQX3BXsgy/sDG/sbLlEiXKZoxHAfE+hScHBiilmIOMZd9yJtCNV5xHZiGmZlclFMXKzDgh77FoUFE9T7AZXwQ/chG4n33xUT5EKTb6auGq6vor64zHlZHhPUZmR0Uh4O9zh/59Pd94rd0+cStujc7fdR7C3pLe3f5xP8wPgwfxX3YPc59zn3YPdg+zn3Oftg+2D7Ofs5+2D7YPc5+zn3YB/nBPsr+xH3Efcs9yz3EfcR9yv3LPcR+xH7LPss+xH7EfssH4/TFfLXzuuVHymQBVaEZ2pbG09ivNXWtLvHHxP+QLmua1uSHxP9QOyQBeeCQMwmG/sJOTj7Dh8T/MD7Dd039wkeDkX3AR3mxeDH3ZsKKsMVxe2tBsEpBcwGTfYFrpWep68avmCrRx4vBur7ChVmzrDlCkX3AR30xt/Hz5sKOMMVxu2uBtCzqcC+YatHHy4G6vsKFWfOr+UK93X5Fs8B90vX9yrX94jYA/jL9/sV3Abc92sF+2vY9/MnByn7nyn3nwUm+/PX924G+8L7bhXX96/yz/uuR/IGDvuR+Afn9yHnAbTo9x/oA/dg+AcV5NTU5ORC1TIyQUEyMtVC5B/nBGRsq7GyqquysqlrZGVta2QfDvwoZQr7dfjn9yEBtffzA7X453UK7vshIB38DeIK+yoV9xH58PsRBg78DeIK9/cV9xH39/sRBv3wBPcR9/f7EQYONqB2+EPjChb3DPhD5h0GDjn7FXb3O+/3zuMK+yoV9wz3O/cq7/sq987mHfvO+yUn9yUGDvhNi+XK2vdP2/dndy4d99z3FrvmQ/egReQT/oD5+fctFejHz/T0T88uL05HIiLIR+cf/an7LRWKHRP9APkj/VoV96Dl+6AGE/6A9xr3IhVkdK7Gx6KssrSiak9QdGhiHw5O92DC4sKrwuLCAdfH91XGA/fd0hXG9xn3H8L7H+L3KML7Ywb7kSYVx/cZ9x7C+x7i9yfC+2MGDvd19yHs9xTs9yvrAffq4+br9xXrA/hCNRX3d/gw+M371fuLMPd1B/wX/BYF97/7PhX7Pfc+9z33PQUi96f3jPcV/Az8KAcOTvfuwgH4I8QD9yr3wBXHBvD33gVQBkP7iUP3iQVQBvfy/MMVxPen58L7hVTnBg4/lHaodvi5dyEdwf8ATYAAdf8ATYAAE7j3dDAV2QaS2vcbjencmvcSGfsYkYJGZGdUhhmp9+qyfaZrklgZ9xiSBRN0ffcCQdH7AJyT4hg9BoQ3BfsmgC77APszGvsi1Cf3Cm4eUfejFemtyMmbHm773gVgpHPC2hoOOeXr93LrsncB3ur3cusD97XlFbazmKKsH9ZBw8E/1gWirJizthq2frN0rR7X1lPBQEAFompjmGAbYWN+dWofQNVTVddABXRpfmNgGmCYY6JqHj9Aw1XV1QV0rbJ+thvrBE9YvcjIvr3Hx75ZTk5YWU8fDpKRdqF2+Qf3BIh3oncSz/cY8trk9xf7C/cYE4qA98MwFdrXBvchlufZ9w0a8VDP+0K1HvdZBxNTAL95qV+SUfcXkRh+9wxB5/sZnwgTTgDePDsH+yeEMzf7Chr7BstY9z9kHvtnB0aZZbuA1/sYgxiW+xvlLfcpewgTZoAk+KsVvbGvzJEe+04HO6J0orsa90r8OxX3VAfeb51tXxpWZm1LhB4O1ycd9xzZ19n3KPcFAfcV9xID+EJ7Ffcj7fD3K6cf+xWSBTR7VVBDGz1VwtxyH/cYBpbZBfsyBom2jKwF9zwGltkF+zoG46LCx90bz8BWO54f9xOSBfckbCjq+xsb+yf7APsA+y1oHzQ91waKao1gBT495Qb7J7D2JfcjGw6zf/cF9xrZ09n3K/cEAdr3Gveh9xkDwPgVFfjm2V0Gk5yRn50a9xMk3Ps5+w8sQfsMah73Gn4FyKa4rcMb1b9iU4kfinWFenp8CPwpBve0/G8V9yD00vcGqx/7I5MFWnJYbE0bQlewwowfmZCZlZke+DfZ/OY9rwaFfod8fRr7DvU49zAeDsyL90892dD3Bfd49wUS9yL3Fveo9xoTfLX3ARXvBhO8+wH3FgcTfPcB7AcTvNkq0PclB/c67uH3IvchKOD7Oh/7p/yfJwb4BfdKFfsf93j3Hwbku2RBP1pkMx8OsaB295T22NrZ9wU92RLb+MkT7Pf+Fvc3Bvuv95QFxwb3J+vQ9weeH9zaPAaFuHmxcKkI9xbZ/MkGE/T7BfdtB9e2cVeZH/vyPPfxBld9X3JBG/ttIAYO90WL3vi03gHb9wXa9tj3A9n3BQP3pBb35QbnxMXnH/jE+wX8yQdldHNlHvth+GwgBvtU/L8V9wX5B/dfBrCic2Uf/C73A/gpB+dRxS8e++UGDnKL9wj3Wdn3cvcFEvcN9xU69xIT6MH0FSIH+KeOBfcF/CgH26+w2YjeCPco2QYT8Ps1Bnu+e6uwGse7tcC7s29ZmB73JJIF8nk53PsnG/sXKjj7BmuTYppeH5F3BSo9BhPo9wYGjH+Mf4AaQWVQPmMeDpeL92824Mbg9+93Evek9xYTePcP9xoV9ykGE7j7GvcWBxN49xr3KeD7Kcb3KeAmB/dc9+9PHfdd++8FJjb3KVD7KQYOJfeA9gH3dvYD93a+Ffb3TfdM9vtM90wg+0z7TSD3TQYOJfd/9wABtPhwA7T3fxX4cPcA/HAGDvs54fgxAbX4MAO19zYV1j/3F/cX9xb7FtfX+xb3FvcW9xY/1/sW+xb7F/cWQED3F/sXBQ4lyfcg1fbc9yAB92r3JAO096gV+HD2/HAG94n71Vgd+CYEWR0OcvcX9vcG9gHb+HAD2/f0Ffhw9vxwBvvcBPhw9vxwBg4l9xf29wb2IPdMErT4cBOw9yqfFfcBBq33AwX3dPb7VAat9wYF9zIGE9D2+xEHE7Ci2AX7AQYT0HQ+BfuGBhOwIPdlB2n7BgX7QyD3IwYO+wil+KYBtvhfA7alFfhf91oF9xsH/F/3WQX7CAf37fsp++37KAUO+wyl+KYBtPhfA/iIpRX3CQf77fco9+33KQX3CAf8X/tZBfsbBw4li/YBtPhwA7T3QBX4cPcSBfchB/xw9xIF+wIH9+w1++w1BfuvBPhw9vxwBg4li/YBtfhwA/ia90AV9wMH++zh9+zhBfcCB/xw+xIF+yEH+HD7vhX2/HAgBw42pfD3SvAB93j3CwO098kV90/7C/cL9wv3T/D7T/cM+wv7DPtPBvwUBPiB8PyBBg77G+DkkeOv45HkErTt94zsE6z38PfEFeC+0fQfKgZXfmhqb3yho3YeE5ymc2+hXBs3VkQiH+0GwJmtqqaZeHSfHhOsb6Soc7wb+28E4L7S9B8qBld+aGprfainch4TbKFzcJpiGzdWRSIf7QbAma2qo5t7dJ4eE6xupKZwwBsO+xv3gueR5xK07feM7BOw9/D3ghXgvtT3AR8qBlR+aGpxfJ+ieB4TcKpyb6NZGzdWQvsBH+0GwpmuqqmZcnCjHhOwcKKoeLcbDvtP93vlAffq5QP36s0V5feT/Bsx98EGDvuM+BP3tgG0994DtPgTFe8GzPdVzPtVBe8GJ/e2BfsWBg73V+Pu9zvvKO4hHfiR9xgTuPd24xXd2LLUtx9Bt9ll3hvx2tvyHxPY8jzbJR42ikBkXkEIE7jTXkC1OBskOTskJN078h+p7hVcaLC6uq6wuh+6irltqVYIVW5bbV0b9+4WXFypwW0fE9iqwbqpuYoIuYquZ10aE7hdaGZdih4O+377Kvb5GvYBlPgtA937KhXmicbAleTJ+MMYj66gobCJtIkYlvZBjDCNUFaBMhlN/MOHZ3Z3aowZXo2BIAUOiYvr+Jnsi3cSovj5E7CiFvj56wb7hfj6BfsVBvuH/PoF8hYT0Pdg+Jn3YPyZBQ6f+xV2+YP3AQH3HfcR9zX3EAP3HfsqFfcR+YP3Nf2D9xD5g/cA9wH9CPsB9wIGDvsFIwoBp/iAA6cW+ID3Bfv8Bvc394b7N/eGBff89wX8gPsFBvc2+4b7NvuGBQ6Q+xV2+Yb1AaH5AwP3D/sqFfc/Bvcm+YYF92H1+8YG+xj9RUr3zwX7DAYOWn/w967yErX3GfeT9x8h9RPo961/FdOHwZ7Bu/ct9x+4+KD8TrZoKRj3Pnr3AfsFjfsyccVSsUeS+yqYIDN++yp++yPw+wL3K4MIE/CN8BVDk17ElOOR3cPB04TJhr1jlEuF+wBORDuRCA5e+xV29yrnMeUS3vcV92H3FPsO9w4T2N77KhX3FQYTtPdkB2mZsHW1G7+5q72fHxPUNwcT2PcO+Kb7FPu/BjNiWERMbbnoHve/+xUHDvcvi9pFdveq257b90/amncStOr3D+n3Aun3D+oTV8Df1h0Tm8DtRtY0NUVAKR4TV8DhChObwMSisLGyomZSHhNXwFJ0Z2QeE7vApQoO+HuL2kV296rbPNqe2/dP2pp3ErTq9w/p9wLp9w/qpOb3EeUTldj6TRbizdbt7UnWNDRJQCkpzUDiHxNLgP351h0TBYDtRtY0NUVAKR4TS4DhChMFgMSisLGyomZSHhNLgFJ0Z2QeE6BgpQoTkBj34hZlc7DExKOwsbKjZlJSc2ZkHw67Ix0B97j3EQP5LfeYFfcfB/vL98v7y/vKBfsfB/eN940F/JL3EfiPBw5v+PrtAf8B6oAA/wBigAAD+H/3QRXt7gX4Swf8S4wpKQX39Ab7/fv94zP3+/f7BQ73HPe39xEBtvlaA/fDthX3Hwb3y/fL+8r3ywX7Hwb3jfuNBfyS+xH4jwYOcI3u+Et3AfiB/wBhgAADv/AV7igF+EsGjPhLKe4F+/UH+/33/TMz9/v7+wUOuyMdAfe49xED+S34VhX7jPuLBfiP+xH8kgf7jfeNBfsfB/fL+8r3y/fLBQ5wje74S3cB/wArgAD/AGGAAAP42vAV+/MG9/v3+zPj+/37/QX39QcpKIz8SwX4SwYO9xz3t/cRAbf5WgP4grYV+4v3jAX4j/cR/JIG9433jVwdDm/4+u0Bt/8AYoAAA/ci90EVjPfz9/v7++Pj+/33/QX39AYp7fxLigX8SwcO+Cv3t/cRAbb6aQP40rYV7h33jfuNBfzZBveN941cHfcfBvuL94wF+NMGDrv7S/poAfe49xEDt/efFfsfB/fL+8v3y/fKBfcfB/uN+40F+NgH9437jQX3Hwf7y/fK+8v7ywX7Hwf3jPeLBfzSBw5/9z/s5egBtvjHA/fO908V02LdtsLk3lsYdfeM+3Qj21xsWWx3cJsZc5mHpoenha2DrVynPrf7CUh2+wkI7gabvK6gp3ylfIpukmqTZpptsXUIDpL3w+73JXcBtuAD+AT3RxX3EPeV7vuW9xAH+2P7QgX7CftXFeD4GjYGDpL3w+73JXcB+LDgA/fA90cV92T3Qftj90IF+xD7lij3lQf32fsmFfgaNvwaBw6J94Dt94buAfiY7wP4F/eAFfcU8Or3EPcQJuv7FB/7uyj3ugbUxFZHSFJVQh/7PAb3C/cLBfsTBvs7+zz3Pfs8BfcSBvsK9wsFDon3gO33hu4Btu8D96T3gBX3Owb7CvsLBfcSBvc99zz7O/c8BfsTBvcL+wsF+zwGQlLBzs/EwNQf97ru+7sG+xQmK/sQ+xDwLPcUHw6MoHb4HvEB+JnxA/iZFvH4hPv79xYG+237Sfdu+0kF9xb3lAcOjKB2+B7xAbbxA/clFvge95T7Fgf3bvdJ+233SQX7Fvv7/IQHDoz3avH4HncBtvED9yX5WhUl/IT3+/sWBvdt90n7bvdJBfsW+5QHDo6gdvj37QH4Iu0D+FMW90H3ZAX7EPiJ/Fkp9/f8J/sQBg6M92rx+B53AfiZ8QP4mflaFfwe+5T3Fgf7bvtJ9237SQX3Fvf7+IQHDvddi+73dOIB94ft90rtA/eHFvgO99f3bQb8Kvgr/C38KwX3cAbt+3QV98snB/dT91L3UftSBSn7ywYO+1vmCvhoFftP93b7UPt1BfcS/Ff3EPhWBg5X+Vx3Abf4nQP4rvg4Fab3uPu4ceQx+9L70uIz99P30gUO8fe89xD3EncBtvk4A/iB9z8V93b3T/t191AF+xL8V/sQ+FYHDleN+J4Bt/ieA/emqRX3uG9x97gxMvvS99MzM/fS+9IFDvtb5gr3iBX7EfhW+xD8V/sSBvdQ+3UFDleN+J4BtvieA/fjqBUz4/fS99Mz4/vS+9Mx5HH7uAUO8fe+9xABtvk4A/eh90EV9xH4VvcQ/Ff3Egf7dftQBQ5X+Vt3Abf4nQPS+DcV4+P30/vS4uP70vfS5OX7uKUFDvdb96z3EQG2+ZoD96D3LxX3EffY+xEH93X3T/t291AF+xH71vcRB/t2+1AFDvtbaPmaAfc99xED+Df3UhX7EffY9xEG+0/3dftQ+3YF9xH71vsRBvdQ+3YFDvdIlHb5dncBtvmGA/g4fxX3afc49y/3afdr+zj3L/tp+2n7OPsv+2v7afc4+y/3aR8O90h/8vio8gG29fiz9AP4OH8V92n3OPcv92n3a/s49y/7aftp+zj7L/tr+2n3OPsv92kf8gT7LfsK9wP3Lvcw9wr3A/ct9y73CvsD+zD7LvsK+wP7Lh8O90iQ3fhYd/cg3W93p3cStt344t0TzvkK90AVxFGcnJuemaAZRrmBen99fn0Z/DD7BhW30HqWfZd9mBlST516nnygfhkg7xXOvIGZgZuEnRk+apV1mHWZdxn3ifstFZnceI95kHiRGW0/ooKjhaSGGfvF97QV3JwFhp6JnZ8aOYoFco5ykHQe+AX7YhU5B6Sjjo+jH3zbBYh3eYl3G/wG9/QV3HyOnpGek5wZPqqBdYRzh3IZ+Hf73hWqP6KVoZafmRlez3yAeoN4gxn8P/hmFdBdlpyXmZmZGVDFenp7eH12GfTyFblHBRMUmpack52UbNYYE850gXWAd30I+Hf8LxXWbJWhkqOPpBk7moh4hXmEeRkTIvvv+GcVmzsFjp+djZ4b3Qdyc4iHcx/4BPv3Fd2MBaSIpIaiHjt6BY94jXl3GhNK+1D3nhWo13SUc5FykBl+Op6HnoadhRn3OPsuFdasgaF+oX2fGUhaln2We5J5GUnnFcLHeZx4mnaYGWBGm4Caf5p+GQ40i+pBdvi56hK2+HwTcPdoFvcqBvc999b7PffWBfsqBvs9+9YF9xAW9wz3d/cM+3cFE7D7DPt3BQ73YaB2+VrQCg73LXQd2/la9h0O92EjHeEdDvctdB2i+VraCg73YYv3APju0Ar7ffzuFfd9+DL3f/wyBQ73LXQd2+v2Hev8whX4Jwf4I/tdBQ73YaB2+O73AOEd/Rf7ABX4aAb7f/wyBQ73LXQd+RHr2gr4+vteFfwj9174I/ddBQ7459cBtPfCA/dV+OcvHfjt9wYBtCkKA7T47SQdvgr45/chAbT3UgP3F/jnJR1lCvjn9yEBtPf0A7T450cKvAqoCvji9yYBtPfQA7T5dCEK+OfXAbT3wgP3VfjnLx3408fYxwG0yNjIA/ch+NM+CooK3h344/cAAbT3DAO0+OPlHfsg9gHG9wwDtPt7Tgr7IPYBxvcMA7T7e04KrR2aCve53AH3APgUA/cA97kV+BTc/BQGDvjr9xYBtCwdA/cA+OspHfjr9xUBtPcZA/b46ysd+5D47fcGAbQpCgO0+O0kHfxRvgr8Gfjn9yEBtPdSA/cX+OclHfwZZQr7d/jn9yEBtPf0A7T450cK+5uoCvub+OL3JgG099ADtPl0IQr7qPjn1wG098ID91X45y8d/BD408fYxwG0yNjIA/ch+NM+CvuJigr7td4d++CtHfwLmgr7m/jr9xYBtCwdA/cA+OspHfxS+Ov3FQG09xkD9vjrKx38Q7wK/ChlCvxr+FT3mgG09wADw/hUFdoGmfdJBdz7ADoHDvc0f/l2AbT5dgP4Ln8/Cg73SHXd+OfcAbTd+OfcAzUdDnub+KqX9zibBvs2lwd/l/iml/c8mwgeoDf/DAmLDAv3BQr3GgvwlwwM9xSRDA35KRW+EwDNAgABAA4AIgApADEANwBEAFEAWABfAGUAawB0AIAAgwCNAJUAnQC3AMEAyQDZAOYA7QEWARwBIwEtATQBOQE/AWUBiAGgAawBswG8AegCAQIYAh8CIgI3AkQCTwJTAl0CYgJsAnYCfAKDArYC6gLvAw4DKQMxA0oDWgNiA2oDcgN5A38DhgOsA7gDwAPXA+YD7wP5BAIECgQRBBkEIQQoBDkEQARIBEsEUQRVBFoEZQRpBHEEdgR/BIgEkwSbBKQEqwSyBLoE2AT7BWoFygY0BpgGvAcZByEHRwd2B4QHlQe4B8wH8wgSCB0IPwh9CJIIzwjZCOYI/gkZCVUJZQl7CYgJkAmVCakJrwm4CeQKDgoUCioKQgpOCnUKjQqZCq4KzwrYCvoLGQs6Cz8LTAtrC3ILgAucC6ILpguxC78LyQvXC+0L+QwADAgMGgwiDCcMLQxADEsMVgxoDGsMfAyLDJwMrQy+DMUM1QzkDO0M/A0LDRoNKQ0uDTwNSg1YDV4Naw10DYENjg2bDagNtQ3ADcwN2A3kDfAN+w4GDhHLMgXoBi33JgX7FAYOFen7JgX3FAbp9yYFLgZLMkrkBQ4nHfiY9wULi/cF+Hj3BQt/8/fy8wtdh359dRt9gJCaeR8Lt42cmZ8bm5WFfJ0fC3ejn4GpGw6fcnWWaxsL9xHY9xALoHb4qncLzrK+4I4fSAYL9xr7E9c/9xw21xIL3woOLtVW9wQepbEdC/L3wPH7wAULf+g27Pf27gtJlrZ2xRucoI2Nkx/oegd3gZOoH/dWBzcKC3/zL+f38ucv8wv4cvlaBSoGC34dyArdu0r7AvsDW0s5Hwv3FP//hYAA/wB6gAALe/cF+Pp3C/ciPdv7LPsZNUv7BHYe9xeFBcGXrajKG86uZEAf+0VoBfsJdFJaLxoL9xsDeB0L1vcM1lDVC9EW9xT4qvsUBgugdvjp9wUL95t/FQuL7vfk7gsVw7a2w8NgtVNTX2FTU7dgwx/HBHR7m6Khm5uioZt7dXR7e3UfDhX7YPs59zn3Yfdf9zn3Ofdg92D3Ofs5+1/7Yfs5+zn7YB8LM2NcRk1us+Ue98z7FPvsB/sTzkD3AR4LFd/JutO8bbFYnh8L2sKtzqYfCxb3Fvla+xYGCz8Hwm1TrD4b+ydB+xD7L/sx1vsO9ycfsfMVNGPd6Ouz2uLlrT8oLGo7MB8L90oW9xgG9Pf69fv6BfcYBvc1+KoF+xcGCyP8GfsA+BkF+wMG+wD8GST4GQX7FwYLdQrv+yEgHYcdDq9oBcSXenNzeH1sa3qYpn8fTnEFC/cS//+pgAD/AFaAAAv4BHsV7uG81a8fC3voCgv7bfcN+y33YB4LFdkGQh0V2gbC95oFIwYOi/cl+xB2+Kp3C1cH7YwFC/cW96j3Ggv3RAYshUtCIhv7Hk73Afco9yTJ9wf3G/G7VDibH/cbkgX3JW0v7vtIG/tk+w/7M/tpHwv3APsqFeYG2bOnzaIf92X44gX7GQb7E/wd+xv4HQX7GAb3UvyVBbAGfWYFcoF9gWgbRwYLthaLHQvRFvcU98IG5ba90NCjWTEe+8L3FPfrB/cMS977Ch4L92oW9yQG9xD4evcQ/HoF9yUG91H5WgX7HQYLzgr3IdhQxgsV1wb3C7i39wIf+Kb7FPyiB112fmUeVgYLFeO8ZD9BW2QyH/sf93gGDvcN+Kr7FAYLdvlad+D3IQv8FxXY+BgGC/cU92H3FAsT6NtDCgv3FPsE9wQL9wYdE7z3cX8VE7pBHRN6jzQFE3z3AvfYBjcKE7wu1Vb3Ax48HQsBwfcZ91v3GQN2HQsBtvcbA30dC9DIrb+kH0cHQF9pPEZuorR+HvsYggUL+Of3IQG091IDtPjndQoOsaimsrFupWULoHb5Wnfm9wYSC/t4Fc/Br80fC4v3Bfd49wULvW2xSZAeC3/zL+f38vMLe89sdvdGwwsiHfewqx0L28bC4d9VwkQfE/S4ChPsxh0iHfeosh0LNgrf9yF5HQsVaR33xHvDHQvQHR8LzwqZHQsV7wbl9yEF+xQGC/5BTgrXCvla+xYGDsYK95QLdvhO5y/z1goL9xpk9xZf9xoL+yv3dUHV+GB3Egv3D+bL86gfC/uuByG8XPUeC3NXBu2MBQ73GfsX9xQL9xb32fcaAwv38XsV9zT13PcW9UvR+1O0H6QKvwr7KJf2KPdFGwu7ChPvQFodE/dA+HsHE/cg+xEGE+8gTh0T74BkChPvQFYdC3v3BPcZ8fey9wESxPcY9573HvsW9xYT+PfGexX3YN73MfeI92sz9xL7UPsuISj7MPsl7Cr3IB8T9NXFp8GwH/ssgldMKxtQZ6K0fB/7E4MFE/giqdpM9xQbl/fvFT1YweLivcXd371QNDNTVzofDs0K96D3GST3GRO62xb3wgb3OujM9xYfE9rsTc37A5QeE9zmlL/E4Br3GS/G+0Ee+54GE7r3vPzsFfs691z3OgbdvWhJSlhpOh8TvGn3whX7GPdQ9xgG47ttS05YajYfDvsVdvce8/fy5y/zEtH3EPsQ9xT3j/cZE9bR+yoV9xT3cwZXqMZqzxv3LNf3Efcu9y5A9xH7LB8T2kVQa1BsHxPqidoFE+b7Dwb3kvxOFTxcxvcIHxPW9wi7xtnZukr7Ah4T5vsCXEo9Hg4nHfdR9wX3avcFAfjJ9xsD+AF7FfdQ9yf3Lfdu93b7Ivcl+1X7IvsKNfsdYB/3IIMF2avHs9Qb9t4x+xCTH/yeBoxWBfuGlfcj+wz3PBuN9wUVKUnR9wt4H/gNBvsLdkRFJRsO+yD2wXkKvvcMrfcUE9dWChPbUh0T64jnBRPn+wgG9zX9kU4KexUT+vc69wLb9xvlVcwuox8T/Nuktr/VGvcNMNf7NPssLz77CH0e9xmEBb+TsK7bG9qxZ09HV3FHH04kyAYT+uLDZT8/TGo9Plas14Qf+xmFBRP8+xeS6Db3PhsOMB2+9yFUHQv46SwKtDEdE0z3nvjwFRMsKwoTTCUKExwoChOMKh0THCYKE0wnCov3Bfde2/de9wUB9zSACrb3zxX3CfvP2R37z/sJBvf1+64VIfde9xXb+xX3XssKAbT3Gcr3Gb73GQNMHQtbHRP4ax0T9EcdS4/JWdobDvgSexVfHfd5+xP3I/to+2f7FPsj+3n7efcU+yH3Zx/3BQQLMx3T9wYuHVYpChP6Rh0T9tjTJB0SqvVG9xn7F85I9xQT8dEWE/ik0QoT8oMdE/GrtAWK+Kr7FAYT9AsVE8qAKwoT0oAlChPGQCgKE+FAKh0TxUAmChPSQCcKAbT3Gcr3GQOVCgtTHRO5APeKfxUTuIBCChN4gI0yBRN5AEgdE7kAQAoTtgALoHb3lPcF93j3BQHbUgoD2xb3FveU9yUG9zru4fci9yEo4Ps6H/unBveh++kV+x/3ePcfBuS7ZEE/WmQzHw73xH8V9x7r3PcUmh/7GJEFhh2WHQugdqF2+Vl3Lh34dvcWE7jbFvcW+H4GE3j3R/x9BfcQBvdH+H0FE7j8fvcW+Vr7Qwf7WPy6+1j4ugX7QwYONh0BofijA1QKDjYd5vcGwB33AfkkLQqqCiNS5Pc89zzE5vPzxDD7PPs8UjIjHw77a973LXYBtPUD9yf7axWDHau0LJZsZJcdHg7MA/e793AV9yD3BfcG9yD3H/sF9wX7IPsg+wT7Bfsf+yD3BPsG9yAfzAQlNeDz8uHf8fLgNyQjNjYkHwugdvhO8/c4dwHRXgoDvh0OKgoBuvirA7oW5Ar3Hgb7Uvej1R0FDicd+Pl3AcJ1HQNyCg4Bovi6A7gdC/MdrQoL+yD2rPcF+Ol3Ih2/9wzxHfc4dgqgXArBHQvBCvsUBveDwAr7EqhpocUawrmx1+S+Vj6UHvcXkQX3HXwt7vs9G/s0KzX7EPsIzVn3RGMfC/g6/FEV4dHW7e1F1jU0RkApKdBA4h/aBGR0sMTEoq+ysaJnUlJ0ZmUfC/cVA6wKC6+nmqSdH0WDbmNhG3B5mKSDH0GEBQv44igdtPfQE6C0+OIV6QYTYMzkBROgIAoB2PcW99z3FgPPHQt7FfdK9wX3Ivd493n7Bfcj+0r7SvsG+yP7eft49wb7IvdKH/cFBAsT6PekFvcW96wG94z4Qk8d9438QgUT9Av3Evi/FWg/KNe3CgsT6OQdE/BKYWxDdh+I8gUT6PsMBgsW9xgG94zY90T3NPdIHvX8mvsF+BMH+yP7PDD7ZftwGg4iHbb3GQNGHQv7FPsTBjJZVTlLY8HjHvcU+xT7LAf7HNs09xLRxa7BqR4LFvhH9fsk+PAGE+gkBi1qbTYeTigGE/D3LPwR+zUGDvee9/cF+zkG+4j72wX32/sW+9oH+4f32gX7Ogb3nfv3C9IK95QL+z/g+wD3HR6x89odCwHE+GcDxBb4Z+771Ab3zPfdBfX8VCj3vQf7yPvdBQshHfeNuwoL/Dn3Ffg59xnu+xnKCgtob3xzeR/IkqS7uRunnH5ykx/VkgXGfFewURsL91sW1x0LFYsdDvcV+xT3FPsR9xEL+FT3mgHC9xoDwvhUTwqgXAoiHQPbQwoL+O33BgG09xkDtPjtLQr3JWmnalQaTlpsOChVvud+HvsYgwUL/EwV+wP3KvcD9wod6R37DPdWCwb3jveOXB0OFRPo2QbH8AXsBxPk+wwgrgYOdvg89wLzHQsiHfEdC/enBtIKC/sW/On7XPjp+xf86ftd+On7Fgs4XMv3A/cCuszeC/cG7kAGXnabvR8Lpwe0naG1HtvuIwb7BVdQKx8L7x0OBfsaBvse/CD7HvggBfsYBguL9wL3XMRS8fdQ9wIuHQv/ADOAAP//zIAA/wCTgAASC/sXkwVcfGRwUhs/Wrrphh8LdwGi+ccDohb5xwb8LvlaBQsGdW+XHR4L9zru4Pch9yIo4fs6H/slC/cbJ/cZ94H3GSf3GhPyCyQKuygdtPcZCwbCblCsQRv7GzT7APs/CxLR/wB1gAD//4qAAPcUC6B2+Vp3Adv3FgPbFvcWC0wV+0P3s4v3z/dD97IIC+wKLh0LA/lxihX5XQf9Wvv4BQsG90P7sov7z/tD+7MIC8/3rM8BuNT3PNMD914L+OnrCgYLJx33c/L3Anfv9wUSCxX3GfcG+xkGC/ijFROlQM6yvuCOHwsp0UDhHtsEZXSvxB8L+xV2+fB3Adv3EQPbC+73SHcB93j3DAP3eAv3IQb3FPdU9xT7VAULBqmdgHZ0eX9tHw6d+TgB9z33EAP4NgvR9xT3NPcP9zP3FAv3BT92953w94v3BQt79wH3qe/3JPcEEgugdvci9wX4W3cBC/ds9wX8xfsF92sL+xV29yr3BfjpdwsAAAEAAgAOAAAAAAAAAbAAAgBFAAIADAABAA8AIgABACUAKwABAC0ALQABAC8ARAABAEYASgABAEwAVAABAFgAYgABAGQAcwABAHUAeQABAHsAhAABAIYAqQABAKoAqwACAKwAtwABALkAwQABAMMAzQABAM4AzgAEAM8BAQABAQUBDgABARABHwABASEBJQABAScBMAABATIBYAABAWEBZAACAWcBZwABAWoBawABAW0BbQABAW8BcQABAXQBdwABAXoBewABAX4BgQABAY4BjgABAZEBkwABAZUBlgABAZoBmgABAZ0BoAABAaQBpAABAaYBqQABAawBrQABAa8BrwABAbEBswABAbYBugABAb4BvgABAcEBwQABAcMBxAABAdEB0QABAdQB2gABAd0B3QABAeAB4AABAeYB6wABAfIB9gAEAfgB+QAEAhwCJQACAjsCPQACAj4CPgAEAkwCTAAEAk8CVgABAlcCVwAEAnQCdAABAn4CgQACAowCjQABApQClAABApgCmgABAqECoQABAqUCpQABAqgCqQAEArgCuAABAtoC3AABAuYC+gADAAEAAgAAAAwAAAAcAAIAAgLnAusAAALtAvMABQACAAEC9AL3AAAAAAABAAAACgBuALwAAkRGTFQADmxhdG4AEgBKAAAAOgAJQVpFIABGQ1JUIABGS0FaIABGTUFIIABGTU9MIABGTkxEIABGUk9NIABGVEFUIABGVFJLIABGAAD//wADAAEAAwAEAAD//wADAAAAAgAEAAVrZXJuACBrZXJuACBtYXJrAChtYXJrAChta21rAEgAAAACAAAAAQAAAA4AAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPAAAAAQAQABEAJAJUGLQZphnKG8Qb5hw4HFYkeCT6Ju4ncCioKOQpNil4AAIACAACAAoAKgABABAABAAAAAMAGgAaABoAAQADAj4CPwJOAAEB8wAGAAIAqgAEAAAAwADuAAcACwAA//cAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAA//kAAP/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0//P/6f/i/+oAAAAAAAAAAP/3AAD/8QAA/+IAAP/5//r//gAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAQAJAfMB9AH2AfgB+QI+Aj8CTgJcAAIABwHzAfMABAH0AfQAAwH2AfYAAQH4AfgAAgI+Aj8ABgJOAk4ABgJcAlwABQACAC4AAgANAAMADwAUAAQAFwAYAAQAIwAjAAQAJQAsAAQATABVAAQAWABYAAQAXQBiAAQAZABoAAUAlQCaAAQAmwCbAAMAnACcAAQAnwCfAAQAogCiAAQAqQCpAAQAqgCqAAMBZwFnAAMBbgFuAAMBcwFzAAgBewF7AAQBfgF+AAQBfwF/AAUBggGCAAQBjgGQAAQBlAGUAAUBlwGXAAUBmgGaAAQBpQGlAAQBpwGnAAQB7AHsAAMB7gHuAAMB8AHwAAIB8QHxAAQB8wHzAAkB9AH0AAgB9QH1AAYB9gH2AAoB9wH3AAQB+AH4AAUB+QH5AAICDwIPAAQCTAJMAAMCVwJXAAcCXQJdAAECiQKJAAQCzwLPAAMAAgAIAAIACgXUAAEAWgAEAAAAKAOsAK4DrAOsA6wDrAOsA6wDrAOsA6wDrAC4A6wA0gHQAdAB0AHQAdAB1gOsA6wDsgSwBbIFsgWyBbgFvgW+Bb4FvgW+BcQFxAXEBcQFxAXEAAEAKAANAA4AGQAaABsAHAAdAB4AHwAgACEAIgAkAFUAWQBkAGUAZgBnAGgAewCdAJ4A6QEFAQYBBwEIAYkBrAGtAa4BrwHCAcMBxAHeAeIB4wHrAAIAGf/zARD/7AAGAM7/9gDl/+wA5//sAOj/7AFh//YCfP/2AD8Auf/uALr/7gC7/+4AvP/uAL3/7gC+/+4Av//uAMD/7gDB/+4Awv/uAMP/7gDE/+4Axf/uAMb/7gDH/+4AyP/uAMn/7gDK/+4Ay//uAMz/7gDN/+4Az//uAND/7gDR/+4A0v/uANP/7gDU/+4A1f/uANb/7gD4/+4A+f/uAPr/7gD7/+4A/P/uAP3/7gD+/+4A///uAQD/7gEB/+4BBP/uAQn/7gEK/+4BC//uAQz/7gEN/+4BDv/uAT//7gFA/+4BQf/uAUL/7gFD/+4BRP/uAUX/7gFG/+4BR//uAUj/7gFJ/+4BUP/uAVH/7gFS/+4BU//uAVr/7gFg/+4AAQAC/6AAdQCs/7kArf+5AK7/uQCv/7kAsP+5ALH/uQCy/7kAs/+5ALT/uQC1/7kAtv+5ALf/uQC5/64Auv+uALv/rgC8/64Avf+uAL7/rgC//64AwP+uAMH/rgDC/64Aw/+uAMT/rgDF/64Axv+uAMf/rgDI/64Ayf+uAMr/rgDL/64AzP+uAM3/rgDP/64A0P+uANH/rgDS/64A0/+uANT/rgDV/64A1v+uAOn/6ADq/+gA6//oAPH/6ADy/+gA8//oAPT/6AD1/+gA9v/oAPf/6AD4/64A+f+uAPr/rgD7/64A/P+uAP3/rgD+/64A//+uAQD/rgEB/64BAv/oAQP/6AEE/64BBf/oAQb/6AEH/+gBCP/oAQn/rgEK/64BC/+uAQz/rgEN/64BDv+uARX/4gEW/+IBF//iARj/4gEZ/+IBGv/iARv/4gEc/+IBHf/iAR7/4gEf/+IBM//oATT/uQE1/7kBNv+5ATf/uQE4/7kBOf+5ATr/uQE7/7kBPP+5AT3/uQE+/7kBP/+uAUD/rgFB/64BQv+uAUP/rgFE/64BRf+uAUb/rgFH/64BSP+uAUn/rgFP/7kBUP+uAVH/rgFS/64BU/+uAVr/rgFb/+IBX/+5AWD/rgABAEb/+QA/ALn/wAC6/8AAu//AALz/wAC9/8AAvv/AAL//wADA/8AAwf/AAML/wADD/8AAxP/AAMX/wADG/8AAx//AAMj/wADJ/8AAyv/AAMv/wADM/8AAzf/AAM//wADQ/8AA0f/AANL/wADT/8AA1P/AANX/wADW/8AA+P/AAPn/wAD6/8AA+//AAPz/wAD9/8AA/v/AAP//wAEA/8ABAf/AAQT/wAEJ/8ABCv/AAQv/wAEM/8ABDf/AAQ7/wAE//8ABQP/AAUH/wAFC/8ABQ//AAUT/wAFF/8ABRv/AAUf/wAFI/8ABSf/AAVD/wAFR/8ABUv/AAVP/wAFa/8ABYP/AAEAAuf/eALr/3gC7/94AvP/eAL3/3gC+/94Av//eAMD/3gDB/94Awv/eAMP/3gDE/94Axf/eAMb/3gDH/94AyP/eAMn/3gDK/94Ay//eAMz/3gDN/94Az//eAND/3gDR/94A0v/eANP/3gDU/94A1f/eANb/3gD4/94A+f/eAPr/3gD7/94A/P/eAP3/3gD+/94A///eAQD/3gEB/94BBP/eAQn/3gEK/94BC//eAQz/3gEN/94BDv/eATT/5wE//94BQP/eAUH/3gFC/94BQ//eAUT/3gFF/94BRv/eAUf/3gFI/94BSf/eAVD/3gFR/94BUv/eAVP/3gFa/94BYP/eAAEBNP/nAAEBzAAAAAEBu/+wAAEBu/+4AAIHgAAEAAAIdAxiABwAIgAA/+//4P/Z/6D/8//z/6YACv+2/9X/8P/0//H/1f/A/9n/6v/OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7AAAAAD/4//6AAD/7AAAAAAAAAAAAAAAAP/zAAD/5//2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAP/xAAAAAAAAAAAAAAAA//UAAAAAAAAAAAAAAAAAAP/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/rQAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAP/c/5wAAAAA/7AAAP+IAAAAAAAA/+D/xP/iAAD/6//YABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8wAAAAD/7AAAAAD/1QAA//b/9gAA/+8AAAAA/98AAAAA//H/2f/sAAD/+v/Y/+r/7v/s//QAAAAAAAAAAAAAAAAAAAAA/7AAAAAAAAAAAAAA/+8AAAAAAAD/+f/pAAAAAAAA//kAAP+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//MAAP/x//gAAAAA/+IAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+/+wADQAAAAAAEf+6AAD/7AAA/+z/twAAAAAAAP/h/+v/ygAA/+wAAAAAAAAAAP+lAAD/6/+c/+X/rgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/sP/VAAAAAAAAAAf/yQAAAAAAAP/w/8IAAP/0AAD/6gAA/6YAAAAAAAAAAAAAAAD/tgAA/+8AAAAAAAAAAAAAAAD/7gAA/9gAAAAAAAAAAP/o//IAAAAA/+//xgAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/1AAAAAAAAAAAAAAAAAAAAAP/z//0AAP/fAAD/7gAAAAD/9gAAAAAAAP/pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0AAAAAD/3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAA/+8AAP/iAAAAAAAAAAAAAP/W/9YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//v/oAAD/9v/8//j/6f/UAAD/+P/gAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/7P/0AAD/8f/1/+//8wAA/+IAAP/z/+wAAP/4/+gAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAAAAP/O//z/6P/s//v/+P/5/9j/5QAA//T/5P/2/+L/xQAAAAD/8AAAAAAAAAAA/+MAAAAA//UAAAAAAAAAAAAAAAAAAAAAAAD/6QAA//YAAP/p/+sAAP/0AAAAAAAA/+L/2AAAAAAAAP/xAAD/ygAAAAD/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAP/zAAD/8wAAAAAAAAAA//z/6wAAAAD/9QAAAAAAAAAA//AAAAAA//sAAAAAAAAAAP/x//MAAAAAAAD/7AAAAAAAAAAA/+UAAAAAAAAAAAAA/87/2wAAAAAAAAAAAAD/ygAAAAD/yAAAAAAAAAAAAAAAAAAA//b/7AAAAAAAAP/ZAAD/0f/T/+3/xQAA/+AAAP/sAAAAAP/2AAAAAAAA/+UAAAAAAAAAAAAAAAAAAAAA/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAAAAAAAAAAAA//wAAAAAAAD/9wAAAAAAAAAAAAAAAAAA//AAAAAA//MAAAAA//wAAAAAAAD/+wAAAAAAAAAA/+8AAAAAAAD/+gAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAKAACABUAAAAZAFYAFABYAGIAUgBkAIQAXQCGAIsAfgCVAKYAhACpAKkAlgCsAL8AlwDCAOUAqwDnAO0AzwDvAQ4A1gEQATAA9gEyAUsBFwFNAWEBMQFkAWQBRgFnAWoBRwFsAXYBSwF4AYQBVgGGAYYBYwGJAZIBZAGVAZ0BbgGfAZ8BdwGhAaEBeAGkAacBeQGpAbkBfQG7AcoBjgHNAc0BngHRAdoBnwHcAekBqQHrAewBtwHuAe4BuQHwAfIBugH6AfoBvQIPAg8BvgJMAk0BvwJ8AnwBwQKGAoYBwgKJAokBwwKhAqEBxALPAs8BxQACAKcADQANAAMADgAOAAEADwAUAAIAFQAVAAcAGQAiAAMAIwAjAAcAJAAkAAQAJQAsAAUALQAwAA8AMQAxAAsAMgA5AA8AOgA8AAsAPQA/AA0AQABEAAYARQBLAA8ATABUAAcAVQBVAAMAVgBWAAgAWABYAAcAWQBcAAkAXQBiAAcAZABoAAoAaQBzAAsAdAB5AAwAegB6AA0AewCAAAwAgQCEAA4AhgCGAAYAhwCHAA8AiACLAAkAlQCaAAUAnACcAAIAnQCeAAMAnwCfAAUAoAChAA8AogCiAAcAowCjAAsApAClAAwApgCmAA4AqQCpAAUArAC2ABIAtwC+ABQAvwC/AA8AwgDNABQAzgDOABEAzwDWABcA1wDZABMA2gDlAA8A5wDoAA8A6QDrABkA7ADtABIA7wDwABIA8QD3ABMA+AEDABQBBAEEABcBBQEIABUBCQEOABQBEAEUABYBFQEfABcBIAElABgBJgEmABkBJwEsABgBLQEwABoBMgEyABIBMwE+ABMBPwFJABcBSgFLAA8BTQFOAA8BTwFPABIBUAFSABQBUwFTABcBVAFZAA8BWgFaABQBWwFbABcBXAFdABgBXgFeABoBXwFfABMBYAFgABcBYQFhABEBZAFkABYBaAFpAAEBagFqAAoBbAFtAAoBbwFxAAMBcgFyAA0BcwFzAAEBdAF1AA8BdgF2AA0BeAF6AA8BewF7AAcBfAF8AA8BfQF9AAgBfgF+AAIBfwF/AAoBgAGBAAwBggGCAAcBgwGDAA0BhAGEABsBhgGGAA8BiQGJAAEBigGKABsBiwGNAAEBjgGOAAcBjwGPAAIBkAGQAAcBkQGSABsBlQGVAAcBlgGWABsBlwGYAAEBmQGZAA0BmgGaAAcBmwGbAAwBnAGdAA0BnwGfAAwBoQGhAA0BpAGkABsBpQGlAAcBpgGmAA8BpwGnAAcBqQGpABIBqgGrABQBrAGvABUBsAGzABQBtAG0ABkBtQG1ABQBtgG4ABcBuQG5ABkBuwG9ABcBvgG+ABQBvwG/ABMBwAHBABQBwgHCABUBwwHEABgBxQHFABQBxgHGABkBxwHKABcBzQHNABcB0QHTABQB1AHVABcB1gHWAA8B1wHXABMB2AHYABQB2QHZABcB2gHaABMB3AHcABkB3QHdABQB3gHeABgB3wHgABkB4QHhAA8B4gHjABgB5AHkABkB5QHlABcB5gHmABMB5wHnAA8B6AHoABQB6QHpABcB6wHrABgB8AHwAAIB8QHxAAcB8gHyABsB+gH6AAcCDwIPAAcCTAJMAAwCfAJ8ABEChgKGABACiQKJAAcCoQKhABsAAgCxAAIADQATAA4ADgAYAA8AFAADABUAFgAYABcAGAADABkAIgAYACMAIwADACQAJAABACUALAADAC0AOQAYADoAPAACAD0AQgABAEMAQwAYAEQARAAWAEUASwAYAEwAVQADAFYAVwAYAFgAWAADAFkAXAAYAF0AYgADAGQAaAAEAGkAcwAFAHQAeQAHAHoAegAXAHsAgAAHAIYAiwAYAJUAmgADAJsAmwATAJwAnAADAJ0AngAYAJ8AnwADAKAAoQAYAKIAogADAKMAowAFAKQApQAHAKkAqQADAKoAqgATAKsAqwAFAKwAtwAIALgAuAAYALkAzQANAM4AzgAKAM8A1gANANcA5AAYAOUA5QAUAOcA6AAUAOkA6wAMAOwA8AALAPEA9wAMAPgBAQANAQIBAwAMAQQBBAANAQUBCAAMAQkBDgANARABFAAPARUBHwARASABJQASASYBJgAVAScBLAASAS0BMAAgATIBMgALATMBMwAMATQBPgAIAT8BSQANAUoBSwAYAU0BTgAYAU8BTwAIAVABUwANAVQBWQAYAVoBWgANAVsBWwARAVwBXQASAV4BXgAgAV8BXwAIAWABYAANAWEBYQAKAWQBZAAPAWUBZgAJAWcBZwATAWgBawAYAWwBbQABAW4BbgATAW8BcQAYAXIBcgAXAXMBcwAQAXQBdwAYAXgBeAAfAXkBegAYAXsBewADAXwBfQAYAX4BfgADAX8BfwAEAYABgQAGAYIBggADAYMBgwAXAYUBigAYAYwBjAACAY0BjQABAY4BkAADAZEBkgABAZQBlAAEAZUBlQABAZcBlwAEAZgBmAABAZkBmQAXAZoBmgADAZsBmwAHAZwBnAAXAZ0BngAYAZ8BnwAHAaEBoQAXAaMBpAAYAaUBpQADAacBpwADAakBqQAIAaoBqgANAasBrwAMAbABswANAbQBtAAVAbUBtQANAbYBuQAMAbsBuwAdAbwBvQAMAb4BvgANAb8BwAAMAcEBwQANAcIBwgAPAcMBxAASAcUBxQANAcYBxgAVAccBxwARAcgBygAMAcwBzQAMAc4BzgAPAc8BzwAdAdAB0AAMAdEB0wANAdQB1QAMAdYB1gAUAdcB1wAYAdgB2AAMAdsB2wAYAdwB3AAVAd0B3QANAd4B3gASAd8B3wAVAeAB4QAYAeIB4wASAeQB5AAVAeUB5QARAeYB5wAYAegB6AANAekB6QAMAesB6wASAewB7AATAe4B7gATAfEB8QADAfMB8wAbAfQB9AAQAfUB9QAeAfcB9wADAfgB+AAEAg8CDwADAj4CPwAaAkUCRQAOAkkCSQAJAkwCTAATAk0CTQAHAk4CTgAaAlQCVAAOAlcCVwAhAl0CXQAZAnwCfAAKAoYChgAcAokCiQADAqECoQABAs8CzwATAAQAAAABAAgAAQ7IAAwAAg7oADYAAQATAk8CUAJRAlICUwJUAlUCVgJ0AowCjQKUApgCmQKaAqECpQLaAtsAEwBOAAAAVAAAAFoAAABgAAAAZgBsAHIAAAB4AH4AhAAADxIAAACKAAAAkAAAAJYAnAs4Cz4AogAACYgJggoMChIAqAAAAK4AAACuAAAAAQCPAhIAAQCTAhIAAQEvAhIAAQBvAhIAAQBcAhIAAQBvABIAAQEcAhIAAQESAhIAAQEtACIAAQBrAhIAAQG7AhIAAQC+AhIAAQFkAsYAAQFjAAAAAQETAhIAAQB8AhIAAQGkAhIABAAAAAEACAABD0oADAABD1gAEgABAAECuAABAAQAAQIcAAAABAAAAAEACAABDbIADAACDdIAkAABAEABZwFqAWsBbQFvAXABcQF0AXUBdgF3AXoBewF+AX8BgAGBAY4BkQGSAZMBlQGWAZoBnQGeAZ8BoAGkAaYBpwGoAakBrAGtAa8BsQGyAbMBtgG3AbgBuQG6Ab4BwQHDAcQB0QHUAdUB1gHXAdgB2QHaAd0B4AHmAecB6AHpAeoB6wBADfAAAAECAAABAgAAAQgAAAhmCGwIZghsCGYIbAEgASYBIAEmDgwAAA4MAAAN8AAACIQIighgCMYIKggkASwAAAEsAAAIGAgSCHgIfgh4CH4HygAAAQ4BFA3wARoIhAiKDgwAAA3wAAAInAiiCJwIogh4CH4BIAEmCIQIigEsAAAJ7AmkATIAAAEyAAABOAAACaoJzgmqCc4JqgnOAVwAAAFcAAABXAAAAVYAAAFWAAAJyAnOCcgJzgnmAAAJ5gAACVAJSgm2AAAJtgAACcIAAAjwAAABPgFEAUoBUAjwAAAJyAnOAVYAAAkCAAAJjAl6COQI6gFcAAAJyAnOCeYAAAABAU0CxgABAYICxgABAooCxgABAooAAAABAWcAAAABAWoCxgABAXQAAAABASsCxgABAQsCFgABATECFgABAhgCFgABAhgAAAABAV8CFgABAUQAAAABATQCFgABAScCFgAEAAAAAQAIAAEM8AAMAAEM9gAUAAEAAgF/AecAAgj2CQgABAAAAAEACAABDQoADAABDRgALAABAA4BZwFvAXABcQGRAZIBpAGpAbEBsgGzAdQB1QHoAA4M/gqMCowKjAqSCpIKkgqwCrYKtgq2CrwKvAqkAAQAAAABAAgAAQ0KAAwAAQ0WABIAAQABAecAAQsSAAQAAAABAAgAAQsmAAwAAgtGAJQAAgAWAAIADAAAAA8AIgALACUAKwAfAC0ALQAmAC8ARAAnAEYASgA9AEwAVABCAFgAYgBLAGQAcwBWAHUAeQBmAHsAhABrAIYAqQB1AKwAtwCZALkAwQClAMMAzQCuAM8BAQC5AQUBDgDsARABHwD2ASEBJQEGAScBMAELATIBYAEVAtwC3AFEAUULYAAAC2AAAAtgAAALYAAAC2AAAAtgAAALYAAAC2AAAAtgAAALYAAAC2AAAAXQBjYF0AY2BdAGNgXQBjYF0AY2BdAGNgUWBRwFFgUcBSIFKAUiBSgF1gXcBdYF3AXWBdwF1gXcBdYF3AXWBdwF1gXcBdYF3AXWBdwF1gXcBjAF4gYwBeIGMAXiBjAF4gYwBS4GMAXiBjAF4gtgAAALYAAABegF7gU0Be4F6AXuBegF7gXoBe4F6AXuBegF7gXoBe4F6AXuBegF7gU6AAAFOgAABToAAAVGBUAFRgVABUYFTAXoBVIF6AVSBegFUgXoBaYFWAVeBawFZAWsBWQFrAVkBawFsgWsBWQF9AX6BfQF+gX0BfoF9AX6BfQF+gX0BfoF9AX6BWoFcAX0BfoGMAY2BYgFdgWIBXYFiAV2BYgFfAWIBYIFiAWCBYgFggWIBYIFiAWCBYgFjgWaBZQFmgWUBZoFlAWaBZQFmgWgC3wLggt8C4ILfAuCC3wLggt8C4ILfAuCC3wLggt8C4ILfAuCC3wLggt8C4IGAAYGBgAGBgYABgYGAAYGBgAGBgYMBhIGDAYSBgwGEgYMBhIGDAYSBgwGEgYYBh4GGAYeBhgGHgYYBh4F6AWmBawFsgW+BbgFvgW4Bb4FuAW+BcQGJAYqBiQGKgYkBioGJAYqBiQGKgYkBioGJAYqBiQGKgYkBioGMAY2BjAGNgYwBjYGMAXKBjAGNgYwBjYLYAAABdAGNgXWBdwF1gXcBjAF4gXoBe4F6AXuBfQF+gt8C4IGAAYGBgwGEgYYBh4GJAYqBiQGKgYwBjYHXAcUB1wHFAdcBxQHXAcUB1wHFAdcBxQHXAcUB1wHFAdcBxQHXAcUB1wHFAY8BkIHOAc+BzgHPgc4Bz4HOAc+BzgHPgc4Bz4GSAZOBkgGTgZIBk4HGgc+BxoHPgcaBz4HGgc+BxoHPgcaBz4HGgc+BxoHPgcaBz4HGgc+BlQGWgcgAAAHIAAAByAAAAcgAAAHIAAAByAAAAcgAAAHIAAABnIAAAZgAAAGcgAAByYAAAcmAAAHJgAAByYAAAcmAAAHJgAAByYAAAcmAAAHJgAAByYAAAZmAAAHMgAABzIAAAcyAAAHMgAABnIGbAZyBmwGcgZ4BtIMxgbSDMYG0gzGBtIG2AZ+BoQGigaQBt4GlgbeBpYG3gaWBt4G5AbeBpYG3gaWBzgHPgc4Bz4HOAc+BzgHPgc4Bz4HOAc+BzgHPgc4Bz4HOAc+BpwGogauBqgGrgaoBq4GqAauBrQGwAa6BsAGugbABroGwAa6BsAGugbABsYLngukC54LpAueC6QLngukC54GzAdEB0oHRAdKB0QHSgdEB0oHRAdKB0QHSgdEB0oHRAdKB0QHSgdEB0oHRAdKB1AHgAdQB4AHUAeAB1AHgAdQB4AHVgAAB1YAAAdWAAAHVgAAB1YAAAdWAAAHXAd0B1wHdAdcB3QHXAd0BtIG2AbeBuQHYgdoB2IHaAdiB2gHYgdoB2IHaAdiB2gHYgdoB2IHaAdiB2gHYgdoB2IHaAduB3QHbgd0B24HdAduB3QHbgd0B24HdAduB3QHbgd0B24HdAduB3QHbgd0BvwG6gb8BuoG8Ab2BvwHAgcIBw4HXAcUBzgHPgcaBz4HGgc+ByAAAAcmAAAHJgAAByYAAAcmAAAHLAAABzIAAAc4Bz4HRAdKB1AHgAdWAAAHXAd0B2IHaAduB3QHegeAAAEBRQLGAAEBSwAAAAEBlQLGAAEBmwAAAAEBev8ZAAEDCgLGAAEB6ALGAAEBYgAAAAEBVALGAAEBYv8ZAAEBOQAAAAEAswLGAAEBXAAAAAEBdQAAAAEBgALGAAEBgAAAAAEBZQAAAAEBZf8ZAAEBVgAAAAEBVgLGAAEBV/8ZAAEBMwAAAAEBMwLGAAEBM/8ZAAEBOv8ZAAEBfwLGAAEBdf8ZAAEBUwAAAAEBUwLGAAEBU/8ZAAEBe/8ZAAEBeALGAAEBQALHAAEBQQAAAAEBegAAAAEAkQLGAAEAkQAAAAEBfgLGAAEBfgAAAAEB4gLGAAEB4gAAAAEBUQLGAAEBUQAAAAEBKgLGAAEBKgAAAAEA5QLGAAEA5QAAAAEBewLGAAEBewAAAAEClwIUAAEClwAAAAEBOAIWAAEBOAAAAAEBIwIWAAEBIwACAAEArQLLAAEBsAIWAAEBNwAAAAEAhgLLAAEBOP8ZAAEAiQLGAAEAtAAAAAEBvgIWAAEBvgAAAAEBLQAAAAECvQIUAAECvQAAAAEAhgAAAAEA3AIWAAEAh/8ZAAEBHQAAAAEBGwISAAEBHv8ZAAEA/f8ZAAEAhgLGAAEAsv8ZAAEBLQIWAAEBLf8ZAAEAkAAAAAEAjgLGAAEAjgAAAAEAkALGAAEAkP8ZAAEA2wLGAAEA2wAAAAEBHgAAAAEBMAIUAAEBLwIWAAEAhgIWAAEBowIWAAEArQIWAAEBMAIWAAEBMAAAAAEBKAIWAAEBKAAAAAEBpAIWAAEBHgIWAAEBJQIWAAEBGgIWAAEBGQAAAAEBLgIWAAEBJQAAAAEBpALGAAEBpAAAAAQAAAABAAgAAQQ8AAwAAQRCAC4AAgAFAGQAaAAAAL8AwQAFARABFAAIAUoBTgANAtwC3AASABMAKAAoACgAKAAoAC4ALgAuBCoEKgQqBCoEKgA6ADoANAA6AEAARgABATMBTgABATgBCwABAI4BCQABAJABCQABANsBCQABAaQBdQAEAAAAAQAIAAED9gAMAAEEBACOAAIAFQACAAwAAAAZACIACwAwADkAFQBpAHMAHwCMAJQAKgCbAJsAMwCdAJ4ANACgAKEANgCjAKMAOACnAKgAOQCsALcAOwDDAM0ARwDaAOQAUgEBAQEAXQEVAR8AXgE0AUkAaQFPAU8AfwFRAVIAgAFUAVgAggFbAVsAhwFfAWAAiACKA4gDiAOIA4gDiAOIA4gDiAOIA4gDiAEWARYBFgEWARYBFgEWARYBFgEWARwBHAEcARwBHAEcARwBHAEcARwDmgOaA5oDmgOaA5oDmgOaA5oDmgOaASIBIgEiASIBIgEiASIBIgEiA4gBFgEWARwBHAOaASIBIgE6AToBOgE6AToBOgE6AToBOgE6AToBKAFAAUABQAFAAUABQAFAAUABQAFAAS4BRgFGAUYBRgFGAUYBRgFGAUYBRgFGATQBTAFMAUwBTAFMAUwBTAFMAUwBTAFMAVIBUgFSAVIBUgFSAVIBUgFSAVIBUgFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBOgFAAUABRgFGAUYBRgFGAUwBUgFYAAECNgAAAAEA0gAAAAEBngAAAAEDMAAeAAEAiwH4AAEDVQAeAAECNwAAAAEByAAeAAEAxgAAAAECDgAAAAECAwAAAAECKQAAAAQAAAABAAgAAQJUAAwAAQJgAC4AAgAFAL8AwQAAAOwA8AADARABFAAIATIBMgANAUoBTgAOABMAKAAoACgANAA0ADQANAAuAkgCSAJIAkgCSAA0AEAAQAA6AEAARgABAj8CFgABAN8CEgABAN0CEgABAOQCEgABAOYCEgABATECEgAFAAAAAQAIAAEADAAiAAIALADIAAIAAwLmAusAAALtAvcABgL5AvoAEQABAAMAqgCrAWQAEwAAAE4AAABUAAAAlgAAAFoAAABgAAAAZgAAAGwAAABsAAAAcgAAAHgAAAB+AAAAhAAAAIoAAQIOAAECDgABAhQAAQIaAAAAkAAAAJYAAQDBAhYAAQDMAhIAAQCuAhIAAQBjAhIAAQCrAhIAAQDHAhIAAQDBAhIAAQCNAhIAAQDRAhIAAQC6AhIAAQBmAhIAAQDJAhIAAQBsAhIAAwAIACQARgACAAoAAAAQABYAAQFnAsYAAQOzAsYAAQOzAAAAAgAKABAAFgAcAAEBXQLGAAEBXQAAAAEDoALGAAEDoAAAAAIACgAQABYAHAABANcCFgABAPwAAAABAjQCFgABAlkAAAAFAAAAAQAIAAEADACgAAEAEgAeAAEAAQL4AAEAAAAGAAEBLQFOAAEABAACAAYADAABANcBCwABAjQBCwAFAAAAAQAIAAEADAASAAEAGgAgAAEAAQL3AAEAAgCqAKsAAQAAALgAAgAGABgAAgAGAAwAAQK2AAAAAQRsAAAAAgAGAAwAAQHEAAAAAQRZAAAABQAAAAEACAABAAwAEgABABgAJAABAAEC7AABAAEBZAABAAAABgABACMCEgABAAQAAgAGAAwAAQELAoEAAQJnAoEABgAQAAEACgABAAEADAAWAAEAHgBCAAIAAQL0AvcAAAABAAIC9AL1AAQAAAASAAAAEgAAABgAAAAeAAEAbwAAAAEAsgAAAAEA0QAAAAIABgAGAAEAb/8ZAAEAAAAKAmID0AACREZMVAAObGF0bgBAAAQAAAAA//8AFAAAAAEAAwAEAAUADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AOgAJQVpFIABoQ1JUIACYS0FaIADITUFIIAD4TU9MIAEoTkxEIAFYUk9NIAGIVEFUIAG4VFJLIAHoAAD//wAUAAAAAgADAAQABQAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUABgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUABwAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUACAAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUADQAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUADAAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUACwAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUACQAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAA//8AFQAAAAEAAwAEAAUACgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeYWFsdAC2Y2NtcAC8Y2NtcAC8ZGxpZwDEZnJhYwDKbGlnYQDQbG9jbADWbG9jbADWbG9jbADWbG9jbADWbG9jbADWbG9jbADcbG9jbADcbG9jbADibG9jbADob3JkbgDucG51bQD2c2luZgD8c3MwMQECc3MwMgEMc3MwMwEWc3MwNAEgc3MwNQEqc3MwNgE0c3MwNwE+c3MwOAFIc3MwOQFSc3VicwFcc3VwcwFidG51bQFoAAAAAQAAAAAAAgABAAIAAAABAA8AAAABAAoAAAABABAAAAABAAMAAAABAAQAAAABAAUAAAABAAYAAAACAAsADAAAAAEADQAAAAEACAAGAAEAEQAAAQAABgABABIAAAEBAAYAAQATAAABAgAGAAEAFAAAAQMABgABABUAAAEEAAYAAQAWAAABBQAGAAEAFwAAAQYABgABABgAAAEHAAYAAQAZAAABCAAAAAEABwAAAAEACQAAAAEADgAdADwEVASaBMAE1AT2BRwFUgVSBWAFbgYCBkAGYgZ6BpIGwAdQB14HdgeOB6YH1ggACBgI4gj4CRAJKgADAAAAAQAIAAEDHgB3APQA+AD8AQABBAEIAQwBEAEUARgBHgEiASYBKgEuATQBOgE+AUIBRgFKAU4BUgIaAVYBWgFeAWIBZgFqAW4BcgF2AXoBfgGCAYYBigGOAZYBnAGiAagBrgG2AbwBwgHIAc4B1AHYAdwB4AHkAeoB7gHyAfYB+gIAAgQCCAIMAhICFgIaAh4CIgImAioCLgIyAjYCOgI+AkICTAJWAl4CZgJuAnYCfgKGAo4ClgKaAp4CogKmAqoCrgKyArYCugK+AsICxgLKAs4C0gLWAtoC3gLiAuYC6gLuAvIC9gL6Av4DAgMGAwoDDgMSAxYDGgABAWUAAQCbAAEAnAABAJ0AAQCeAAEAlQABAJYAAQCXAAEAmAACAJkAnwABAJoAAQCMAAEAjQABAI4AAgCPAKAAAgCQAKEAAQCRAAEAkgABAJMAAQCUAAEAOwABAIYAAQCHAAEAogABAIgAAQCJAAEAigABAIsAAQBiAAEAaAABAKMAAQCkAAEApQABAKYAAQCnAAEAqAABAKkAAwFlATQBPwACATUBQAACATYBQQACATcBQgACATgBQwADATkBRAFPAAIBOgFFAAIBOwFGAAIBPAFHAAIBPQFIAAIBPgFJAAEBUAABAVEAAQFSAAEBUwACAN8BVAABAVUAAQFWAAEBVwABAVgAAgDnAVkAAQFKAAEBSwABAUwAAgEyAU0AAQFOAAEBMwABAWYAAQFaAAEBDgABARQAAQFbAAEBXAABAV0AAQFeAAEBXwABAWAABAImAjACEQIPAAQCJwIxAhICEAADAigCMgITAAMCKQIzAhQAAwIqAjQCFQADAisCNQIWAAMCLAI2AhcAAwItAjcCGAADAi4COAIZAAMCLwI5AhoAAQHxAAEB8gABAfMAAQH0AAEB9QABAfYAAQH3AAEB+AABAfkAAQH6AAECTgABAk8AAQJQAAECUQABAlIAAQJTAAECVAABAlUAAQJWAAEC0AABAtEAAQLSAAEC0wABAtQAAQLVAAEC1gABAtcAAQLYAAEC2QABAvkAAQL6AAEC9QABAwgAAQMJAAEAdwACAAcAFAAdAB4AJQAmACgAKQAqACsAMAAyADMANAA1ADYANwA4ADkAOgBDAEkATABPAFkAWgBbAFwAYABnAG0AeAB+AIQAjwCQAJkArACtAK4ArwCwALEAsgCzALQAtQC2AL4AxwDIANQA2gDeAN8A4gDkAOUA7ADtAO4A7wDwAPUA+AD7AQwBEwEZASQBKgEwATkBRAHxAfIB8wH0AfUB9gH3AfgB+QH6AhECEgITAhQCFQIWAhcCGAIZAhoCPgJAAkECQgJDAkQCRQJGAkcCuwK8Ar0CvgK/AsACwQLCAsMCxALnAugC9AL7AvwABgAQAAIADAAeAAAAAwAAAAEAbgABACoAAQAAABoAAwAAAAEAEgABABgAAQAAABoAAQABAOUAAgACAucC6wAAAu0C8wAFAAIAAAABAAgAAQAKAAIAEgAYAAEAAgFiAWMAAgDOANoAAgDOAOwAAQAAAAEACAABAAYABQABAAEA2gABAAAAAQAIAAIADgAEAGIAaAEOARQAAQAEAGAAZwEMARMAAQAAAAEACAACABAABQCGAIcBMgEzAvUAAQAFAEMASQDvAPUC9AAGAAAAAQAIAAED/gACAAoAHAABAAQAAQAyAAEAAAABAAAAGwABAAQAAQDcAAEAAAABAAAAGwABAAAAAQAIAAEBLgA1AAEAAAABAAgAAQEgAD8ABAAAAAEACAABAH4ABQAQAEQAUABmAHIABQAMABQAHAAkACwCHAADAkwB8wIdAAMCTAH0Ah8AAwJMAfUCIQADAkwB9gIiAAMCTAH5AAEABAIeAAMCTAH0AAIABgAOAiAAAwJMAfUCIwADAkwB+QABAAQCJAADAkwB+QABAAQCJQADAkwB+QABAAUB8gHzAfQB9gH4AAYAAAACAAoAJAADAAEAfAABABIAAAABAAAAHAABAAIAAgCsAAMAAQBiAAEAEgAAAAEAAAAcAAEAAgBMAPgABAAAAAEACAABABQAAQAIAAEABAKUAAMA+AI+AAEAAQBGAAEAAAABAAgAAQAG/+AAAgABAhECGgAAAAEAAAABAAgAAQAGACAAAgABAfEB+gAAAAQACAABAAgAAQAeAAIACgAUAAEABACqAAIAMAABAAQAqwACADAAAQACAAIAaQAEAAgAAQAIAAEAfAAEAA4AKAAyAFIAAwAIAA4AFAFhAAIAzgFiAAIA2gFjAAIA7AABAAQBZAACARAAAwAIABIAGgI7AAQCVwJXAqgCPAADAlcCqAI9AAICqAAEAAoAFAAcACQCgAAEAlcCVwJXAn8AAwJXAlcCgQADAlcCqAJ+AAICVwABAAQAzgEQAlcCqQABAAAAAQAIAAEAFACIAAEAAAABAAgAAQAGAJMAAgABAKwAtgAAAAEAAAABAAgAAQAGAF4AAgABAOwA8AAAAAEAAAABAAgAAQAGAC8AAgABAFkAXAAAAAEAAAABAAgAAgAYAAkAjACNAI4AjwCQAJEAkgCTAJQAAgACADAAMAAAADIAOQABAAEAAAABAAgAAgASAAYAlQCWAJcAmACZAJoAAQAGACUAJgAoACkAKgArAAEAAAABAAgAAQAGABUAAgABArsCxAAAAAEAAAABAAgAAgBiAC4AmwCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkBTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWACTgJPAlACUQJSAlMCVAJVAlYC+QL6AwgDCQABAC4ABwAUAB0AHgAqADQANQBPAG0AeAB+AIQAjwCQAJkAsQC+AMcAyADUANoA3gDfAOIA5ADlAPsBGQEkASoBMAE5AUQCPgJAAkECQgJDAkQCRQJGAkcC5wLoAvsC/AABAAAAAQAIAAEABgAeAAEAAgHxAfIAAQAQAAEACgAAAAEABgABAAEAAgDaAOUAAQAAAAEACAACAAoAAgA7AOcAAQACADoA5QABAAAAAQAIAAIADgAEAWUBZgFlAWYAAQAEAAIATACsAPg=\"}"
  },
  {
    "path": "apps/www/app/og/geistmono-regular-otf.json",
    "content": "{\"base64Font\":\"T1RUTwAMAIAAAwBAQ0ZGINMvNaQAABocAADLSkdERUaOgIu5AADlaAAAAgJHUE9TaW4+HAAA52wAABCMR1NVQtVEIxcAAPf4AAANhE9TLzIF4h4/AAAN8AAAAGBjbWFwOpoBDgAAEcAAAAg6aGVhZC6pukoAAADUAAAANmhoZWEPQwwPAAANzAAAACRobXR4VrH9cAAAAQwAAAy+bWF4cAM5UAAAAADMAAAABm5hbWVaa41VAAAOUAAAA3Bwb3N0/58AMgAAGfwAAAAgAABQAAM5AAAAAQAAAAEzM2trAy5fDzz1AAMD6AAAAADiJyGbAAAAAOInIZv/yv8JC3oD9AAAAAcAAgAAAAAAAAHbAFgCWAAAAlgAGgJYABoCWAAaAlgAGgJYABoCWAAaAlgAGgJYABoCWAAaAlgAGgJYABoCWAAKAlgAWgJYACYCWAAmAlgAJgJYACYCWAAmAlgAJgJYAFoCWABaAlj/9gJY//YCWABaAlgAWgJYAFoCWABaAlgAWgJYAFoCWABaAlgAWgJYAFoCWABaAlgAHAJYAGQCWAAmAlgAJgJYACYCWAAmAlgAJgJYACYCWAAmAlgAFAJYAEQCWAAYAlgARAJYAFACWABQAlgAUAJYAFACWABQAlgAUAJYAFACWABQAlgAUAJYACgCWAAoAlgAKAJYADwCWAA8AlgAPAJYAGQCWABkAlgAZAJYAGQCWP/mAlgAPAJYAEYCWABGAlgARgJYAEYCWABGAlgARgJYACYCWAAmAlgAJgJYACYCWAAmAlgAJgJYACYCWAAmAlgAJgJYAAcCWABaAlgAWgJYACYCWABGAlgARgJYAEYCWABGAlgALAJYACwCWAAsAlgALAJYACwCWAAsAlgAJAJYACgCWAAoAlgAKAJYACgCWAAoAlgAPAJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYADwCWAAYAlgAKAJYACgCWAAoAlgAKAJYACgCWAAyAlgALAJYACwCWAAsAlgALAJYACwCWAAsAlgAMgJYADICWAAyAlgAMgJYAQACWABkAlgARgJYAEcCWABHAlgARwJYAEcCWAAUAlgAFAJYABQCWAAUAlgAFAJYABQCWAAaAlgAJgJYAFoCWABaAlgAJgJYAFACWABQAlgAJgJYADwCWAAoAlgALAJYADICWAAUAlgANgJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYADYCWAANAlgAUAJYAEYCWABGAlgARgJYAEYCWABGAlgARgJYADICWAAyAlgAMgJYADoCWABCAlgAQgJYAEICWABCAlgAQgJYAEICWABCAlgAQgJYAEICWABCAlgAPAJYAEYCWAA8AlgAPAJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYAGQCWAAZAlgAAgJYAFACWABQAlgAUAJYAFACWABQAlgAUAJYAFACWABQAlgAUAJYAFACWABuAlgAbgJYAG4CWABuAlgAWgJY//kCWABaAlgAUAJYAFACWABQAlgAUAJYAGQCWAAoAlgAYAJYAGACWABgAlgAYAJYAGACWABgAlgAOgJYADoCWAA6AlgAOgJYADoCWAA6AlgAOgJYACMCWAA6AlgACgJYAFACWABQAlgAMgJYAFoCWABaAlgAWgJYAFoCWABQAlgAUAJYAFACWABQAlgAUAJYAFACWABMAlgAMgJYADICWAAyAlgAMgJYADICWABaAlgAWgJYAFoCWABaAlgAWgJYAFoCWABaAlgAWgJYAFoCWABaAlgAWgJYADYCWAAUAlgAFAJYABQCWAAUAlgAFAJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYADYCWABSAlgAUgJYAFICWABSAlgBAAJYAFACWABgAlgATgJYAE4CWABOAlgATgJYAE4CWABOAlgATgJYAE4CWABOAlgATgJYAE4CWAA2AlgANgJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYAFACWABQAlgAUAJYAFACWABPAlgANgJYAEYCWABCAlgAQgJYADwCWABQAlgAUAJYAFACWABQAlgAbgJYADoCWABaAlgAFAJYADYCWABSAlgATgJYADYCWACPAlgAkQJYABoCWABQAlgAWgJYAGQCWABkAlgAZAJYABMCWAAMAlgAWgJYAFoCWABaAlgABwJYACECWABGAlgARgJYADoCWAA6AlgAFAJYADwCWABEAlgAJgJYAEYCWABaAlgAJgJYACgCWAA0AlgANAJYABkCWAAyAlgAMgJYADwCWAA3AlgAIwJYAEYCWABaAlgAIwJYAB4CWAAFAlgAFAJYACwCWAAmAlgALQJYAFACWABQAlgAKAJYAAUCWAAUAlgALgJYAAUCWAAPAlgAAQJYACYCWAAOAlgABwJYADACWAA1AlgALAJYACsCWAAyAlgAIwJYAEYCWABQAlgAHAJYAEYCWAAmAlgANAJYADYCWAA6AlgAWgJYAJUCWACVAlgAlQJYACkCWAAUAlgAQgJYAEICWABCAlgACwJYAFACWABeAlgAXgJYAF4CWABbAlgAWwJYABkCWAAkAlgAWwJYADoCWABaAlgAUAJYAEYCWABDAlgANgJYADYCWAAXAlgANgJYAEUCWABaAlgAOAJYADgCWABaAlgAUQJYACMCWAAKAlgABQJYABQCWABQAlgAPQJYAD4CWABQAlgAUAJYAG4CWAAZAlgAFAJYAFECWAAZAlgACgJYAA4CWAA6AlgAJQJYAAsCWABaAlgAWwJYADYCWAA2AlgANgJYAEUCWABkAlgAUAJYADwCWABeAlgAOgJYADYCWAAaAlgACQJYADsCWAAQAlgAMwJYADICWAA8AlgAMgJYADICWAAoAlgAPAJYADICWAA8AlgAMgJYADICWAAPAlgADwJYAA8CWAAPAlgADwJYAA8CWAAPAlgADwJYAA8CWAAPAlgADwJYAA8CWAAPAlgADwJYAA8CWAAPAlgADwJYAA8CWAAPAlgADwJYADACWAANAlgAKAJYACgCWAAUAlgAKAJYABECWAAoAlgAKAJYABQCWAARAlgAKAJYAJUCWACzAlgAoAJYAKACWACEAlgApQJYAKUCWACmAlgAnwJYAKgCWACVAlgAswJYAKACWACgAlgAhAJYAKUCWAClAlgApgJYAJ8CWACoAlgAAASwAHwHCACHCWAAPgcIAD4EsAA+BwgAPgSwAD4HCAA+BLAAzQSwAIwHCAGLBwgBAgSwAKIEsADXBLABDgSwAD4HCAA+BLAAaAcIAHwHCADWBLAAKgcIATQEsABsBwgAbAJYAPACWADwAlgA8AJYAPACWAA3AlgA8AJYAPACWABDAlgAQwJYAPACWADDAlgAggJYAKECWAA2AlgAbAJYAGwCWADwAlgA8AJYAPACWAA3AlgA8AJYAPACWABAAlj//wJYAPACWACWAlgAZAJYACgCWABQAlgABgJYAL0CWACXAlgAXwJYAGoCWACpAlgAjgJYAKsCWACmAlgAuQJYAI0CWACqAlgAfwJYAFQCWABWAlgAsAJYAHkCWACqAlgAfwJYALkCWACWAlgA9gJYAJ4CWACcAlgAngJYAOkCWAD2AlgATwJYAE8CWADHAlgAoQJYAKsCWAEAAlgAMgJYAFoHCAAcBLABJQlgATcHCAGDBwgBNQSwATQEsACzBLAAoQcIAD4HCAA+BLAAPgcIAD4HCAA+BwgAPgSwAD4HCAAlBLABBAcIAD4HCAA+BwgAPgSwAD4HCAA+BwgAPgcIAB4JYAA+C7gAPgSwAKAHCADlCWAA5gcIADwEsAD7BwgAPglgAD4HCAA+BwgAPgSwAJEHCAA+BwgAPgSwAIYHCACvBwgAwQcIAOoEsADPBLAAhASwAH0EsACGBLAA2gcIAMEEsAAjAlgACAJYABYCWAAeAlgAKgJYAFACWAAEAlgAMAJYADACWAARAlgAlgJYAN4CWACOAlgBAwJYAQUCWABrAlgAawJYAAUCWAAmAlgATwJYAA4CWAAEAlgACAJYAAQCWAA0AlgARgJYADgCWAAvAlgACgJYABYCWAAhAlgAJQJYABQCWAAvAlgALAJYAD4CWAA+AlgAfgJYAD4CWABQAlgAUAJYAEkCWABIAlgAPgJYAD4CWAA+AlgATwJYAE4CWABaAlgAcwJYAAcCWABuAlgADwJYABECWABGAlgAEQJYACcCWABfAlgADQJYAAQCWAAdAlgAGAJYABECWAAlAlgAHQJYADkCWAAHAlgARgJYAAICWACAAlgAEgJYABQCWAAUAlgAEQJYABECWAASAlgAHgJYAB4CWAAOAlgAEgJYAAICWACLAlgAJgJYABECWAAlAlgAiwJYADkCWAAKAlgAOAJYAAgCWACLAlgAEAJYABACWAACAlgATwJYAAgCWP/KAlgACAJYAJUCWAAIAlgALAJYAAgCWAAzAlgBAQJY/9gCWAEBAlgBAQJYAQEAAACgAAAAoAAAAQAAAADcAAAA3AAAAJYAAAD0AAAAoAAAAKAAAACgAAAA0AAAAI4AAACmAAAA8AAAAPAAAADwAAAAwQAAANQAAABkAAAAnAAAAPYCWACgAQAA3ADcAJYAoACgAKAA0ACOAKYAwQDUAJwA9gDxANwBAAAPAA8AAAABAAADmP8kAGQLuP/K/gwLegABAAAAAAAAAAAAAAAAAAADJgAEArMBkAAFAAgCigJYAAAASwKKAlgAAAFeADIBCQAAAAAAAAAAAAAAAKEAAv8AAa37AAAAAAAAAABWUkNMAMAAIPj/A5j/JABkA/QBAiAAAJcAAAAAAhICxgAAACAABQAAABQA9gADAAEECQABABQAAAADAAEECQACAA4AFAADAAEECQADADgAIgADAAEECQAEACQAWgADAAEECQAFAD4AfgADAAEECQAGACIAvAADAAEECQAIAJAA3gADAAEECQAJAGABbgADAAEECQALADABzgADAAEECQAMADABzgADAAEECQAQABQAAAADAAEECQARAA4AFAADAAEECQEAABIB/gADAAEECQEBAAoCEAADAAEECQECAAoCGgADAAEECQEDAAoCJAADAAEECQEEAAoCLgADAAEECQEFABQCOAADAAEECQEGABYCTAADAAEECQEHABgCYgBHAGUAaQBzAHQAIABNAG8AbgBvAFIAZQBnAHUAbABhAHIAMQAuADIAMAAwADsAVgBSAEMATAA7AEcAZQBpAHMAdABNAG8AbgBvAC0AUgBlAGcAdQBsAGEAcgBHAGUAaQBzAHQAIABNAG8AbgBvACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAwADsARwBsAHkAcABoAHMAIAAzAC4AMgAgACgAMwAyADQAOQApAEcAZQBpAHMAdABNAG8AbgBvAC0AUgBlAGcAdQBsAGEAcgBCAGEAcwBlAG0AZQBuAHQALgBzAHQAdQBkAGkAbwAsACAAVgBlAHIAYwBlAGwALAAgAEEAbgBkAHIA6QBzACAAQgByAGkAZwBhAG4AdABpACwAIABHAHUAaQBkAG8AIABGAGUAcgByAGUAeQByAGEALAAgAE0AYQB0AGUAbwAgAFoAYQByAGEAZwBvAHoAYQBCAGEAcwBlAG0AZQBuAHQALgBzAHQAdQBkAGkAbwAsACAAQQBuAGQAcgDpAHMAIABCAHIAaQBnAGEAbgB0AGkALAAgAE0AYQB0AGUAbwAgAFoAYQByAGEAZwBvAHoAYQBoAHQAdABwAHMAOgAvAC8AYgBhAHMAZQBtAGUAbgB0AC4AcwB0AHUAZABpAG8ALwBOAG8AIAB0AGEAaQBsACAAYQBBAGwAdAAgAGEAQQBsAHQAIABsAEEAbAB0ACAAUgBBAGwAdAAgAEcAQQBsAHQAIABhAHIAcgBvAHcAcwBSAG8AdQBuAGQAZQBkACAAZABvAHQAUwBsAGEAcwBoAGUAZAAgAHoAZQByAG8AAAACAAAAAwAAABQAAwABAAAAFAAECCYAAAEIAQAABwAIAC8AOQB+AKwBEwErATEBNwE+AUgBTQF+AY8BkgHOAekCGwI3AlkCuQK8AsgC3QMEAwgDDAMSAyYDKAM1A5sDqQO7A8AEDAQaBCMELwQzBDUEOQQ6BEMEXwRjBGsEdQSTBJcEmwSjBLMEtwS7BMAEzwTZBOME6QTvDj8eIR6FHp4evR7zHvkgFCAaIB4gIiAmIDAgMyA6IEQgcCB5IIkgqiCsILQguSC9IQchFyEiIVUhXiGZIZ0hqiGxIbUh5SHnIgIiBiIPIhIiGiIeIisiSCJgImUjJyMrI84kDCQjJGgk6iUAJQIlDCUUJRwlsyW3Jb0lwSXMJc8nfjADMBEwFzAcp4z4////AAAAIAAwADoAoACuARYBLgE0ATkBQQFKAVABjwGSAc0B5AIYAjcCWQK5ArwCxgLYAwADBgMKAxIDJgMnAzUDmwOpA7sDwAQABA4EGwQkBDAENAQ2BDoEOwREBGIEagRyBJAElgSaBKIErgS2BLoEwATPBNgE4gToBO4OPx4gHoAenh68HvIe+CATIBggHCAgICYgMCAyIDkgRCBwIHQggCCqIKwgtCC5IL0hByEWISIhUyFbIZAhnSGpIbAhsyHkIeciAiIGIg8iESIaIh4iKyJIImAiZCMmIysjziQLJCMkYCTqJP8lAiUMJRQlHCWyJbYlvCXAJcolzyd2MAMwCDAUMByni/j///8AAAGtAAAAAAAAAAAAAAAAAAAAAAAAAAD+lADgAAAAAAAA/qD+ZgB8AHgAAAAAAAAAAAAAAAv/+P/5/+3+Pf4w/h/+GwAAAAD9SQAA/WUAAP1qAAD9bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD80P0EAAAAAAAAAAD0NAAAAADhxAAAAAAAAOI7AAAAAAAA4hLir+J94jXhuOGh4aHhh+Ia4hTiDeIK4gXg1QAA4YsAAOCoAADhTeFE4T/hPuEH4Q3g2uDS4MoAAODB4LjgrOCK4GwAAAAA347e7QAA3pPdkt0HAADeDN3/3fnd8wAAAAAAAAAAAADdMNpy0j0AAAAA0jUAAAmmAAEBCAAAASQBrAHEAo4CuAK+AsQCzgLcAuIAAAAAAzoDPANGAAAAAAAAAAADRANIA1IDWgNeAAAAAAAAAAAAAAAAAAAAAANSA2oAAAOAAAADlAAAA5QAAAOSA8gDygPMA9ID2APaA9wD3gPoA+oAAAAAA+gD6gPsA+4AAAPuA/AAAAP4A/oD/AAAA/wEAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPsAAAD7AAAA+4AAAAAAAAAAAAAAAAAAAAAAAAD7gAAAAAAAAAAAAAD5gPoAAAAAAPmAAAAAAAAA+IAAAAAAAAAAAPcA94D4APiA+QAAAAAAAAD4gP0AAAD+AAAAAAAAQI5AnACQQK/At4CpwJxAlICUwI/AscCNQJNAjQCQgI2AjcCzgLLAs0COwKmAAIADgAPABUAGQAkACUALQAwADkAPAA/AEQARQBLAFUAVwBYAFwAYwBoAHMAdAB5AHoAgAJWAkMCVwLVAlADJwCeAKoAqwCxALUAwADBAMkAzADWANoA3QDiAOMA6QDzAPUA9gD6AQEBBgERARIBFwEYAR4CVAKxAlUC0wIbAjoCvQLFAr4CxgKyAqkDJQKqAVECbALUAqsDLwKuAtECEwIUAygC3QKoAj0DMAISAVICbQIAAf0CAQI8AAgAAwAGAAwABwALAA0AEgAfABoAHAAdADUAMQAyADMAGABJAE8ATABNAFMATgLJAFIAbQBpAGsAbAB7AFYBAACkAJ8AogCoAKMApwCpAK4AuwC2ALgAuQDSAM4AzwDQALQA5wDtAOoA6wDxAOwCygDwAQsBBwEJAQoBGQD0ARsACQClAAQAoAAKAKYAEACsABMArwAUALAAEQCtABYAsgAXALMAIAC8AB4AugAhAL0AGwC3ACgAxAAmAMIAKgDGACkAxQAvAMsALgDKADgA1QA2ANMANwDUADQAzQA7ANkAPgDcAEAA3gBCAOAAQQDfAEMA4QBGAOQASADmAEcA5QBKAOgAUQDvAFAA7gBUAPIAWQD3AFsA+QBaAPgAXQD7AGAA/gBfAP0AXgD8AGYBBABlAQMAZAECAHIBEABvAQ0AagEIAHEBDwBuAQwAcAEOAHYBFAB8ARoAfQCBAR8AgwEhAIIBIAAFAKEALADIACcAwwA9ANsAYQD/AGcBBQMqAysDNgMsAyYDLQMxAy4DKQMTAxQDFwMbAxwDGQMSAxEDGgMVAxgBXAFdAYMBVwF7AXoBfQF+AX8BeAF5AYABYwFtAXQBUwFUAVUBVgFaAVsBXgFfAWABYQFiAW4BbwFxAXABcgFzAXcBdgF1AXwBgQGCAZwBnQGlAbEBsgG0AbMBtQG2AboBuQG4Ab8BxAHFAZ4BnwHGAZkBvgG9AcABwQHCAbsBvAHDAaYBpAGwAbcBhAHHAYUByAGGAckBhwHKAVgBmgFZAZsBiAHLAYkBzAGKAc0BiwHOAYwBzwGNAdABjgHRAY8B0gGRAdQBkgHVAZMB1gGUAdcAKwDHAHgBFgB1ARMAdwEVACIAvgB+ARwAfwEdAmoCawJmAmgCaQJnArMCtAI+ArUCrAH+Af8CAgLmAuAC4gLkAugC6QLnAuEC4wLlAtoCyALQAs8CugK4ArwCtwHnAwwDAwMHAwQDCAMFAwkDBgMKAwIDAAMBAlgCWQJeAl8CXAJdAmICYwJaAlsCYAJhAmQCZQCEASIAAAADAAAAAAAA/5wAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQESR2Vpc3RNb25vLVJlZ3VsYXIAAQEBKfpxAPpyAfpzAvgYBPsRDANV+4scC3r6iAUcMrkPHDWrEbYdAAC9ExICWQIAAQAHAA4AFQAcACIAKAAzAD0AQwBJAE8AWQBgAGcAbgB1AHsAgQCMAJMAnQCkAKsArwC6AMQAywDSANgA4wDuAPUA/AECAQgBDwEVARsBIgElATIBOQE/AUUBTAFSAVoBZQFsAXMBdwF9AYQBiwGRAZ4BpQGsAbEBtwG9AcgB0QHXAeIB6AHvAfUB/wIGAhUCJAIqAjUCQAJMAlICXQJtAnkCiAKUAqICsQK/As4C3QLrAvoDCAMWAyQDMgNBA1UDWwNiA2kDcAN2A3wDhwORA5cDnQOjA60DtAO7A8IDyQPPA9UD4APnA/ED+AP/BAMEDgQXBB4EJQQrBDIEPQRIBE8EVgRcBGIEaQRvBHUEfAR/BIwEkwSZBJ8EpgSsBLQEvwTGBMoE0ATXBN4E5ATxBPgE/wUEBQoFEAUbBSQFKgU1BTsFQgVIBVIFWQVoBXcFfQWIBZMFnwWvBb0FyAXUBeAF6gX1BfsGBgYRBh0GLQY7BkYGUgZeBmgGcwZ5BoQGjwabBqYGtAbDBtEG4AbvBvUHAwcRBx0HIwcxBz8HTQdbB2oHfQeQB5cHngelB6wHswe6B8EHyAfPB9YH3QfkB+sH8gf5CAAIBwgOCBUIHAgjCCoIMQg4CD8IRghNCFQIWwhiCGkIcAh3CH4IhQiMCJMImgihCKgIrwi2CL0IxAjLCNII2QjgCOcI7gj1CPwJAwkKCREJGAkfCSYJLQk0CTsJQglJCVAJVwleCWUJbAlzCXoJgQmICY8JlgmdCaQJqwmyCbkJwAnHCc4J1QncCeMJ6gnxCfgJ/woGCg0KFAobCiIKKQowCjcKPgpFCkwKUwpaCmEKaApvCnYKfQqECosKkgqZCqAKpwquCrUKvArDCsoK0QrYCt8K5grtCvQK+wsCCwkLEAsXCx4LJQssCzMLOQtAC0YLSAtPC1YLXQtkC2sLcgt5C4ALhwuOC5ULnAujC6oLsQu4C78LxgvNC9QL2wvkC+sL8gv5DAAMBwwODBUMHAwjDCoMMQw4DD8MRgxNDFQMWwxiDGkMcAx3DH4MhQyMDJ4MtwzYDPINBQ0gDTANRQ1bDW0Nhg2eDa8Nvw3TDeQN+w4RDjAOVQ5vDpMOow65DsAOyw7VDuMO8A77DwoPFw8oDzsPQg9JD1APVw9eD2UPbA9zD3oPgQ+ID48Plg+dD6QPqw/CD9UP7Q//EBMQIRAxEEEQVxBvEIEQmxCvEMUQ2BDzEQURHxE6EVQRZBF7EZMRqBHGEesR+BIJEh4SMxJCElcSdBKLEp8SsBLFEtkS7RMJEygTPxNVE2cTfBOTE60TzxPjE+oT8RP3E/0UBBQLFBIUGRQgFCcULhQ1FDkUQBRHFE4UVRRdFGkUchR9FIUUjRSUFJsUpBSrFLYUvRTEFMsU1RTcFOUU7BT1FPwVBRUOFRUVHBUjFSoVMRU4FT8VRhVNFVsVYhVuFXoViRWVFaMVrxW9FckV1xXlFewV8hX5FgAWBxYOFhUWHBYjFioWMRY4Fj8WRhZNFlQWWxZlFmwWcxZ8FoUWjBaXFp4WpRasFrMWvBbDFsoW0RbgFucW7hb1FwEXDRcaFygXLxc2Fz0XSRdbF2IXcxeFQWJyZXZldW5pMDFDREFtYWNyb25Bb2dvbmVrQ2FjdXRlQ2Nhcm9uQ2NpcmN1bWZsZXhDZG90YWNjZW50RGNhcm9uRGNyb2F0RWNhcm9uRWRvdGFjY2VudEVtYWNyb25Fb2dvbmVrdW5pMUVCQ3VuaTAxOEZHYnJldmVHY2Fyb25HY2lyY3VtZmxleHVuaTAxMjJHZG90YWNjZW50dW5pMUUyMHVuaTAxRTRIYmFySGNpcmN1bWZsZXhJZG90YWNjZW50SW1hY3JvbklvZ29uZWtJdGlsZGV1bmkwMDRBMDMwMUpjaXJjdW1mbGV4dW5pMDFFOHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTmFjdXRlTmNhcm9udW5pMDE0NUVuZ09odW5nYXJ1bWxhdXRPbWFjcm9uUmFjdXRlUmNhcm9udW5pMDE1NlNhY3V0ZVNjZWRpbGxhU2NpcmN1bWZsZXh1bmkwMjE4dW5pMUU5RVRiYXJUY2Fyb251bmkwMTYydW5pMDIxQVVicmV2ZVVodW5nYXJ1bWxhdXRVbWFjcm9uVW9nb25la1VyaW5nVXRpbGRlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNXZ3JhdmVZY2lyY3VtZmxleFlncmF2ZXVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pQTc4QnVuaTAxM0IubG9jbE1BSHVuaTAxNDUubG9jbE1BSFIuc3MwNFJhY3V0ZS5zczA0UmNhcm9uLnNzMDR1bmkwMTU2LnNzMDRHLnNzMDZHYnJldmUuc3MwNkdjaXJjdW1mbGV4LnNzMDZ1bmkwMTIyLnNzMDZHZG90YWNjZW50LnNzMDZ1bmkxRTIwLnNzMDZBZGllcmVzaXMuc3MwOENkb3RhY2NlbnQuc3MwOEVkaWVyZXNpcy5zczA4RWRvdGFjY2VudC5zczA4R2RvdGFjY2VudC5zczA4SWRpZXJlc2lzLnNzMDhJZG90YWNjZW50LnNzMDhPZGllcmVzaXMuc3MwOFVkaWVyZXNpcy5zczA4V2RpZXJlc2lzLnNzMDhZZGllcmVzaXMuc3MwOFpkb3RhY2NlbnQuc3MwOEdkb3RhY2NlbnQuc3MwNi5zczA4YWJyZXZldW5pMDFDRWFtYWNyb25hb2dvbmVrY2FjdXRlY2Nhcm9uY2NpcmN1bWZsZXhjZG90YWNjZW50ZGNhcm9uZGNyb2F0ZWNhcm9uZWRvdGFjY2VudGVtYWNyb25lb2dvbmVrdW5pMUVCRHVuaTAyNTlnYnJldmVnY2Fyb25nY2lyY3VtZmxleHVuaTAxMjNnZG90YWNjZW50dW5pMUUyMXVuaTAxRTVoYmFyaGNpcmN1bWZsZXhpLmxvY2xUUktpbWFjcm9uaW9nb25la2l0aWxkZXVuaTAyMzd1bmkwMDZBMDMwMWpjaXJjdW1mbGV4dW5pMDFFOXVuaTAxMzdsYWN1dGVsY2Fyb251bmkwMTNDbmFjdXRlbmNhcm9udW5pMDE0NmVuZ29odW5nYXJ1bWxhdXRvbWFjcm9ucmFjdXRlcmNhcm9udW5pMDE1N3NhY3V0ZXNjZWRpbGxhc2NpcmN1bWZsZXh1bmkwMjE5dGJhcnRjYXJvbnVuaTAxNjN1bmkwMjFCdWJyZXZldWh1bmdhcnVtbGF1dHVtYWNyb251b2dvbmVrdXJpbmd1dGlsZGV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3dncmF2ZXljaXJjdW1mbGV4eWdyYXZldW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmlBNzhDdW5pMDEzQy5sb2NsTUFIdW5pMDE0Ni5sb2NsTUFIYS5zczAxYWFjdXRlLnNzMDFhYnJldmUuc3MwMXVuaTAxQ0Uuc3MwMWFjaXJjdW1mbGV4LnNzMDFhZGllcmVzaXMuc3MwMWFncmF2ZS5zczAxYW1hY3Jvbi5zczAxYW9nb25lay5zczAxYXJpbmcuc3MwMWF0aWxkZS5zczAxYS5zczAyYWFjdXRlLnNzMDJhYnJldmUuc3MwMnVuaTAxQ0Uuc3MwMmFjaXJjdW1mbGV4LnNzMDJhZGllcmVzaXMuc3MwMmFncmF2ZS5zczAyYW1hY3Jvbi5zczAyYW9nb25lay5zczAyYXJpbmcuc3MwMmF0aWxkZS5zczAybC5zczAzbGFjdXRlLnNzMDNsY2Fyb24uc3MwM3VuaTAxM0Muc3MwM2xzbGFzaC5zczAzYWRpZXJlc2lzLnNzMDhjZG90YWNjZW50LnNzMDhlZGllcmVzaXMuc3MwOGVkb3RhY2NlbnQuc3MwOGdkb3RhY2NlbnQuc3MwOGkuc3MwOGlkaWVyZXNpcy5zczA4aS5sb2NsVFJLLnNzMDhpb2dvbmVrLnNzMDhqLnNzMDhvZGllcmVzaXMuc3MwOHVkaWVyZXNpcy5zczA4d2RpZXJlc2lzLnNzMDh5ZGllcmVzaXMuc3MwOHpkb3RhY2NlbnQuc3MwOGFkaWVyZXNpcy5zczAxLnNzMDhhZGllcmVzaXMuc3MwMi5zczA4dW5pMDQxMHVuaTA0MTF1bmkwNDEydW5pMDQxM3VuaTA0MDN1bmkwNDkwdW5pMDQ5MnVuaTA0MTR1bmkwNDE1dW5pMDQwMHVuaTA0MDF1bmkwNDE2dW5pMDQxN3VuaTA0MTh1bmkwNDE5dW5pMDQxQXVuaTA0MEN1bmkwNDFCdW5pMDQxQ3VuaTA0MUR1bmkwNDFFdW5pMDQxRnVuaTA0MjB1bmkwNDIxdW5pMDQyMnVuaTA0MjN1bmkwNDBFdW5pMDQyNHVuaTA0MjV1bmkwNDI3dW5pMDQyNnVuaTA0Mjh1bmkwNDI5dW5pMDQwRnVuaTA0MkN1bmkwNDJCdW5pMDQyQXVuaTA0MDl1bmkwNDBBdW5pMDQwNXVuaTA0MDR1bmkwNDJEdW5pMDQwNnVuaTA0MDd1bmkwNDA4dW5pMDQwQnVuaTA0MkV1bmkwNDJGdW5pMDQwMnVuaTA0NjJ1bmkwNDZBdW5pMDQ3MnVuaTA0NzR1bmkwNDk2dW5pMDQ5QXVuaTA0QTJ1bmkwNEFFdW5pMDRCMHVuaTA0QjJ1bmkwNEI2dW5pMDRCQXVuaTA0QzB1bmkwNEQ4dW5pMDRFMnVuaTA0RTh1bmkwNEVFdW5pMDQzMHVuaTA0MzF1bmkwNDMydW5pMDQzM3VuaTA0NTN1bmkwNDkxdW5pMDQ5M3VuaTA0MzR1bmkwNDM1dW5pMDQ1MHVuaTA0NTF1bmkwNDM2dW5pMDQzN3VuaTA0Mzh1bmkwNDM5dW5pMDQ1RHVuaTA0M0F1bmkwNDVDdW5pMDQzQnVuaTA0M0N1bmkwNDNEdW5pMDQzRXVuaTA0M0Z1bmkwNDQwdW5pMDQ0MXVuaTA0NDJ1bmkwNDQzdW5pMDQ1RXVuaTA0NDR1bmkwNDQ1dW5pMDQ0N3VuaTA0NDZ1bmkwNDQ4dW5pMDQ0OXVuaTA0NUZ1bmkwNDRDdW5pMDQ0QnVuaTA0NEF1bmkwNDU5dW5pMDQ1QXVuaTA0NTV1bmkwNDU0dW5pMDQ0RHVuaTA0NTZ1bmkwNDU3dW5pMDQ1OHVuaTA0NUJ1bmkwNDRFdW5pMDQ0RnVuaTA0NTJ1bmkwNDYzdW5pMDQ2QnVuaTA0NzN1bmkwNDc1dW5pMDQ5N3VuaTA0OUJ1bmkwNEEzdW5pMDRBRnVuaTA0QjF1bmkwNEIzdW5pMDRCN3VuaTA0QkJ1bmkwNENGdW5pMDREOXVuaTA0RTN1bmkwNEU5dW5pMDRFRkxhbWJkYXVuaTAzQTlsYW1iZGFwaXVuaTIxMDd1bmkyNEZGdW5pMjc3NnVuaTI3Nzd1bmkyNzc4dW5pMjc3OXVuaTI3N0F1bmkyNzdCdW5pMjc3Q3VuaTI3N0R1bmkyNzdFdW5pMjRFQXVuaTI0NjB1bmkyNDYxdW5pMjQ2MnVuaTI0NjN1bmkyNDY0dW5pMjQ2NXVuaTI0NjZ1bmkyNDY3dW5pMjQ2OHplcm8uc3MwOXVuaTIxNTN1bmkyMTU0dW5pMjE1NXVuaTIwODB1bmkyMDgxdW5pMjA4MnVuaTIwODN1bmkyMDg0dW5pMjA4NXVuaTIwODZ1bmkyMDg3dW5pMjA4OHVuaTIwODl1bmkyMDcwdW5pMDBCOXVuaTAwQjJ1bmkwMEIzdW5pMjA3NHVuaTIwNzV1bmkyMDc2dW5pMjA3N3VuaTIwNzh1bmkyMDc5dW5pMDBBMGh5cGhlbl9oeXBoZW4ubGlnYWh5cGhlbl9oeXBoZW5faHlwaGVuLmxpZ2FoeXBoZW5faHlwaGVuX2h5cGhlbl9ncmVhdGVyLmxpZ2FoeXBoZW5faHlwaGVuX2dyZWF0ZXIubGlnYWh5cGhlbl9ncmVhdGVyLmxpZ2FoeXBoZW5fZ3JlYXRlcl9ncmVhdGVyLmxpZ2FoeXBoZW5fbGVzcy5saWdhaHlwaGVuX2xlc3NfbGVzcy5saWdhaHlwaGVuX2FzY2lpdGlsZGUubGlnYWJyYWNlbGVmdF9iYXIubGlnYXBlcmlvZF9wZXJpb2RfcGVyaW9kLmxpZ2FwZXJpb2RfcGVyaW9kX2VxdWFsLmxpZ2FwZXJpb2RfZXF1YWwubGlnYWNvbG9uX2VxdWFsLmxpZ2FleGNsYW1fcXVlc3Rpb24ubGlnYWV4Y2xhbV9lcXVhbC5saWdhZXhjbGFtX2VxdWFsX2VxdWFsLmxpZ2FxdWVzdGlvbl9xdWVzdGlvbi5saWdhcXVlc3Rpb25fcXVlc3Rpb25fcXVlc3Rpb24ubGlnYW51bWJlcnNpZ25fbnVtYmVyc2lnbl9udW1iZXJzaWduLmxpZ2FudW1iZXJzaWduX3VuZGVyc2NvcmUubGlnYW51bWJlcnNpZ25fdW5kZXJzY29yZV9wYXJlbmxlZnQubGlnYXNsYXNoX2VxdWFsLmxpZ2FzbGFzaF9lcXVhbF9lcXVhbC5saWdhdW5pMzAwM3BlcmlvZC5zczA4Y29sb24uc3MwOHNlbWljb2xvbi5zczA4ZWxsaXBzaXMuc3MwOGV4Y2xhbS5zczA4ZXhjbGFtZG93bi5zczA4cXVlc3Rpb24uc3MwOHF1ZXN0aW9uZG93bi5zczA4cGVyaW9kY2VudGVyZWQuc3MwOHVuaTMwMUN1bmkzMDA4dW5pMzAwOXVuaTMwMTB1bmkzMDExdW5pMzAwQ3VuaTMwMER1bmkzMDBBdW5pMzAwQnVuaTMwMTR1bmkzMDE1dW5pMzAwRXVuaTMwMEZ1bmkzMDE2dW5pMzAxN3VuaTBFM0ZiYXJfaHlwaGVuX2dyZWF0ZXIubGlnYWJhcl9icmFjZXJpZ2h0LmxpZ2FiYXJfYmFyX2Jhcl9ncmVhdGVyLmxpZ2FiYXJfYmFyX2VxdWFsLmxpZ2FiYXJfYmFyX2dyZWF0ZXIubGlnYWJhcl9lcXVhbC5saWdhYmFyX2dyZWF0ZXIubGlnYWVxdWFsX2VxdWFsLmxpZ2FlcXVhbF9lcXVhbF9lcXVhbC5saWdhZXF1YWxfZXF1YWxfZ3JlYXRlci5saWdhZXF1YWxfZ3JlYXRlci5saWdhZXF1YWxfZ3JlYXRlcl9ncmVhdGVyLmxpZ2FlcXVhbF9sZXNzX2xlc3MubGlnYWVxdWFsX3NsYXNoX2VxdWFsLmxpZ2FncmVhdGVyX2h5cGhlbi5saWdhZ3JlYXRlcl9oeXBoZW5fZ3JlYXRlci5saWdhZ3JlYXRlcl9lcXVhbC5saWdhZ3JlYXRlcl9lcXVhbF9ncmVhdGVyLmxpZ2FncmVhdGVyX2dyZWF0ZXJfaHlwaGVuLmxpZ2FncmVhdGVyX2dyZWF0ZXJfZXF1YWwubGlnYWxlc3NfaHlwaGVuLmxpZ2FsZXNzX2h5cGhlbl9oeXBoZW4ubGlnYWxlc3NfaHlwaGVuX2dyZWF0ZXIubGlnYWxlc3NfaHlwaGVuX2xlc3MubGlnYWxlc3NfZXhjbGFtX2h5cGhlbl9oeXBoZW4ubGlnYWxlc3NfZXhjbGFtX2h5cGhlbl9oeXBoZW5faHlwaGVuLmxpZ2FsZXNzX2Jhci5saWdhbGVzc19iYXJfYmFyLmxpZ2FsZXNzX2Jhcl9iYXJfYmFyLmxpZ2FsZXNzX2Jhcl9ncmVhdGVyLmxpZ2FsZXNzX2VxdWFsLmxpZ2FsZXNzX2VxdWFsX2VxdWFsLmxpZ2FsZXNzX2VxdWFsX2VxdWFsX2dyZWF0ZXIubGlnYWxlc3NfZXF1YWxfZ3JlYXRlci5saWdhbGVzc19lcXVhbF9sZXNzLmxpZ2FsZXNzX2dyZWF0ZXIubGlnYWxlc3NfbGVzc19oeXBoZW4ubGlnYWxlc3NfbGVzc19lcXVhbC5saWdhbGVzc19hc2NpaXRpbGRlLmxpZ2FsZXNzX2FzY2lpdGlsZGVfZ3JlYXRlci5saWdhbGVzc19hc2NpaXRpbGRlX2FzY2lpdGlsZGUubGlnYWxlc3Nfc2xhc2hfZ3JlYXRlci5saWdhYXNjaWl0aWxkZV9oeXBoZW4ubGlnYWFzY2lpdGlsZGVfYXQubGlnYWFzY2lpdGlsZGVfZXF1YWwubGlnYWFzY2lpdGlsZGVfZ3JlYXRlci5saWdhYXNjaWl0aWxkZV9hc2NpaXRpbGRlLmxpZ2Fhc2NpaXRpbGRlX2FzY2lpdGlsZGVfZ3JlYXRlci5saWdhcGVyY2VudF9wZXJjZW50LmxpZ2F1bmlGOEZGdW5pMjExN21pbnV0ZXNlY29uZHVuaTIxMTZ1bmkyNDIzdW5pMjQwQ3VuaTIzMjd1bmkyMzJCdW5pMjMyNnVuaTIzQ0V1bmkyNDBCRXVyb3VuaTIwQjR1bmkyMEJEdW5pMjBCOXVuaTIwQUFub3RlcXVhbGdyZWF0ZXJlcXVhbGxlc3NlcXVhbGFwcHJveGVxdWFsaW5maW5pdHlpbnRlZ3JhbHVuaTIyMDZwcm9kdWN0c3VtbWF0aW9ucmFkaWNhbHBhcnRpYWxkaWZmdW5pMDBCNWFycm93dXB1bmkyMTk3YXJyb3dyaWdodHVuaTIxOThhcnJvd2Rvd251bmkyMTk5YXJyb3dsZWZ0dW5pMjE5NmFycm93Ym90aGFycm93dXBkbnVuaTIxOUR1bmkyMUU0dW5pMjFFNXVuaTIxQTl1bmkyMUFBdW5pMjFCMHVuaTIxQjF1bmkyMUIzdW5pMjFCNGNhcnJpYWdlcmV0dXJudW5pMjFFN2Fycm93dXAuc3MwN3VuaTIxOTcuc3MwN2Fycm93cmlnaHQuc3MwN3VuaTIxOTguc3MwN2Fycm93ZG93bi5zczA3dW5pMjE5OS5zczA3YXJyb3dsZWZ0LnNzMDd1bmkyMTk2LnNzMDdhcnJvd2JvdGguc3MwN2Fycm93dXBkbi5zczA3dW5pMjVDRmNpcmNsZXVuaTI1Q0Nsb3plbmdldHJpYWd1cHVuaTI1QjZ0cmlhZ2RudW5pMjVDMHVuaTI1QjN1bmkyNUI3dW5pMjVCRHVuaTI1QzF1bmkyNTBDdW5pMjUwMHVuaTI1MTR1bmkyNTAydW5pMjUxQ3VuaTAzMDYuY3l1bmkwMzA4dW5pMDMwN2dyYXZlY29tYmFjdXRlY29tYnVuaTAzMEJ1bmkwMzBDLmFsdHVuaTAzMDJ1bmkwMzBDdW5pMDMwNnVuaTAzMEF0aWxkZWNvbWJ1bmkwMzA0dW5pMDMxMnVuaTAzMjZ1bmkwMzI2LmxvY2xNQUh1bmkwMzI3dW5pMDMyOHVuaTAzMzV1bmkwMzA4LnNzMDh1bmkwMzA3LnNzMDhkaWVyZXNpcy5zczA4ZG90YWNjZW50LnNzMDh1bmkwMkJDdW5pMDJCOXVuaTAyQzhibGFja0NpcmNsZWRibGFja0NpcmNsZWRTdHJva2UwMDEuMjAwY29weXJpZ2h0IG1pc3NpbmdHZWlzdCBNb25vIFJlZ3VsYXIA8wIAAQAEAAwAEgAZAB8AJQAqADQANwBCAEsAUQBZAF8ApADQANgA4AEeAVcBdgF7AYgBnwGmAdYB4QH3AgwCFgIdAiQCNgJlAm8CeAKAAoYCogKmArsC2gLrAvYC/wMGAxIDGQMfAyYDMAM0A0MDUQNjA28DeQOAA4kDkAOfA6YD9AP+BBwENwRMBFEEYARxBHwEhwSRBJ4EpwSyBLoEwwTKBNEE3QTlBO0E9QVNBY0FzgYRBjAGNwZJBmQGeAaUBsAGxAbrBvEHAwcWBycHNwc+B0wHWgdfB3YHegd/B4QHkAeiB7MHwwfNB9YH3wfoB/EH/QgFCA0IFQggCC8IgAiTCN4JIQl9CdYKIApsCrcK/AsECwcLTwuVC7gLwgviC/wMMAw6DHQMlQywDNMM1w0PDSENUw1eDW4Ngw2xDdoN+g4kDjMONw5VDn4Opg7ODtoPAA8lDzYPWw+AD5EPow+sD88P7xABECEQQRBgEH4QnBC6ENcQ9BELESYRQBFYEWYRfRGUEasRuhHQEdsR6BH9EgkSHhIqEj4SUhJkEnIShRKWEqESsxLFEtUS3BLsEvwTCxMQEx8TLRM7E0kTVxNlE3ETfhOLE5gTpBOwE7wTyBPUE+AT6hP1FAAUCxQWFCEULBQ3FEIUTUIdDhX3oNP7oAYOi9X4EtULeaGhf6UbDovd+LbdCxXj7TMGC7/3aL8LFdEGSfcUBS0GDrUdDvd6fxXXz66/qB8Li933ft33et0Le9/5FncLBSEG+5j7mQsB95XhAwv3wXsV90P3Avcj93j3ePsC9yP7Q/tE+wL7I/t4+3j3Avsj90Qf1QT7Fzr3BvdL90vc9wf3F/cW3fsH+0v7Szn7BvsWHwvV99QG9yg51fsU+wo9SyN1HuSEBcOZsLLZG9m6YDGMH/tOZgX7CXRYXDEaC3/VS9f4GNsL8/f08/v0BQ5Vlq10xRubn4yMkx/VaQd1gZOjH/dwB/caQd37FPsMPUcndx7khAXIm7Kt1RvXtV8xH/tGZwX7CHRXXDEaC/fAfxX3Juv3APc99z0r9wD7JvsnLPsA+z37Per7APcnH9sEKVPV9w/3D8PV7ezEQfsP+w9SQSofCzXXUe8ek9UVT2envbejpdOZH/c2qwVdBzNVT/sAHgv3qn8VCxXRBhPY0eUFE+hwHQ7lFvhM3fv293734t374vd69+7d/EQGC9zErMKoHwv3Pgb7CodJMSkb+wVK8vdL90zK8/cD379NM6If5ZEF9xpsM+n7Fhv7Oin7I/t5Hwv1Hfsm0fsX9y4fCzcHxnNKsEEb+xktIfsr+yvrIfcbHwv3UwRoc6OtqqOgrq6jdmxpc3NoHwv7iPcC+xL3Kh4L18OuyqgfC/sq1fjydwv3yX8V9wTdzuqnH5Adjx3YHQv3HvsqFdAG0rClxJ8f92v46QUvBvsr/E77NVAd91n8nAWoBnhZBXKBfIBmG04GCxXRBuX3FAUtBgvl2/cMJOHy5Qv7cMGtdtK4C6B2+FzVC8wd+wJN7/dO907J8fcC9wLJJftO+05NJ/sCHwsVyx0Or5qgpbMayla5RkdVXUxjoHGvfB4L95YW4fe2Bvdo+DgFKQb7MvvU+zL31AUpBvdq/DgFC/8AK4AA///UgAD/AISAABILe99cdveo3few3wt73/dj3/ev3wv3gNmx2QEL95j3mPuY95kFIQYLsPdcBUMGC/hOBS8GC0yPx1rYGw4BzeP3uucDQB0LFVYdC/xK/VoV2Qb3H/eTBT0GC9///7KAAP8ATYAAP9cLrKamrKxwpmpqcHBqaqZwrB8Lq/dBBfcRBmv7QQULFcgGv/eGBTgGDl6yqnW6Gw6gdvey3/eU3wsGy0tLSwUL1ftL+Fz7s0H3X/wS+2kLW3hvZFoaC+YD98F7Ffc38vcU918ft/ueN/dDB/sTjEc7+wAb+w5G9xn3Lfcuz/ca9w/dzE81oh/lkQX3Fmwo6fsWG/s6+wf7Oftj+2L3CPs49zkfCwHI5ffP5QN0HQsBseUD98J7Ffca6en3MKUfMJAFfh37d+n7I/c+HwskHS0d2xb4TN37Rfi290Xd/Ew590X8tvtFBg73XBXo+xkF6Qbo9xkFRQZFMUXlBQ75skIdDvjoB/eS/OgF9wz5WjUGCxX4TNn8TAb7vwT4TNn8TAYO+10V9wz3DPsMBgvXx7/Nu2i4XZkfC7Wrqbm5q21hHgv7cBXCtrS/wGOwUh8L4rW62R73AAYL+wwV9wz3DPsMBgv3Ldn3I9kBC8Z++wj3BfOEC6B2+QbfAQvFUc73IMoL0TEF0QYu9xkFLQYLEveE9wwk4Qv3HvwS+x4GC3vEd3b3RsEL98t7Ffcl79n3BPcKTcb7Qbwf+xqxZ6LOGs/DuePrvU01lx7lkQX3Fns36/smG/smMTj7CyHFW/coYR/3OVytZkcaRlVkKCdKxvV9HjGFBfskl/Qo9yobC/fKfxX3DOXD6eNftvs4ph8rm2ebwRq4r67Z07djU5ce45EF53tH2fsXG/sWREcvNblc9y5wH+gdJ5PfPPceGwt/1WJ2+KZ35/cUEuXf94rfO9sTvPebfxUTuj4dE3o1BxN82/imN/vQBhO8LFhSOD9nuvIe99I3++kH+xLPQPQeCwHS4fe25QPSFuH3svcUBpcG9zb7sgXqBvs9978F7KXC0u4a9xsu2/szHvtqBvdq++gV+xT3lPcUBvPFXDk5UV4jHwv/ADaAAP8AxIAAPdn3FNk991kSyRwGjBOYHAVb3h0LAb34iNsdC10dlx21q6m5uattYWRrcV0fCxXIBvcTwvcJ2e8et/uoUvddB0ErXvsG+w0aDqdmBbaVrHtrGnF5em5pc6ydfR4LZG16cXcfy5OnxMAbqaJ8b5UfxpEFyHlarFQbC/sFd05RORv7BU7y90v3TMjz9wXVxlYloh/nkQX3J20u4fsRG/s+Lfsj+3kL+/7sHRWqpKWpqnKkbGxycmxtpHGqH/dFFqqkpamqcqRsbHJybG2kcaofC98T6NMdCxbZBvmi98IF9Qf9o/fCBT0GCxKl+LgT3JEd4wb7bPlaBfsIBgsW2QaM+VoFPQb9o/vCBSEHC/eP+6MV28i41LxusVyfHwv9ChUT7DEdBvcp3sf29wA4x/spHwv7kvzoBfjoNf1a9wwHC/j6Qh0OZvtcBTIGf0UF4wZr+0EFNwZ/RQXeBguXHR8L6x2uuAv5vSUdDn/b+B7bw/cZYLYSC/gWpAb3Rirv+x77Ji77Afs8CzGSBVV5XmhGGy9SxPcGhR8LpRbjBsX3WgX3lAbF+1oFC3/b9zTV9zTbAQsV9zD3MPswBgv3kvjoBfzoBwv7G3b3MPcMAQt3AfeZ2QP3mQtCyF7bHsQEXWulsgt/21x2+GLbC6B2+GjVf3cL1u7W19fu1QtvaH5saRpZrW3DC3/bR8/4IstL18f3FJ8dC/sVdvce2/ge2393Etv/AE6AAP//sYAA3/e+4xPm1x0T6kNQaUxrHxPaiuAFE9Y9Bvd+/GIVLlLO9xYfE+b3FsXO5+fDQvsQHhPW+xBTQi8eDn/b9z/V9ynbxfcUUh37QPezJx0SweP3vt///7KAAP8ATYAAP9cTngA1HROdADgdE1yAjj8FE24A1/imNwYTngA6HROcgJzbFfsCYOvw9Lbr9wL3AbcpJChfKfsBHwvTBhNosPdZBeMGl9EFNAar90EF3gaX0QU5BhMYTx0TKGb7XAX7EQYTGE8dE2iKHROIZvtZBdMGE0iw91kF9xEGE4gLe9/3gt/3kN8B+HXmA/e4exX3NfcL9zf3ZPdu+wP3Lfs9+wUvN/sZYx/mgwXdocfG0xv01SP7KJUf/FkGjFkF+2WP9Psn9y4b3wQtUeH3LHgf9/sG+yx0SzUmGw5/2/cp1fc/2wHH5/e64wP3t/iyFfsEOUgsbx/lhAXBnbiu0BvnxFL7BpEf/BZyBvtG7Cf3Hvcm6PcB9zz3PC73AfsqHvsf+9kV97oGKX1UWDkbPVK68YMfDvsQ5cL3ER3h783fE+frFt/30QbtxcDd26tWKR770d/36Qf3BFLk+w0eE+tCTWlCbx8T24nqBRPXPgb3Kv18FcMGy+kF4ScxrQcOoHb4aNW11UH3EhLv3/eQ3xPcpPjcFdb83N/30Abtw8Hg1bBaJR770d/36Qf3Ckze+wZDT21KcB73HeoHE+zVLAcT3L83BxPsV0AHDhXlxOT3Iuxf4i8/UVU0N8FU0B8T9LKqnKafHz+Cal1bG210mqeBH1CFBRP4Tp28asIblPdUFV5zrbu8pa63tKloWoofW4praWUbDgb8uPvAFfty93IF+EPZ/EMG93H3ciwd95j7mAUT8PhAVBX3DPcM+wwGE+is5BXCBpHRlPcN2xr3ejX7egc7lfsNkUUeDnvf+NLfrB0OqR0OFejF2/cT9xRR3C4uUTr7FPsTxTvoH8YEeHqRl34f9xb3ZAWRdY5xbRotalVSHjH3KBXsrMDEnpyFf5ge+xb7YwWFoIikqBoL5QPRFuH3tPcoBt+vbkmRH5z7VQXiBnn3YITWbrFImBnIosHJ3hr3GC7b+yke+2wG92z76BX7FveW9xYG7MJbOTlUXSofC/sQ5a3V+MbVEveY70jfE+jPHVb9ohUT8MMGy+kF4ScxrQcOAbHl9+zlA0YdC/sq1fio1d7tEvf04zeBHRPw94b5RRUT6OPtBhPwMwYOSB0TgIBdHROAkIsdEyCQaB0TgJBka3FdHgugdves3fee3QHl4few5QPlFuH3rPcW9wEd+2wG92L78BX7DPee9wwG9wS/XDU1V1z7BB8OPx0BwfiEA0EdDt872xO5APebfxUTuIA+HRN4gDUHE3kA2/imN/vQBhO5ACxYUjg/Z7ryHvfSN/vpB/sSz0D0HhO2AAsV28PD3dhXx0Jvd4J3dx+Y8QX3LcT7YgZs+3YFxwbWHQ4qHd/tEuXhjePz4xP6Nx0T9uPfJR33VCklHQ4iHd7tEvdS45rfkOMT6NsW+HRcHQYT9PcC+K8lHfdUKSUdDhXZHQsB5eH3vOUD5Rb3PAb3TPcM9xL3ePd4+wz3FPtMH/s8Bvc3/QgVPvi22Ab3Htwt+0j7SDov+x4fC6B2+GjV9zx3Ae/f95DfA8cdDisdAbPf98DhA/enexX3JObr9zIf+Gw1/GwH+wRaUScpWsH3CIceN4MF+yiP5Cn3IhsOi+r4+3fn9xS8HQsqHdT3FAHl4QM3Hfda1CcdAcfh98jhA/fAexX3KuXx9zYf1B0LAbP4nAP3ABb3FgbJ+F3J/F0F9xYGz/laBTEGV/z7QfirBTMGQfyrV/j7BTEGCwGf+MQD9xEW9AbR997R+94F9Qbz+KYFLwZI/E4/+AQFMQY//ARIUB0L+xDlrd35CHcB7+Hq7/cJHfc1/jAVwwbL6QXhJzGtBw4B5d8D5Rbf9x4G8/cC90L7jAXxBvtv98X3Zfd1BfsEBvuW+7EF+GU3BwsGc20Fmx2xq5Wbmx6MHQvXgB0O+Or3GWC2Evc096wToPc0+OoV0QYTYNHlBROgcB0OO3tVY0cbKVHV9w/3D8XV7c+9Y0WbH+ORBfcKdTnN+wob+ygr+wH7PAv/ADSAAP8AyIAA//87gAD/AMSAAD3Z9xTZPfdV+1X3WRLJHAaME0YLi9X4xtUB95bfA/glFvcz1fszBmJ5nrYf+NL7mkH3RvyIBzS+WuceC8EV9oxOHfdy+3IFC+8W3/fQBu3DweDVsFolHvvR3/fpB/cKTN77BkNPbUpwHvebNwcL/wA2gAD/AMSAAD3Z9xTZPfdZEskcBowTqPhBwRUTaPsL9wsFCwHF4QP4WBb3BQb70ff34B0LA/fAfxX3Juv3APc99z0r9wD7JvsnLPsA+z37Per7APcnH9sEC7+zs7+/Y7NXV2NjV1ezY78fvQRzeZ2jo52do6OdeXNzeXlzHwv3wHsV9zzp9xn3geQdH98EC6mjo6moc6RtbnJybm2kc6gfDuMd9yA39xsdC/e5+MwV/IL7aUH4dNX7S/h8B+xYvioe+xVB9xEGtqRyYB8LFcjXt8Rf95NYBvta+5oFWfdQB/sCxBX3AvcmBfsmBw4iHdP3FAH3ud8D2xb4dFwdBgs1+4UGNTpOIEZYw+Ue94Y1+4YH+yHfMvcO39W0xqkeC/cC+yoV91gG5LjI5B/4pvvUQfeA/FwHX3RrZx77TwYL+GI1/GIH+wdWSiYmVsz3Bx74YjX8Ygf7NuUl9yoeC/cr950FKwb7JfuSBfeSN/uSB/sl95IFKwb3K/udC6+hpJCiG7OqZl5cbGljZ2yirYQfTIgFSpHDXdQbC9v7KhXf93AGWKfIbNAb9zLR9xf3JvcmRfcX+zIfC/s86PsB9yoe9x/32RX7ugbtmcK+3RvZxFwlkx8L3cG92Y8fUQZdhW13XRtdbZ+5hR9RBj2PwVndGwugdvkI3S0d95UW4fkI923d/Jw5920GDgO9FviI3fwoBvgg+LIF4fxuOfgOB/wg/LIFC43VFVNjpb21m6fbmx/3Pq0FZwclT1H7Ah4Li/cM9zDZ9/h3EvmC9wwk4RPo+mX3qBULwRX2jE4dE2j3C/sLBQsVMlTX9w33D8LV4u3FQfsP+w1RPysfC/fH9/cF+wUG+7777wX37zX9WuH37wcL91T39gUpBvsn+7P7J/ezBScG91T79Qv5BdMB9zr3oAP3OvkFIR34Dhb3ItX7IgZcdaK8H/fK92fV+2cL94Mt9xn7PPcCHQv8WxX7IPdO9yD3Ex0O90v4aPtL+GcFOwb3S/xn+0v8aAULwRX2jE4d93H7cgUL9wh3o3ldGltddT03W7LNgR4zhQUL91b3NftV9zUF+w4LFdsG+0v4aPdL+GcFOwb7S/xnBQtzwwWBf3eHfRt4gJWfm5Ccpa0fCxX3BL9cNTVXXPsEH/sM954GDgYTmPcL9wssHfeY+5gLxHJ39y/Ee3cSnMhcyPcSyFvKCzX9BvsI+QY1/Qb7CPkGNQYOk/cIIvsFmPsIUAsB9ynfA/cpFt/4XPez1fwHBgt3Er3j977f//+ygAD/AE2AAAsGE1i49xUFOAYTaF77FQULAe/h9wkdC0UHwG1VqD0b+y5F+xf7Jgtesqp1uhvCtrS/wGOwUh8L95j3mAUhBhOg+3H7cgULBvcDHQv7PC37GfuD+4Hp+xn3PAv3KOva9xz3HCva+ygfCwa3cVC1QRv7IDQg+z4LxPc3wtTEAfgJygP3wAv3Bi52+Oj3Bot3EtHhC3vf+NLfv/cZYLYSseULNxX5Vfuj/VT7owUOA+8W+Ezd+/b5CDUGC/kdFfyN+7f4jfu4BQvfXHb3qN33sN8SseUL96jZZbESyfrIE6ALBSIG+5n7mfeZ+5gLBtm1vO2VH6z3yQULmPcI+wUjkvsITRsL/wArgAAS96rIXLoLdvho1X93EuvZPd8L9ybf++839wcHDgbru2xMTVttKx8LFfe3/I33uPiNBQud+TgB95nZA/hhC/sC+fAB9wD4FAML9wrh1/cKoR8zkQv3itk992H3HNkSC/sVdvcq3/kGdxILdvhi27XVQfcSEgv7IPtDQfdD+8oHCwEAAQAAIgAAqwABhwEArAIBiQEArwEAigAAIwEBiwEAsQABjQEAJQABjwEAmgAAJgAAsgABkQAAswEBkgAAtQABkwMAJwEBlwYAKQABngEAKgAAtgIBoAAAuQABoQIAKwABpAEALAABpgEALQABqAIAjAAALgEBqwIAugABrgAAMAAAuwMBrwEAjQAAvwAAjgAAMQAAnQAAMgEBsQIANAABtAAAwAABtQMANQABuQMANgAAwQABvQAAwgIBvgQANwEBwwMAOQEAxQABxwAAxgAByAEAOwABygAAxwAByxoAQgAAyAAB5gEAyQIB6AEAzAEAkAAAQwEB6gEAzgAB7AEARQAB7gEApwAARgAAzwAB8AAA0AEB8QAA0gAB8gMARwEB9gYASQAB/QEASgAAkQAA0wIB/wAA1gACAAIASwACAwIATAACBgEATQACCAIAkgAATgECCwIA1wACDgAAUAAA2AMCDwEAkwAA3AAAlAAAUQAAogAAUgECEQIAVAACFAAA3QACFQIAlQAAVQACGAMAVgAA3gACHAAA3wICHQQAVwECIgMAWQEA4gACJgAA4wACJwEAWwACKQAA5AACKi8AiwAAjwACWokAEQkC5BQAYwAAmwAC+QEAngAAowAC+wABQAMC/CwADwAADQAAGwEAeQAAAgAAYAAAIAAAewAAcgAAdAAACwADKQAABAAAEAAAPQADKggADgAAbwAAiQAAQAADMwAACQEAXAAAXgAAPAAAPgADNA0AdQEAaQAAdwAAQQAACAAAagAAeAAAawEAAwAAaAAAZQADQjIAIQAABwAAcwAAZgAAqgAApQADdQAAmQAAoQADdgEAXQAAoAAAcAEDeAcAYQAAZwAABQADgAQAYgAAZAAADAAApgAAqAAAnwAAHgADhQAAHwAAHQADhgEAnAADiAAAXwAAlwAAPwADiQcABgAAegADkUQAgwAAggAAfAEAhgAAfgAAiAAAgQAAhAAAfwEAhQAAhwAD1gYDOQIAAQD9AP4BEAEfATcBRgFmAYEBjgGwAdQB8QIaAl8CYQJmAnACfQLKAtcC5gLrAvcC+QL7AwADDAMYAzEDMwNFA0cDYQOQA74DwAPfBAEEJARHBHkEpwTNBPgFOAU6BYEFowWlBa0FvgXABd8F5wX3BiAGPgZABngGuwbDBtAG4wbrBvgHGAcaB0gHSgdZB2UHbwdxB6AH6QfrB/IIDAgiCCkIMQhGCLsI2glRCVMJlQnjCegJ9AoBChoKHwopCjYK2wr5CxcLdAt2C54LrwvcDAQMCQwODDsMWQxyDHkMgQyaDOANGg05DWENaQ1vDakN3A3iDeQN5g3tDf4OFQ4cDjsOQA5NDloOaw5tDm8OcQ52DoIOjw7iDuwPFw81D1cPaA99D5YPuQ/0EAcQNBBKEGIQehCSEMQQ2REDERgRLRE0EWsRoxHIEegR7xIaEkYSbBKZEyITghOEE5ATnxPdFCEUNRRXFIIU5xVZFV4VaxV4FZYVmBWtFa8VzRYWFmwWbhafFrkW9xceF1YXghevF+EYPRg/GEEYYxhlGG8YdxiJGIsYjRiVGKYYzRjtGO8Y9BkBGRAZGxkrGWUZaBl0GYMZhRnCGh0aMhpUGnUadxqpGu8a+xsOGykbQhtVG2kbgRv3HBYcfhyAHMMdLh1CHWgdjh2vHbEeER50HvcfEh8vH5sfvR/yIBcgTyBuII8glCC/IPEhDiEcISMhTyGbIc8iESI1Ij0iQyJ1IqAipiKoIqoisiLDItUi3SL/IwgjGSMpIzojPCM+I0AjfiOnI+8kGCRKJIIkqyTXJUwlfiW6JeUl7CYjJjAmbCalJqwm6Sc0J2gnpiepJ7snwifdKBcoNyhJKGIoeCipKKsoxijIKPApBSkdKTApWimYKaop4SoUKokqwSrTKvcq+SsBKw8rKitLK5crnCueK6Ar3SxZLGwsjiyTLKAszyzRLNMs1SztLO8s9Cz2LTAtcS3QLdIt6i4VLiwuTi59Lp4u5S8LL2QvwS/GMBEwYjBkMGYwaDCfMP8xQzGCMbgyFjJsMpgy7jMWM0UzRzNxM6YzyDP/NAE0AzQqNF80pzS8NSw1lDWZNaQ1wTXrNj42QzZFNkc2bzbkNvU3DDcjNzk3Vjd0N6030jfeN/c3+Tf7OBI4FDglOI04jzinONU47DkROTc5VjmIOa058TpLOk06mDrbOt063zrhOuM7QTuIO948PDyaPPM9KD1lPZw90z3uPiQ+UT56Pnw+fj6APps+xT7dPv0/aD+pP+FAUkCzQOVBNEGeQc5CI0KMQrNDLEOWQ7BDzkPkRAVEFESFRJtEqkTKROBFQEVvRYpFuUXvRglGNkZmRpxG8Ec2R0lHhEfdSCJIcUjESTJJdknkSktKrkrASt1LKUtzS5lL2kv9TAxMRExXTGtMkkymTNRM5UzuTQRNEk1JTZRNlU22TeJOBU4WTitOTE5nTq1O309ET2NPik+oT89P+VA1UI9QsFDcUTlRXlGkUdRSCFIOUhlSKFI+UlhSalKeUq5TCFMSUzNTalOPU6ZTuFPNU9tT61QbVDlUY1SMVOFVNVU9VVJVZVV4VYlV1FX9ViZWfFbRVu1XClcZVz1XXFdyV4lXn1ezV8hX71gZWElYeFixWN5Y6Vj9WSFZOFlHWVhZllm+WeNZ8loZWilae1r9Wx1bgVuoW9Rb8lwSXDJcUFx/XJRcrlzsXUBdg12cXcRd+14wXmleu17VXvFfRl92X4NfkF+qX9JgCGBbYI5gp2D4YSFhWmGOYchiD2JgYtVjPmOPY8Fkj2TxZSFlemW5ZhpmV2cWZ7Rn4WiBaQ5pgWnqaidqX2pvaotqnWq1atZrCGt2a59r1mwTbFxso2zmbRRtim38bpxvGG+Ub9dwLXB3cORxHXE6cURxeHGTcZ5x5HIHcidyUXJ6cq9zS3OSc6hzznRNdIx0vnTxdR11RXWtdfV2E3bHduV3E3cmd053b3eXd7B32ngqeHp4zHjxeRJ5Wnmlecl57XoTejR6XHqXeq960HrmewV7G3s5e1Z7dXufe8d79XxCfbd95n34fg1+HH4rfkx+bn6JfqN+qX68ftB+437sfv5/EX8Wfxt/IH8zf0Z/S39ef3B/hX+gf6V/tn/Hf9h/3X/if/iAC4AegC6AMIAygDSARIBGgFaAZYB3gI+AkYCTgJWApYC1gMaAyIDYgOOA8hz6aPsqzaq4qqGquKrEqqLAoKyhqq5xpaqlq66rpKquqssS49JE00P3GfsZ91ksqmz3XPscqmz3HEHVE/+/Ffga+bQV+8L+SvfCBkH3whUg+zH2BxMQACD3EmwVExAACCxeBhMaACHqBqr3hBUgBxMOART7MfaqP+q4BhMGAEJsdWrABhMDYQXq9wgVLPsxrPcSyQeqxBUTAaEFbE1JLKrJrk2qBxMAEEDJ6BUTABAQbGgGEwA4QaoGrM4VSMlrBxMALwH7Me4G9zH3DhVsTWjJbPsxqgcT4AaBya5Oqgb3MP1dFWxtB0heBexsBhPgAQD7MaoGzbgFSaoGDg4uChKl+LgT2DIKXfxCFRPoMR0uCuf3FIMdn9NCHfsYhh0uCujJEqX4uBPcMgrF1LUdI/yLFRPsMR0uCuL3GYMdOfdctgpphh0uCuMgCqX4uBPaMgo4zxXRBhPW0eUFE+pwHVP9CxUxHS4K8u0S9zTj8+MT3jIKOd7CCvsw/PcVE+4xHS4K5/cUgx2n8Qqbhh0uCvcH0xKl+Lj8LfegE9wyChPqPuoV96DT+6AGqvzpFTEd+2bP9zd291rd9/TZi3cS+DrXE+yRHYxeCpWDCl38QhUT9DEdLgrXvd+9Evdkvd+9E98yCsXDFcsdI/ysFRPvMR0uCu8kCvciJh0T1zIKE9v3CtsmChPXJQoT23mhoX+lGxPn+zj8khUxHYvf9wrfqN33ed863BL31eET1JUW5AbL914F9zL7XveZ3/tDBhP093v3N937N/d59z7f++EHE8xU/DwV9wP36wWg++sGDo8KIgpgHQ4iCsP3FGAdZWMdIgq+9xlgHfsg+jIhCkQdod740t8SseX3c8IX98hpHaCh9wuX3uej9yUZMJAFE15+Hfts4Psg9y5+HxP+bWqnZgW2lax7axpxeXpuaXOsnX0eE15iZQUT/lkd9wcdE+iZCvsh+a42HSIKzu0BseX3FeOMCl6NHSQdth0OJB3O9xm2HS/50CEKkwqTCiodYQoOKh3U9xRhCvdS1CAdKh3P9xlhCuP3XSEKKh3QIArl4RP0Nx3i0BXRBhPs0eUFE/QnCrMdKh3f7QHl4ezjAzcd90vfJR0Ouh0qHevTEuXhkvegE/g3HRP06OsV96DT+6AGDvtmz/ci3fd+3fd63QHl4fds1wPlFvgDwB2HjAXc+/b3fvfi3fvi93r37t38RAcOKh3cJArl4XsmHRP1Nx33tNwVxLC3148fVwZZh357cht7fpKcdh8T6yUKE/UjHaEdoHb3xt33hN0B7+ED7xbh98b35N375PeE9/bd/EwGDnv3Cx337dw72xO89757FeHBtcytHxN8OwoTujkdE7w9HQ5LHcTJErHl9+3cO9sTvkIKE347ChO9OR0Tvj0djPmzFdkdDksdvvcZErHl9+3cO9sTvkIKE347ChO9OR0Tvj0d+x/6MiEKSx2/IAqx5fft3DvbE7sAQgoTewA7ChO6gDkdE7sAPR37IPmuFdEGE7cA0eUFE7sAJwr7EOWd9wsd9xfv9wbcO9sTXwBCChM/ADsKE16AOR0TXwA9HVD7WhXDBhPfAFUKSx3O7RKx5fcS4/cX3DvbE78AQgoTfwA7ChO+gDkdE78APR1fjR1LHdrTErHlr/egtNw72xO9AEIKE30AOwoTvIA5HRO9AD0dE78A+xr5ySEde9/a1cHf96/fAZ/l+ALmA/fBexX3BN7H8rUfwNVrBpCojqusGrf7njf3Qwd4inmIeh77P0H3JQZZbVluSqYKDrEKoHb31N/3Ed8390kS5uH3iuET7Pg7FuH4pc7fSAYT3Ow1BxPsKvuKBxPc7DUHE+wqSDfO/KXh99T3igf7it8V9xH3ivsRBw6gdvfQ3ffMd+MgCs/h97jhE/bKCubPFdEGE+7R5QUT9icKYR20CvdK+VAgHSQdzyAK95XhE+g4Ctr5TDYdnwokHd7tEveT4zXhE+g4ChPw90P5WxUT6OPtBhPwMwYOtAr3UvlQJx0kHerTAfeV4QM4CuD5ZyEd+2bP9yLd+LbdAfeV4a7XA9sW9/9eCt37Rfi290Xd/Ew590X8tvtFBw4kHdskCvciv8rhyr8T5jgK96z5WCYKE94lChPmIx24HSsd5/cUAbPf98DhA/enexX3JObr9zIf+Gw1/GwH+wRaUScpWsH3CIceN4MF+yiP5Cn3Ihv3LGMdKx3jIAqz3/fA4RPs96d7Ffck5uv3Mh/4bDX8bAf7BFpRJylawfcIhx43gwX7KI/kKfciG7z5rhXRBhPc0eUFE+wnCigKAcfhdwoOKAri9xkBx+F3CthiHfsQ5cJ2+Vp3Acfh7e93Cvc4fAqL3fkId/QdDovd+Qh35/cU9B2QRwqL3fgW94aLdxLv4ROw7xb4TN379vkINQYT0Pdc+4ZYHb4di935CHcB9wXhA5X3uxXyuwX76/hM3fv298EH9wvDZ9c4ZAX3fjX7pgf7H0oFDqAKzwrRFuEGE2xkHROcaAoOUwrn9xSrCvdU0yAdUwri9xmrCuViHZcKUwrvJArR4X0mHX3hE1ZA0RbhBhNmQGQdE5ZAaAoTWoD3ttsmChNVQCUKE1qAIx37Kt/idvjo9waLdxLR4fer6jXhE9r3ofsqFfIG58XD4h+Sk/laNfzoB/uS+OgF+wz9WuEGE+z46Af3kvzoBaSDBmV2d2EeJAYOpx10CmX5XiAd9wcd9+zlE+xGHfsh+VoV0QYT3NHlBRPsJwoiCs7tAbHlq+Pz46vlA0Yd+yD5aSoKdApt+V4nHXQK+wL5XkYKIgra0wGx5bD3oLLlA0Yd+xv5dSEdIgoBseX37OUDsXsV3waovAVrs716xhvuCvcIdeZhyh/H8QU5Bm9cBapjWptQG/s8LfsZ+4P7BaAytEwf91x2FWFomadwH/eM+DsFnl2UT0Ia+05NJ/sCHvtA97IV907J8fcCtK19cKYe+4z8OQV6uILG0RoOIgrLJAqx5ZkmHZnlE9lGHRPrx/lmJgoT3SUKE+sjHXvfR9/3e933ed9H3xKS4/d94zXhE7X3aHsVurKerasfE3Vm95rfBxN2+0T3e/c43fs493n3P98GE3X7lQYTbWYHrWtknlwb+xU/+yL7eh8Ttft41/si9xUeE67fBDZr9wL3RPdGq/cC4OCq+wL7RvtEbPsCNh8Orx2gdvcp3/ed3/cUdwHl4ffA5QPlFuH3KfceBvcz6N33HfcbLtr7Mx/7HvcUNQbh/HEV9533Hgf3AMFgNDJVXfsAHw4iCgGx5ffs5QP4OEUV6wZO9gXRxrD3APcqGuQdqaaPk6QeOdMV+wJN7/dO907J8fcC9wLJJftO+wN1O2JcH1bnBSsG2fscBYh/fop+Gw6FCnUKDoUK0/cUdQpl+DAgHYUKzvcZdQr7IPiwIQr7EOXCdve03feW3QHR4fcA79WqHWH83FQKIgpfHQ4iCsP3FF8dWWMdIgq+9xlfHfss+jIhCkQdXvcqT3b5I98SyOX3TcLW5RPvgPe5+3AVwra0v8BjsFIfnqAF9ySM7tn3Axr3Ck3G+0G8HvsasWeizhrPw7nj671NNZce5ZEF9xZ7N+v7Jhv7JjE4+wshxVv3KGEf9zlcrWZHGhNXgEZVZCgnSsb1fR4xhQUTT4CW+xXgL/cQeAgT74BraKdmBbaVrHtrGnF5em5pc6ydfR4TT4BiZQUT74BZHSIKvyAKyOX3z+UT7HQd+y35rhXRBhPc0eUFE+wnCvsQ5Z3f+NLfEsjl9wHv9eUTfHQdRPtaFcMGE/xVCovf96HS917fAa/h+ADkA6/4iRX8ieH4iQfctLfUHvdGBvtr+1EFNgfxjAX3BozSWDUaOk1XJh77Gjf3Ggb3Lu3l9xf3EPsA3fs0iB/3cPdWBef7twf7Dz47+xUfDtodoHb3y9X3h90tHfeVFuH3y/cx1fsx94f3bd38nDn3bfuH+zFB9zEGDqB2+QjdzvcZLR3cCir3riEKRB3FdvkI3RL3leGEwhN895UWngZfWwUT+nwdE3xiZQUT+vYdE3ytsAWa6woO+xDlwnb5CN0S95XhNfIn3hPw3Ap6/d4VE+jDBsvpBeEHE+QnMa0GDisdux0OdgplYx0rHejJAcfh98jhA0AK+bME3cG92Y8fUQZdhW13XRtdbZ+5hR9RBj2PwVndGw4rHeMgCsfh98jhE+xACvsh+a4V0QYT3NHlBRPsJworHfLtEsfhmePz45nhE/JAChP++yD5vSoKdgpt+bInHXYK+wL5skYKKx33B9MSx+Ge96Cg4RP0QAoT/Psb+ckhHftmz/cS3/kWdwHH4fXX9xLhA/fAexWPBoB9BU8KrrgF6K3A5PcRGvhiNfxiB/sHVkomJlbM9wce+GI1/GIH+zblJfcqHg4rHde9370Bx+HJvd+9yeEDQAr5ogS/s7O/v2OzV1djY1dXs2O/H70Ec3mdo6OdnaOjnXlzc3l5cx8OKx3vJArH4YcmHYfhE9lAChPqx/m6JgoT1SUKE+ojHYvrQHb5WncSo/i8E3D3iBb3BAb3cPlaBS8GE7D7TPz6+0z4+gUvBg6L6vj7d7wdDrkd93JHCovq+Pt34yAKs/icE+j3ABb3FgbJ+F3J/F0F9xYGz/laBTEGV/z7QfirBTMGQfyrV/j7BTEG9wvPNh2L6vj79Qr3ABb3FgbJ+F3J/F0F9xYGz/laBTEGV/z7QfirBTMGQfyrV/j7BTEG9wzeKgq5Hfd6gAqiCqoKqAqP+IAgHSgK4yAK95bhE+hJHSj4fDYdKAry7RL3NOOV4ZPjE+hJHRP8KfiLKgqoCpf4gCcdKArvJAr3Ir/L4cm/E9RJHRPm8fiIJgoT3CUKE+YjHSQdeR0OJB3T9xR5Hfdo+UwgHSQdzvcZeR33AvnMIQokHd7tAfeT49sd92H5VyUdDr8Kvh2XCloddx0OWh3T9xR3HWr4MCAdWh3O9xl3Hfsb+LAhCvsQ5cJ297Lf95TfAdLh6O/s5QPSFuH3svcUBpcG9zb7sgXqBvs9978F7KXC0u4a9xsu2/szHvtqBvdq++gV+xT3lPcUBvPFXDk5UV4jH1T83FQKTB0Bn+X4Al4dDkwdxMkBn+X4Al4d+bME3cG92Y8fUQZdhW13XRtdbZ+5hR9RBj2PwVndGw5MHb8gCp/l+ALmE/ZzCvsh+a4V0QYT7tHlBRP2Jwr7EOWd3/dj3/ev3xKf5fcr7/cH5hN+cwpP+1oVwwYT/lUKTB3O7QGf5fcm4/cYXh1ejR1MHdrTAZ/lw/egteYDcwr7G/nJIR0uCuuKCsz3BBPeMgps14Ad+1T8jhUT7jEdIgrC9wABseX3DPcAjAr5sQSpo6OpqHOkbW5ycm5tpHOoHw4qHdj3BBLl4YgtChPoNx0T9vcf2BWqpKWpqnKkbGxycmxtpHGqH/dFFqqkpamqcqRsbHJybG2kcaofDiod0/cAAeXh4/cAAzcd93jTKwpLHcL3ABKx5fcJ9wD3DNw72xO1AEIKE3UAOwoTtIA5HRO1AD0dE78AjPmxKwokHdeKCoHhgPcEE8g4ChP09xf5VCkKJB3S9wAS94r3ACrhE8g4ChPw93D5TysKIgrH9wQSseWmLQqn5RPSRh0T/jL5YikKKx3r9wQSx+GULQqV4RPyQAoT/jL5tikKi+r4++QK9wAW9xYGyfhdyfxdBfcWBs/5WgUxBlf8+0H4qwUzBkH8q1f4+wUxBvc/wR0oCuuKCoLhf/cEE+hJHRP0XPiEKQokHdL3AAH3ivcAA70W+Ijd/CgG+CD4sgXh/G45+A4H/CD8sgX3jvlLKwpMHcL3AAGf5fcd9wD3DV4d+bEEzR0wHRLB4/eW3xO4KR0TeDIdE7g0HQ6NCpP4sCAdMB3IyRLB4/eW3xO8KR0TfDIdE7w111HvHpPVFU9np723o6XTmR/3NqsFXQczVU/7AB65+LEoHTAdwvcZEsHj95bfE7wpHRN8Mh0TvDXXUe8ek9UVT2envbejpdOZH/c2qwVdBzNVT/sAHi35MCEKMB3DIArB4/eW3xO2KR0TdjIdE7Y0HSz4rBXRBhOu0eUFE7YnCjAd0u0SweON4/Pjc98TuSkdE3kyHRO5NB0Tti34uyoKjQqb+LAnHTAd3tMSweOS96B63xO6KR0TelWWrXTFG5ufjIyTH5AKE7o0HRO0MvjHIR37Zs/3FtVjdvhh2xLB4/eW3xPcKR0TvJRgonOyhHJsGE8KrrgFkAoT3DQdDjAdt73fvRLB4729372j3xO+gCkdE36AMh0TvoA0HRO/gLn4oEcdMB3PJArB43smHWHfE6yAKR0TbIAyHROsgDQdE7UA9fi4JgoTqoAlChO1ACMdLAoSmN/3IfEm7/c2/wBWgAAT9vg9rApZbh++c2KkURs2WVP7BHof3oQFE/rClJmzuRu6nmQmHzZ1BTV2VU4+GizIU9SJHsyNurSd1AgT9j+nvWPRG/ui2xVpiHOpuRqyprDBmB7ImgVxByZxXVGHHvfu94kVE/r7NQb2laS1vRsT9rehYSCVHw6YHfc8dxLb/wBNgAD//7KAAN/3vuMTtvfXfxX3IOL29z73PjT2+yBBUGFfcR/3kjcHE3b9WgcTetcGE7qO2wUTtlGpx2nVG4bbFStR1/cN9w/F1e3iwkH7D/sNVD8yHw6WCiMKx/cUAdFbCmSJHSMKwvcZAdFbCvsh+XohCkQdptlSdvhs2xLR4/dTwhPv98ZpHaKl9wKR2tag9wQZM5EFE1fDHfsv3CP3FXsfE+9oZXwdE09iZQUT71kdjh3R4xPo985/FfcXHQU7e1VjRxspUdX3D/cPxdXtz71jRZsf45EF9wp1Oc37Chv7KCv7Afs8+zzr+wH3KB/7Ivj2Nh0jCtLtAdHj9wJbCl35BRXj7TMGDpgd9zzyHRO896l/FRO61cetxakfE3qOOwUTfM0KE7y4Cg6YHUH3hovyHROu96l/FROt1cetxakfE22OOwUTbs0KE664ChOW95b4JFgdf9tc9xodveP3UvdUN99aCv8ATYAAE64A99z43BUTrQD3APsU9wQd+z7iIPcgHxOsgNXHrcWpHxNsgI47BRNtANf43MgGE7UA1U4HE60AvzcHE7UAVwcTtgD7AAYTrQBd/OLfHQ5/2/f22/dwdwHF4/fJ4wP3kfiiFfcMtaduoWWaXBmoZV2eVhv7Jysp+zP7M+sp9yf3Juvt9z33HnD3C0nfH/cBsXPL+x9aWbJKpTmTGXdBu4e1ga96GT9wBdP8nhUpUsv3BfcFxMvt7MRLJPsSUk4qHw4sClIdDiwKxfcUUh37SPezIB0sCsD3GVId+674MyEKLArBIArN4/e65xP2QB37r/evFdEGE+7R5QUT9icKjgosCtDtAc3j9uPu5wNAHftP974lHQ6eHSwK3NMSzeOc96CU5xP6QB0T/vup98oV96DT+6AGDvtOz3Z29yjb9z/V9ynbEs3j9yLX1+cTf/fJfxWjjAUTv3Jqf21rGlmtbcMeE3+xq5Wbmx8Tv4wduKirt5vAGZAdjx0eE3/YHQ4sCs0kCs3jhSYde+cT7QD3yX8V9wTdzuqnH5AdE+yAjx0eE+0A+zzo+wH3Kh4T7ID3H/fZFfu6Bu2Zwr7dG9nEXCWTHxP1ADn3uyYKE+sAJQoT9QAjHaIdRR311QH3fN8D93z4yBVp+zZB9zb8XN/4XPdg1ftgrQe3oae1Hvcq1fsqBidbVy0fDjkKhAoT9joKE+74ggcT7TsGE/U7HRP2NgoOOQroyRLH4/e+3zvbE/cAOgoT7wD4ggcT7oA7BhP2gDcHxnNKsEEb+xktIfsr+yvrIfcbHxP3ADYKjviDKB05CuL3GYQKE/cAOgoT7wD4ggcT7oA7BhP2gDsdE/cANgr7HfkCIQo5CuMgCsfj977fO9sT9YA6ChPtgPiCBxPtQDsGE/VAOx0T9YA2Cvse+H4V0QYT84DR5QUT9YAnCjkK3uUSx+Py7+rfO9sT94A6ChPvgPiCBxPvQDsGE/dAOx0T94A2Ctf5LeUKOQry7RLH4/Tj9N872xP3gDoKE++A+IIHE+9AOwYT90A7HRP3gDYKYfiNJR0OOQr3B9MSx+Oa96Ca3zvbE/aAOgoT7oD4ggcT7kA7BhP2QDsdE/aANgoT94D7GPiZIR37Ntvqdq/b9x3V9yPbf3eEChP7APe794kV9ygGNn1UVzwbMFPP9wH3AcHP6N3EVTKVH/spBo38dRX3JuLV9xAf92W/1VcHE/cA92cHE/aAOwYT+oA7HRP7ALwKDrcdpB2gdvho1fc8d+MgCu/f95DfE/bHHSnPFdEGE+7R5QUT9icKeAoiHQH3ud8DQQoO0R33aPikIB0iHc8gCve53xPoQQr3AfigNh20HXgK0R33cPikJx0iHerTAfe53wNBCvcH+LshHftmz/ci1fgS1d7tEvex4zvftNcT9tsW+CdeClwdBxP692H4ryUdDiId2yQK90C/0N/GvxPUQQoT5vfK+KwmChPcJQoT5iMdrR1vCrIKDm8K0/cUsgr3jfk6IB1vCs8gCvf4gR33Jvk2Nh2gdvimd/dcd78dDqB2+KZ391x34vcZvx0qYh37EOXCdvimd/dcdwHl3+rvA+UW3/ceBvP3AvdC+4wF8Qb7b/fF92X3dQX7BAb7lvuxBfhlNwf3M3wKpwoOTQrT9xSwCmz3aiAdpwr3EycVyAa/94YFOAYOqx1NCgH3zd8D95b3xBXCpAX7k/tpQfh01ftL97oH4rNszlNxBfcFB+xYvioe+xVB9xEGtqRyYB/7MQc1YwUOoHb4aMlN1RKz2T3f9xrf9xrfE66zFt/35gblqbO1t51lMR776N/35gflqbO1tZ9pLR776N/38gf3HGbDNlNiY0t6Hs9/aq9UGxO2WWZpU3kfE9aJ2QUTzj4GDqDgChPMXwoT1FcKE7SJ6gUTrD4GDpkd5/cUEuvZPd/3kN8T1l8KE9pXChO6ieoFE7Y+BvdARwqZHeL3GRLr2T3f95DfE9ZfChPaVwoTuonqBRO2PgbRYh2jHZkd7yQK69k932smHWvfE8pAXwoTzEBXChOsQInqBROygD4G96LbJgoTyUAlChOygCMd+yrV7OAKE+b3sfsqFdwG6MTD4h/38Af3BFLk+w0eE+pXChPaieoFE9Y+/Kbf99EGE+btxcDd26tWKR772Qdic3BjHjgGDiMKAcXj98jjAzMdDiMKx/cUAcXj98jjAzMdZfiqIB2OHcXj98jjE+wzHfsh+KYV0QYT3NHlBRPsJwojCtLtEsXjmePz45njE/IzHRP++yD4tSoKIwrH9xQBxeP3yOMDMx1t+KonHSMKx/cUAcXj98jjAzMd+wL4qkYKIwre0xLF4573oKDjE/QzHRP8+xv4wSEdIwoBxeP3yOMDrn8V4gautwVvsrt7wxv3Juv3APc91njJarof1egFNAZoXwWnZFubVBv7Jyz7APs9QZ1MrFwf91N+FWdslZ5zH/d096wFmW2SZV8a+w9SQSoe+y73WRX3D8PV7a+pgXijHvtz+6wFfamEsbcaDiMKzyQKxeOHJh2H4xPZMx0T6sf4siYKE9UlChPqIx0sChKV3/c34Dbh9zX/AFaAABP6+ECsClhuH71uYaZXGyZLIPs++z7LIPC/taa9qB9YqLdxxBv7kdsVWmvX9w33DavXvL6qP/sN+w1sP1gf9933iRUT9vs1Bu6Tpb25GxP6uqZaJ5IfDp0d+xV29x7b+B7b9zx3EtvaPN/3vuMT9tcdE/pDUGlMbB+J950FE/Y9Bvd+/RYVLlLO9xb3FsXO5+fDQvsQ+xBTQi8fDvsVdvce2/ge2393Er3j977f//+xgAD/AE6AABPs+Jz7KhUT3Pk8BxPaPQYT6oo2BcprUK1DG/syRfsX+yb7JtH7F/cyHxPs0Miqvqcf+3AH+yr3bhUvU9T3EPcQw9Tn58VI+xb7FlJILh8Oi+cKE6hqChPIah0TsGUKE6hyHQ6L1fgQ10HV0/cUEvd41ELfE6RqChPEah0TqGUKE7RyHfdn+KQgHYvV+BDXQdXO9xkS93jUQt8TtGoKE9RqHRO4ZQoTtHId9wH5JCEK+xDlrecKOO8T1GoKE+RqHRPYZQoT1HId9wv7tBUT0mYKkQojCsf3FAHp4feS4QP3yn8V9wzlw+njX7b7OKYfK5tnm8EauK+u2dO3Y1OXHuORBed7R9n7Fxv7FkRHLzW5XPcucB/3CHejeV0aW111PTdbss2BHjOFBSeT3zz3HhtdiR0jCsL3GQHp4feS4QP3yn8V9wzlw+njX7b7OKYfK5tnm8EauK+u2dO3Y1OXHuORBed7R9n7Fxv7FkRHLzW5XPcucB/3CHejeV0aW111PTdbss2BHjOFBSeT3zz3Hhv7KPl6IQpEHV73KlJ2+GzbEunh9zLCtOET74D3u2kdoqQF9wiO4MLnGuNftvs4ph4rm2ebwRq4r67Z07djU5ce45EF53tH2fsXG/sWREcvNblc9y5wHxNXgOgdE0+AkjHQQvcFfQgT74BoZadmBbaVrHtrGnF5em5pc6ydfR4TT4BiZQUT74BZHY4d6eH3kuET7HUd+yn49hXRBhPc0eUFE+wnCvsQ5aHb+B7bEunh3e/T4RN8dR1H+14VwwYT/FUKi9v3ltr3ddsS1+D3keFf4xP01/iKFfyK4PiKB+jAutceE/jUvl5LRlVaPo0fX4wFOge3jAUT9OiN22EvGjY9YjYeSzvLBvcY9wvP9xfrTM4zoh8T+NCiscjTGvcBNdP7EB4T9PsOLzv7IB8OIh0B93XfA/gOFvci1fsiBlx1orwf98rbCvvKByi9XPIeDovV9z/V9x3VAfd13wPN94kV9zMoBii9XPIe9yLV+yIGXHWivB/u917V+173HdsK+x37MwcOIh2j9wgS93XfE9DjHQcT8PcgNwcT0PcbHSi9XPIeE/B/+L5YHUQdsNX4EtUS93Xf2MITfs4dOa1d0n0eW1enZgW2lax7axoT/nF5em5pc6ydfR4TfmJlBRP+9h0O+xDlrdX4EtUS93XfjO8T8M4dKL1c8h4z+2oVE+hmCj4KEuXf94rfO9sTuPebfxUTtD4dE3Q1BxN4SgoTuEUKDnYdg4kdPgroyRLl3/eK3zvbE7z3m38VE7rXw67KqB8TejUHE3xKChO8RQqp+PsoHT4K4yAK5d/3it872xO295t/FRO1Ph0TdTUHE3ZKChO2RQr7A/j2FdEGE67R5QUTticKPgry7RLl33bj8+N+sR37AvkFFePtMwb3VCklHQ52Hfj6BNEGSfcUBS0GDnYdO/j6Rgo+CvcH0xLl33v3oIXfO9sTuvebfxUTuT4dE3k1BxN6SgoTukUKE7Qi+REhHftmz/cW1WJ2+KZ3EuXf91DXed872xPa95t/FRPZPh0TuTWOBxPcc20FTwoT2q64BfimN/vQByxYUjg/Z7ryHvfSN/vpB/sSz0D0Hg4+Cte9370S5d+mvd+9rt872xO9gPebfxUTvUA+HRN9QDUHE32ASgoTvYBFChO/gKn46kcdPgrvJArl32SyZCYdbN872xOsQPebfxUTrCA+HRNsIDUHE2xASgoTrEBFChO0gOX5AiYKE6pA5goTqUDfChO0gCMdi+FKdvimdxLB+IATcPeLFvUG91VyChOw+y78UPsu+FAFLwYOi+P4Tne9HQ6kCveGRwqL4/hOd+MgCp/4xBPo9xEW9AbR997R+94F9QbzcgpI/E4/+AQFMQY//ARIUB33H882HYvj+E71CvcRFvQG0ffe0fveBfUG83IKSPxOP/gEBTEGP/wESFAd9yDeKgqkCveOgAqhCrAdmwr3E/k6IB0/HeMgCsH4hBPoQR2j+TY2HT8d8u0B9zfj8+MDQR2k+UUqCpsK9xv5OicdPx3vJAr3JSYdE9xBHRPs93X5QiYKE9wlChPseaGhf6UbDiIdAd34SE4KDiId0/cUAd34SE4K90n4miAdIh3O9xkB3fhITgra+RohCiId3u0B95TjTgr3QvilJR0OvwqrHaMdLwoS2eP3nt8+2BO495h/FRO0MAoTdJE5BRN4Lx0TuC/bV/EejdUVU2OlvbWbp9ubH/c+rQVnByVPUfsCHg4vCsf3FBLZ4/ee3z7YE7z3mH8VE7owChN6kTkFE3wvHRO8NwqO+LAgHS8KyMkS2eP3nt8+2BO895h/FRO65cm4vKMfE3qROQUTfC8dE7wv21fxHo3VFVNjpb21m6fbmx/3Pq0FZwclT1H7Ah60+LEoHS8KwvcZEtnj957fPtgTvPeYfxUTujAKE3qROQUTfC8dE7w3Cij5MCEKLwrDIArZ4/ee3z7YE7b3mH8VE7UwChN1kTkFE3YvHRO2Nwon+KwV0QYTrtHlBRO2JwovCtLtEtnjiOPz44DfPtgTuID3mH8VMAoTdICROQUTeQAvHRO4gC/bV/EeE7kA3B0TtgAo+LsqCi8Kx/cUEtnj957fPtgTvPeYfxUTujAKE3qROQUTfC8dE7w3Cpb4sCcdLwre0xLZ4433oIffPtgTuveYfxUTuTAKE3mROQUTei8dE7o3ChO0LfjHIR37Zs/3FtX4JNsS2eP3ZNd53z7YE/T3mH8VE/IwCpE8BRP4cGoFTwoT9K64BffUB/coOdX7FPsKPUsjdR7khAXDmbCy2RvZumAxjB/7TmYF+wl0WFwxGi/bV/EejdUVU2OlvbWbp9ubH/c+rQVnByVPUfsCHg4vCre9370S2eO4vd+9sN8+2BO/gPeYfxUTv0AwChN/QJE5BRN/gC8dE7+ANwq0+KBHHS8KzyQK2eN2Jh1u3z7YE6yA95h/FROsQDAKE2xAkTkFE2yALx0TrIA3ChO1APD4uCYKE6qAJQoTtQAjHTQKEsHj977fWgr/AE2AAD/XE5w1HROaOB0TWY4/BRNsRAoTnDodE5kzCg6cHV74qiAdNArIyRLB4/e+31oK/wBNgAA/1xOeADUdE50AOB0TXICOPwUTbgBEChOeADodE5yAMwqE+KsoHTQKwvcZnx37J/kqIQo0CsMgCsHj975VHRObADUdE5qAOB0TWkCOPwUTawBEChObADodE5pAMwr7KPimFdEGE5cA0eUFE5sAJwo0CtLtEsHjkePz45dVHROcQDUd3MSswqgfE1ogjj8FE2qAwwofE5xA7QoeE5wgMwoTm4D7J/i1KgqcHWb4qicdNAre0xLB45b3oJ7fWgr/AE2AAD/XE50ANR0TnIA4HRNcQI4/BRNtAEQKE50AOh0TnEAzChOfAPsi+MEhHftmz/cW2112+GXLS9cSweP3hNd531oK/wBNgAA/1xNNADUdE0yAOB0TLECOQAUTzgBybAVPChNVAK64BfimNwcTTQA6HRNMQDMKDjQKt73fvRLB48G9373HVR0Tn8A1HROfoDgdE1+Qjj8FE2/ARAoTn8A6HROfkDMKhPiaRx00Cs8kCsHjfyYdhVUdE5ZANR0TliA4HRNWEI4/BRNmQEQKE5ZAOh0TlhAzChOagMD4siYKE5VAJQoTmoAjHcUdDk0K0/cUAfeW3wO6Cvsf+aIgHcUdqPhoWB37EOWt1fjG1RL3lt857xPwugr7NftqFRPoZgpNCgH3ld8D91/3xBXBpAX7VQc0vlrnHvcz1fszBmJ5nrYf93wH47NrzlNxBfeZ+5pB90b7dQc1YwUOMB3L9wQSweOILQpv3xO5KR0TeTIdE7k0HRO2YPi0KQojCsb3AAHR4/D3AJoKivj5KwosCsn3BBLN45ItConnE/lAHRP2+3v3tykKLArE9wABzePt9wDj5wNAHfsi97IrCjkK5vcAEsfj6/cA6d872xP2gDoKE+6A+IIHE+5AOwYT9kA7HRP2gDYKE/eAjviBKwqcCiId1/cEEvdN9wSH33z3BBPoQQoT9Pc1+KgpCpwK+2bP9yLV+BLV0vcAEveo9wAw37TXE/bbFvgnXgpcHQcT+veO+KMrCm8K0vcAEvfr9wAsgR0T8Pez+TkrCiMKy/cEEsXjlC0KleMT8jMdE/4y+K4pCj4K6/cEEuXfcS0KerEdUPj+KQqL4/hO5Ar3ERb0BtH33tH73gX1BvNyCkj8Tj/4BAUxBj/8BEhQHfdTwR0/Hev3BAH3Mi0KA/ce+yoV0AbSsKXEnx/3a/jpBS8G+yv8Tvs1UB33WfycBagGeFkFcoF8gGYbTgbX+T4pCiId0vcAAfeL9wBOCvdv+JkrCi8Ky/cEEtnjgy0KfN8+2BO5APeYfxUTuIDlybi8ox8TeICROQUTeQAvHRO5ADcKE7YAW/i0KQo0Csv3BBLB44wtCpNVHROcgDUdE5xAOB0TXCCOPwUTbIDDCu0KHxOcIDMKE5uAK/iuKQr4BcZVyfdsyhL3I9T3GNETuPeT+AUVurGirJsfE3hok6R7sRuVmoyMkB/HeQd8hZCcH/cMB+Fcvjc/WWBLfx7ShgWrk6CcsRuyoXVbHyN2BRO4TH5laVgaUb5nyB6UxhVsepqkpJuXqZEf4ZwFcwdca25XHg74Bcv3a8sB9yXU9zfUA/e/+AUV58rO9PJMzy8vTUckIspI5h/LBFlstM7NqbS+v6liSUltYVcfDi4KEqX4uBPYMgpd/EIVE+gxHYvd957d91jfAdvh97DlA9v5WhX9WvdsB2MK91j3+d8G+4F/HY8KoHb5Bt/ZCg6gdvkG39P3FNkK91BHCm4d7+H3tuED9075BhX4DPeDNfsv/Az9WuEGDlodAe/hA573shXc+7Lh97L3g9/7g/eU+ALf/Fj76DoGDvsVdvcq3/iy3xKX4ffI4Y3hE/iX+yoV4fcqBhP0+CD7KuH3fgYT+DP5BvvCBlf8ggUwgXJiWRtiBvdAFqComLORwLj4OBj3HfyyBg4qHWEKDrodsx0oCi0dkhboBvcx9+IF++Lh9+IH9zH74gXoBvs79/f3Mff3BS4G+yf74AX34DX74Af7J/fgBS4G9zH79wUOe9//AQuAAN//AN6AAN8SrOT33eVK5BP498B7FRP09yz3BeL3EOdUzyioHxP44aS3wNoa9wEk1/se+xEkRCd+HuWFBcSUyK/cG+TJZE0vO2xSjB9BjAU2B9WMBRP01YzjYywaOUNXIylCutWEHjKFBRP4+wmR9wY59ycbDs8K+KYW+Vr7DAcTnIgdE2yUHQ5TCujJEtHh97ThE174phb5WvsMBxOeiB0TbpQd+yT5oygdKArJHQ4oCuf3FMkd9wT4RyAdi9/4st8B+GHhA58W0gbjscXkkh+z+HMF91n9BuH5WvwABl38vQVfh3huZxtRBg6gCrEKpx1uHdHh97ThA9EW4fkG97T9BuH5WvxgBg6vHSIKYB0O2h2L3/kGdwG/+IoD9yEW0AbHsaXEnx/3dvkHBS0G+y78TPsz+EwFLAb3VfycBa0GckYFcIF7gXEbTgYOi9/5BnfoyQG/+IoD9yEW0AbHsaXEnx/3dvkHBS0G+y78TPsz+EwFLAb3VfycBa0GckYFcIF7gXEbTgb3N/lPKB0oCgGk5fch4fcj5QP3lBbh1gb3JZ3j8/cyGvcyM/P7JZ0e1jU/B/sjejMj+zIa+zLjI/cjeh77IferFfTA0+OcHvwYBzOcVtP0Gvd3+1YV+BgH5HvBQyEaIVVDMnseDqIKoHb3gt/4GHcBveH3yOED+FAW4fla0h0O9xkdx+H3tOF24RP4x/laFf1aBxP0+Ev7KuH3fgYT+Er5BjX9Bvu0+QYGDovf+QZ3AcLh9wjh9wjhA8IW+H75Wu8d9xkdruH3COH3COFx4RP8rhYT+vhk+yrh934GE/xP+QbvHfsq93433/kGdxLR4fDh8OETvPeV+yoV4QYTfPcq90/5WjX9Bvu0+QY1/Vr3TwcOi933nt33rHcB5eH3sOUD5flaFf1a92wHYwr3rAb3DH8di9/3nt/3qHcBruL3ZeXF4QOuFvcbBvcy6Nv3G/cdLt37Mh9b96g0Bvcb/QYVW/eeuwb3AMBdMjRWX/sAH/fJNxXh+Vo1Bg6L3fee3fdY3wH24few5QOp+QYV2P0G92wGYwr3WIzf+zgG969/HYvf957f91TfAfTf5eL3Fu4DkBa0BuO0xeSPH5/4cwXb/Qb3Bwb3FNTb9xv3HULd+xQfbwaK96gF+4sGcfy9BV+Jdm5nG28G+BAWePeengbZrF0yNGpfPR8Oi9/3et9b3/eodxKf4fcK4vc+7hPe93QW9xEG9zLU2/cbHxO+9x1C3fsyHmX3qDQGE977zPsK98w1/Vrh9873Cgf3CPt6FW4GE773nqgH9wCsXTIfE940al/7AB4OIgpfHQ573/eI3/eK3wGx5gP3wHsV9yHk6fc+pB8wBvsIdlJLNRsmTuL3MYIf92zf+2wG9zKUyOPwG+HES/sInx/nBvc/cTPo+yEb9wIdHw573/eI3/eK3wH4a+YD98B7Fe4K94Mt9xn7PPshMy77P3Ef5wb3CJ/Ey+Eb8Mgz+zKUH/tsN/dsBvsxgk40Jhs1Usv3CHYfMAb7PqTkLfchGw5hHZ8KuB2gdvgY3/cu3wH3DOH3quED9wwW4feFBuHIyOLXwU81HvuG4feGB/chN+T7DkROZFNxHveN9xIde99cdvfN3/eJ33t3Ep/h4+X3YuUTt/gWexX3G8b3BfeV95dQ9wX7G/sSTyf7eYUfMwYTb/fNNf1a4ffN4wcTt/t4kcYm9xMb3wRBb9r3Y/dkp9vV1qg7+2T7Y248QB8OWh0ByuX3tuED+KUW+Vr7agf7My47+xsowkTscR/7Pfu/BeoG9zb3sgWXBvcU+7IG+xT4BhUjUbjd3cW68x/3FPuUBg6L3/fE3/cu3wH3DOH3uuUD9wwW4feFBuHJyOTiw1IvLEJP+w8eNwf3RPcC5/cn9x0q6/scR1FlU3If94z3Eh2L3fee3e/fN/dIEvcG4few5RPsmvimFe78pvdsBmMK7/c43/s4BhPc6zUHE+wrKAf3xfue7B2gdvfF3/eB3y0d9Pe1FSP7tQXnBuL3jAW3mpuYpBug+8Xh98WgBqOafl+bH+P7jAXnBiL3tXPNZqpgjhn3JveBBd/8bDcH9yb7gWCJZWxzSBnG9+UV96QG+xz7cQUOe9/3Z+H3qd8BseX37OWzCvsATev3R4kfnY6yj8KCunkZ9whgo4a0jwj7HnxQQi0b+zz3/xX3HZrG1ekb9wDIKftGjh+Bil2GfI/7DbkZYJxQlGGGCA5uHZn42QP3fRbsBvc4+KoF0aCiobYbmd9dBlFZWTxzH/sc/Fb7RPjXBTAGDvsVdvcq0fkUdwH3i933Q+ED+Iz7KhXh93BWBvsU97H3K/f3BTEG+yH74gX34jn74gf7IffiBTEG9yv79/s0+/cF5Ab3K/fjBfvj3ffjB/cr++MFowYO+xV29yrR+RR3Abvh9/fhA/h9+yoV4fdwOAb7kvex4B33yPvvBboGDvsVdvcq0feK3ffMdxLA4fe44XndCkf5FDX7zPu498w1/Vrh99D3uPvQBhP6zwYOqgqgdvd53/ghdy0d8fd5Ffcv+3nh93n3S9/7Pwb3XPghwAr3XvwhBfsjBg77KvdwRdH5FHcS+ILhE7D4gvsqFeEGE3D3cEYH+zH3suEd+1j7+QXtBvcr97f3K/u3BbcGDvsVdvcq0fc83/gYdxKu4ffI4XvdCkX5FNId++YHE/rRBg6gdvgY3/eCdwHR4ffI4QP3MPlaFTX9WuH3hQbh3Mj20L5TMR77huH3hgf3ITfk+w43QWJQbR4OYR2hHVMK9wfTEtHhlPegluETXfimFvla+wwHE52IHRNtlB0TX/ur+bkhHXvf94nf94nfAbHm9+rmswolT+D3NIIf9+oG+zSCTzYlG/s/990V9zOUyOHwG/DINfszlB8Oi9/5Bnf3B9MSv/iK/BX3oBPw9yEW0AbHsaXEnx/3dvkHBS0G+y78TPsz+EwFLAb3VfycBa0GckYFcIF7gXEbTgYT6Kf5ZSEdMB0SweP3lt8TuCkdE3gyHRO4NB0Oe9v36NsSxeI05/c94bvjE9z3wHsV9x3z7Pcv9yYs8fsXHxPsPlJmSmcfkvcjz6LWswjctqi/2Ro1igVSdnRIbB4T3PsOUlg1+1Ua+wKkML5YHlS+wHXJG9sEMU3S8I0f7ozL0OUb4shGKCZMRDEfDovV9zK1YdVrq/cq1RLl3/eK5UflE63lFveNBvcK1sXnHxPNz1i6N5QeE57SlbWzxhrlPcT7Dh77cAYTrfeN/FwV+zn3Mvc5BsqzbFhdY21MHxOubvd8Ffsc9yr3HAbOtm9eXGBtSB8ORR3xHQ5FHdP3FPEd9yhHCkUdAfcp3/dd4QP3ffhcFfez93k1+y/7sfym3wYOoHb3fNX3KtUB9ynfA7T3fBX3APt83/d89wbV+wb3Kvez1fwH+3T7AAYO+yr3dEHV+BLVEp/f98bfjd8TeJ/VFRO4+3TfBxN09yr4HAcTtPsq3wcTdPd0BxN4Nfhc+8UGW/v8BUmCdG1hG/cQFpuhlqiQsLX3uhj3JfwSBg4sClIdDp4djgqgdvimdwH3lt8DlhbrBvcr95MF+5Pf95MH9yv7kwXrBvsx953VHQUOf9v/AKyAANr/AI6AANsS2+NG5vdv40XjE/L3vn8V9xnfx+vNXMA+oR8T7M2ds7O9Guc+xPsO+wQ+VjaBHuaGBbGQtKTJG8+2cGFdY25OjB9UjAU7B8KMBRPy04y6aFEaWVlsPD9ZrL6HHjOHBSmQ3033FRsObAoS6d/3id8TeGIKE7hrCg5sCujJEunf94nfE3xiChO8awr3Y9QoHWwK5/cUEunf94nfE3xiChO8awr3RYAKoHb4pncB5uED+EgW9wwG+6X3nccKDqB2+KZ35/cUAebhA/hIFvcMBvul953HCuH37CAdi9/4CNUB+FLfA6QWyPcOHfdZ/Fzf+Kb7+ukKWgYOi/I5dvimdxK03vf43xN4rxbfBpP38vcR+/IF9Ab3DvftBfvt3/im+wIHE7j7KPw/+yn4PwX7AwYOoHb3d9X3eXcB5t/3jt8D5hbf93f3jvt33/imN/t5+473eTcGDiMKAcXj98jjAzMdDkUdAeXf95DfA+UW3/hc95D8XN/4pvw4Bg6dHZYKRR0B95bgA/eWFuD4XPdT1fxnQfdTBg6wHT8d6MkBwfiEA0Ed9zn5Oygd+xV2+fB3AaLl9yXg9yPlA/eW+yoV4PdGBvcfm+np9xYa9xYt6fsfmx73Xjb7XQf7IHssLfsXGvsX6i33IHse+yX3hRXgwsXlmB77zAcxmFTF4Br3evswFffMB+R9wVE3GjdVUTJ9Hg6hCqB29zLb97h3AdDf96XfA/g+Ft/4prkKDlkK+Fx3EuXf95Dfgd8T+OX4phX8pgcT9Pgu+yrf93QGE/hB+Fw3/Fz7kPhcBg6L1fhcdwHD3/cJ4PcJ3wPDFvh7+KbUClkK+Fx3EsPf9wng9wnfZt8T/MMWE/r4Vvsq3/d0BhP8XPhc1ArqCt/f39/fE7z3lvsqFd8GE3z3Kvc8+KY3/Fz7kPhcN/ym9zwHDovW907V91d3Adzf97DjA9wW93SHHfsg91c3Bvd05R2L1vdO1fdXdwGu3/dz477fA64W9zeHHTz3VzcG9zf8WxU8907a9xMd969AFd/4pjcGDovW907V9w3VAevf97DjA5X4XBXh/Fz3dIcd+yD3V/s+BvfK5R2L1vdO1fcN1QH3pOD3KuMDkBag9w4d3vxc9yEG9wnMx/b3AErH+wkfU/dX+4npCoIG+CyCFVP3TsMGx61pT1Bpak8fDovW9zDVX9X3V3cSn9/3Mt/3K+MT3veaFvchBvcJzMf2HxO+9wBKx/sJHlL3VzcGE977dfsy93U3/Kbf93v3Mgf3IfswFVIGE773TsQHx61pTx8T3lBpak8eDpEKkh3I5QP3xH8V9wzi1PcNpR8xBkN3WGFDGzNUxvCBH/dF1ftFBvCVwsbjG9S+YEGfH+UG9w5xNNb7DRv7Jyv7APs9+z3r+wD3Jx8Okh34VeUD97x/Ffcn9Ar7J/sNNED7DnEf5QbVn7621BvjwlAmlR/7RUH3RQYmgVRQMxtDWLXTdx8xBvsNpeJC9wwbDngKtB2tHaQdf9tcdvd41fc02393Ep/fx+L3e+MTt/gCfxX3F9Tu90b3RkLu+xf7DUQ2+y+BH08GE2/3eDf8pt/3eMcHE7f7L5XSNvcNG9sEQWLS9xL3ErTS1dW1RPsS+xJhREEfDqB292HV90bUAeTl94vfA/dm93AV+xX7cAXtBvcN92EF9xL7Yd/4pvtlBvscP1IkR7ZV2W8f5sYVPV+rxMS3q9kf9xH7RgYO+yrV7PcaHerf95HfE+7qFt/3ywbtw8Df17BZJh77zgdedG9mHmJBvgbkuMTlH/fsB/cPRtn7AklNcVFtHvcS7wcT9tUnBxPuvzcHE/ZXRQcT7kHRBw6L1vdi1fdD3zf3SBL3FN839133O+MT6vcUFvd0Bvcp3sr3BvcGOMv7KR/7IPdDBhPm9wnfBhPq+wkGE9rrNwcT6iv7Cjf3Cgf3dPxbFfsg92L3IAbnv2VJSVdnLx8OoHb3btL3O9UtHez3axU4+2sF6wbI90UFrZehkqkboftu4fduoAaqoYRplx/I+0UF6wY492t5uWKiYJAZ9zH3OwXV/JdBB/cx+ztgh2FzeV0Zu/eFFffLBvsv+zkFDn/b9w3V91vbAcXj98jjyh0sU9H3CIgfjJGRjJEbq4y5hbJ5CF/tnYuvG5iMBT53WF5AG/so95kV35u/vNsb68RC+w2MH4iCgYmBG2WKf4snuWecW5FoiQgOi+NIdvhc1RKw+LMTcPd6FvUG9x/4EgW8naukuBuV1XQGP1FgPnAfE7D7BfvW+zD4TgUxBg5ZClZ2+KZ3EveW3/c43xO8+I77KhXfBhPc93ReB/sF91PVHfsx+50F6wb3K/eTBfuT3/eTB/cr+5MFmAYO6grh98DfE7j4cPsqFd8GE3j3dDoH+1n3U/eZ950F+woG+437lgX3ljX8puH3lgf3l/uWBbQGDlkK9y3V93l3Eubf947ffN8T+viC+yoV3/d0BhP8RvhcN/t5+473eTf8pt/3d/eO+3cGE/rQBg77FXb5PHcB95bfA/eWFvsq3/cqB/dg+KbeCg77KvdPQdX4gXcS95bfE3D3IGYV9woGE7D7Bd8HE3D3BfcJBxOw1SQH91L4gd4K91L8gQUjBg7vCvh53xOw+Hn7KhXfBhNw93Q/B/sg91jFCvtX+6QF7wb3J/dq9yf7agWwBg5ZCt/b97h3EtDf96XffN8T+viD+yoV3/d0BhP8RvhcuQr7lQcT+tAGDrcdYR2iHWwK9wfTEunff/eggN8TemIKE7prChN00+ohHZIdxeX3xOXKHTNVxvCBH/fEBiaBVFA0G/ss934V8JXBxuMb4sJQJpUfDj8d9wfTEsH4hPwS96AT8EEdE+ip+VEhHaB2+Q/Wi3cSpfi4E7ClFuMGE9D3TvkP9079DwXjgwoOi9/4wt8SlOUz943b940z5RPklhYT1PeN3wYT5DGMRPcP9zAa9zfe9wf3CvcK3vsH+zf7MET7DzGKHhPoN/eN3/sYBxPk2sDC9wn3Ahr3afsM9yn7P/s/+wz7Kftp+wLC+wnaVh4T1PsYBg5NCgHG+H8D+JgWrdVoBmd9oK6AH/sd+FIF7G1hsDcbU0HKBq+ad2eWH6Q6+1j8hwXjBvcl+A7W+4gFJ6qvad0bDiIdEpv3Uzff91HfE9j4uRaq1WsGX3OmuB/3yvHVBxPo/MpBBhPY9vxc3/hc91H7ygYzuFH3AB4Oe9v/ARKAANn/AOWAANsSvuNL4xPw98d7Fe7ztsi/H1XSBVJbNmVHGyVJw93fzcLxiR/BigXaB1WKBRPoSIo+recay8K05MjUZ1q1HsPQBcNaLLMzG/sdLD/7ATu1V99yHxPwKG5YRy8a+xDyNPctHg4iCgG95ffU5QP3wHsV9y7r9yD3evd6K/ci+y77Liv7Ivt6+3rr+yD3Lh/fBGZsmqZyH/d4+DMFm16UUEga+0RP+wInHvs097IV90TH9wTvsKp8b6Qe+3j8MwV7uILFzhoOi934UNVB90wS97DhRdETsMcW+HTd+z75CAYTqEUGE8g7bW0/HisGE7BB9078UPt0Bw6L3/jC3wG99ffD5QO9FviI3/weBo/BzdX3FM8I9yfZu8H3ABr3DjXf+yb7Li4y+x97HuWFBeuaxcHvG+m7WEJDZGspVx/7afsFUCj7KhoOe9/3n9/3c98SveT3vOVK5RP097p7Ffco9wDZ9xzmU88vpB8T+Nyktb7XGvcKM9X7HvseOUIhfh7lhQXKlLex5Rvju2RCOk1tQR9TN8MGE/Tn0GAtKztpNTZNreKDHzKFBfsJkd859y4bDqB29y7f+Gx3AfgY4QP4GBbh9y7h3zX4bC8G++r8cgU99/AH+4jfFfeI9+gF++gHDnvf99bd9y7fAcfl98DlA/e+exX3IfDw9yP3Ii/x+xxZVHdjaB+l92oF97/f/A4GXPwjBecGvaLEqMMb6cNNJydPTy85U7TbgR8xhQX7CpXlOvceGw573/fc3fc43xK95THp99DlE/T3wnsV9yfw6/cw9yYv6/sgOkxkV2kf9z+Zz9/3ABvZr2dTmx/lkwXvb0nP+xIb+2ZF+1T7fvtf5/sF9zQfjd8VE+wpTdHt7dPJ6+TGTSkfE/QhTE0uHg5uHfdW4wP3VhbjBveE2vdQ90f3YB7Z/HQ3+BYH+zL7Si37dPtwGg573/eh2/d13xK95VPl95DlU+UT8vfAexX3IfcB1Pce51bMN6kfE+zKpbO61xr3BDHe+xL7EjE4+wQ/s1zKcR4T8jdtVkovGvse9wFC9yEe3wQuSLXl3sHB9fXBVTgxSGEuHxPs9/EEP1mx18+7ttnZu2BHP1llPx8Oe9/3ON333N8SveX30Okx5RP09775ahX7JyYr+zD7Jucr9yDcyrK/rR/7P31HN/sAGz1nr8N7HzGDBSenzUf3Ehv3ZtH3VPd+918v9wX7NB+JNxUT+O3JRSkpQ00rMlDJ7R8T9PXKyegeDvcoxve+xgH3Kcj3SMgD98D3KKkd5vwHtQoO/wGggAD3EB0TwDEKdPdFFcj4GAYToFwGNQoTwIgK9zTE97PEAfc71PcTyAMxCvsa90RcCvcoxPccxPcCxBL3NHAKE/IxCvc4BGcdE+xdChPyPApRHfeBxAH31MgDMQqe90XQHfclxPc3wtTEAfgJygP3wXsV+0T7Avcj93j3ePcC9yP3RPdD9wL7I/t4+3j7Avsj+0Mfivc1FdvDw93YV8dCb3eCd3cfmPEF9y3E+2IGbPt2BccGr6GkkKIbs6pmXlxsaWNnbKKthB9MiAVKkcNd1BsO9yjE9zrE2cQS9zlvHRPsMQr3OASUCviAxAH3jMgDMQpW90V7HfcoxPcdwfcCfgoT8jEKivc4zgoT7EgdE/J6HRPsPB0O9yjE2cT3OsQS9zxxChP4MQqB9zilHXvV5cb3vsbk1AGa1cfI90jIydQDLh2K5RXoxdv3E/cUUdwuLlE6+xT7E8U76B/GBHh6kZd+H/cW92QFkXWOcW0aLWpVUh4x9ygV7KzAxJ6chX+YHvsW+2MFhaCIpKgaDnvV/wFmgAD/ACuAAPdV1BKa1fdRyFy690LUE/ouHXTyFcj4GAYT9lwGNQoT+ogKe9XxxPezxOfUAZrV2dT3E8jg1AMuHfsa8VwKe9XlxPccxPcCxOPUEprV0shcyPcSyFvK19QT/mAuHeUEZx0T/aBdChP+YDwKUR171fdHxPf71AGa1fd7yPcY1AMuHZ7yFcjXt8Rf95NYBvta+5oFWfdQB/sCxBX3AvcmBfsmBw571eLE9zfC1MTy1AGa1fewytjUAy4diuKyHXvV5cT3OsTZxOXUEprV128d2dQT/cAuHeUE18XB4t9VwkYfE/7AfR0T/cB5CnvV+EbE89QBmtX3M8j3YNQDLh1W8hXIBvcTwvcJ2e8et/uoUvddB0ErXvsG+w0aDnvV5cT3HcH3AsTl1BKa1dFtCtPUE/5gLh2K5RXbyLjUvG6xXJ8fE/2gSB0T/mB6HRP9oDwdDnvV5cTZxPc6xOXUEprV2nEK1tQT/0AuHYHlFeXE5Pci7F/iLz9RVTQ3wVTQHxP+wK8KE/9ATp28asIblPdUFV5zrbu8pa63tKloWoofW4praWUbDiIKAbvl99jlA/fAexX3L+z3I/d393kq9yP7L/svKvsj+3n7d+z7I/cvH98EKEz3A/dD90XK9wPu7sr7A/tF+0NM+wMoHw4oCgGY+NIDmBbfBvh++VoFNwYOi8T3s8T/ALGAAEod9yvIXLrq1PcTyBPbTApQCvcU+5OeCvsw99cVyPgYBhPXXAYT5zUKE+tzBhPbSwp7xHd290XE9wLE/wCxgABKHfcqyFy65HAKE7aQUQoTdpBUHRO2kPea+6NnChO2YF0KE7aQPApMj8da2Bv7t/fnFcj4GAYTtZBcBhO5kDUKE7qQcwYTtpBLCnvEd3b3RcTmxGXE96DEe3cSn9T3E8iicAoTtIhMChNyiFAKE7TI9577o2cKE6ywXQoTtMg8CkyPx1rYGxO1iPw99+lcCov3GVLE/wG9gABKHfcqyFy695PIE5pMClAK97P7kxXIBhNa17cHE5rEX/eTWAcTWn0KE5p/CvvQ91IVyPgYBhOWXAYTpjUKE6pzBhOaSwqL9xlSxPdExPcc7h33QMgTrTBMChOrMFAK97P7kxXIBhNtMNe3BxOtMMRf95NYBxNtMH0KE60wfwr7yPdEZwoTrNB6ChO1UIYKE7UwPAoTrTBRHXvEd3b3N+dYwtTE/wC9gABKHfcqyFy697PKE5tAUQoTa0BUHRObQPeK+6MV28PD3dhXx0Jvd4J3dx+Y8QX3LcT7YgYTq0Bs+3YFxwYTm0DWHfun9+cVyPgYBhOawFwGE5zANQoTnUBzBhObQEsKcx33AsT/ALOAAEod9yrIXLrZbQoTtpBRChNAgLcKExBgrh0TNmA8Hfus5hXI+BgGEwUAXAYTCQA1ChMKAHMGEwYASwpzHdXEdsT3E8LUxBL3eMqJyl/K9wrKX8oTtxBRChNAELcKEwhgrh0TKGA8HRMXAPun1RXbw8Pd2FfHQm93gnd3H5jxBfctxPtiBmz7dgXHBq+hpJCiG7OqZl5cbGljZ2yirYQfTIgFSpHDXdQbDnMd2MRzxPLuHYZtChOzRIBMChNAgIBQChOABICFHRMIAwBIHROABABdHROABICLHRMgBIBoHROABIBka3FdHhMoAwA8HRMSSAD7pNgVZx0TAzAAegoTBBAAhgoTFEgAPAoTEkgAUR1zHfcCxPeSxBL3Hsjlyl/K9wrKX8oTvkBRChNCAFQdE4JAhR0TEYBIHROCAF0dE4JAix0TIkBoHROCQGRrcV0eEz2APB37uOUVyAb3E8L3CdnvHrf7qFL3XQdBK177BvsNGg58xve+xgH3Kcj3SMgD98B8qB2gdv8A/4AA9xAdE+D3qhbI+BgGE9BcBjUKE+CICovE97PEAfc01PcTyAP3NBb3nMT7UwaMpaeosKSnnRjIsqy7uhrNWrlFQVdaPoIex4gFupSkpLQbq6V0a25+dGZzH2t2BShKeEpNGg57xPccxPcCxBL3NHAKE/L3wXsV18e/zbtouF2ZHxPstpiisbAaxVa5RkxUYVWDHsiHBaKOpp+uG6yncWxyb29mH3JSBhPyPApRHYv3GVLEEvfUyBOg99QWyAYTYNe3BxOgxF/3k1gHE2B9ChOgfwoOe/cFHXsV28PD3dhXx0Jvd4J3dx+Y8QX3LcT7YgZs+3YFxwavoaSQohuzqmZeXGxpY2dsoq2EH0yIBUqRw13UGw57xPc6xNnEEvc5bx0T7PfBexXXxcHi31XCRh8T9H0dE+x5Cp9299/EAfeMyAP3jIp7HXvE9x3B9wJ+ChPy98B7FdvIuNS8brFcnx8T7K+aoKWzGspWuUZHVV1MY6Bxr3weE/J6HRPsPB0Oe8TZxPc6xBL3PHEKE/j3t3ulHffKxve+xgH3Kcj3SMgD98D3yqgd/wJCgABKHfeqyFy6E2D3qvfXFcj4GAYTUFwGE5A1ChOgcwYTYEsK99nE97PEAfc01PcTyAP3NPfZXAr3ycT3HMRyd/cvxBL3NMhcyPcSyFvKE7n3wffJZwoTtnoKE9qGChPZPAoTuVEd+CPE95N3AffUyAP31PfX0B33xvcFHffGsh33y8T3OsTZxBL3OW8dE+z3wffLFZQK+SHEAfeMyAP3jPfWex33y8T3HapswXR39y1+ChOcgPfA98vOChObAEgdE5yAXR2XHR8TzIBoHROcgGRrcV0eE6sAPB0O98vE2cT3OsQS9zxxChP497f3yxXlxOT3Iuxf4i8/UVU0N8FU0B8T9K8KE/hOnbxqwhuU91QVXnOtu7ylrre0qWhaih9bimtpZRsODv1X96jZAfcQ+kwD+Rb3qBX4Rtn8Rgb8mj0V+EXZ/EUGDiD3qNkB9xscBfoDHAS796gV+FrZ/FoG/sg9FfhZ2fxZBviuPRX4Wdn8WQYO+IH3qNkByRwI5APJ96gVHAhSBvtx+3JSCvdy+3IFHPesBg4gvgr3cvtyBRz6BD0cBfoGDv1X96jZAcn6yAP5l8Yd/jg9+jYGDiC+CveY+5kFHPneZBUcBSAG+3L7clIK93P7cgUc+t4GDv1X9wwd+pvCFfYGE2D7mfeZ9wAd/YA9+YAGDiD3qNllsRLJHAaME6AcBl/CFfYG+5n3mfeY95gsHQUc+uNkFfr+Bvdy+3EF9QYTYPuZ95n3mPeYBSIGE6D7cvtyBf7+Bg79V00d+iLeA/dh94AV998G84T3CMnGfvsI9wUb9wCq9wbbHzgGRHZeaB5pClAb+98GDv1XMdn3y973ytkB97ra+FjdA/htMRX3btn7TQYqimelzhrlB+ZazUKZHowH0pm+zOUa5AfPsKXriR73Tdn7bgYhQkQmHzsHKlxiII0eOAf2jbpiKho6BybURPUe9/QW3fnwOQYOIIv3DAH4H/cM99n3DPfY9wwD+B89CvhRax34UGsdDiD3Ldly9zCX2RL3lvcw94n3MBN495b3YpMd+CX7MJMdE7j4NpdlHf1X9y3Zcvcwl9kS9zb3MBNw9zb3YpMdE7D4NpdlHf1XufcMftn3I9l39wwS92v3DBOY92u5FUMK954EQwoTaPfN+0ZlHf1Xi/cM+J7fe3cS96L3DCTh93NDHRPOgPmSPQoT1YA/CvyVZh0TroClCv1Xi/drWAr3YxLJ+sgTqPhRFt0GE2i79x0F+MfZ/KwGuPcUBfh/2fxk8x38pT34igZf+xQF/F49+EMGDiCL9y892dzZ3NoSyRwGjBO4+Y8W3QYTeKbYBfn2BhO42f3bB6fcBfm/2f2jBqfcBfmH2v1sBqbXBTgGcT8F/fY8+doGbzoF/b49+aMGbzoF/YcGE3g9+WwHDv1XiQrzQx3BQx0T90D5rhZDChP2wD8K/K1mHRPvQD8KDiCJCvcQQx3fQx3aQx0T93T3uj0KE+0APwr4qWYdE8LQPwr4pGYdE0AsPwoOIIv3n0XR90HRRfeiEvdqHAVeE4j6FhagHfgo+1kVoB3+K/tZFdMGE2jGChMYTx0TKGb7XAX7EQYTGE8dE2iKHROIZvtZBdMGE2jWCvsE0RVXHffQFlcd99AWVx0O/VfiChK1+tgTvPexFtMGlQoTfMv7LRX5gNn9gAb7RPclFVcdDiDiCq93EhwE3usTthwFjBbZBvtk93OL96z3ZPdzCD0GE3b7U/tMaftz9xD7WQj9Lz35agYTtph8mXyafQj9+RbTBhO6kgr9V/dA2fcU2QH3APqaA/cA+wIV2wbv964F+ebZ/csGufcUBfmd2f2CBvP3ugU7Bg4g90HZ9xTZAfcAHAZeA/cA+wIV2wbv968FHAWq2Rz6cga49xQFHAVh2Rz6ugbz97kFOwYOi24KPQoOlR33hPcMA/eLZAqL9wz3nm4KPQr3ngRDCg77G3b3MPcM955uCvgWFUMKkv0qSQoOi/cMAcL3DMv3DM33DAPCPQr3TGsd905rHQ6L9wz44ndxHRPg94Q9ChPQpQr7IXb44vcMcR0T4PeE+LgV+wz3DPcMBxPQa/tlFVQGhUWB+w07Gvt64fd6B9uC9w2F0R4OiQrOQx0T9PeBPQoT7D8KDvs23/ie9wwSzuXh9wwk4ezlE/T3//jIFfsM+wz3DAYT7Ho6FTUGRXxrVWgeNVNlXzca+wvjNvcW9ybl6fcYlx4xkQUrgVpXKBs6XL7Qx5mj2bsf0LanvesaDveHbgr3hxVDCg73W/dlAfdX92YD98D3WxXFurrExVy6UVFcXFFSulzFHw74msv3HHcB9xb36AP3fvgSFc31ziG/rUfxBfcLy/sLBs/xV61IIEn2V2nOJQX7C0v3CwZIJQUO9633XAH3NfeqA/ew960VzAbl91wFLgb7TftcFcwG5fdcBS8GDqB291nR90HR91x3AcH4gAP3vRbTBpIK9xYd9wD7AhXbBvfE+fAFOwYO9xYd+ID7AhX7xPnwBTsG98T98AUOhfcMAfeE9wwD98CFYAqF9wz3gfIKhVMd9/kEVh0O+xt29zD3DPd69wwS94T3DPsK9wwT8PfA9/JTHVj8jhUT6L0Gyvc+BfX7DPsMwQcOhfcMAcL3DM33DMz3DAP3B4VTHfdOFlYd900WVh0OhfcM+Oh3cR0T0Pel92EVwQaQ55bl5xr3ezX7ewcvljGQLx4T4Kb7Z2AK+yF2+Oj3DHEdE9D32/frFVUGhi+AMS8a+3vh93sH54DlhuceE+BwyAqF9wz4pN8Sy+Xg9wwk3fblE+z3lPdhFd0Gwp67va0e5smwwdAa9wkq3fsg+xApKvsVfx7lhQXilsPI3RvhxFtIih9JW3ZUXh5MVnRLQhoT9Lb7Z2AK+zbf+KT3DBKK5eH3DCjd8eUTrPeq9/sVOQZUeFtZaR4wTWZVRhr7Cew59yD3EO3s9xWXHjGRBTSAU045GzVSu86MH827oMK4HsrAosvUGhP0YMgK94XyCveFYAr3kNkB9yr3wAP3KveQFffA2fvABg73kdkB7/gkA+/3kRX4JNn8JAYO95HZAbP4nAOz95EV+JzZ/JwGDj3ZAdv4TAPbPRX4TNn8TAYO94vfkN8SkfjgE6D4OveLFc7OtM6xH1HFBVdnZG1kG2ximqpZHxNgqF1imWgbSEliSGQfxVEFwK+yqLIbqrR8bL0fE6BuubR9rhsOMfnwAfdR5AP4DTEV0wb7ePeci/fg93j3nAhDBvuP+5KL+/T3j/uSCA4x+fAB99bkA/crMRXTBveP95KL9/T7j/eSCEMG93j7nIv74Pt4+5wIDizZ983e983ZAfeX2wP4SiwVw9kG+wiIZKXQGucH5lrNQpkejAfSmb7M5RrnB9GypfcIhx7ZUwchQkQmHzgHKl5i+wuNHjgH9wuNuGIqGjgHJtRE9R4OLNn3zd73zdkB95nbA/c2LBX11NLwH94H7Li09wuJHt4H+wuJXrTsGt4H8ELSIR5TPQb3CI+ycUUaLwcxvkrSfR6KB0J9WkkwGi8HRmRx+wiOHj0HDjHZ+VTZAfc92wP4XjEV2ftl+VT3Zdn7tf3wBw4x2flU2QH389sD9yIxFfe1+fD7tT33Zf1U+2UGDvsG+jsB9z/3mwP39ssKDvsG+jsB9zr3mwP3ivsGFfdL+Gj7S/hnBTsG90v8Z/tL/GgFDkz6DAH3TfcfA/hfTBX7SPezi/fP90j3sgj7pv4MBg5M+gwB96j3HwP3IUwV96b6DPum4QoO+YDZAfc+3AP3Pvd/Fdz4lfdy2fvDBg4k2QH38dwD+EL4fBU6/JX7cj33wwYO+wb6OwHf+EID95/LCvfy/GjqHQ77Bvo7AeH4QgP34fsGFeYdNBbmHQ77Jvp4AfdE2wP4P/smFb/E+3P3XQX4dwf3cfdaV8T7jftzBfy3Bw77Jvp4Affs2wP3QfsmFfeP93YF+LcH+433c1dS93H7WgX8dwf7c/tdBQ73fbP4HbPbswH3PrPcsvOyA/c+930V9zT4Rfcj9zT7wwaz/L0V+JX3dDv7I/xFBw4ks9uz+B2zAfcTsvOy3LMD+EL4fhX7NPxF+yP7NPfDBmP4vRX8lft02/cj+EUHDkyz+byzAfdNs76yA/hWTBX7SPezi/fP90j3sgj7nf4MBvdXsxX7L/m89y8G+x/7oIv7o/cf+6EIDkyz+byzAfexsr6zA/cqTBX3nfoM+53hCtGzFfcf96GL96P7H/egCPcv/bwGDpUd94r3DAP3kWQKlR33MvcMufcMA/c5+zBJCvcLZAr4QfcMAfcw9wy59wwD+EfYCvsL9zAVWQZM+z4FIfcM9wxVBw745/cMAfcy9wy59wwD9zn4S0kK9wtkCvhB9wwB9333DAP37tgKDvjn9wwB94r3DAP3kfhLSQoO1/gkAdr4TgP309cV+z73XPc+91wFJAb7Hfs3BUEH9x37NwX3xRb7Pvdc9z73XAUkBvsd+zcFQQf3Hfs3BQ7X+CQB2vhOA/et18QK/Aj7XBXyBvcd9zcF1Qf7Hfc3BSQG9z77XAUO1/gkAfdb94QD+EvXFfs+91z3PvdcBSQG+x37NwVBB/cd+zcFDtf4JAH3NfeEA/c118QKDvladwH3P+Hh4QP37fgTFcgGoveLBdszB/sn+9sVyAaP99sFMzsGDoEK+BMVxwaZ948F1zM/Bw6K1vgS1fXVAf8BB4AA/wBQgAAD9yeKFeWKvbmV5K/31xj3UdX7SQaRvQWvj6Gfrxv3BdUhBjFZXjKBH4ZdBfsdQfcVBmf72wVnh3V4ZxsiQQYOi933gt33dd063RLl4dHW9wflT+UT3feKMBXW5gb3Jo3k1vcNGudQyimYHhPe15m+xtga9wRG0/sclB7rQCz7MP1a9zAHRd0V94LR+4IHRffUFfd20ft2BxPd1vvUFfeCB+qJvV5AGkRZYCyJHhPu99UE93QH2oSvYkoaS2djPIQeDiD3qNn4AncBp90DHAVbxh0c+jT4Ajn9Wt33nhwFygYO/Vcx2ffL3vfK2QH3ud34WNoD+WsxFfXU0vAf3AfsurT2iR7eByCJXLTsGtsH8ELSIR77bj33TQbrjbBxRxoyBzG+StJ9HooHQn1aSTAaMQdIZ3EqjB77TT0G+xoW+fA5/fAHDviBSAr3y934M93/AaOAAFYKE18cBR6CHfyJhwr8hYcKE6/6yPcIHSBsHfgX3fgr3QP4FzEV3fnwOQb4ff3wFd33h/i42fy49yP4uNn8uPfSOQYOIEgK98nd/wE/gABWChNe+VuCHfwlhwoTrvhz9wgd/VdsHffI3QP3yDEV3feH+LjZ/Lj3I/i42fy499I5Bg79V0gK/wCzgABWChNc90iCHROs2TcV+VX7o/1U+6MFDv1XbB33NfoCA/c1+AoV+gLZ/gIG+78E+gLZ/gIGDiD22dzZ3NoByRwGjAPJ+D0VHAaM2hz5dAb8IQQcBozZHPl0BtwEHAaM2Rz5dAYOIHgdHPprPRwF4lsdHPoePRwFlAYO/VfMCvrIE5j5l94d/dE9+h5bHf4ePfnQBg4gxB0cBVvDFVIK95j7mQUTMhz53vsiFRwEwQYTivsP+w/2jE4dEzL3B/sHBRz7Rj0cBQcGz0dPTwUc+vEGDiDTChwGX8IV9gb7mfeW95j3mwUhBvuY+5sFHPrj+x4VHATUBhOo9wv7DAX2BhNo+1n3WgUc+w8G9xQEHATvBhNY91r3VwUhBhNo+wv7CQUc+ywGDiCL92tYCvdjEskcBowTaMn3HRX5gQYTqFv7HQXdBhNou/cdBfnh2f3GBrj3FAX5mdn9fvMd/eM9+cgGX/sUBf2cBg79V/cMHfc9whX3cfdxBfmA2f2A1wr7mQUOIPeo2WWxErAcBsUToBwFe+cdHPsU1wr7mvaMBROg93H3cQUcBOwGDv1XcPjkAfeY+UUD95j3GRX5Rfc3BfUH/UX3NwU3B/jq+xj86vsZBfuHBPlF9zcF3Qf9Rfs2BQ4geB0c+04GE1j7DPcLBSEGE2j3WvtZBRwFG1sdHPrjBhOo+1n7WfaMBRNo9wr3CgUcBLMGDiD3qNlkshLJHAaME6D3rcEV9Yz3cvdxBfr92f79Bvty93IFIgYTYPeY+5kF/HT7mRVSCveY+5gFDiDTCvc9whX3mPeW+5j3mwUhBveY+5v7mfuWBRwGjPcMFdkc+w8HE6j7WftaBfYGE2j3C/cMBRwE1PdiFdkc+ywHE1j7C/cJBSEGE2j3WvtXBQ79V/eo2QHJ+sgD+EHBFftx93IF+jbZ/jjRCiD3qNkByRwGjAP4QcEV+3H3cgUcBfrZHPoE0Qog/wA2gAD/ASuAAD3ZPffAEskcBowTkBwFW8EV9oz3mPeYBRMw+5j3mQUhBhNQ93L7cgUc+pQGEzD3cvdyLB0FE5D3mPuY9ooFE1D7cfdyBRwFaAYOIPeo2WWxEqkcBsUToPghwRX7cvdyBRwE7Ab3cftx9ooFE2D7mfea9wAdHPsU1QoO+IHdHRwFUdkc+q+mHfrZ3R0cB6nZHPhXph39V0gK9zTZ/wLAgADZE1z6QoQd2cAVE6yCCiBICvd5Vgr/AT+AAN0TXvqHhB0cBO77whX5Wjn9Wgf+4vf3FROuggr4gUgK93pWCv8Bo4AA3fgz3RNf+oiEHRwFUvvCFflaOf1aB/jXFvlaOf1aBxz5Xff3FROvggogKAoBx9j/AtOAANn/AtSAANgD+nkW+Xv3wgX1B/1798IFNwf5Lvuj/S77owX7VjcV3wf9Lvej+S73owXfB/17+8IFIQf5tPvCFdkGjPlaBT0GDv1XcPjkAfeP+UUD+kD3GRXeB/zq9xn46vcYBd8H/UX7NwUhB/lF+9cV3gf9Rfc2BTkHDiDIHRwFlNkc+h4GS8vLywUcBeLZHPpryQr4gcL3WFgK91kSyRwI5BOo99bCFfYGE2j7CvcKBRwG8gYTmPsK+woF9gZOHRNo9wv7CwUc+QoGE1j3C/cLLB0FE2j1FsvLBRwHkFsdHPhwBg4geB0c+2LtHfaKBRNo+wv3CwUcBJwGHPrW9yIVy8sFHAU4Wx0c+sgGDiDIHRwEswYTqPcK+wr2igUTaPtZ91kFHPrjBkvLy8sFHAUbBhNY91r3WQUhBhNo+wz7CwUc+07JCv1XwPiUAfcl1vmM1gP47MAV+Fv3XwX1B/xb91/8W/tfBSEH1sAV+BD3PvgQ+z78EPs+BQ4g96jZAckcBowD+EHBFfuZ95n3mPeZLB33mPuYBRwFiPdxFdkc+t4H93P3ciwd95j7mPaK+3L3cgUOIMQd+EHDFfuZ95n3mPeZLB33mPuYBRMyHAWI9woV2Rz68QdPx8/PBRwFB9kc+0YGE4r3B/cHLB33mPuY9ooFEzL7D/cPBQ79V00d+mrfA/fP94QVntuF6MHJhPsIiwrLhPsI9wAb9wCr9wbbHzcGRHZeaB5OmPcI+wkjkvsITVCY9wj7BSKT+whMG2CM95j3mfcNHfWKBQ4gwveXPdmx2RL3QxwFqhOw+EfCFfYG+0v3SQWR74b3AskbE3BtHfcIycd9+wj3BfSD9wjKbR3iyRuzBpOD+5n7mAX1BveZ95j7mfeZBSIG90X7RgV7P49HV2kKT029ChsTsPsJmPsIThtIBoeM95n3mSwdBQ4gTR0cBfPfA/jEwRX7mfeZk5MFswbJhDSLCsqD+wj09wV99wjHyYT7CIsKy4T7CPcAG/cAq/cG2x83BkR2XmgeTpj3CPsJI5L7CE1QmPcI+wUik/sITU/3Dx1Xj8+bPx/3RfdG9w0dBQ4g+xV2+fB3Afd+HAU1A/kb+yoV4Qb3tfkI+Fr7Pfxb+z4FNQf4tvdfBfUH/JP3UtT3MgU0Bvua/M/8W/c++Fv3PgXhB/y2+18FIQf4lPtSBQ79V00d92PeA/ks94AV99/Z+98GUPcPHWh2uNIfOAY7qvsG9wAe9wV+9wjGyYT7CPMbDv1Xf8pNy+XZsdmZuV3C9x7UEviU2aDb9xrQ///IgAD/AECAANXTE7PQ+Wp/FbO0rr+fHxNzUJr7GvdZipX3vQj3c5Io9zH7PRv7NvsG+wf7OT1zZWUfTfAdGz0H84T3CMnHffsI9wUb6bnM9xX3Ddzh9wf3EtL7FPtMhR/7EIZ4VGgbdoKw2JEfE3swnfd6BUMGE3cwiGcFp39xnGkbQEw1+w9+HxOz0PsPfLo12xsTt9CfyhVjdMjjkx/klK3Jsxuzn00ygh8zg2tOZBsO/VeL2fcU2cnZs9kS9xHlON75m94T9vcY9+4VE/reBtDTvPAe90iy+wr3XRv3L/cC3PcHHzgGRj9aIR77SGP3CvtcGxP2+yohOvsHHxP6hPvuFfpK2f5KBvcUBPpK2f5KBg79V00d9xrfA/oJ94QV+077TvWM95n3mPuZ95kFIgb3mPuZYIoFTKMKG8GFLnjbHw79V/eA2T33Vj3ZEvdu3/jn3xO49273gBUTWN8GE7jSoLiuHsh++wj3CfOE9wjJxn77CPcFG/cAq/cG2x8TWDcGE7hEdl5oHmkKUEuS9wj7ABv7AGv7BjsfDiBNHfdV3wMcBNjBFfWM95n3mPuZ95kFIgb3RftGBXs/j0dXaQpPTaMKx337CPcF9IP3CMptHeLJG7MGk4MFDv1X2gqumh15mh0TRgC0fxXqBvhW+XYFLAYToMCuChNbAK0K+Er8WhXqBhOkDPhW+XYFLAaF/WoV27fX7Otf1zs6Xz8rKrc/3B/XBGt6rsnJnK2rqp5pTU14aGwfExgwqQqL9xD4B+QBk9n4P9oD9Bb4GgbDtLTDH/gaB8NitFMe/BoGU2JiUx/8GgdTtGLDHnj3EBX3afgH92r8BwUORdDdyk3L9765XcL3HtQSodS32vcd2P//voAA/wBBgADU1BPPoPhDbhVtzAVzYGF+ZBsiPun3S/c/1vdS9zjyz/sK+0AfE7eg+xZ0RGpzg7DYkR6d93oFE9dgQgYTz2CIZwWmgHCdaRsiWvssJii4Sc66r6y9nx8Tr2BVmKxvshvax/cJ9y33Zyn3J/sk+2gl+3X7Zvtx9wT7EPcgHxPPoL6/mKfBH/sx90EVaHa40MSi9xXIrZ5gSFt8+yJJHw5/2UnyOXb5Ft8SqeJ84fcv38HjE5v3rX8V0MmfsLMfEzuvXgXxBhNXNvIFsbql29saM5OPVIJLc2oZ+zj3ZdC2uMCcwBmt8TzmKpQIMpM1RyMaWKBSuU4eE5s3TFRnIRr7FvFF9yke2QQnS7rWzca2uKkf90H7bwVxdmB7WhsTl2D4CRVovHyyqxqKurCyu4gIt4imaV0aX2NdSm0eDqB2+Q7XAfex1tHVA/ex98YV+8bW+Q7R/Q7V+Vr7bwf7KS09+xD7EOk99ykfDvsB2/kK2xLs4zbj94XjNuMT1PfK+wEVE9jy87ztwHq2SqofE9TDoaiwvRrnWLT7LrEeKKVvnrQatLmoyNm8ZlCVHuGRBfcBfPsEyDUb+wQuVCVbqmjIcR8T6Elvbl5UGj/BY/cmaR7qc7BvYxpeW25EP1OzzIEeM4UFE9Qile5B9w0bjffTFRPkLZVqrLUatLmnyMPfdk0eE9RfW3BDHg5/0NTQ98/Q1dABj8/F0Pda0MjPA/e/fxX3QvcO9yz3bfdt+w73LPtC+0L7Dfss+237bfcN+yz3Qh/QBPsfM/cI90z3TeP3B/cf9x/k+wf7TftMMvsI+x8fktQV3NHI7ZcfRpAFTIJma1sbQ2jE7/CuxNO6r21Skx/QkAXogUPFPRshRTL7Hvse0TP1Hw7jCuu+873mwwP3wPdwFfcg9wT3Bvcg9x/7BPcF+yD7IPsE+wX7H/sg9wT7BvcgH8QEIDLk9wD25OP29uQzIPsAMjIgHyfFFb71tgbLIQXFBkT3BQWxlaGnsRrAYKtEHjAG7vsRFVvcuwavn31ycXd7Zx8O4wr3A77zvdfDA/fA93AV9yD3BPcG9yD3H/sE9wX7IPsg+wT7Bfsf+yD3BPsG9yAfxAQgMuT3APbk4/b25DMg+wAyMiAfNsUVvvW1BtOzqcC/X6xFHzAG7vsRFVvcuwauoH1ycXZ7aB8O+SLDAe7G9wTG91HGA/ga9/sVzgbI90gF+0jG9/NMBzD7pTL3pQVL+/PG90kG+3r7SRXG97vew/t0U90GDvga1Pcu1AH3KtX3LNUD98D4GhXdz8/d3UfPOTlHRzk5z0fdH9QEYWmutbWtrrW1rWhhYWloYR8O+C333gH3cvcwA/dy+C3sCvgt994B9yL30QP3IvgtFc0G5ffeBS4G7fve7Aox+fAB95fdA/eXMRXd+fA5Bg77FXb58JYd9/cV2ff3PQb98ATZ9/c9Bg5FHfdIdwH3mtkD95oW2fhc9y3V+y33SD37SPsvQfcvBg77FXb3ONb4A9X3SJYd+yoV2fc49y7W+y74A/cu1fsu90g9+0j7LkH3LvwD+y5A9y4GDovZytf3Vdf3dHcSkN/3LN+q10/3ZFDWE/6AkBbf+IgG9xH8iAX3A/laN/x/BvsN+H8F+wcGE/0A+AP9WhX3ZNn7ZAYT/oDzyhXQvs719VjNRkZYSSEhvkjQH9cEcnixxsaesKSlnmZQUHhlcR8O+1LZPfdSErHa+ALaE7Cx+1IV+KAGE3D3UjwHE7D7BPwCBxNw9wQ8Bw73ZLzqvK+86rwB2r73Xr0D9+DSFb33HfclvPsl6vcuvPtgBvuRJhW+9x33JLz7JOr3Lbz7YAYOi9D40NABmdD4RtADmRb40Pla/NAG0P0VFfjQ+Eb80Af7yPcfFebm5i/DwzDn5eVUwjExL+ZTU+cwMDAFDovQ+NDQAfif0AP3Mhb4Rvla/EYG+y77+QX3XfuwFfsR97H3EfezBffS/NAG+7P3HxXl5ucvwsMw5+XlVcIwMDDnU1PnMDAwBQ6L0PjQ0AGT0AP4Thb3Lvf1+y73+QX8Rv1aBvgX0BX70vjQ99IG9xH7swX7MPsmFcLCMebm5lPDMC8w5lVU5TEwL8JT5+cFDph291bZ19n3atkB94PKxtnX2QP3woMV91b3t/ig+3z7uFD3VAf7vvvIBfd/ZRUoB/sX9xz3F/cdBSn3XPe41/wEBw739LwB+Ca+A/ct98AVwQbw994FVgZA+5NA95MFVgb38vzDFb73req8+4Va6gYOf9tadvizdxLR49j/AEqAAP//7IAA1hO493swFdYGktoFjAb3CuHX9wqhHzORez1YY0qJGa34Gbp+rWaYVBnjkQUTdHjxTMoumpPmGEAGgzMF+xh+NyH7MRr7Hssq9GseOvefFfcAt9HYmx5q/A0FU6dry+YaDuzU95LUt3cB7tT3ktQD97/sFbWymKGrH9o9v7892gWgq5iytBq1frF1qx7a21e/OzwFoWtlmGEbYmR+dmsfPNlXV9k8BXVrfmRhGmGYZaFqHj09v1fZ2QV1rLF+tRvUBEVSxNHRxMTR0MVSRUVRUkYfDjD3NDffTHajdvlzd6B3Esvl9wTV9xXlE4eA954wFdUGEyuA1wf3F5Tj1vQa9wZRxvs1ux73hwfQe7BTlUPlkRh99wpE5PsNmwgTF4DdQToH+xJ/Pzz7ARoixFv3JWEe+5MHQ5xewn/iMYUYlvsU3y73EHkI+wT4sBXGtrbQlR77cgc0qHKkwxoTR4D3TvxfFfeBB/Rlo2hSGkxeZTeFHg573/c71dvV90ffAf8AMIAA5QOV+BkVsgaKaIxeBWRBuwb7MafjLfceG/ca6en3MKUfMJAF+wV3TlE5GzVUxvcAdR/3XQaW1QX7cgaKuIyuBfd7BpbVBft+BvcIn8TK4xvVxlYloh/nkQX3J20u4fsRG/shMij7OHEfXQYOf9/3N9Xb1dJ39xTfAbzl99LlA6H4GRX4wNVZBpeekqOgGvcOK9j7LPsGMUH7Cmwe6YIF1qvCtc0b4cdbSHGEd3l5H/wuBvej/G8V9xPt0PcCqx8pkwVMcExjQRszTrnNnJGdl5sf+DnV/MBBsgaDfId4ehr7B+869yQeDqB29w7V3933nt0B9wLh97DlA6z3DhXY+w7h9w7k1TLf9xb3AR37bPyWPgb3r/c6FfsM9573DAb3BL9cNTVXXPsEHw6gdveo3+rW699B1RKw+KAT9PflFvcNBvvD96gF1wb3IuTN9wWcH93WOgYT7IW1e69ypwj3FAYT9NX8oDf3Vgfnv2tLmR/79ED38wZMfFdrMRv7VjcGDove+LTeAZ/i0uHS4dLiA/dGFvePBufFxecf+MQ0/MkHZXRzZR77O/hsNQb7Mvy/FeL5B/c7BrCjc2Uf/C7h+CkH51HFMB77kAYOi+L3etX3j98S9wfkYt8394kT6LviFTQH+IWOBd/8OQfqtrHngeoIE+T3NdUGE/D7RQZ6wIGzqhrVx8DNxr1qU50e7pIF3nxD3vsjG/sJLTb7BGmTZZpdH5F3BSpBBhPo9wYGjWQFN2RNP14eDqB29yPZzdn37XcB95bhA/eWFuH3I/c42fs4zfc42fsSBvdC9+3ACvdE++0F+xI99zhJ+zg99zgGDvee2fdblh3OFdn3W/db2ftb91s9+1v7Wz33WwYO97PZAcn4cOgKDt/4GwH3EvgcA/cS9x8VwlT3Ifch9yH7IcLC+yH3Ifch9yBUwvsh+yH7IfchVFT3IfsgBQ7f9wze2ef3DAH3hPcM6Ar3gvutUx34CQRWHQ5sHdv4TAPb+AplHfct2fcj2T33RxLb+EwT0PdMthXYBq33AgX3ddn7XQa29yMF9zLZ+xoGE7Cq8AU+BhPQbCYF+3k992EGYPsjBfs2PfceBg7A+JQB+FnWA9TAFfhb918F9Qf8W/dfBTUH+BD7PvwQ+z4FDsD4lAHT1gP4o8AV4Qf8EPc++BD3PgXhB/xb+18FIQcOi9kByfhwA8n3SRX4cPcYBfUH/HD3GAU5B/gbJPwbIwX7mgT4cNn8cAYOi9kByfhwA/iu90kV3Af8G/P4G/IF3Qf8cPsYBSEH+HD7zRXZ/HA9Bw6v2fdt2T33ZRL3mdkT0MmvFfhw2fxwBvdtBPdb+xfZ9xf3W9n7WwYTsPcXPQcT0PsX+1sHDt7VQfdG+zz3RUHVq9VB90X7PPdGQdUS2tn3stkTmcD4G/fCFdu91fIfE5TAPQYTmcBNemJlZ3qop3Uep3Rwp1UbPFhBIx8TksDZBhOZwMqctLGsnHJxnx5to6ZrxRv7bwTbvdbyHxNJwD0GE5nATXphZWF7sqxuHqF3cZ5dGzxYQSQfEynA2QYTmcDKnLOxqZx2cZ8ebKOlaMkbDveA2T33Vj3ZEtne96neE1jZ94AV3gYTuNKguK4eyH77CPcJGxNY9wCq9wbbHzgGE7hEdl5oHkuS9wj7ABsTWPsAbPsGOx8O957ZAfgn2QP4J+oV2feN/Bs9980GDvkK24t3EvcH+AYTYPcH9+EV3wYToPD3vfD7vQXfBvsY+A0FIQYO9wfX9zPXQNcSktf4RdcTuPcr9wcVwcmvy6wfSazLacEb3MfR4R8T2OFP0TqKHlJPZ0xpHxO4yGpPslMbOE5FNTXIRd4f1wRjb6y6uqessx+zirpqpV0IXHFcamMb98AWY4pbrG+7CBPYqLq6rLOKCLGKpmpeGhO4XXBqZYoeDvsq1vla1gH3AvgPA/cw+yoV5om9upXkzfjoGI+voaGvibqJGJLWXYwwjVlcgTIZSvzoh2d1dmeMGVuNhEAFDovZ+MXSi3cSmsv4TssTuJoW+M73Ewb7efjbBfsEBvt5/NsFy1oVE9j3cfjF93H8xQUO+xV2+aLZEpz3Uj3Z91LZPfdOE9j3FfsqFdn5ovdS/aLZ+aIGE+T3ANn8yj0GE9j3BAYOi9/4st8B0fhwA9EW+HDf/A0G90n3o/tJ96MF+A3f/HA3BvdK+6P7SvujBQ77FXb5ptUBnPjLA/cK+yoV7wb3LPmmBfdq1futBvsc/VlG9+MFOgYOf9hTdvgq2xKz5PfQ6jrcE3T3nn8VxYXBnr+29y/3HLn4pPxHuHc+GPdDe/X7DI37RG7LUrJDkvsmmCU1fvssfvsi6CD3Jn8IE7iK2BUxlVLNlvCS7M/K5YPYhchdmD6C+xFAOCuTCA77FXb3HtVidvimdxLq3/eK4DrcE9zq+yoV3/ddBmSctXO9GxPaycGxyaQfE7ozBxO83PimNvvQBhPcLldQNkJnvvAe99A3Bw7aCpiaHRNXwJ5/FeoG+Fb5dgUsBhO7wK4KE5vAqQqL0E9295TR3tD3Q9GadxKYz+XPg8/lvuXOE0YAj38V4wb4Dfl2BTMGE7LgYP1qFaylnKmcH22cpXqsG86z0OLjY9FIanF6bXofqXpxnGobSGNFMzSzRs4fkNAVb3uqw8SbqqeonGxSU3psbh/3IRZufKrDxJqqqKedbFJTeWxvH/v799wVExsA1bPQ4+Jj0UFDY0U0HxOy4DOzRtMeExsA0ARve6vDxJupp6icbVJTemtuHw7wCvfRFfUH+6P3o/uj+6IFIQf3fPd8Bfyo2fimBw75D9YB/wHGgAD/AEuAAAP4W/ePFdbWBfgU/BMHQEAF99wG/Az8DMJU+Av4CwUO96jZAZz41AP3ducd/EM9+EMGDov/AEuAAAH4aNYD39YV1kAF+BT4EwZA1gX73Af8DPgMVFT4C/wLBQ7wCvgfFft8+3sF+KY9/KgH+3z3fAUhB/ej+6L3o/ejBQ6L/wBLgAABxNYD+JjWFfvcjPgL+AtUwvwM/AwF99wHQEAF/BP4FAcO96jZAZL41AP4CsEV+3L3cgX4Q9n8Q9UKDvkP1gHR/wBLgAAD9yX3jxWM99z4C/wLwsL8DPgMBffcBkDWBfwT/BQGDvdH91892T33XRKN+OgTkPc590cV9AYTUPsP9xEF98YGE5D7D/sRBfQG9zf3OAUTMPs29zYFIgYTUPcO+w8F+8YGEzD3DvcPBSIG+zb7NgUOl3YS9xT3aD3ZPfdmE6D3wYIVE5D3P/c/BfUHE6D7GPsYBfiOBxOQ9xj7GAX1B/s/9z8FE8D7QftABSEHE6D3GvcZBfyOBxPA+xr3GQUhBw73Ptj3GtcBnfjFA/e2900Vz2TbssHl4lgYdfeB+2oo3FtsVmlxa50ZbpuIqoithrKEtFipPLj7BkJ5IQjeBp7Es6aseKx4iGaSZJBol2i2cggO96fZAZ/ZA/fS9y0V9w73mtn7m/cOB/tV+zUFI/tXFdn4Gj0GDven2QH4itkD9673LRXpHfubPfeaB/e++zAV+Bo9/BoHDvcYHfiM2hOw9//3ihX3D+zm9wr3Cirn+w8f+7s997sG2slRQUJNUTwf+14GE3D3FPcTBSAG+zn7Ovc7+zsF9QYTsPsT9xQFDvcYHZzaE7D3gfeKFfdcBvsT+xQF9Qb3O/c7BRNw+zn3OgUgBhOw9xT7EwX7XgY8TcXU1cnF2h/3u9n7uwb7Dyov+wr7Cuww9w8fDqB2+CrZAfiA2QP4gBbZ+Hj7+/cOBvtV+zX3Vvs1BfcO96wHDqB2+CrZAanZA/cAFvgq96z7Dgf3Vvc1+1X3NQX7Dvv7/HgHDvd22fgqdwGp2QP3APlaFT38ePf7+w4G91X3NftW9zUF+w77rAcOoHb5C9kB+BvaA/hCFvc191UF+w34mPxcPfgN/En7DQYO93bZ+Cp3AfiA2QP4gPlaFfwq+6z3Dgf7Vvs191X7NQX3Dvf7+HgHDovZ99LG95J3Afci2fc22QON+CAV9yD8IPfS+CD3Hgb7vffNBfsd+5IV9x33Jvcc+yYFVPwN+zb4DQYO9xUd+IgV+zX3Vvs1+1UF9w78d9n4dgYO+Vp3AbH4jgP4nfhfFaL3j/uOdOE1++r76sJU9+r36gUO98/ZAZz40QP4IPdVFekd/BA9+A8HDqF2AbD4jgP3uKMV9490dPeONTX76vfqVFT36vvqBQ73FR33aBX7Dvh2Pfx3+w4G9zX7VQUOoXYBxPiOA/fIoxU04ffq9+pUwvvq++o14XT7jgUO98/ZAZX40QP3YPdVFfcO+A/Z/BD3Dgf7Vfs1BQ75WncBw/iOA9r4XxXh4vfq++rCwvvq9+rh4fuOogUO98PZAZP43AP3XfdJFfcO91r7Dgf3Vfc1+1b3NQX7DvtY9w4H+1b7NQUOlXYB95nZA/fAgBX3NfdVBfsO+DD3Dgb7NfdV+zX7VgX3Dvwu+w4GDtr4wAGb+M0D98HaFfc09xD3CPc19zf7EPcI+zT7NfsQ+wj7N/s19xD7CPc1Hw7a1vgq1gGb2fgx2QP3wdoV9zT3EPcJ9zT3NvsQ9wn7NPs1+xD7Cfs2+zT3EPsJ9zUf1gT7CTHf9wr3DOXf9wn3COU3+wz7CjE3+wgfDs3G+Ch33sYBjcX4c8UD+Gr3UxW0YJqamp2WnRlaqoJ9gH5+fxn73DgVqb58k3yWf5YZY2KafJ19noAZNdkVuq6BmIOahJwZVXWUdpV4mHkZ91b7CBWUxXqNeZB8kBl2VZ+EoIWgiBn7hfdzFcSXBYeciZydGlEGdI12kHce97b7PBVQB6Ghjo+fH4DDBYh7eIp5G/u5968VxYKOnI+ckpsZVKCDeIZ2h3UZ+Bb7nxWgVZ+TnpSdlxlrvH2BfIR6hBn77fgMFbxslJmWmJeXGWO1e3x+e394GdzeFatampWak5uRGXfBdoN4gnl/Gfge++EVwXWTn5Cgj6EZUpSIeoZ5hXwZ+7P4DRWWUgWOnJ2NnRuKxnWKdol3hxn3xPuxFcUGoYmghqAeUn8Fj3qNeXoa+yf3bRWfwXeTd5F1jhmCUZyInYebhRn3FvsSFcChg6CAnoCcGVppln2TfJJ7GVfYFbS1e5p5mHmWGW1ZmoKZgZd/GQ6LzviSzgHa+E0D94wW8gb3PffW+z331gUkBvs9+9YF4Rb3G/eT9xr7k/sa+5MFDqB2AZP42wOTFvjbBvu4+I0FDs342wFV+I0DVfkdFfzbB/iN97gFDvladwGT+NsDk/la9xQdDs342wH3KfiNA/ki9wodDu3VAZP42wOT7RX42wb7uPiNBfs4/EMV9zj3sfc5+7EFDs342wG31QO3+R0V/NsH+I33uAX8Q/c4Ffex+zj7sfs5BQ74ttUBk/jbA5P5APcUHfxcQRX33Qb7OfuxBQ7N+NsB+HbVA/jA9wodQfhcFfvdB/ux9zkFDtAK++sGDvfT4QFj+RQDY/fTFfkU4f0UBg730+EtHfeV99MV9+vh+5X48jUGDvuLHATrLR33lfuLFeEcBOs1Bg7QCvuV+PM1Bg4c+I3478kB9zT3rAP3wPjvKB0c+I34+e0B9zTj8+MD9zT4+SoKHPiN0goc+I3BChz4jXsKHPiN+O73FAH3KvfAA/cq+O5GChz4jfho94YB94j3BQP3iPhoWB0c+I3CHRz4jfjp9xkB9zT3rAP3NPluIQoc+I3478kB9zT3rAP3wPjvKB0c+I343r3fvQH3ZL3fvQP3wPjeRx0c+I349iQK9yImHROw9/z49iYKE3AlChOwIx0c+I3iHRz4jfjl5QH3hO8D9/z5meUKHPiN+xDlAfeY7wP3hPtqVAoc+I37EOUB95jvA/eE+2pUChz4jZgKHPiNnQoc+I33jNUB7/gkA+/3jBX4JNX8JAYOHPiN+PL3BAH3MC0KA/do+PIpChz4jfjt9wAB94r3AAP3wPjtKwr4+e0B9zTj8+MD9zT4+SoK0grBCnsK+O73FAH3KvfAA/cq+O5GCsId+On3GQH3NPesA/c0+W4hCvjvyQH3NPesA/fA+O8oHfjevd+9Afdkvd+9A/fA+N5HHfj2JAr3IiYdE7D3/Pj2JgoTcCUKE7AjHeIdmAqdCvjy9wQB9zAtCgP3aPjyKQr47fcAAfeK9wAD98D47SsK+Of3DAH3hfcMA/eM+EtJCg57CoEK+D8VxwaZ92MF1zM/Bw57+XoBmvjPAzEKDnvV+OfUAZrV+DzUAy4dDnub+KaX9zybBvs2lwceoDf/DAmLDAvfCuUL248MDN+RDA347BQcB3MVthMA1gIAAQAHAAoAEAAWABsAIAA2ADkAPwBCAEUASABRAFcAYgBqAHEAdwB9AJYAoACmAMUAzQDkAPEA/gEJAR0BIQEpAWIBcAF4AYMBiwGRAacBrgGyAb0BzAHUAdoB4gHoAgMCDgIYAiICJwIzAjYCPwJHAk4CVQJcAmICZgJpAnQCeAKVApgCnwKwArYCuwLNAtEC1QLhAuwC9wMBAwoDEwMeAyUDLgM1AzsDWANgA2gDcAOVA6wD0APUA90D4QPrA/ID/wQCBA0EFgQgBCkEMgQ7BEQESwRTBFsEYwRnBH8EmAT7BS0FOQVCBZIFowW7BcIF3wX9BhcGKwY4BlAGcQauBsUG/AcdBzsHXgdpB4MHtQe6B8cHygfUB+kIEwg9CGYIfAiECJYIngiiCKwIzwjiCOoI9gkWCTQJUglvCXcJiAmaCakJsQm5CcEJ2AnvCgYKHQoyCjYKTApRCmIKbQp5CoMKlAqhCrAKvwrQCt0K5Qr2CwcLFwsnCzcLPgtNC1wLawtyC4ALjgucC6cLswvAC80L2QvlC+kL9Qv/DAcMDwwaDCUMMAw7DEYMUQxc9xlgthILtgoOe9/40t8Lf9v4HtsLwY3BEgvmCt8KCxXEsLfXjx9XBlmHfntyG3t+kpx2HwtwHQ6gdvladwuAHQ7CCg4VzR1/2/c/1fcp2wv3BMz3BAugdvda3ff02Yt3C3/VYnb4YtsL5cm4vKMfC/fBe7UKC5Ed44MKC5zbFfsCYOvw9Lbr9wL3AbcpJChfKfsBHwt/20fP+CLLS9cLUmxrUR4LvAqJ96IVMFPP9wH3AcHP6OfIR/sBiR/7AYpQRzAbCy/bV/Ee3B0L2xb4TN37Rfi290Xd/Ew590X8tvtFBgv7Ntvqdq/b9/bbf3cL9737NhX3JuLV9xAfC40wBdv3+vuOOQYLpAa3rWtkZ2tuYmFopauIH06IBQsWQwoLf9Vidvimdwuc3BXhBtGaq8GuHuHDsbffGvcLM+D7FvsmMS37GH8e5YUF65W8v+4b3LpYRk99cz1bH0Zgb1krGgv3wHsV9yrl8fc2H9QdC9sW+HRcHQYL9757FeHBtcytHwv3DPcM+wwGC9f4pjcGCyxYUjg/Z7ryHvfSN/vpB/sSz0D0HgtCHdX7FCAd00IdDovfTHb5Bt+LdxILFb0Gyvc+BfX7DPsMwQcL2/imN/vQBgtfB+6MBQ735/haFdkGC4vV+MbVCwPdFvhI1fvsBvfk+AgF3/w2QffaB/vk/AgFC5sdsauVm5se6x0L9x/3lAU9BlQdC0wK9x/3lAU9Bgv2jE4dC4v3Bi52+Oj3Bot3CxVmCsvpBeEnMa0HDtn/AsCAANkLQk1pQm8fCz3Z9xTZPQv7FXb3KtUL//+ygAAL45oKC54KDrsKcm9vZh9yUgYLwB0FC+sW3/fRBu3FwN3bq1YpHvvR3/fpB/cEUuT7DR4LUx0OAeXhAzcdC+kW8wb3dfgeBfwe3/imKAcL9wMd+xYL+zBJCg7X+wEHSWBqRnkfhfEF+2RBBgvDBlUKFWcdC/zoB/uS+OgF+wwGC02S9wgj+wWY+wgL5Rb4GtX7PPeKBgv7evwmBfgmNwcLi/cUIHb4pncLyl/K9wrKX8oL9wwB94T3DAP3hAv7KtX4qNULyFzI9xLIW8oLyvcgzlLEC/imBS8GC/fBexX3N/L3FPdfH7f7njf3Qwf7E4xHO/sApgoLIgrD9xSsHQsB0eH3rqodCysd5/cUux0LA8cW4fewBsvP94j79AX1Bvu2+DD3ove+BSEG+7T7zgX3zjUHCyId3u0S97HjO98T6EEKE/D3YfivJR0OIWL7BfsKKrY06B+MxBVhbq68jB+7jKqtshu4o2lbWnFoXx8OuwofC/MK93D47kIdDv4wVAr7WvuaBVn3UAcLxBL3M20KC/sCxBX3AvcmBfsmBwvxCg75WncB95TjA/eiC/lV96OK/LIFDgb7bPlaBfsIBgsSx+P3vt872wugdve03feW3Qtyb29mHnJSBgv9WhXd+Vo5BgtzXwbujAUOi/cM+J7fEgv3BBL3L/cEC/P3BX73CMYLA5kKCzAdx/cUEsHj95bfE7wpHRN8Mh0TvDQdCywK0O0SzeOX4/PjjecT/UAdE/b7rve+KgqL3feC3fd23RLl4feY5U/lE/TlFvd1Bvcq5tb3D+dQyimYHxP415m+xtga9ww71fswHvtcBhP093b9CBX7IPeC9yAG7b9dP0NXXykfE/h199QV+wr3dvcKBu23YUNEX2IpHw7VaQd1gZOjH/dwB/caQd37FPsMPUcndx7khAXIm7Kt1RvXtV8xH/tGZwX7CHRXXDEaCyMKAenh95LhA3UdDpUK+wTRFVcdDovd94DV94DdAfcV4fe85QOB99IV9x/70vc8BvdM9wz3Evd493j7DPcU+0wf+zz70vsfBvfC+8oVPveA6tUs94DYBvce3C37SPtIOi/7Hh8O18XB4t9VwkYfE/R9HRPseQrGCk8dZvtcBfsRBk8dih1m+1kF0wbWCgsjCgHRWwoO+xDlrfcGHfPv3+ETr9EW4QYTt2QdE89oCvc+fApEHcV2Evf1whf3ymkdrbBglVZRfB0TeGJlBRP4WR33wnsV9xrp6fcwpR8wkAV+Hft36fsj9z4fCwP3zn8V9xcdBcMd+zzr+wH3KB8LPx3n9xQBwfiEA0EdCyId0vcAEveo9wAw3xPoQQoT8PeO+KMrCvtmz/c3dgH3aNcD98L7ZhWxq5Wbmx+MHUaVa2MFmx0eDhX3nMT7UwaMpaeosKSnnRjIsqy7uhrNWrlFQVdaPoIex4gFupSkpLQbq6V0a25+dGZzH2t2BShKeEpNGgskHd7tEvc045ThlOMT6DgKE/zb+VsqCqB2+Of3B4t3Esfh98jhE7j3mtsV1wYT2PcI+JcF/Ofh+Vr7Fgf7AvyC+wL4ggX7Fv1a4fjnBg6gdvimdwHB+IADwRbvBvcn92r3J/tqBe0G+1X3osUKBQ4oCgG9+IgDvRbtBvcr97f3K/u3Be8G+1j3+OEdBQ69CvsJmPsIThtodrjSHzcGO6v7BvcAHvcAhPcIy20d9wjJC4vj+E535/cUvR0LrOQVwgaR0ZT3Ddsa93o1+3oHO5X7DZFFHg4b+w5G9xn3Lfcuz/ca9w/dzE81oh/lkQX3Fmwo6fsWG/s6+wf7Oftj+2L3CPs49zkfC00KsAoLKArn9xQB95bhA0kdC60KDigKAfeW4QNJHQ4S0eH3tOETXtEW4QYTbmQdE55oCgt/FeS2uPcJpB82kgVLfndyZBtZbMj3AoYf940GirEF90WFVuMkG1JfcQv72ve2Fdy31+vsX9c6O18/Kiu3P9sf1wRsea3JyZ2uqqudaE1NeWlrHwuF/WoV27fX7Otf1zs6Xz8rKrc/3B/XBGt6rsnJnK2rqp5pTU14aGwfC7KqnKafHz+Cal1bG210mqeBH1CFBQsB97nfA88dC6B299Dd98x3Ac/h97jhA8oKDgH3+N8D0x0LA8wdCyQd0/cULR04CgsV+0T7Avcj93j3ePcC9yP3RPdD9wL7I/t4+3j7Avsj+0MfCxXo+xkF6Qbo9xkFRQZFMUXlBQtUHROAkIUdC/s+4iD3IB6Q298dCzf7IQYuT1ErRF3F5x73Ijf7Igf7Idky9w/Sx7PGpB4L+CUW9zPV+zMGYnmeth/40vuaQfdG/IgHNL5a5x4LtpiisbAaxVa5RkxUYVWDHsiHBaKOpp+uG6yncWwL0Mevw6UfNQc9VmUrOWepvXseM4UFLqHhTvcGGwvwHU2S9wgjC/eo2QHJHAaMAxwFW8EVUgoLgQr4DhXHBpn3WAX3HDP7HAcOBSkG+zL71Psy99QFKQYL8wr3yvjuJx0lHfdUKSUdC0QKE5yA9R0LFfIG9x33NwXVB/sd9zcFJAb3PvtcBQv3TPeYBScG+xz7XPsf91wFKQb3TfuWC7D3WQXjBpfRBTQGq/dBBd4Gl9EFOQYL95n3nQX7Cgb7jfuWBfeWNfym4feWBwv3ZxVqcHBqaqZwrKympqyscKZqHw7tHQUOzxbh99D3uPvQ4flaNfvM+7j3zDUGC/sG6h0L/wA2gAD/AMSAAFgK91kSyQvX+Vo3+5L3BB0fCxXbyLjUvG6xXJ8fC4v3Bh33tOETXAv30+EtHfeV+4sV4fjK95XhCwb3cvdyLB33mPuYBQ74+e0B95TjA/eU+PklHQ7C91pYCvdXEskcBowTaAs3/Fz7CfhcNvxc+wn4XDcGDgb3cfdyLB33mPuYBQuw91kF9xEGCwb7cfdyBSEGE2D3mPuY+5kL+VUVWQZM+z4FIfcM9wxVBwsB7+ED7xbh+Qb4At/8WAYLi9dIdvet16DX91XXmncSC/dn1ftn9yA3+yD7Q0H3Qwv3lRbh6woL4RP6+If7KhXh93AGE/wLBTEG+zD8Qfsw+EEFMQYLvwa7jZ2aoxuflIR4oh8L9xEd95DfCwb3SPuyi/vP+0j7swgLi/cOPdnW0fdB0fdcdwv3cMT3OLbct8fEAbvDC3fr9wQB9y8tCgMLFVMGSy0FNe/laQcOnnR2mGsbVWNjPokfC9X4ENdB1RL3eNRC3wsDyfezFfhw2fxwBgsGY/wKBVyGd3JqGwvvCuUL+Qj3bd38nDn3bQYLFc0G5ffeBS4GDvsm0fsX9y4L9zzp9xn3gQv7Kvd0QdX4XHcSC535OAH3mdkD+M8L0xXRBkn3FAUtBgv3DAH3hPcMA/fAC/ju9xQB93D3NAML6/cA9z33PSv3AAt38u0B9zTj8+MDCwAAAAEAAgAOAAAAAAAAAcIAAgBIAAIADAABAA8AIgABACUAKwABAC0ALQABAC8AQwABAEUAUwABAFcAYQABAGMAcgABAHQAeAABAHoAgwABAIUAqQABAKsAswABALUAvwABAMEA8QABAPYA/wABAQEBEAABARIBFgABARgBIQABASMBUAABAVMBUwABAVYBWQABAVsBXQABAWABYwABAWYBZwABAWoBbQABAXoBfwABAYIBggABAYYBhgABAYkBjAABAZABkAABAZIBlQABAZgBmwABAZ0BnwABAaIBpgABAaoBqgABAa0BrQABAa8BsAABAb0BvQABAcABwwABAcUBxQABAckByQABAcwBzAABAdIB1wABAd4B4gAEAeQB5QAEAf0CBgACAhwCMwACAjQCNAAEAjYCNgAEAjkCOQAEAjsCOwAEAkECQgAEAkUCTAABAk0CTQAEAlACUAAEAlICUgAEAlQCVQAEAmYCawABAnQCpAACAqYCpgAEAq0CrgABArECsQAEArUCtQACAr0CwAABAsYCxgABAsoCygABAssCywAEAs0CzgAEAtMC0wAEAt4C3gAEAwEDAQABAxADJAADAAEAAwAAABAAAAAgAAAAKgACAAIDEQMVAAADFwMdAAUAAgABAx4DIQAAAAIAAwMQAxUAAAMXAx0ABgMjAyQADQAAAAEAAAAKAGoAmgACREZMVAAObGF0bgASAEgAAAA6AAlBWkUgAERDUlQgAERLQVogAERNQUggAERNT0wgAEROTEQgAERST00gAERUQVQgAERUUksgAEQAAP//AAIAAQACAAD//wACAAAAAgADbWFyawAUbWFyawAUbWttawAoAAAACAAAAAEAAgADAAQABQAGAAcAAAACAAgACQAKABYBEgMAAx4DdAuMDFwOLA7kDzgABAAAAAEACAABA2oADAACA/wANAACAAYCRQJMAAACZgJrAAgCrQKuAA4CvQLAABACxgLGABQCygLKABUAFg94AAAPeAAAD3gAAA9yAAAAWgBgAGYAAABsAHIPeAAAAHgAAAB+AAAAAACEAIoAAACQAJYAnAAAAKIAAA94AAAK4ArmAKgAAAmuCkQArgC0CsIOygC6AAAAAQBiAhIAAQEtABIAAQEiAhIAAQC5AhIAAQD0ACIAAQEd/6kAAQEr/6kAAQEtAnwAAQErAfwAAQEaAhIAAQE6AnwAAQEkAhIAAQF9AhIAAQEdAhIAAQE4AsYAAQFFAAAAAQBTAhIABAAAAAEACAABAm4ADAACAwAAkgABAEEBUwFWAVcBWAFZAVsBXAFdAWABYQFiAWMBZgFnAWoBawFsAW0BegF7AXwBfQF+AX8BggGGAYkBigGLAYwBkAGSAZMBlAGVAZgBmQGaAZsBnQGeAZ8BogGjAaQBpQGmAaoBrQGvAbABvQHAAcEBwgHDAcUByQHMAdIB0wHUAdUB1gHXAEEJaAAAAQwAAAEGAAABDAAAAQwAAAhgCGYHvghmCGAIZgloDXAJaA1wARIAAAEYAAAJaAAACWgNcAhUCFoJaA1wATYAAAE2AAAJbg1wCWgNcAloDXAJaA1wCWgNcAfWAAABHgEkCWgNcAEqAAABMAAACWgNcAluCXQJaA1wCWgNcAloDXABNgAACXoJgAFCAAABPAAAAUIAAAFCAAAJkgmYCJYJmAmSCZgOGAAADhgAAAlEAAAOGAAACUQAAA4eDXAJhgmMCbwAAAm8AAAJIAkaCLoAAAmqAAAIwAAACK4AAAFIAU4OHg1wDh4AAAiuAAAJaA1wCJwIog4YAAAOHg1wCbwAAAABAUYDjgABAUYCxgABASYCxgABASYDjgABATYCxgABATYAAAABARwCxgABAR0CxgABATACxgABAU8C2gABAU8CEgABAVACEgABATgAAAAEAAAAAQAIAAEImAAMAAEI2AASAAEAAQFrAAEJGAAEAAAAAQAIAAEJSgAMAAEJwAAuAAEADwFTAVsBXAFdAX0BfgGQAZUBnQGeAZ8BwAHBAdMB1AAPCpAKlgqWCpYKnAqcCpwKtAq6CroKugrACsAKnAquAAQAAAABAAgAAQAMACIAAgCeAOwAAgADAxADFQAAAxcDIQAGAyMDJAARAAIAFAACAAwAAAAPACIACwAlACsAHwAtAC0AJgAvAEMAJwBFAFMAPABXAGEASwBjAHIAVgB0AHgAZgB6AIMAawCFAKkAdQCrALMAmgC1AL8AowDBAPEArgD2AP8A3wEBARAA6QESARYA+QEYASEA/gEjAVABCAMBAwEBNgATAAALsAAAC7AAAAuqAAALkgAAC5gAAAueAAALqgAAC7AAAAuwAAALsAAAC7AAAAuqAAALpAABCwIAAQsCAAELCAABCw4AAAuqAAALsAE3BqwAAAamAAAGrAAABqwAAAasAAAGrAAABqYAAAasAAAGrAAABqwAAAasAAAFmAWeBN4FngWYBZ4FmAWeBZgFngTkBZ4FsATqBbAE6gTwBPYE8AT2BaQFqgUCBaoFpAWqBaQFqgWkBaoE/AWqBQIFqgWkBaoFpAWqBaQFqgayBrgGsga4BrIGuAayBrgGsgUIBQ4GuAayBrgGrAAABqwAAAasCrQGpgq0BqwKtAasCrQFaAq0BqYKtAasCrQGrAq0BqwKtAUaAAAFFAAABRoAAAUmBSAFJgUgBSYFLAXyBW4FMgVuBfIFbgXyBTgFPgVEBqwKtAamCrQGrAq0BqwKygasCrQGrAq0BqwKtAamCrQGrAq0BqwKtAamCrQGpgq0BqwKtAasCrQGrAq0BqwKtAVWBVAFSgVQBVYFUAVWBVwGsgq0BWIKtAayCrQGsgq0BrIKtAayCsoGrAq0BqwKtAasCrQGrAq0BqwKygasCrQGpgq0BqwKtAasCrQGrAq0BqYKtAamCrQGrAq0BqwKtAasCrQGrAq0BqwKtAamCrQGrAq0BqwKtAamCrQGrAq0BqYKtAasCrQGrAq0BqYKtAasCrQGrAq0BqYKtAasCrQFaAq0BfIFbgasCrQFgAV6BXQFegWABXoFgAWGBbAHBgWwBwYFsAcGBbAFjAWSBwYFsAcGBqwAAAWYBZ4FpAWqBaQFqgayBrgGrAq0BqwKtAasCrQGrAq0BqwKtAasCrQGrAq0BbAHBga+BsQFtgbEBr4GxAa+BsQGvgbEBr4GxAW2BsQGvgbEBr4GxAa+BsQGvgbEBbwFwgbKBtAFyAbQBsoG0AbKBtAGygbQBc4G0AtiCrQLYgq0C2IKtAbWBtwF2gbcBtYG3AbWBtwG1gbcBdQG3AXaBtwG1gbcBtYG3AbWBtwF4AXmBuIAAAbiAAAG4gAABuIAAAbiAAAF7AAABuIAAAbiAAAF8gAABfIAAAXyAAAF/gAABu4AAAX4AAAG7gAABu4AAAX+AAAF+AAABu4AAAX+AAAG7gAABgQAAAb0AAAGCgAABvQAAAYQBtwGEAbcBhAGFgasCrQGpgq0BqwKtAasCsoGHAYiBigGLgaOBpQGNAaUBo4GlAaOBjoGjgaUBo4GlAtiCrQGggq0C2IKtAtiCrQGggq0BoIKtAtiCrQLYgq0C2IKtAZMBkYGQAZGBkwGRgZMBlIGZAZeBlgGXgZkBl4GZAZeBmQGXgZkBmoG4gZwBuIGcAbiBnAG4gZwBuIGdgpMBvoGfAb6CkwG+gpMBvoKTAb6BnwG+gZ8BvoKTAb6CkwG+gpMBvoKTAb6C2IKtAaCCrQLYgq0C2IKtAaCCrQHAAAABpoAAAcAAAAHAAAABpoAAAcAAAALXAcGBogHBgtcBwYLcgcGBqwKtAaOBpQHAAcGBpoHBgcABwYHAAcGBwAHBgcABwYGmgcGBwAHBgcABwYHAAcGBwAHBgcMBxIGoAcSBwwHEgcMBxIHDAcSBwwHEgagBxIHDAcSBwwHEgcMBxIHDAcSBqwKtAamCrQGrAq0BqwKygayBrgGvgbEBsoG0AbWBtwG1gbcBuIAAAboAAAG7gAABu4AAAbuAAAG9AAAC2IKtApMBvoLYgq0BwAAAAtcBwYHAAcGBwwHEgcYBx4AAQEuA44AAQEtA3sAAQEzAAAAAQFUAsYAAQFaAAAAAQE9A3wAAQE+A48AAQEr/yIAAQEqA3sAAQHRA44AAQHRAsYAAQEcAAAAAQEVAsYAAQEc/yIAAQCPA44AAQFB/yIAAQCcAsYAAQFOAAAAAQEeA44AAQEwAAAAAQEeAsYAAQEw/yIAAQErA44AAQErA3sAAQFBAAAAAQEiA44AAQEiAAAAAQEiAsYAAQEi/yIAAQEt/yIAAQEsA3sAAQEuAsYAAQE7AAAAAQE+AscAAQE+AAAAAQEtAsYAAQEcAtoAAQGpAhAAAQGpAAAAAQE5AtoAAQE4AscAAQExAsUAAQEyAtgAAQEjAhIAAQEmAAIAAQEpAscAAQCPAsYAAQFKAtoAAQFJAscAAQGMAscAAQGNAtoAAQCFAsYAAQE1/yIAAQFAAsYAAQFAAAAAAQFGAhIAAQEvAAAAAQEyAtoAAQEy/yIAAQFTAtoAAQENAAAAAQFTAhIAAQEN/yIAAQEuAtoAAQEuAAAAAQEuAhIAAQEu/yIAAQFeAAAAAQFe/yIAAQElAtoAAQEsAtoAAQEtAtoAAQEyAhIAAQEyAAAAAQEvAtoAAQEgAtoAAQEsA44AAQEsAsYAAQErAsYAAQErAAAAAQEcAhIAAQEXAAAAAQE5AhIAAQE5AAAAAQEyAhAAAQE1AAAAAQEqAhIAAQB8AhIAAQFKAhIAAQGNAhIAAQElAAAAAQEvAhIAAQEtAAAAAQEgAhIAAQEVAAAAAQEsAosAAQEsAEIABAAAAAEACAABAAwAEgABAEwAWAABAAEDIgACAAkAPwBDAAAAYwBnAAUAhQCFAAoAsQCzAAsA3QDhAA4BAQEFABMBIwEjABgBOwE/ABkDAQMBAB4AAQAAAAYAAQEsAR0AHwBMAEwATABMAEAARgBGAEYARgBGAEwAXgBeAF4AXgBeAF4AXgBSAFgAWABYAFgAWABeAF4AXgBeAF4AZABqAAEBOQFjAAEBLAFcAAEBLAFjAAEBQAEJAAEBKgEJAAEBLAEJAAEBKwEJAAEBLAFnAAQAAAABAAgAAQAMABIAAQCCAIgAAQABAyEAAgASAAIADAAAABkAIgALADAAOAAVAGgAcgAeAJEAkQApAJMAlAAqAJYAlwAsAJkAmQAuAJ4AqQAvALUAvwA7AMwA1QBGAQYBEABQASUBOgBbAUABQABxAUIBQwByAUUBSAB0AUsBSwB4AU8BUAB5AAEAAAJCAHsA+AD4APgA+AD4APgA+AD4APgA+AD4AP4A/gD+AP4A/gD+AP4A/gD+AP4BBAEEAQQBBAEEAQQBBAEEAQQBCgEKAQoBCgEKAQoBCgEKAQoBCgEKAPgA/gD+AQQBBAEKARwBHAEcARwBHAEcARwBHAEcARwBHAEQASIBIgEiASIBIgEiASIBIgEiASIBFgEoASgBKAEoASgBKAEoASgBKAEoAS4BLgEuAS4BLgEuAS4BLgEuAS4BLgE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBOgE6AToBOgE6AToBOgE6AToBOgE6ARwBIgEiASgBKAEoASgBLgE0AToAAQI0AAAAAQIWAAAAAQIIAAAAAQGKAAAAAQHfAAAAAQCiAfoAAQImAAAAAQG2ABgAAQIwAAAAAQH4AAAAAQIEAAAAAQIMAAAABAAAAAEACAABAAwAEgABAEAATAABAAEDFgACAAcAPwBDAAAAhQCFAAUAsQCzAAYA3QDhAAkBAQEFAA4BIwEjABMBOwE/ABQAAQAAAAYAAQDgAhIAGQA6ADoAOgA6ADQAOgBAAEAAQABSAFIAUgBSAEYATABMAEwATABMAFIAWABYAFgAWABeAAEBJQISAAEBGAISAAECCAISAAEBpAISAAEBWgJoAAEBkAISAAEBmgISAAEBmQISAAYAEAABAAoAAQABAAwAFgABABwAQAACAAEDHgMhAAAAAQABAx4ABAAAABIAAAASAAAAGAAAAB4AAQEsAAAAAQE9AAAAAQFiAAAAAQAEAAEBLP8iAAYAEAABAAoAAgABAAwAIgABACwAjgACAAMDEAMVAAADFwMdAAYDIwMkAA0AAgABAxIDFQAAAA8AAABcAAAAXAAAAFYAAAA+AAAARAAAAEoAAABWAAAAXAAAAFwAAABcAAAAXAAAAFYAAABQAAAAVgAAAFwAAQFUAhIAAQECAhIAAQEEAhIAAQEfAhIAAQEtAhIAAQEsAhIABAAKABAAFgAcAAEBLALHAAEBVALaAAEBAgLaAAEBBALaAAEAAAAKAeQDGAACREZMVAAObGF0bgASAD4AAAA6AAlBWkUgAGBDUlQgAIhLQVogALBNQUggANhNT0wgAQBOTEQgAShST00gAVBUQVQgAXhUUksgAaAAAP//ABAAAAABAAIAAwANAA4ADwAQABEAEgATABQAFQAWABcAGAAA//8AEQAAAAEAAgADAAQADQAOAA8AEAARABIAEwAUABUAFgAXABgAAP//ABEAAAABAAIAAwAFAA0ADgAPABAAEQASABMAFAAVABYAFwAYAAD//wARAAAAAQACAAMABgANAA4ADwAQABEAEgATABQAFQAWABcAGAAA//8AEQAAAAEAAgADAAsADQAOAA8AEAARABIAEwAUABUAFgAXABgAAP//ABEAAAABAAIAAwAKAA0ADgAPABAAEQASABMAFAAVABYAFwAYAAD//wARAAAAAQACAAMADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAA//8AEQAAAAEAAgADAAkADQAOAA8AEAARABIAEwAUABUAFgAXABgAAP//ABEAAAABAAIAAwAHAA0ADgAPABAAEQASABMAFAAVABYAFwAYAAD//wARAAAAAQACAAMACAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZYWFsdACYY2NtcACeZnJhYwCkbGlnYQCqbG9jbACybG9jbACybG9jbACybG9jbACybG9jbACybG9jbAC4bG9jbAC4bG9jbAC+bG9jbADEb3JkbgDKc2luZgDSc3MwMQDYc3MwMgDic3MwMwDsc3MwNAD2c3MwNgEAc3MwNwEKc3MwOAEUc3MwOQEec3VicwEoc3VwcwEuAAAAAQAAAAAAAQABAAAAAQAJAAAAAgAMAA0AAAABAAIAAAABAAMAAAABAAQAAAABAAUAAAACAAoACwAAAAEABwAGAAEADgAAAQAABgABAA8AAAEBAAYAAQAQAAABAgAGAAEAEQAAAQMABgABABIAAAEEAAYAAQATAAABBQAGAAEAFAAAAQYABgABABUAAAEHAAAAAQAGAAAAAQAIABkANAOSA9gD7AQOBDQEagRqBHgEhgUaBWIFhAWuCK4IvAjUCOwJBAkuCUYKBAoYCjAKSgADAAAAAQAIAAECjABjAMwA0ADUANgA3ADgAOQA6ADsAPAA9gD6AP4BAgEGAQoBxgEOARIBFgEaAR4BIgEmASoBLgEyATYBOgE+AUYBTAFSAVgBXgFmAWwBcgF4AX4BhAGIAYwBkAGUAZoBngGiAaYBrAGwAbQBuAG+AcIBxgHKAc4B0gHWAdoB3gHiAeYB6gHuAfYB/AICAggCDgIUAhoCIAImAiwCMAI0AjgCPAJAAkQCSAJMAlACVAJYAlwCYAJkAmgCbAJwAnQCeAJ8AoAChAKIAAEBUQABAJEAAQCSAAEAkwABAJQAAQCLAAEAjAABAI0AAQCOAAIAjwCVAAEAkAABAJYAAQCXAAEAOgABAIUAAQCGAAEAmAABAIcAAQCIAAEAiQABAIoAAQBhAAEAZwABAJkAAQCaAAEAmwABAJwAAQCdAAMBUQElATAAAgEmATEAAgEnATIAAgEoATMAAgEpATQAAwEqATUBQAACASsBNgACASwBNwACAS0BOAACAS4BOQACAS8BOgABAUEAAQFCAAEBQwABAUQAAgDRAUUAAQFGAAEBRwABAUgAAgDYAUkAAQE7AAEBPAABAT0AAgEjAT4AAQE/AAEBJAABAVIAAQFKAAEA/wABAQUAAQFLAAEBTAABAU0AAQFOAAEBTwABAVAAAwIHAhEB+wACAggCEgACAgkCEwACAgoCFAACAgsCFQACAgwCFgACAg0CFwACAg4CGAACAg8CGQACAhACGgABAkQAAQJFAAECRgABAkcAAQJIAAECSQABAkoAAQJLAAECTAABAvUAAQL2AAEC9wABAvgAAQL5AAEC+gABAvsAAQL8AAEC/QABAv4AAQMjAAEDJAABAx8AAQMyAAEDMwABAGMAAgAHABQAHQAeACUAJgAoACkAKgArADMANAA5AEIASABLAE4AWABZAFoAWwBfAGYAbAB3AH0AgwCPAJ4AnwCgAKEAogCjAKQApQCmAKcAqACwALkAugDGAMwA0ADRANQA1gDdAN4A3wDgAOEA5gDpAOwA/QEEAQoBFQEbASEBKgE1Ad0B3gHfAeAB4QHiAeMB5AHlAeYCNAI2AjcCOAI5AjoCOwI8Aj0C4ALhAuIC4wLkAuUC5gLnAugC6QMRAxIDHgMlAyYABgAQAAIADAAeAAAAAwAAAAEASAABACoAAQAAABYAAwAAAAEAEgABABgAAQAAABYAAQABANYAAgACAxEDFQAAAxcDHQAFAAEAAAABAAgAAQAGAAUAAQABAMwAAQAAAAEACAACAA4ABABhAGcA/wEFAAEABABfAGYA/QEEAAEAAAABAAgAAgAQAAUAhQCGASMBJAMfAAEABQBCAEgA4ADmAx4ABgAAAAEACAABBgYAAgAKABwAAQAEAAEAMQABAAAAAQAAABcAAQAEAAEAzgABAAAAAQAAABcAAQAAAAEACAABAN4AKgABAAAAAQAIAAEA0AA0AAQAAAABAAgAAQB+AAUAEABEAFAAZgByAAUADAAUABwAJAAsAf0AAwJCAd8B/gADAkIB4AIAAAMCQgHhAgIAAwJCAeICAwADAkIB5QABAAQB/wADAkIB4AACAAYADgIBAAMCQgHhAgQAAwJCAeUAAQAEAgUAAwJCAeUAAQAEAgYAAwJCAeUAAQAFAd4B3wHgAeIB5AAGAAAAAgAKACQAAwABACwAAQASAAAAAQAAABgAAQACAAIAngADAAEAEgABABwAAAABAAAAGAACAAEB3QHmAAAAAQACAEsA6QAEAAAAAQAIAAEAFAABAAgAAQAEArUAAwDpAjQAAQABAEUABAAAAAEACAABABwAAQAIAAIABgAOAh0AAwJNAk0CHAACAk0AAQABAk0ABAAAAAEACAABAtgADgAiAEAASgBmAHoAmACsAPAA+gE+AYIBvAKaAs4AAwAIABAAGAImAAMCNAI0AicAAwI0AssCKAACAssAAQAEAikAAgLLAAMACAAQABYCLAADAssCywIqAAICOwIrAAICywACAAYADgIuAAMCOwI7Ai0AAgI7AAMACAAQABgCLwADAkECQQIxAAMCUAJSAjAAAgJQAAIABgAOAjMAAwLLAssCMgACAssABwAQABoAIgAqADIAOAA+Ah4ABAJNAk0CzQIfAAMCTQLNAiEAAwLNAs0CIwADAs4CzgIgAAICzQIiAAICzgIkAAIC0wABAAQCJQACArEABwAQABoAIgAqADIAOAA+AnYABAKxArECzQJ0AAMCTQLNAncAAwKxAssCeAADArECzQJ1AAICVQJ5AAICywJ6AAICzQAHABAAGAAgACgAMAA4AD4CgQADAkICywJ8AAMCywLLAn0AAwLLAs0CfwADAs0CzQKAAAMCzgLOAnsAAgLLAn4AAgLNAAYADgAWAB4AJgAuADQCgwADAk0CzQKFAAMCywLNAoYAAwLNAk0ChwADAs0CywKCAAICTQKEAAICywAWAC4AOgBEAE4AWABgAGgAcAB4AIAAiACQAJgAoACoALAAuADAAMYAzADSANgCjQAFAjkCTQJNAk0CjAAEAjkCTQJNApAABAKxArECsQKUAAQCywLLAs0CnQADAkICzQKJAAMCTQJNAooAAwJNAs0CiwADAk0CzgKPAAMCsQKxApEAAwKxAs0CkwADAssCywKVAAMCywLNApYAAwLLAs4CmAADAs4CTQKZAAMCzgLLApsAAwLTAs0CnAADAtMC0wKIAAICTQKOAAICsQKSAAICywKXAAICzQKaAAIC0wAGAA4AFgAcACIAKAAuAqMAAwLTAs0CngACAk0CnwACAqYCoAACAssCoQACAs0CogACAtMAAQAEAqQAAgLeAAEADgI0AjYCOQI7AkECQgJNAlQCsQLLAs0CzgLTAt4AAQAAAAEACAABABQAhwABAAAAAQAIAAEABgCSAAIAAQCeAKgAAAABAAAAAQAIAAEABgBeAAIAAQDdAOEAAAABAAAAAQAIAAEABgAvAAIAAQBYAFsAAAABAAAAAQAIAAIAEgAGAIsAjACNAI4AjwCQAAEABgAlACYAKAApACoAKwABAAAAAQAIAAEABgAVAAIAAQLgAukAAAABAAAAAQAIAAIAXAArAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAkQCRQJGAkcCSAJJAkoCSwJMAyMDJAMyAzMAAQArAAcAFAAdAB4AKgAzADQATgBsAHcAfQCDAI8AowCwALkAugDGAMwA0ADRANQA1gDsAQoBFQEbASEBKgE1AjQCNgI3AjgCOQI6AjsCPAI9AxEDEgMlAyYAAQAAAAEACAABAAYAHgABAAEB3QABABAAAQAKAAAAAQAGAAEAAQACAMwA1gABAAAAAQAIAAIACgACADoA2AABAAIAOQDWAAEAAAABAAgAAgAOAAQBUQFSAVEBUgABAAQAAgBLAJ4A6Q==\"}"
  },
  {
    "path": "apps/www/app/og/route.tsx",
    "content": "import { ImageResponse } from \"next/og\"\n\nimport { Icons } from \"@/components/icons\"\n\nasync function loadAssets(): Promise<\n  { name: string; data: Buffer; weight: 400 | 600; style: \"normal\" }[]\n> {\n  const [\n    { base64Font: normal },\n    { base64Font: mono },\n    { base64Font: semibold },\n  ] = await Promise.all([\n    import(\"./geist-regular-otf.json\").then((mod) => mod.default || mod),\n    import(\"./geistmono-regular-otf.json\").then((mod) => mod.default || mod),\n    import(\"./geist-semibold-otf.json\").then((mod) => mod.default || mod),\n  ])\n\n  return [\n    {\n      name: \"Geist\",\n      data: Buffer.from(normal, \"base64\"),\n      weight: 400 as const,\n      style: \"normal\" as const,\n    },\n    {\n      name: \"Geist Mono\",\n      data: Buffer.from(mono, \"base64\"),\n      weight: 400 as const,\n      style: \"normal\" as const,\n    },\n    {\n      name: \"Geist\",\n      data: Buffer.from(semibold, \"base64\"),\n      weight: 600 as const,\n      style: \"normal\" as const,\n    },\n  ]\n}\n\nexport async function GET(request: Request) {\n  const { searchParams } = new URL(request.url)\n  const title = searchParams.get(\"title\")\n  const description = searchParams.get(\"description\")\n\n  const [fonts] = await Promise.all([loadAssets()])\n  const hasContent = [title, description].some(Boolean)\n\n  return new ImageResponse(\n    <div\n      tw=\"flex h-full w-full bg-white text-black\"\n      style={{ fontFamily: \"Geist Sans\" }}\n    >\n      <div tw=\"flex border absolute border-neutral-200 border-dashed inset-y-0 left-16 w-[1px]\" />\n      <div tw=\"flex border absolute border-neutral-200 border-dashed inset-y-0 right-16 w-[1px]\" />\n      <div tw=\"flex border absolute border-neutral-200 inset-x-0 h-[1px] top-16\" />\n      <div tw=\"flex border absolute border-neutral-200 inset-x-0 h-[1px] bottom-16\" />\n      {hasContent && (\n        <div tw=\"flex absolute flex-row items-center justify-center bottom-24 right-24 text-white\">\n          <Icons.logo width={48} height={48} />\n          <div tw=\"text-black flex text-[32px] font-semibold tracking-tight ml-2\">\n            Magic UI\n          </div>\n        </div>\n      )}\n      <div tw=\"flex flex-col absolute justify-center items-center inset-0 p-24 w-full h-full\">\n        {hasContent ? (\n          <div tw=\"flex flex-col items-center justify-center text-center w-full h-full\">\n            <div tw=\"tracking-tight flex flex-col justify-center text-black text-balance font-semibold text-[80px]\">\n              {title}\n            </div>\n            <div tw=\"text-[40px] text-gray-600 mt-6 text-balance font-normal\">\n              {description}\n            </div>\n          </div>\n        ) : (\n          <div tw=\"flex flex-col items-center justify-center text-center w-full h-full\">\n            <div tw=\"flex flex-row items-center justify-center space-x-4\">\n              <Icons.logo width={48} height={48} />\n              <div tw=\"text-black flex text-[32px] font-semibold tracking-tight ml-2\">\n                Magic UI\n              </div>\n            </div>\n            <div tw=\"text-black flex text-[80px] font-semibold tracking-tight\">\n              Modern Next.js Templates\n            </div>\n            <div tw=\"text-gray-600 text-2xl flex\">\n              <p>\n                Built with React, Typescript, shadcn/ui, Tailwind CSS, and\n                Motion.\n              </p>\n            </div>\n          </div>\n        )}\n      </div>\n    </div>,\n    {\n      width: 1200,\n      height: 628,\n      fonts,\n    }\n  )\n}\n"
  },
  {
    "path": "apps/www/app/robots.ts",
    "content": "import { MetadataRoute } from \"next\"\n\nexport default function robots(): MetadataRoute.Robots {\n  return {\n    rules: {\n      userAgent: \"*\",\n      allow: \"/\",\n      disallow: [\"/api/\", \"/_next/\", \"/public/\"],\n    },\n    sitemap: \"https://magicui.design/sitemap.xml\",\n  }\n}\n"
  },
  {
    "path": "apps/www/app/sitemap.ts",
    "content": "import type { MetadataRoute } from \"next\"\nimport { headers } from \"next/headers\"\n\nimport { blogSource, source } from \"@/lib/source\"\n\nexport default async function sitemap(): Promise<MetadataRoute.Sitemap> {\n  const headersList = await headers()\n  const domain = headersList.get(\"host\") as string\n  const protocol = \"https\"\n  const allDocs = source.getPages()\n  const allBlogs = blogSource.getPages()\n\n  return [\n    {\n      url: `${protocol}://${domain}`,\n      lastModified: new Date(),\n    },\n    ...allDocs.map((post) => ({\n      url: `${protocol}://${domain}${post.url}`,\n      lastModified: post.data.date,\n    })),\n    ...allBlogs.map((post) => ({\n      url: `${protocol}://${domain}${post.url}`,\n      lastModified: post.data.publishedOn,\n    })),\n  ]\n}\n"
  },
  {
    "path": "apps/www/components/analytics.tsx",
    "content": "\"use client\"\n\nimport Script from \"next/script\"\n\nexport function Analytics() {\n  return (\n    <>\n      <Script\n        async\n        defer\n        src=\"https://www.googletagmanager.com/gtag/js?id=G-4CVHZX68BT\"\n      ></Script>\n      <Script id=\"gtag\">\n        {`\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\n\ngtag('config', 'G-4CVHZX68BT');\n`}\n      </Script>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/blog/mobile-toc.tsx",
    "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { Menu } from \"lucide-react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Sheet,\n  SheetContent,\n  SheetHeader,\n  SheetTitle,\n  SheetTrigger,\n} from \"@/components/ui/sheet\"\n\nimport { BlogTableOfContents } from \"./table-of-contents\"\n\nexport function MobileTOC() {\n  const [open, setOpen] = useState(false)\n\n  return (\n    <div className=\"fixed right-8 bottom-8 z-50 lg:hidden\">\n      <Sheet open={open} onOpenChange={setOpen}>\n        <SheetTrigger asChild>\n          <Button\n            size=\"icon\"\n            className=\"bg-primary text-primary-foreground size-12 rounded-full shadow-lg transition-all duration-200 hover:scale-105 hover:shadow-xl\"\n            aria-label=\"Table of contents\"\n          >\n            <Menu className=\"size-5\" />\n            <span className=\"sr-only\">Table of contents</span>\n          </Button>\n        </SheetTrigger>\n        <SheetContent\n          side=\"bottom\"\n          className=\"border-border bg-background/60 right-4! bottom-4! left-4! h-fit max-h-[60vh] overflow-hidden rounded-2xl border p-0 shadow-2xl backdrop-blur-xl\"\n        >\n          <SheetHeader className=\"bg-muted border-border border-b px-6 py-3\">\n            <SheetTitle className=\"item-start flex text-left font-semibold\">\n              On this page\n            </SheetTitle>\n          </SheetHeader>\n          <div className=\"bg-card max-h-[calc(60vh-8rem)] overflow-y-auto p-6 pt-4\">\n            <BlogTableOfContents\n              className=\"[&_a:hover]:bg-muted/50 p-0 [&_a]:transition-colors [&_nav]:space-y-2 [&>p]:hidden\"\n              onLinkClick={() => setOpen(false)}\n            />\n          </div>\n        </SheetContent>\n      </Sheet>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/blog/table-of-contents.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\n\n// Helper function to generate consistent IDs\nconst generateHeadingId = (text: string) => {\n  return text\n    .toLowerCase()\n    .replace(/\\s*&\\s*/g, \"--\")\n    .replace(/[^a-z0-9\\s-]/g, \"\")\n    .replace(/\\s+/g, \"-\")\n    .replace(/-+/g, \"-\")\n    .trim()\n}\n\nexport function BlogTableOfContents({\n  className,\n  onLinkClick,\n}: {\n  className?: string\n  onLinkClick?: () => void\n}) {\n  const [activeHeading, setActiveHeading] = useState<string>(\"\")\n  const [headings, setHeadings] = useState<string[]>([])\n  const [isLoading, setIsLoading] = useState(true)\n\n  useEffect(() => {\n    // Extract headings from rendered DOM\n    const extractHeadings = () => {\n      const headingElements =\n        document.querySelector(\".article-content\")?.querySelectorAll(\"h2\") ?? []\n      const extractedHeadings: string[] = []\n      headingElements.forEach((element) => {\n        if (element.textContent) {\n          extractedHeadings.push(element.textContent)\n        }\n      })\n      setHeadings(extractedHeadings)\n      setIsLoading(false)\n    }\n\n    // Extract headings after a short delay to ensure content is rendered\n    const timeoutId = setTimeout(extractHeadings, 100)\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            setActiveHeading(entry.target.id)\n          }\n        })\n      },\n      {\n        rootMargin: \"-100px 0px -66%\",\n        threshold: [0, 1],\n      }\n    )\n\n    const headingElements =\n      document.querySelector(\".article-content\")?.querySelectorAll(\"h2\") ?? []\n    headingElements.forEach((element) => observer.observe(element))\n\n    // Also update active heading on scroll\n    const onScroll = () => {\n      const headings = Array.from(\n        document.querySelector(\".article-content\")?.querySelectorAll(\"h2\") ?? []\n      )\n      const middle = window.innerHeight / 2\n\n      for (const heading of headings) {\n        const { top, bottom } = heading.getBoundingClientRect()\n        if (top <= middle && bottom >= middle) {\n          setActiveHeading(heading.id)\n          break\n        }\n      }\n    }\n\n    window.addEventListener(\"scroll\", onScroll, { passive: true })\n    onScroll() // Initial check\n\n    return () => {\n      clearTimeout(timeoutId)\n      headingElements.forEach((element) => observer.unobserve(element))\n      window.removeEventListener(\"scroll\", onScroll)\n    }\n  }, [])\n\n  const handleClick = (headingId: string) => {\n    setActiveHeading(headingId)\n    onLinkClick?.()\n  }\n\n  return (\n    <div className={cn(\"flex flex-col gap-2 p-4 pt-0 text-sm\", className)}>\n      <p className=\"text-muted-foreground bg-background sticky top-0 h-6 text-xs\">\n        On This Page\n      </p>\n\n      <nav className=\"space-y-1\">\n        {isLoading ? (\n          // Skeleton loading state\n          <div className=\"space-y-1\">\n            <Skeleton className=\"h-4 w-3/4\" />\n            <Skeleton className=\"h-4 w-2/3\" />\n            <Skeleton className=\"h-4 w-4/5\" />\n          </div>\n        ) : (\n          headings.map((heading, i) => {\n            // Get the actual heading element to check its ID\n            const headingElement = document.querySelector(\n              `.article-content h2:nth-of-type(${i + 1})`\n            )\n            const headingId = headingElement?.id || generateHeadingId(heading)\n            const isActive = activeHeading === headingId\n\n            return (\n              <a\n                key={i}\n                href={`#${headingId}`}\n                onClick={() => handleClick(headingId)}\n                className={`block py-1 text-sm transition-colors ${\n                  isActive\n                    ? \"text-foreground font-medium\"\n                    : \"text-muted-foreground hover:text-foreground\"\n                }`}\n              >\n                {heading}\n              </a>\n            )\n          })\n        )}\n      </nav>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/blur-image.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image, { ImageProps } from \"next/image\"\n\nexport default function BlurImage(props: ImageProps) {\n  const [loading, setLoading] = useState(true)\n  const [src, setSrc] = useState(props.src)\n  useEffect(() => setSrc(props.src), [props.src]) // update the `src` value when the `prop.src` value changes\n\n  return (\n    <Image\n      {...props}\n      src={src}\n      alt={props.alt}\n      className={`${props.className} ${loading ? \"blur-[2px]\" : \"blur-0\"}`}\n      onLoadingComplete={async () => {\n        setLoading(false)\n      }}\n      onError={() => {\n        setSrc(`https://avatar.vercel.sh/${props.alt}`) // if the image fails to load, use the default avatar\n      }}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/components/callout.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\"\n\nexport function Callout({\n  title,\n  children,\n  icon,\n  className,\n  ...props\n}: React.ComponentProps<typeof Alert> & { icon?: React.ReactNode }) {\n  return (\n    <Alert\n      className={cn(\n        \"bg-surface text-surface-foreground mt-6 w-auto border-none md:-mx-1\",\n        className\n      )}\n      {...props}\n    >\n      {icon}\n      {title && <AlertTitle>{title}</AlertTitle>}\n      <AlertDescription className=\"text-card-foreground/80\">\n        {children}\n      </AlertDescription>\n    </Alert>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/code-block-command.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ClipboardIcon, TerminalIcon } from \"lucide-react\"\n\nimport { useConfig } from \"@/hooks/use-config\"\nimport { Button } from \"@/components/ui/button\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { copyToClipboardWithMeta } from \"@/components/copy-button\"\n\nexport function CodeBlockCommand({\n  __npm__,\n  __yarn__,\n  __pnpm__,\n  __bun__,\n}: React.ComponentProps<\"pre\"> & {\n  __npm__?: string\n  __yarn__?: string\n  __pnpm__?: string\n  __bun__?: string\n}) {\n  const [config, setConfig] = useConfig()\n  const [hasCopied, setHasCopied] = React.useState(false)\n\n  React.useEffect(() => {\n    if (hasCopied) {\n      const timer = setTimeout(() => setHasCopied(false), 2000)\n      return () => clearTimeout(timer)\n    }\n  }, [hasCopied])\n\n  const packageManager = config.packageManager || \"pnpm\"\n  const tabs = React.useMemo(() => {\n    return {\n      pnpm: __pnpm__,\n      npm: __npm__,\n      yarn: __yarn__,\n      bun: __bun__,\n    }\n  }, [__npm__, __pnpm__, __yarn__, __bun__])\n\n  const copyCommand = React.useCallback(() => {\n    const command = tabs[packageManager]\n\n    if (!command) {\n      return\n    }\n\n    copyToClipboardWithMeta(command, {\n      name: \"copy_npm_command\",\n      properties: {\n        command,\n        pm: packageManager,\n      },\n    })\n    setHasCopied(true)\n  }, [packageManager, tabs])\n\n  return (\n    <div className=\"overflow-x-auto\">\n      <Tabs\n        value={packageManager}\n        className=\"gap-0\"\n        onValueChange={(value) => {\n          setConfig({\n            ...config,\n            packageManager: value as \"pnpm\" | \"npm\" | \"yarn\" | \"bun\",\n          })\n        }}\n      >\n        <div className=\"border-border/50 flex items-center gap-2 border-b px-3 py-1\">\n          <div className=\"bg-foreground flex size-4 items-center justify-center rounded-[1px] opacity-70\">\n            <TerminalIcon className=\"text-code size-3\" />\n          </div>\n          <TabsList className=\"rounded-none bg-transparent p-0\">\n            {Object.entries(tabs).map(([key]) => {\n              return (\n                <TabsTrigger\n                  key={key}\n                  value={key}\n                  className=\"data-[state=active]:bg-accent data-[state=active]:border-input h-7 border border-transparent pt-0.5 data-[state=active]:shadow-none\"\n                >\n                  {key}\n                </TabsTrigger>\n              )\n            })}\n          </TabsList>\n        </div>\n        <div className=\"no-scrollbar overflow-x-auto\">\n          {Object.entries(tabs).map(([key, value]) => {\n            return (\n              <TabsContent key={key} value={key} className=\"mt-0 px-4 py-3.5\">\n                <pre>\n                  <code\n                    className=\"relative font-mono text-sm leading-none\"\n                    data-language=\"bash\"\n                  >\n                    {value}\n                  </code>\n                </pre>\n              </TabsContent>\n            )\n          })}\n        </div>\n      </Tabs>\n      <Tooltip>\n        <TooltipTrigger asChild>\n          <Button\n            data-slot=\"copy-button\"\n            size=\"icon\"\n            variant=\"ghost\"\n            className=\"absolute top-2 right-2 z-10 size-7 opacity-70 hover:opacity-100 focus-visible:opacity-100\"\n            onClick={copyCommand}\n          >\n            <span className=\"sr-only\">Copy</span>\n            {hasCopied ? <CheckIcon /> : <ClipboardIcon />}\n          </Button>\n        </TooltipTrigger>\n        <TooltipContent>\n          {hasCopied ? \"Copied\" : \"Copy to Clipboard\"}\n        </TooltipContent>\n      </Tooltip>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/code-block-wrapper.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\"\n\ninterface CodeBlockProps extends React.HTMLAttributes<HTMLDivElement> {\n  expandButtonTitle?: string\n}\n\nexport function CodeBlockWrapper({\n  expandButtonTitle = \"View Code\",\n  className,\n  children,\n  ...props\n}: CodeBlockProps) {\n  const [isOpened, setIsOpened] = React.useState(false)\n\n  return (\n    <Collapsible open={isOpened} onOpenChange={setIsOpened}>\n      <div className={cn(\"relative overflow-hidden\", className)} {...props}>\n        <CollapsibleContent\n          forceMount\n          className={cn(\"overflow-hidden\", !isOpened && \"max-h-72\")}\n        >\n          <div\n            className={cn(\n              \"[&_pre]:my-0 [&_pre]:max-h-[650px] [&_pre]:pb-[100px]\",\n              !isOpened ? \"[&_pre]:overflow-hidden\" : \"[&_pre]:overflow-auto]\"\n            )}\n          >\n            {children}\n          </div>\n        </CollapsibleContent>\n        <div\n          className={cn(\n            \"from-background/10 to-background absolute flex items-center justify-center bg-linear-to-b to-90% p-2\",\n            isOpened ? \"inset-x-0 bottom-0 h-12 from-gray-900/30\" : \"inset-0\"\n          )}\n        >\n          <CollapsibleTrigger asChild>\n            <Button variant=\"secondary\" className=\"mb-8 h-8 text-xs\">\n              {isOpened ? \"Collapse\" : expandButtonTitle}\n            </Button>\n          </CollapsibleTrigger>\n        </div>\n      </div>\n    </Collapsible>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/code-collapsible-wrapper.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\"\nimport { Separator } from \"@/components/ui/separator\"\n\nexport function CodeCollapsibleWrapper({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof Collapsible>) {\n  const [isOpened, setIsOpened] = React.useState(false)\n\n  return (\n    <Collapsible\n      open={isOpened}\n      onOpenChange={setIsOpened}\n      className={cn(\"group/collapsible relative md:-mx-1\", className)}\n      {...props}\n    >\n      <CollapsibleTrigger asChild>\n        <div className=\"absolute top-1.5 right-9 z-10 flex items-center\">\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            className=\"text-muted-foreground h-7 rounded-md px-2\"\n          >\n            {isOpened ? \"Collapse\" : \"Expand\"}\n          </Button>\n          <Separator orientation=\"vertical\" className=\"mx-1.5 !h-4\" />\n        </div>\n      </CollapsibleTrigger>\n      <CollapsibleContent\n        forceMount\n        className=\"relative mt-6 overflow-hidden data-[state=closed]:max-h-64 [&>figure]:mt-0 [&>figure]:md:!mx-0\"\n      >\n        {children}\n      </CollapsibleContent>\n      <CollapsibleTrigger className=\"from-code/70 to-code text-muted-foreground absolute inset-x-0 -bottom-2 flex h-20 items-center justify-center rounded-b-lg bg-linear-to-b text-sm group-data-[state=open]/collapsible:hidden\">\n        {isOpened ? \"Collapse\" : \"Expand\"}\n      </CollapsibleTrigger>\n    </Collapsible>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/code-tabs.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { useConfig } from \"@/hooks/use-config\"\nimport { Tabs } from \"@/components/ui/tabs\"\n\nexport function CodeTabs({ children }: React.ComponentProps<typeof Tabs>) {\n  const [config, setConfig] = useConfig()\n\n  const installationType = React.useMemo(() => {\n    return config.installationType ?? \"cli\"\n  }, [config])\n\n  return (\n    <Tabs\n      value={installationType}\n      onValueChange={(value) =>\n        setConfig({ ...config, installationType: value as \"cli\" | \"manual\" })\n      }\n      className=\"relative mt-6 w-full\"\n    >\n      {children}\n    </Tabs>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/command-menu.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { type DialogProps } from \"@radix-ui/react-dialog\"\nimport {\n  CircleIcon,\n  FileIcon,\n  LaptopIcon,\n  MoonIcon,\n  SunIcon,\n} from \"@radix-ui/react-icons\"\nimport { useTheme } from \"next-themes\"\n\nimport { docsConfig } from \"@/config/docs\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  CommandDialog,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n  CommandSeparator,\n} from \"@/components/ui/command\"\n\nexport function CommandMenu({ ...props }: DialogProps) {\n  const router = useRouter()\n  const [open, setOpen] = React.useState(false)\n  const { setTheme } = useTheme()\n\n  React.useEffect(() => {\n    const down = (e: KeyboardEvent) => {\n      if ((e.key === \"k\" && (e.metaKey || e.ctrlKey)) || e.key === \"/\") {\n        if (\n          (e.target instanceof HTMLElement && e.target.isContentEditable) ||\n          e.target instanceof HTMLInputElement ||\n          e.target instanceof HTMLTextAreaElement ||\n          e.target instanceof HTMLSelectElement\n        ) {\n          return\n        }\n\n        e.preventDefault()\n        setOpen((open) => !open)\n      }\n    }\n\n    document.addEventListener(\"keydown\", down)\n    return () => document.removeEventListener(\"keydown\", down)\n  }, [])\n\n  const runCommand = React.useCallback((command: () => unknown) => {\n    setOpen(false)\n    command()\n  }, [])\n\n  return (\n    <>\n      <Button\n        variant=\"outline\"\n        className={cn(\n          \"bg-muted/50 text-muted-foreground relative h-8 w-full justify-start rounded-[0.5rem] text-sm font-normal shadow-none sm:pr-12 md:w-40 lg:w-64\"\n        )}\n        onClick={() => setOpen(true)}\n        {...props}\n      >\n        <span className=\"hidden lg:inline-flex\">Search documentation...</span>\n        <span className=\"inline-flex lg:hidden\">Search...</span>\n        <kbd className=\"bg-muted pointer-events-none absolute top-[0.3rem] right-[0.3rem] hidden h-5 items-center gap-1 rounded border px-1.5 font-mono text-[10px] font-medium opacity-100 select-none sm:flex\">\n          <span className=\"text-xs\">⌘</span>K\n        </kbd>\n      </Button>\n      <CommandDialog open={open} onOpenChange={setOpen}>\n        <CommandInput placeholder=\"Type a command or search...\" />\n        <CommandList>\n          <CommandEmpty>No results found.</CommandEmpty>\n          <CommandGroup heading=\"Links\">\n            {docsConfig.mainNav\n              .filter((navitem) => !navitem.external)\n              .map((navItem) => (\n                <CommandItem\n                  key={navItem.href}\n                  value={navItem.title}\n                  onSelect={() => {\n                    runCommand(() => router.push(navItem.href as string))\n                  }}\n                >\n                  <FileIcon className=\"mr-2 size-4\" />\n                  {navItem.title}\n                </CommandItem>\n              ))}\n          </CommandGroup>\n          {docsConfig.sidebarNav.map((group) => (\n            <CommandGroup key={group.title} heading={group.title}>\n              {group.items?.map((navItem) => (\n                <CommandItem\n                  key={navItem.href}\n                  value={navItem.title}\n                  onSelect={() => {\n                    runCommand(() => router.push(navItem.href as string))\n                  }}\n                >\n                  <div className=\"mr-2 flex size-4 items-center justify-center\">\n                    <CircleIcon className=\"size-3\" />\n                  </div>\n                  {navItem.title}\n                </CommandItem>\n              ))}\n            </CommandGroup>\n          ))}\n          <CommandSeparator />\n          <CommandGroup heading=\"Theme\">\n            <CommandItem onSelect={() => runCommand(() => setTheme(\"light\"))}>\n              <SunIcon className=\"mr-2 size-4\" />\n              Light\n            </CommandItem>\n            <CommandItem onSelect={() => runCommand(() => setTheme(\"dark\"))}>\n              <MoonIcon className=\"mr-2 size-4\" />\n              Dark\n            </CommandItem>\n            <CommandItem onSelect={() => runCommand(() => setTheme(\"system\"))}>\n              <LaptopIcon className=\"mr-2 size-4\" />\n              System\n            </CommandItem>\n          </CommandGroup>\n        </CommandList>\n      </CommandDialog>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/component-preview-tabs.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { RotateCcw } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Tabs, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { OpenInV0Button } from \"@/components/open-in-v0-button\"\n\nexport function ComponentPreviewTabs({\n  className,\n  name,\n  align = \"center\",\n  hideCode = false,\n  component,\n  source,\n  ...props\n}: React.ComponentProps<\"div\"> & {\n  name: string\n  align?: \"center\" | \"start\" | \"end\"\n  hideCode?: boolean\n  component: React.ReactNode\n  source: React.ReactNode\n}) {\n  const [key, setKey] = React.useState(0)\n  const [tab, setTab] = React.useState(\"preview\")\n\n  return (\n    <div\n      className={cn(\"relative mt-4 mb-12 flex flex-col gap-2\", className)}\n      {...props}\n    >\n      <Tabs\n        className=\"relative mr-auto w-full\"\n        value={tab}\n        onValueChange={setTab}\n      >\n        <div className=\"flex items-center justify-between\">\n          {!hideCode && (\n            <TabsList className=\"justify-start gap-4 rounded-none bg-transparent px-2 md:px-0\">\n              <TabsTrigger\n                value=\"preview\"\n                className=\"text-muted-foreground data-[state=active]:text-foreground px-0 text-base data-[state=active]:shadow-none dark:data-[state=active]:border-transparent dark:data-[state=active]:bg-transparent\"\n              >\n                Preview\n              </TabsTrigger>\n              <TabsTrigger\n                value=\"code\"\n                className=\"text-muted-foreground data-[state=active]:text-foreground px-0 text-base data-[state=active]:shadow-none dark:data-[state=active]:border-transparent dark:data-[state=active]:bg-transparent\"\n              >\n                Code\n              </TabsTrigger>\n            </TabsList>\n          )}\n        </div>\n      </Tabs>\n      <div\n        data-tab={tab}\n        className=\"data-[tab=code]:border-code relative rounded-lg border md:-mx-1\"\n      >\n        <div\n          data-slot=\"preview\"\n          data-active={tab === \"preview\"}\n          className=\"invisible overflow-hidden data-[active=true]:visible\"\n        >\n          <div className=\"flex items-center justify-end gap-2 p-4\">\n            <OpenInV0Button url={`https://magicui.design/r/${name}.json`} />\n            <Button\n              onClick={() => setKey((prev) => prev + 1)}\n              className=\"flex items-center rounded-lg px-3 py-1\"\n              variant=\"ghost\"\n            >\n              <RotateCcw aria-label=\"restart-btn\" size={16} />\n            </Button>\n          </div>\n          <div\n            key={key}\n            data-align={align}\n            className={cn(\n              \"preview flex min-h-[450px] w-full justify-center p-10 data-[align=center]:items-center data-[align=end]:items-end data-[align=start]:items-start\"\n            )}\n          >\n            {component}\n          </div>\n        </div>\n        <div\n          data-slot=\"code\"\n          data-active={tab === \"code\"}\n          className=\"absolute inset-0 hidden overflow-hidden rounded-md data-[active=true]:block **:[figure]:!m-0 **:[figure]:h-full **:[pre]:h-full **:[pre]:max-h-full\"\n        >\n          {source}\n        </div>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/component-preview.tsx",
    "content": "import * as React from \"react\"\n\nimport { getRegistryComponent } from \"@/lib/registry\"\nimport { ComponentPreviewTabs } from \"@/components/component-preview-tabs\"\nimport { ComponentSource } from \"@/components/component-source\"\n\ninterface ComponentPreviewProps extends React.HTMLAttributes<HTMLDivElement> {\n  name: string\n  align?: \"center\" | \"start\" | \"end\"\n  preview?: boolean\n  hideCode?: boolean\n}\n\nexport function ComponentPreview({\n  name,\n  className,\n  align = \"center\",\n  hideCode = false,\n  ...props\n}: ComponentPreviewProps) {\n  const Component = getRegistryComponent(name)\n\n  if (!Component) {\n    return (\n      <p className=\"text-muted-foreground text-sm\">\n        Component{\" \"}\n        <code className=\"bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm\">\n          {name}\n        </code>{\" \"}\n        not found in registry.\n      </p>\n    )\n  }\n  return (\n    <ComponentPreviewTabs\n      name={name}\n      className={className}\n      align={align}\n      hideCode={hideCode}\n      component={<Component />}\n      source={<ComponentSource name={name} collapsible={false} />}\n      {...props}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/components/component-source.tsx",
    "content": "import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport * as React from \"react\"\n\nimport { highlightCode } from \"@/lib/highlight-code\"\nimport { getRegistryItem } from \"@/lib/registry\"\nimport { cn } from \"@/lib/utils\"\nimport { CodeCollapsibleWrapper } from \"@/components/code-collapsible-wrapper\"\nimport { CopyButton } from \"@/components/copy-button\"\nimport { getIconForLanguageExtension } from \"@/components/icons\"\n\nexport async function ComponentSource({\n  name,\n  src,\n  title,\n  language,\n  collapsible = true,\n  className,\n}: React.ComponentProps<\"div\"> & {\n  name?: string\n  src?: string\n  title?: string\n  language?: string\n  collapsible?: boolean\n}) {\n  if (!name && !src) {\n    return null\n  }\n\n  let code: string | undefined\n\n  if (name) {\n    const item = await getRegistryItem(name)\n    code = item?.files?.[0]?.content\n  }\n\n  if (src) {\n    const file = await fs.readFile(path.join(process.cwd(), src), \"utf-8\")\n    code = file\n  }\n\n  if (!code) {\n    return null\n  }\n\n  const lang = language ?? title?.split(\".\").pop() ?? \"tsx\"\n  const highlightedCode = await highlightCode(code, lang)\n\n  if (!collapsible) {\n    return (\n      <ComponentCode\n        code={code}\n        highlightedCode={highlightedCode}\n        language={lang}\n        title={title}\n      />\n    )\n  }\n\n  return (\n    <CodeCollapsibleWrapper className={className}>\n      <ComponentCode\n        code={code}\n        highlightedCode={highlightedCode}\n        language={lang}\n        title={title}\n      />\n    </CodeCollapsibleWrapper>\n  )\n}\n\nfunction ComponentCode({\n  code,\n  highlightedCode,\n  language,\n  title,\n}: {\n  code: string\n  highlightedCode: string\n  language: string\n  title: string | undefined\n}) {\n  return (\n    <figure data-rehype-pretty-code-figure=\"\" className=\"h-full\">\n      {title && (\n        <figcaption\n          data-rehype-pretty-code-title=\"\"\n          className=\"text-code-foreground [&_svg]:text-code-foreground flex items-center gap-2 [&_svg]:size-4 [&_svg]:opacity-70\"\n          data-language={language}\n        >\n          {getIconForLanguageExtension(language)}\n          {title}\n        </figcaption>\n      )}\n      <CopyButton value={code} className={cn(!title && \"top-1.5\")} />\n      <div\n        dangerouslySetInnerHTML={{ __html: highlightedCode }}\n        className=\"h-full\"\n      />\n    </figure>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/components-list.tsx",
    "content": "import Link from \"next/link\"\n\nimport { source } from \"@/lib/source\"\n\nexport function ComponentsList() {\n  const components = source.pageTree.children.find(\n    (page) => page.$id === \"components\"\n  )\n\n  if (components?.type !== \"folder\") {\n    return\n  }\n\n  const list = components.children.filter(\n    (component) => component.type === \"page\"\n  )\n\n  return (\n    <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 md:gap-x-6 lg:gap-y-6\">\n      {list.map((component) => (\n        <Link\n          key={component.$id}\n          href={component.url}\n          className=\"text-base font-medium underline-offset-4 hover:underline\"\n        >\n          {component.name}\n        </Link>\n      ))}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/contribute.tsx",
    "content": "import Link from \"next/link\"\nimport { Page, PageData } from \"fumadocs-core/source\"\nimport { BugIcon, LightbulbIcon, PencilIcon } from \"lucide-react\"\n\nimport { getGithubFileUrl, getGitHubIssueUrl } from \"@/lib/github\"\n\nexport function Contribute({ page }: { page: Page<PageData> }) {\n  const contributeLinks = [\n    {\n      text: \"Report an issue\",\n      icon: BugIcon,\n      href: getGitHubIssueUrl({\n        owner: \"magicuidesign\",\n        repo: \"magicui\",\n        title: `[bug]: ${page.url}`,\n        labels: [\"bug\", \"documentation\"],\n        template: \"bug_report.yml\",\n      }),\n    },\n    {\n      text: \"Request a feature\",\n      icon: LightbulbIcon,\n      href: getGitHubIssueUrl({\n        owner: \"magicuidesign\",\n        repo: \"magicui\",\n        title: `[feat]: ${page.url}`,\n        labels: [\"enhancement\"],\n        template: \"feature_request.yml\",\n      }),\n    },\n    {\n      text: \"Edit this page\",\n      icon: PencilIcon,\n      href: getGithubFileUrl({\n        owner: \"magicuidesign\",\n        repo: \"magicui\",\n        slug: page.url,\n      }),\n    },\n  ]\n\n  return (\n    <div className=\"flex flex-col gap-2 p-4\">\n      <p className=\"text-muted-foreground text-xs font-medium\">Contribute</p>\n      <ul className=\"m-0 flex list-none flex-col gap-1\">\n        {contributeLinks.map((link, index) => (\n          <li key={index}>\n            <Link\n              href={link.href}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-xs transition-colors\"\n            >\n              <link.icon className=\"size-3\" />\n              {link.text}\n            </Link>\n          </li>\n        ))}\n      </ul>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/copy-button.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ClipboardIcon } from \"lucide-react\"\n\nimport { Event, trackEvent } from \"@/lib/events\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nexport async function copyToClipboardWithMeta(value: string, event?: Event) {\n  navigator.clipboard.writeText(value)\n  if (event) {\n    trackEvent(event)\n  }\n}\n\nexport function CopyButton({\n  value,\n  className,\n  variant = \"ghost\",\n  event,\n  ...props\n}: React.ComponentProps<typeof Button> & {\n  value: string\n  src?: string\n  event?: Event[\"name\"]\n}) {\n  const [hasCopied, setHasCopied] = React.useState(false)\n\n  React.useEffect(() => {\n    setTimeout(() => {\n      setHasCopied(false)\n    }, 2000)\n  }, [])\n\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button\n          data-slot=\"copy-button\"\n          size=\"icon\"\n          variant={variant}\n          className={cn(\n            \"bg-code absolute top-3 right-2 z-10 size-7 hover:opacity-100 focus-visible:opacity-100\",\n            className\n          )}\n          onClick={() => {\n            copyToClipboardWithMeta(\n              value,\n              event\n                ? {\n                    name: event,\n                    properties: {\n                      code: value,\n                    },\n                  }\n                : undefined\n            )\n            setHasCopied(true)\n          }}\n          {...props}\n        >\n          <span className=\"sr-only\">Copy</span>\n          {hasCopied ? <CheckIcon /> : <ClipboardIcon />}\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent>\n        {hasCopied ? \"Copied\" : \"Copy to Clipboard\"}\n      </TooltipContent>\n    </Tooltip>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/deal-banner.tsx",
    "content": "import Link from \"next/link\"\nimport { ExternalLink } from \"lucide-react\"\n\nexport function DealBanner() {\n  return (\n    <div className=\"bg-background relative top-0 py-3 md:py-0\">\n      <div className=\"container flex flex-col items-center justify-center gap-4 md:h-12 md:flex-row\">\n        <Link\n          href=\"/pricing\"\n          className=\"flex flex-row items-center justify-center gap-2 text-center text-sm leading-loose font-bold text-black dark:text-white\"\n        >\n          {/* ✨\n          <span className=\"font-bold text-black dark:text-white\">\n            {\" \"}\n            Join our new discord community <strong>here</strong>\n          </span>{\" \"}\n          ✨ */}\n          🔥🔥🔥 FIRE SALE - Get $100 off TODAY ONLY\n          <ExternalLink className=\"size-4\" />\n          {/* with code{\" \"}\n          <span className=\"rounded-md bg-orange-400 p-1 font-bold text-black dark:text-white\">\n            BLOCKPARTY\n          </span>{\" \"}\n          ✨  */}\n        </Link>\n      </div>\n      <hr className=\"absolute bottom-0 m-0 h-px w-full bg-neutral-200/30\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/discord-link.tsx",
    "content": "import * as React from \"react\"\nimport Link from \"next/link\"\n\nimport { siteConfig } from \"@/config/site\"\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { Icons } from \"@/components/icons\"\nimport { PingDot } from \"@/components/ping-dot\"\n\nconst formatCompactCount = (value: number) => {\n  if (value >= 1000) {\n    return `${(value / 1000).toFixed(1)}k`\n  }\n\n  return value.toLocaleString()\n}\n\nconst getActiveMembersCount = async () => {\n  try {\n    const data = await fetch(\n      \"https://discord.com/api/guilds/1151315619246002176/widget.json\",\n      {\n        next: { revalidate: 3600 }, // Cache for 1 hour (3600 seconds)\n      }\n    )\n    if (!data.ok) {\n      return 0\n    }\n\n    const json: unknown = await data.json()\n    if (\n      typeof json !== \"object\" ||\n      json === null ||\n      !(\"presence_count\" in json)\n    ) {\n      return 0\n    }\n\n    const membersCount = json.presence_count\n    if (typeof membersCount !== \"number\" || !Number.isFinite(membersCount)) {\n      return 0\n    }\n\n    return membersCount\n  } catch {\n    return 0\n  }\n}\n\nexport function DiscordLink({ className }: { className?: string }) {\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Link\n          className={cn(\n            buttonVariants({ variant: \"ghost\", size: \"sm\" }),\n            \"shadow-none transition-colors\",\n            className\n          )}\n          href={siteConfig.links.discord}\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          <Icons.discord />\n          <React.Suspense fallback={<Skeleton className=\"h-4 w-8\" />}>\n            <ActiveMembersCount className=\"text-muted-foreground\" />\n          </React.Suspense>\n        </Link>\n      </TooltipTrigger>\n      <TooltipContent>\n        <React.Suspense fallback={<Skeleton className=\"h-4 w-8\" />}>\n          <span>\n            <ActiveMembersCount className=\"text-background\" /> members online in\n            our Discord community\n          </span>\n        </React.Suspense>\n      </TooltipContent>\n    </Tooltip>\n  )\n}\n\nexport async function ActiveMembersCount({\n  className,\n}: {\n  className?: string\n}) {\n  const activeMembersCount = await getActiveMembersCount()\n\n  return (\n    <div className={cn(\"ml-2 inline-flex items-center gap-1\", className)}>\n      <PingDot />\n      <span className=\"min-w-[2rem] text-xs font-medium tabular-nums\">\n        {formatCompactCount(activeMembersCount)}\n      </span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/docs-copy-page.tsx",
    "content": "\"use client\"\n\nimport { IconCheck, IconChevronDown, IconCopy } from \"@tabler/icons-react\"\n\nimport { useCopyToClipboard } from \"@/hooks/use-copy-to-clipboard\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport {\n  Popover,\n  PopoverAnchor,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\"\nimport { Separator } from \"@/components/ui/separator\"\n\nfunction getPromptUrl(baseURL: string, url: string) {\n  return `${baseURL}?q=${encodeURIComponent(\n    `I’m looking at this shadcn/ui documentation: ${url}.\nHelp me understand how to use it. Be ready to explain concepts, give examples, or help debug based on it.\n  `\n  )}`\n}\nexport function DocsCopyPage({ page, url }: { page: string; url: string }) {\n  const { copyToClipboard, isCopied } = useCopyToClipboard()\n  const trigger = (\n    <Button\n      variant=\"secondary\"\n      size=\"sm\"\n      name=\"copy-page\"\n      className=\"peer -ml-0.5 size-8 shadow-none md:size-7 md:text-[0.8rem]\"\n    >\n      <IconChevronDown className=\"rotate-180 sm:rotate-0\" />\n    </Button>\n  )\n\n  let pathname = \"/docs\"\n  try {\n    pathname = new URL(url).pathname\n  } catch (e) {\n    console.error(e)\n  }\n  const menuItems: Record<string, (url: string) => React.ReactNode> = {\n    viewMarkdown: () => {\n      const mdUrl = `${pathname}.md`\n      return (\n        <a href={mdUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n          <svg strokeLinejoin=\"round\" viewBox=\"0 0 22 16\">\n            <path\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M19.5 2.25H2.5C1.80964 2.25 1.25 2.80964 1.25 3.5V12.5C1.25 13.1904 1.80964 13.75 2.5 13.75H19.5C20.1904 13.75 20.75 13.1904 20.75 12.5V3.5C20.75 2.80964 20.1904 2.25 19.5 2.25ZM2.5 1C1.11929 1 0 2.11929 0 3.5V12.5C0 13.8807 1.11929 15 2.5 15H19.5C20.8807 15 22 13.8807 22 12.5V3.5C22 2.11929 20.8807 1 19.5 1H2.5ZM3 4.5H4H4.25H4.6899L4.98715 4.82428L7 7.02011L9.01285 4.82428L9.3101 4.5H9.75H10H11V5.5V11.5H9V7.79807L7.73715 9.17572L7 9.97989L6.26285 9.17572L5 7.79807V11.5H3V5.5V4.5ZM15 8V4.5H17V8H19.5L17 10.5L16 11.5L15 10.5L12.5 8H15Z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n          View as Markdown\n        </a>\n      )\n    },\n    chatgpt: (url: string) => (\n      <a\n        href={getPromptUrl(\"https://chatgpt.com\", url)}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n          <path\n            d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66z\"\n            fill=\"currentColor\"\n          />\n        </svg>\n        Open in ChatGPT\n      </a>\n    ),\n    claude: (url: string) => (\n      <a\n        href={getPromptUrl(\"https://claude.ai/new\", url)}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n          <path\n            d=\"m4.714 15.956 4.718-2.648.079-.23-.08-.128h-.23l-.79-.048-2.695-.073-2.337-.097-2.265-.122-.57-.121-.535-.704.055-.353.48-.321.685.06 1.518.104 2.277.157 1.651.098 2.447.255h.389l.054-.158-.133-.097-.103-.098-2.356-1.596-2.55-1.688-1.336-.972-.722-.491L2 6.223l-.158-1.008.655-.722.88.06.225.061.893.686 1.906 1.476 2.49 1.833.364.304.146-.104.018-.072-.164-.274-1.354-2.446-1.445-2.49-.644-1.032-.17-.619a2.972 2.972 0 0 1-.103-.729L6.287.133 6.7 0l.995.134.42.364.619 1.415L9.735 4.14l1.555 3.03.455.898.243.832.09.255h.159V9.01l.127-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.583.28.48.685-.067.444-.286 1.851-.558 2.903-.365 1.942h.213l.243-.242.983-1.306 1.652-2.064.728-.82.85-.904.547-.431h1.032l.759 1.129-.34 1.166-1.063 1.347-.88 1.142-1.263 1.7-.79 1.36.074.11.188-.02 2.853-.606 1.542-.28 1.84-.315.832.388.09.395-.327.807-1.967.486-2.307.462-3.436.813-.043.03.049.061 1.548.146.662.036h1.62l3.018.225.79.522.473.638-.08.485-1.213.62-1.64-.389-3.825-.91-1.31-.329h-.183v.11l1.093 1.068 2.003 1.81 2.508 2.33.127.578-.321.455-.34-.049-2.204-1.657-.85-.747-1.925-1.62h-.127v.17l.443.649 2.343 3.521.122 1.08-.17.353-.607.213-.668-.122-1.372-1.924-1.415-2.168-1.141-1.943-.14.08-.674 7.254-.316.37-.728.28-.607-.461-.322-.747.322-1.476.388-1.924.316-1.53.285-1.9.17-.632-.012-.042-.14.018-1.432 1.967-2.18 2.945-1.724 1.845-.413.164-.716-.37.066-.662.401-.589 2.386-3.036 1.439-1.882.929-1.086-.006-.158h-.055L4.138 18.56l-1.13.146-.485-.456.06-.746.231-.243 1.907-1.312Z\"\n            fill=\"currentColor\"\n          />\n        </svg>\n        Open in Claude\n      </a>\n    ),\n    v0: (url: string) => (\n      <a\n        href={getPromptUrl(\"https://v0.dev\", url)}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          fill=\"currentColor\"\n          viewBox=\"0 0 147 70\"\n          className=\"size-4.5 -translate-x-px\"\n        >\n          <path d=\"M56 50.203V14h14v46.156C70 65.593 65.593 70 60.156 70c-2.596 0-5.158-1-7-2.843L0 14h19.797L56 50.203ZM147 56h-14V23.953L100.953 56H133v14H96.687C85.814 70 77 61.186 77 50.312V14h14v32.156L123.156 14H91V0h36.312C138.186 0 147 8.814 147 19.688V56Z\" />\n        </svg>\n        <span className=\"-translate-x-[2px]\">Open in v0</span>\n      </a>\n    ),\n  }\n  return (\n    <Popover>\n      <div className=\"bg-secondary group/buttons relative flex rounded-lg *:[[data-slot=button]]:focus-visible:relative *:[[data-slot=button]]:focus-visible:z-10\">\n        <PopoverAnchor />\n        <Button\n          variant=\"secondary\"\n          size=\"sm\"\n          className=\"h-8 shadow-none md:h-7 md:text-[0.8rem]\"\n          onClick={() => copyToClipboard(page)}\n        >\n          {isCopied ? <IconCheck /> : <IconCopy />}\n          Copy Page\n        </Button>\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild className=\"hidden sm:flex\">\n            {trigger}\n          </DropdownMenuTrigger>\n          <DropdownMenuContent align=\"end\" className=\"shadow-none\">\n            {Object.entries(menuItems).map(([key, value]) => (\n              <DropdownMenuItem key={key} asChild>\n                {value(url)}\n              </DropdownMenuItem>\n            ))}\n          </DropdownMenuContent>\n        </DropdownMenu>\n        <Separator\n          orientation=\"vertical\"\n          className=\"!bg-foreground/10 absolute top-0 right-8 z-0 !h-8 peer-focus-visible:opacity-0 sm:right-7 sm:!h-7\"\n        />\n        <PopoverTrigger asChild className=\"flex sm:hidden\">\n          {trigger}\n        </PopoverTrigger>\n        <PopoverContent\n          className=\"bg-background/70 dark:bg-background/60 w-52 !origin-center rounded-lg shadow-sm backdrop-blur-sm\"\n          align=\"start\"\n        >\n          {Object.entries(menuItems).map(([key, value]) => (\n            <Button\n              variant=\"ghost\"\n              size=\"lg\"\n              asChild\n              key={key}\n              className=\"*:[svg]:text-muted-foreground w-full justify-start p-0 text-base font-normal\"\n            >\n              {value(url)}\n            </Button>\n          ))}\n        </PopoverContent>\n      </div>\n    </Popover>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/docs-sidebar.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\nimport { NavItemWithChildren } from \"@/types\"\n\nimport { docsConfig } from \"@/config/docs\"\nimport { trackEvent } from \"@/lib/events\"\nimport { cn } from \"@/lib/utils\"\nimport {\n  Sidebar,\n  SidebarContent,\n  SidebarGroup,\n  SidebarGroupContent,\n  SidebarGroupLabel,\n  SidebarMenu,\n  SidebarMenuButton,\n  SidebarMenuItem,\n} from \"@/components/ui/sidebar\"\n\ninterface DocsSidebarNavItemsProps {\n  items: NavItemWithChildren[]\n  pathname: string\n  level?: number\n}\n\nfunction DocsSidebarNavItems({\n  items,\n  pathname,\n  level = 0,\n}: DocsSidebarNavItemsProps) {\n  return (\n    <SidebarMenu className={cn(\"gap-0.5\", level > 0 && \"ml-4\")}>\n      {items.map((item) => {\n        const isActive = item.href ? pathname === item.href : false\n        const hasChildren = item.items && item.items.length > 0\n\n        return (\n          <div key={item.href || item.title}>\n            <SidebarMenuItem>\n              <SidebarMenuButton\n                asChild={!!item.href}\n                isActive={isActive}\n                className=\"data-[active=true]:bg-accent data-[active=true]:border-accent 3xl:fixed:w-full 3xl:fixed:max-w-56 relative h-[30px] w-fit overflow-visible border border-transparent text-[0.8rem] font-medium after:absolute after:inset-x-0 after:-inset-y-1 after:z-0 after:rounded-md\"\n              >\n                {item.href ? (\n                  <Link\n                    href={item.href}\n                    onClick={() =>\n                      item.event && trackEvent({ name: item.event })\n                    }\n                  >\n                    <span className=\"absolute inset-0 flex w-(--sidebar-width) bg-transparent\" />\n                    <span className=\"flex items-center gap-2\">\n                      {item.title}\n                      {item.label && (\n                        <span className=\"rounded-md bg-[#adfa1d] px-1.5 py-0.5 text-xs leading-none text-[#000000] no-underline group-hover:no-underline\">\n                          {item.label}\n                        </span>\n                      )}\n                      {item.paid && (\n                        <span className=\"rounded-md bg-gradient-to-r from-orange-400 to-orange-600 px-1.5 py-0.5 text-xs leading-none text-white no-underline group-hover:no-underline\">\n                          Pro\n                        </span>\n                      )}\n                    </span>\n                  </Link>\n                ) : (\n                  <span className=\"flex items-center gap-2\">\n                    {item.title}\n                    {item.label && (\n                      <span className=\"rounded-md bg-[#adfa1d] px-1.5 py-0.5 text-xs leading-none text-[#000000] no-underline group-hover:no-underline\">\n                        {item.label}\n                      </span>\n                    )}\n                  </span>\n                )}\n              </SidebarMenuButton>\n            </SidebarMenuItem>\n            {hasChildren && (\n              <DocsSidebarNavItems\n                items={item.items!}\n                pathname={pathname}\n                level={level + 1}\n              />\n            )}\n          </div>\n        )\n      })}\n    </SidebarMenu>\n  )\n}\n\nexport function DocsSidebar({\n  ...props\n}: React.ComponentProps<typeof Sidebar>) {\n  const pathname = usePathname()\n\n  return (\n    <Sidebar\n      className=\"sticky top-[calc(var(--header-height)+1px)] z-30 hidden h-[calc(100svh-var(--footer-height)+2rem)] bg-transparent lg:flex\"\n      collapsible=\"none\"\n      {...props}\n    >\n      <SidebarContent className=\"no-scrollbar overflow-x-hidden px-2 pb-12\">\n        <div className=\"h-(--top-spacing) shrink-0\" />\n        {docsConfig.sidebarNav.map((section) => {\n          return (\n            <SidebarGroup key={section.title}>\n              <SidebarGroupLabel className=\"text-muted-foreground font-medium\">\n                {section.title}\n              </SidebarGroupLabel>\n              <SidebarGroupContent>\n                <DocsSidebarNavItems\n                  items={section.items ?? []}\n                  pathname={pathname}\n                />\n              </SidebarGroupContent>\n            </SidebarGroup>\n          )\n        })}\n      </SidebarContent>\n    </Sidebar>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/docs-toc.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { IconMenu3 } from \"@tabler/icons-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\n\nfunction useActiveItem(itemIds: string[]) {\n  const [activeId, setActiveId] = React.useState<string | null>(null)\n\n  React.useEffect(() => {\n    const observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            setActiveId(entry.target.id)\n          }\n        }\n      },\n      { rootMargin: \"0% 0% -80% 0%\" }\n    )\n\n    for (const id of itemIds ?? []) {\n      const element = document.getElementById(id)\n      if (element) {\n        observer.observe(element)\n      }\n    }\n\n    return () => {\n      for (const id of itemIds ?? []) {\n        const element = document.getElementById(id)\n        if (element) {\n          observer.unobserve(element)\n        }\n      }\n    }\n  }, [itemIds])\n\n  return activeId\n}\n\nexport function DocsTableOfContents({\n  toc,\n  variant = \"list\",\n  className,\n}: {\n  toc: {\n    title?: React.ReactNode\n    url: string\n    depth: number\n  }[]\n  variant?: \"dropdown\" | \"list\"\n  className?: string\n}) {\n  const [open, setOpen] = React.useState(false)\n  const itemIds = React.useMemo(\n    () => toc.map((item) => item.url.replace(\"#\", \"\")),\n    [toc]\n  )\n  const activeHeading = useActiveItem(itemIds)\n\n  if (!toc?.length) {\n    return null\n  }\n\n  if (variant === \"dropdown\") {\n    return (\n      <DropdownMenu open={open} onOpenChange={setOpen}>\n        <DropdownMenuTrigger asChild>\n          <Button\n            variant=\"outline\"\n            size=\"sm\"\n            className={cn(\"h-8 md:h-7\", className)}\n          >\n            <IconMenu3 /> On This Page\n          </Button>\n        </DropdownMenuTrigger>\n        <DropdownMenuContent\n          align=\"start\"\n          className=\"no-scrollbar max-h-[70svh]\"\n        >\n          {toc.map((item) => (\n            <DropdownMenuItem\n              key={item.url}\n              asChild\n              onClick={() => {\n                setOpen(false)\n              }}\n              data-depth={item.depth}\n              className=\"data-[depth=3]:pl-6 data-[depth=4]:pl-8\"\n            >\n              <a href={item.url}>{item.title}</a>\n            </DropdownMenuItem>\n          ))}\n        </DropdownMenuContent>\n      </DropdownMenu>\n    )\n  }\n\n  return (\n    <div className={cn(\"flex flex-col gap-2 p-4 pt-0 text-sm\", className)}>\n      <p className=\"text-muted-foreground bg-background sticky top-0 h-6 text-xs\">\n        On This Page\n      </p>\n      {toc.map((item) => (\n        <a\n          key={item.url}\n          href={item.url}\n          className=\"text-muted-foreground hover:text-foreground data-[active=true]:text-foreground text-[0.8rem] no-underline transition-colors data-[depth=3]:pl-4 data-[depth=4]:pl-6\"\n          data-active={item.url === `#${activeHeading}`}\n          data-depth={item.depth}\n        >\n          {item.title}\n        </a>\n      ))}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/github-link.tsx",
    "content": "import * as React from \"react\"\nimport Link from \"next/link\"\n\nimport { siteConfig } from \"@/config/site\"\nimport { Button } from \"@/components/ui/button\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { Icons } from \"@/components/icons\"\n\nconst formatCompactCount = (value: number) => {\n  if (value >= 1000) {\n    return `${(value / 1000).toFixed(1)}k`\n  }\n\n  return value.toLocaleString()\n}\n\nconst getStarsCount = async () => {\n  try {\n    const data = await fetch(\n      \"https://api.github.com/repos/magicuidesign/magicui\",\n      {\n        next: { revalidate: 86400 }, // Cache for 1 day (86400 seconds)\n      }\n    )\n    if (!data.ok) {\n      return 0\n    }\n\n    const json: unknown = await data.json()\n    if (\n      typeof json !== \"object\" ||\n      json === null ||\n      !(\"stargazers_count\" in json)\n    ) {\n      return 0\n    }\n\n    const starsCount = json.stargazers_count\n    if (typeof starsCount !== \"number\" || !Number.isFinite(starsCount)) {\n      return 0\n    }\n\n    return starsCount\n  } catch {\n    return 0\n  }\n}\n\nexport function GitHubLink({ className }: { className?: string }) {\n  return (\n    <TooltipProvider>\n      <Tooltip>\n        <TooltipTrigger asChild>\n          <Button asChild size=\"lg\" variant=\"ghost\" className=\"h-8 shadow-none\">\n            <Link\n              href={siteConfig.links.github}\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              className={className}\n            >\n              <Icons.gitHub />\n              <React.Suspense fallback={<Skeleton className=\"h-4 w-8\" />}>\n                <StarsCount />\n              </React.Suspense>\n            </Link>\n          </Button>\n        </TooltipTrigger>\n        <TooltipContent>\n          <p>View on GitHub</p>\n        </TooltipContent>\n      </Tooltip>\n    </TooltipProvider>\n  )\n}\n\nexport async function StarsCount() {\n  const starsCount = await getStarsCount()\n\n  return (\n    <span className=\"text-muted-foreground w-8 text-xs tabular-nums\">\n      <span className=\"hidden sm:inline\">{starsCount.toLocaleString()}</span>\n      <span className=\"sm:hidden\">{formatCompactCount(starsCount)}</span>\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/gradient-blur.tsx",
    "content": "import React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface GradientBlurProps {\n  numberOfLayers?: number\n  className?: string\n}\n\nconst GradientBlur: React.FC<GradientBlurProps> = ({\n  numberOfLayers = 6,\n  className = \"\",\n}) => {\n  const generateLayers = () => {\n    const layers = []\n    for (let i = 0; i < numberOfLayers; i++) {\n      const blurAmount = Math.pow(2, i)\n      const startPercent = (i * 100) / numberOfLayers\n      const midPercent = ((i + 1) * 100) / numberOfLayers\n      const endPercent = ((i + 2) * 100) / numberOfLayers\n      layers.push(\n        <div\n          key={i}\n          className=\"absolute inset-0\"\n          style={{\n            zIndex: i + 2,\n            backdropFilter: `blur(${blurAmount}px)`,\n            mask: `linear-gradient(\n              to bottom,\n              rgba(0, 0, 0, 0) ${startPercent}%,\n              rgba(0, 0, 0, 1) ${midPercent}%,\n              rgba(0, 0, 0, 1) ${endPercent}%,\n              rgba(0, 0, 0, 0) ${endPercent + (endPercent - midPercent)}%\n            )`,\n          }}\n        />\n      )\n    }\n    return layers\n  }\n\n  return (\n    <div className={cn(`pointer-events-none inset-x-0 z-5 h-full`, className)}>\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: 1,\n          backdropFilter: \"blur(0.5px)\",\n          mask: `linear-gradient(\n            to bottom,\n            rgba(0, 0, 0, 0) 0%,\n            rgba(0, 0, 0, 1) ${100 / (numberOfLayers * 4)}%,\n            rgba(0, 0, 0, 1) ${100 / (numberOfLayers * 2)}%,\n            rgba(0, 0, 0, 0) ${(100 * 3) / (numberOfLayers * 4)}%\n          )`,\n        }}\n      />\n      {generateLayers()}\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: numberOfLayers + 2,\n          backdropFilter: `blur(${Math.pow(2, numberOfLayers)}px)`,\n          mask: `linear-gradient(\n            to bottom,\n            rgba(0, 0, 0, 0) ${100 - 100 / (numberOfLayers * 2)}%,\n            rgba(0, 0, 0, 1) 100%\n          )`,\n        }}\n      />\n    </div>\n  )\n}\n\nexport default GradientBlur\n"
  },
  {
    "path": "apps/www/components/icons.tsx",
    "content": "import { DiscordLogoIcon, InstagramLogoIcon } from \"@radix-ui/react-icons\"\nimport {\n  AlertTriangle,\n  ArrowRight,\n  Check,\n  ChevronLeft,\n  ClipboardCheck,\n  Copy,\n  CreditCard,\n  File,\n  FileIcon,\n  FileText,\n  HelpCircle,\n  Image,\n  Laptop,\n  Loader2,\n  Moon,\n  MoreVertical,\n  Pizza,\n  Plus,\n  Settings,\n  SunMedium,\n  Trash,\n  User,\n  X,\n} from \"lucide-react\"\n\nexport type IconProps = React.SVGProps<SVGSVGElement>\n\nexport const Icons = {\n  logo: ({ className, ...props }: IconProps) => (\n    <svg\n      width=\"256\"\n      height=\"256\"\n      viewBox=\"0 0 256 256\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      {...props}\n    >\n      <rect\n        width=\"256\"\n        height=\"256\"\n        rx=\"128\"\n        fill=\"url(#paint0_linear_601_4643)\"\n      />\n      <rect\n        width=\"256\"\n        height=\"256\"\n        rx=\"128\"\n        fill=\"url(#paint1_linear_601_4643)\"\n      />\n      <path\n        d=\"M124.157 193.675C123.939 193.783 123.722 193.837 123.505 193.837C123.287 193.837 122.852 193.837 122.2 193.837C120.678 193.837 118.884 193.567 116.818 193.025C114.862 192.591 112.905 191.995 110.948 191.236C109.099 190.586 107.469 189.828 106.055 188.961C104.751 188.094 103.935 187.335 103.609 186.685C103.501 185.167 103.446 183.596 103.446 181.97C103.446 180.345 103.446 178.773 103.446 177.256C103.446 165.118 104.316 152.438 106.055 139.217C107.904 125.995 110.893 111.69 115.025 96.3005C115.459 94.7833 115.894 92.8867 116.329 90.6108C116.873 88.2266 117.416 85.6798 117.96 82.9704C115.351 85.0296 112.252 88.335 108.665 92.8867C105.077 97.3301 101.272 102.64 97.2492 108.818C93.3354 114.887 89.3672 121.606 85.3446 128.975C81.4308 136.236 77.8431 143.66 74.5815 151.246C71.32 158.724 68.4933 166.148 66.1015 173.517C63.8185 180.887 62.4051 187.714 61.8615 194C56.6431 192.483 53.001 190.966 50.9354 189.448C48.9785 187.931 48 186.089 48 183.921C48 181.97 48.5979 179.207 49.7938 175.631C50.9897 172.054 52.6749 167.828 54.8492 162.951C57.0236 158.074 59.6872 152.655 62.84 146.695C65.9928 140.626 69.4718 134.123 73.2769 127.187C77.6256 119.276 81.8656 111.852 85.9969 104.916C90.2369 97.9803 94.3682 91.6946 98.3908 86.0591C102.413 80.4236 106.327 75.5468 110.132 71.4286C114.046 67.3104 117.906 64.1675 121.711 62C123.233 62 125.244 62.3793 127.745 63.1379C130.354 63.8966 132.854 64.8177 135.246 65.9015C137.747 66.9852 139.921 68.1232 141.769 69.3153C143.726 70.399 144.813 71.3202 145.031 72.0788C143.509 75.1133 141.715 79.665 139.649 85.734C137.584 91.803 135.464 98.6847 133.289 106.379C131.224 114.074 129.212 122.256 127.255 130.926C125.407 139.488 123.939 147.724 122.852 155.635C125.353 149.675 128.234 143.498 131.495 137.103C134.866 130.601 138.399 124.207 142.095 117.921C145.792 111.527 149.543 105.35 153.348 99.3892C157.262 93.4286 161.067 88.0099 164.763 83.133C168.459 78.1478 171.884 73.8128 175.037 70.1281C178.298 66.4434 181.179 63.734 183.68 62C185.202 62 187.213 62.3793 189.714 63.1379C192.323 63.8966 194.824 64.8177 197.215 65.9015C199.716 66.9852 201.89 68.1232 203.738 69.3153C205.695 70.399 206.783 71.3202 207 72.0788C203.521 78.2562 200.477 85.7882 197.868 94.6749C195.258 103.562 193.03 112.882 191.182 122.635C189.442 132.389 188.083 142.089 187.105 151.734C186.235 161.271 185.8 169.833 185.8 177.419C185.8 179.911 185.8 182.512 185.8 185.222C185.8 187.931 185.909 190.749 186.126 193.675C184.604 193.675 182.756 193.458 180.582 193.025C178.516 192.7 176.45 192.212 174.385 191.562C172.428 190.911 170.634 190.153 169.003 189.286C167.372 188.527 166.231 187.66 165.578 186.685C165.47 185.167 165.415 183.596 165.415 181.97C165.415 180.345 165.415 178.773 165.415 177.256C165.415 165.118 166.285 152.438 168.025 139.217C169.873 125.995 172.863 111.69 176.994 96.3005C177.429 94.7833 177.918 92.7241 178.462 90.1232C179.005 87.5222 179.549 84.8128 180.092 81.9951C177.048 83.5123 173.569 86.4384 169.655 90.7734C165.85 95 161.936 100.202 157.914 106.379C154 112.448 150.086 119.222 146.172 126.7C142.367 134.177 138.888 141.818 135.735 149.621C132.691 157.315 130.082 165.01 127.908 172.704C125.842 180.291 124.592 187.281 124.157 193.675Z\"\n        fill=\"white\"\n      />\n      <defs>\n        <linearGradient\n          id=\"paint0_linear_601_4643\"\n          x1=\"128\"\n          y1=\"0\"\n          x2=\"128\"\n          y2=\"256\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#EF786F\" />\n          <stop offset=\"1\" stopColor=\"#D8595E\" />\n        </linearGradient>\n        <linearGradient\n          id=\"paint1_linear_601_4643\"\n          x1=\"78\"\n          y1=\"3.7012e-06\"\n          x2=\"236\"\n          y2=\"256\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#9E7AFF\" />\n          <stop offset=\"0.333333\" stopColor=\"#FE8BBB\" />\n          <stop offset=\"0.666667\" stopColor=\"#FFBD7A\" />\n          <stop offset=\"1\" stopColor=\"#F8EAC3\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  ),\n  close: X,\n  spinner: Loader2,\n  chevronLeft: ChevronLeft,\n  discord: DiscordLogoIcon,\n  instagram: InstagramLogoIcon,\n  chevronRight: (props: IconProps) => (\n    <svg\n      fill=\"none\"\n      stroke=\"currentColor\"\n      width=\"11\"\n      height=\"11\"\n      viewBox=\"0 0 10 10\"\n      aria-hidden=\"true\"\n      strokeWidth=\"1.5\"\n      className=\"-mr-0.5\"\n      strokeLinecap=\"round\"\n      {...props}\n    >\n      <path\n        className=\"opacity-0 transition group-hover:opacity-100\"\n        d=\"M0 5h7\"\n        strokeLinecap=\"round\"\n      ></path>\n      <path\n        className=\"transition group-hover:translate-x-[3px]\"\n        d=\"M1 1l4 4-4 4\"\n        strokeLinecap=\"round\"\n      ></path>\n    </svg>\n  ),\n  trash: Trash,\n  post: FileText,\n  page: File,\n  media: Image,\n  settings: Settings,\n  billing: CreditCard,\n  ellipsis: MoreVertical,\n  add: Plus,\n  warning: AlertTriangle,\n  user: User,\n  arrowRight: ArrowRight,\n  help: HelpCircle,\n  pizza: Pizza,\n  twitter: (props: IconProps) => (\n    <svg\n      {...props}\n      height=\"23\"\n      viewBox=\"0 0 1200 1227\"\n      width=\"23\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z\" />\n    </svg>\n  ),\n  check: Check,\n  copy: Copy,\n  copyDone: ClipboardCheck,\n  sun: SunMedium,\n  moon: Moon,\n  laptop: Laptop,\n  gitHub: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n  radix: (props: IconProps) => (\n    <svg viewBox=\"0 0 25 25\" fill=\"none\" {...props}>\n      <path\n        d=\"M12 25C7.58173 25 4 21.4183 4 17C4 12.5817 7.58173 9 12 9V25Z\"\n        fill=\"currentcolor\"\n      ></path>\n      <path d=\"M12 0H4V8H12V0Z\" fill=\"currentcolor\"></path>\n      <path\n        d=\"M17 8C19.2091 8 21 6.20914 21 4C21 1.79086 19.2091 0 17 0C14.7909 0 13 1.79086 13 4C13 6.20914 14.7909 8 17 8Z\"\n        fill=\"currentcolor\"\n      ></path>\n    </svg>\n  ),\n  aria: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n      <path d=\"M13.966 22.624l-1.69-4.281H8.122l3.892-9.144 5.662 13.425zM8.884 1.376H0v21.248zm15.116 0h-8.884L24 22.624Z\" />\n    </svg>\n  ),\n  npm: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  yarn: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M12 0C5.375 0 0 5.375 0 12s5.375 12 12 12 12-5.375 12-12S18.625 0 12 0zm.768 4.105c.183 0 .363.053.525.157.125.083.287.185.755 1.154.31-.088.468-.042.551-.019.204.056.366.19.463.375.477.917.542 2.553.334 3.605-.241 1.232-.755 2.029-1.131 2.576.324.329.778.899 1.117 1.825.278.774.31 1.478.273 2.015a5.51 5.51 0 0 0 .602-.329c.593-.366 1.487-.917 2.553-.931.714-.009 1.269.445 1.353 1.103a1.23 1.23 0 0 1-.945 1.362c-.649.158-.95.278-1.821.843-1.232.797-2.539 1.242-3.012 1.39a1.686 1.686 0 0 1-.704.343c-.737.181-3.266.315-3.466.315h-.046c-.783 0-1.214-.241-1.45-.491-.658.329-1.51.19-2.122-.134a1.078 1.078 0 0 1-.58-1.153 1.243 1.243 0 0 1-.153-.195c-.162-.25-.528-.936-.454-1.946.056-.723.556-1.367.88-1.71a5.522 5.522 0 0 1 .408-2.256c.306-.727.885-1.348 1.32-1.737-.32-.537-.644-1.367-.329-2.21.227-.602.412-.936.82-1.08h-.005c.199-.074.389-.153.486-.259a3.418 3.418 0 0 1 2.298-1.103c.037-.093.079-.185.125-.283.31-.658.639-1.029 1.024-1.168a.94.94 0 0 1 .328-.06zm.006.7c-.507.016-1.001 1.519-1.001 1.519s-1.27-.204-2.266.871c-.199.218-.468.334-.746.44-.079.028-.176.023-.417.672-.371.991.625 2.094.625 2.094s-1.186.839-1.626 1.881c-.486 1.144-.338 2.261-.338 2.261s-.843.732-.899 1.487c-.051.663.139 1.2.343 1.515.227.343.51.176.51.176s-.561.653-.037.931c.477.25 1.283.394 1.71-.037.31-.31.371-1.001.486-1.283.028-.065.12.111.209.199.097.093.264.195.264.195s-.755.324-.445 1.066c.102.246.468.403 1.066.398.222-.005 2.664-.139 3.313-.296.375-.088.505-.283.505-.283s1.566-.431 2.998-1.357c.917-.598 1.293-.76 2.034-.936.612-.148.57-1.098-.241-1.084-.839.009-1.575.44-2.196.825-1.163.718-1.742.672-1.742.672l-.018-.032c-.079-.13.371-1.293-.134-2.678-.547-1.515-1.413-1.881-1.344-1.997.297-.5 1.038-1.297 1.334-2.78.176-.899.13-2.377-.269-3.151-.074-.144-.732.241-.732.241s-.616-1.371-.788-1.483a.271.271 0 0 0-.157-.046z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  pnpm: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M0 0v7.5h7.5V0zm8.25 0v7.5h7.498V0zm8.25 0v7.5H24V0zM8.25 8.25v7.5h7.498v-7.5zm8.25 0v7.5H24v-7.5zM0 16.5V24h7.5v-7.5zm8.25 0V24h7.498v-7.5zm8.25 0V24H24v-7.5z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  react: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  tailwind: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  google: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z\"\n      />\n    </svg>\n  ),\n  apple: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  applePay: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" {...props}>\n      <title>Apple Pay</title>\n      <path d=\"M2.15 4.318a42.16 42.16 0 0 0-.454.003c-.15.005-.303.013-.452.04a1.44 1.44 0 0 0-1.06.772c-.07.138-.114.278-.14.43-.028.148-.037.3-.04.45A10.2 10.2 0 0 0 0 6.222v11.557c0 .07.002.138.003.207.004.15.013.303.04.452.027.15.072.291.142.429a1.436 1.436 0 0 0 .63.63c.138.07.278.115.43.142.148.027.3.036.45.04l.208.003h20.194l.207-.003c.15-.004.303-.013.452-.04.15-.027.291-.071.428-.141a1.432 1.432 0 0 0 .631-.631c.07-.138.115-.278.141-.43.027-.148.036-.3.04-.45.002-.07.003-.138.003-.208l.001-.246V6.221c0-.07-.002-.138-.004-.207a2.995 2.995 0 0 0-.04-.452 1.446 1.446 0 0 0-1.2-1.201 3.022 3.022 0 0 0-.452-.04 10.448 10.448 0 0 0-.453-.003zm0 .512h19.942c.066 0 .131.002.197.003.115.004.25.01.375.032.109.02.2.05.287.094a.927.927 0 0 1 .407.407.997.997 0 0 1 .094.288c.022.123.028.258.031.374.002.065.003.13.003.197v11.552c0 .065 0 .13-.003.196-.003.115-.009.25-.032.375a.927.927 0 0 1-.5.693 1.002 1.002 0 0 1-.286.094 2.598 2.598 0 0 1-.373.032l-.2.003H1.906c-.066 0-.133-.002-.196-.003a2.61 2.61 0 0 1-.375-.032c-.109-.02-.2-.05-.288-.094a.918.918 0 0 1-.406-.407 1.006 1.006 0 0 1-.094-.288 2.531 2.531 0 0 1-.032-.373 9.588 9.588 0 0 1-.002-.197V6.224c0-.065 0-.131.002-.197.004-.114.01-.248.032-.375.02-.108.05-.199.094-.287a.925.925 0 0 1 .407-.406 1.03 1.03 0 0 1 .287-.094c.125-.022.26-.029.375-.032.065-.002.131-.002.196-.003zm4.71 3.7c-.3.016-.668.199-.88.456-.191.22-.36.58-.316.918.338.03.675-.169.888-.418.205-.258.345-.603.308-.955zm2.207.42v5.493h.852v-1.877h1.18c1.078 0 1.835-.739 1.835-1.812 0-1.07-.742-1.805-1.808-1.805zm.852.719h.982c.739 0 1.161.396 1.161 1.089 0 .692-.422 1.092-1.164 1.092h-.979zm-3.154.3c-.45.01-.83.28-1.05.28-.235 0-.593-.264-.981-.257a1.446 1.446 0 0 0-1.23.747c-.527.908-.139 2.255.374 2.995.249.366.549.769.944.754.373-.014.52-.242.973-.242.454 0 .586.242.98.235.41-.007.667-.366.915-.733.286-.417.403-.82.41-.841-.007-.008-.79-.308-.797-1.209-.008-.754.615-1.113.644-1.135-.352-.52-.9-.578-1.09-.593a1.123 1.123 0 0 0-.092-.002zm8.204.397c-.99 0-1.606.533-1.652 1.256h.777c.072-.358.369-.586.845-.586.502 0 .803.266.803.711v.309l-1.097.064c-.951.054-1.488.484-1.488 1.184 0 .72.548 1.207 1.332 1.207.526 0 1.032-.281 1.264-.727h.019v.659h.788v-2.76c0-.803-.62-1.317-1.591-1.317zm1.94.072l1.446 4.009c0 .003-.073.24-.073.247-.125.41-.33.571-.711.571-.069 0-.206 0-.267-.015v.666c.06.011.267.019.335.019.83 0 1.226-.312 1.568-1.283l1.5-4.214h-.868l-1.012 3.259h-.015l-1.013-3.26zm-1.167 2.189v.316c0 .521-.45.917-1.024.917-.442 0-.731-.228-.731-.579 0-.342.278-.56.769-.593z\" />\n    </svg>\n  ),\n\n  paypal: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" {...props}>\n      <path\n        d=\"M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  ),\n  notion: (props: IconProps) => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#fff\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000\"\n      />\n    </svg>\n  ),\n\n  openai: (props: IconProps) => (\n    <svg role=\"img\" viewBox=\"0 0 24 24\" {...props}>\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  zapier: (props: IconProps) => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      data-testid=\"ZapierLogo\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      ></path>\n      <path\n        d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\"\n        fill=\"#FF4F00\"\n      ></path>\n    </svg>\n  ),\n  googleDrive: (props: IconProps) => (\n    <svg viewBox=\"0 0 87.3 78\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  messenger: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      x=\"0px\"\n      y=\"0px\"\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      {...props}\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      ></path>\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      ></path>\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      ></path>\n      <path\n        fill=\"#fff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      ></path>\n    </svg>\n  ),\n  whatsapp: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 175.216 175.552\"\n      {...props}\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        fill=\"#b3b3b3\"\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        filter=\"url(#a)\"\n      />\n      <path\n        fill=\"#fff\"\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n      />\n      <path\n        fill=\"url(#linearGradient1780)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n      />\n      <path\n        fill=\"url(#b)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n      />\n      <path\n        fill=\"#fff\"\n        fillRule=\"evenodd\"\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n      />\n    </svg>\n  ),\n  googleDocs: (props: IconProps) => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <title>Docs-icon</title>\n      <desc>Created with Sketch.</desc>\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        ></path>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        ></path>\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\"></stop>\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\"></stop>\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        ></path>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        ></path>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        ></path>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        ></path>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        ></path>\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\"></stop>\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\"></stop>\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g\n          id=\"Consumer-Apps-Docs-Large-VD-R8\"\n          transform=\"translate(-451.000000, -463.000000)\"\n        >\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    ></path>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    ></path>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        ></path>\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    ></path>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    ></path>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\"></use>\n                    </mask>\n                    <g id=\"SVGID_1_\"></g>\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    ></path>\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                ></path>\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  json: (props: IconProps) => (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M12.043 23.968c.479-.004.953-.029 1.426-.094a11.805 11.805 0 0 0 3.146-.863 12.404 12.404 0 0 0 3.793-2.542 11.977 11.977 0 0 0 2.44-3.427 11.794 11.794 0 0 0 1.02-3.476c.149-1.16.135-2.346-.045-3.499a11.96 11.96 0 0 0-.793-2.788 11.197 11.197 0 0 0-.854-1.617c-1.168-1.837-2.861-3.314-4.81-4.3a12.835 12.835 0 0 0-2.172-.87h-.005c.119.063.24.132.345.201.12.074.239.146.351.225a8.93 8.93 0 0 1 1.559 1.33c1.063 1.145 1.797 2.548 2.218 4.041.284.982.434 1.998.495 3.017.044.743.044 1.491-.047 2.229-.149 1.27-.554 2.51-1.228 3.596a7.475 7.475 0 0 1-1.903 2.084c-1.244.928-2.877 1.482-4.436 1.114a3.916 3.916 0 0 1-.748-.258 4.692 4.692 0 0 1-.779-.45 6.08 6.08 0 0 1-1.244-1.105 6.507 6.507 0 0 1-1.049-1.747 7.366 7.366 0 0 1-.494-2.54c-.03-1.273.225-2.553.854-3.67a6.43 6.43 0 0 1 1.663-1.918c.225-.178.464-.333.704-.479l.016-.007a5.121 5.121 0 0 0-1.441-.12 4.963 4.963 0 0 0-1.228.24c-.359.12-.704.27-1.019.45a6.146 6.146 0 0 0-.733.494c-.211.18-.42.36-.615.555-1.123 1.153-1.768 2.682-2.022 4.256-.15.973-.15 1.96-.091 2.95.105 1.395.391 2.787.945 4.062a8.518 8.518 0 0 0 1.348 2.173 8.14 8.14 0 0 0 3.132 2.23 7.934 7.934 0 0 0 2.113.54c.074.015.149.015.209.015zm-2.934-.398a4.102 4.102 0 0 1-.45-.228 8.5 8.5 0 0 1-2.038-1.534c-1.094-1.137-1.827-2.566-2.247-4.08a15.184 15.184 0 0 1-.495-3.172 12.14 12.14 0 0 1 .046-2.082c.135-1.257.495-2.501 1.124-3.58a6.889 6.889 0 0 1 1.783-2.053 6.23 6.23 0 0 1 1.633-.9 5.363 5.363 0 0 1 3.522-.045c.029 0 .029 0 .045.03.015.015.045.015.06.03.045.016.104.045.165.074.239.12.479.271.704.42a6.294 6.294 0 0 1 2.097 2.502c.42.914.615 1.934.631 2.938.014 1.079-.18 2.157-.645 3.146a6.42 6.42 0 0 1-2.638 2.832c.09.03.18.045.271.075.225.044.449.074.688.074 1.468.045 2.892-.66 3.94-1.647.195-.18.375-.375.54-.585.225-.27.435-.54.614-.823.239-.375.435-.75.614-1.154a8.112 8.112 0 0 0 .509-1.664c.196-1.004.211-2.022.149-3.026-.135-2.022-.673-4.045-1.842-5.724a9.054 9.054 0 0 0-.555-.719 9.868 9.868 0 0 0-1.063-1.034 8.477 8.477 0 0 0-1.363-.915 9.927 9.927 0 0 0-1.692-.598l-.3-.06c-.209-.03-.42-.044-.634-.06a8.453 8.453 0 0 0-1.015.016c-.704.045-1.412.16-2.112.337C5.799 1.227 2.863 3.566 1.3 6.67A11.834 11.834 0 0 0 .238 9.801a11.81 11.81 0 0 0-.104 3.775c.12 1.02.374 2.023.778 2.977.227.57.511 1.124.825 1.648 1.094 1.783 2.683 3.236 4.51 4.24.688.39 1.408.69 2.157.944.226.074.45.15.689.21z\"\n      />\n    </svg>\n  ),\n  ts: (props: IconProps) => (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" {...props}>\n      <path d=\"M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z\" />\n    </svg>\n  ),\n  css: (props: IconProps) => (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" {...props}>\n      <path d=\"M0 0v20.16A3.84 3.84 0 0 0 3.84 24h16.32A3.84 3.84 0 0 0 24 20.16V3.84A3.84 3.84 0 0 0 20.16 0Zm14.256 13.08c1.56 0 2.28 1.08 2.304 2.64h-1.608c.024-.288-.048-.6-.144-.84-.096-.192-.288-.264-.552-.264-.456 0-.696.264-.696.84-.024.576.288.888.768 1.08.72.288 1.608.744 1.92 1.296q.432.648.432 1.656c0 1.608-.912 2.592-2.496 2.592-1.656 0-2.4-1.032-2.424-2.688h1.68c0 .792.264 1.176.792 1.176.264 0 .456-.072.552-.24.192-.312.24-1.176-.048-1.512-.312-.408-.912-.6-1.32-.816q-.828-.396-1.224-.936c-.24-.36-.36-.888-.36-1.536 0-1.44.936-2.472 2.424-2.448m5.4 0c1.584 0 2.304 1.08 2.328 2.64h-1.608c0-.288-.048-.6-.168-.84-.096-.192-.264-.264-.528-.264-.48 0-.72.264-.72.84s.288.888.792 1.08c.696.288 1.608.744 1.92 1.296.264.432.408.984.408 1.656.024 1.608-.888 2.592-2.472 2.592-1.68 0-2.424-1.056-2.448-2.688h1.68c0 .744.264 1.176.792 1.176.264 0 .456-.072.552-.24.216-.312.264-1.176-.048-1.512-.288-.408-.888-.6-1.32-.816-.552-.264-.96-.576-1.2-.936s-.36-.888-.36-1.536c-.024-1.44.912-2.472 2.4-2.448m-11.031.018c.711-.006 1.419.198 1.839.63.432.432.672 1.128.648 1.992H9.336c.024-.456-.096-.792-.432-.96-.312-.144-.768-.048-.888.24-.12.264-.192.576-.168.864v3.504c0 .744.264 1.128.768 1.128a.65.65 0 0 0 .552-.264c.168-.24.192-.552.168-.84h1.776c.096 1.632-.984 2.712-2.568 2.688-1.536 0-2.496-.864-2.472-2.472v-4.032c0-.816.24-1.44.696-1.848.432-.408 1.146-.624 1.857-.63\" />\n    </svg>\n  ),\n  bash: (props: IconProps) => (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" {...props}>\n      <path d=\"M21.038 4.9 13.461.402a2.86 2.86 0 0 0-2.923.001L2.961 4.9A3.023 3.023 0 0 0 1.5 7.503v8.995c0 1.073.557 2.066 1.462 2.603l7.577 4.497a2.86 2.86 0 0 0 2.922 0l7.577-4.497a3.023 3.023 0 0 0 1.462-2.603V7.503A3.021 3.021 0 0 0 21.038 4.9zM15.17 18.946l.013.646c.001.078-.05.167-.111.198l-.383.22c-.061.031-.111-.007-.112-.085l-.007-.635c-.328.136-.66.169-.872.084-.04-.016-.057-.075-.041-.142l.139-.584a.24.24 0 0 1 .069-.121.163.163 0 0 1 .036-.026c.022-.011.043-.014.062-.006.229.077.521.041.802-.101.357-.181.596-.545.592-.907-.003-.328-.181-.465-.613-.468-.55.001-1.064-.107-1.072-.917-.007-.667.34-1.361.889-1.8l-.007-.652c-.001-.08.048-.168.111-.2l.37-.236c.061-.031.111.007.112.087l.006.653c.273-.109.511-.138.726-.088.047.012.067.076.048.151l-.144.578a.255.255 0 0 1-.065.116.161.161 0 0 1-.038.028.083.083 0 0 1-.057.009c-.098-.022-.332-.073-.699.113-.385.195-.52.53-.517.778.003.297.155.387.681.396.7.012 1.003.318 1.01 1.023.007.689-.362 1.433-.928 1.888zm3.973-1.087c0 .06-.008.116-.058.145l-1.916 1.164c-.05.029-.09.004-.09-.056v-.494c0-.06.037-.093.087-.122l1.887-1.129c.05-.029.09-.004.09.056v.436zm1.316-11.062-7.168 4.427c-.894.523-1.553 1.109-1.553 2.187v8.833c0 .645.26 1.063.66 1.184a2.304 2.304 0 0 1-.398.039c-.42 0-.833-.114-1.197-.33L3.226 18.64a2.494 2.494 0 0 1-1.201-2.142V7.503c0-.881.46-1.702 1.201-2.142L10.803.863a2.342 2.342 0 0 1 2.394 0l7.577 4.498a2.479 2.479 0 0 1 1.164 1.732c-.252-.536-.818-.682-1.479-.296z\" />\n    </svg>\n  ),\n  v0: (props: IconProps) => (\n    <svg\n      viewBox=\"0 0 40 20\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M23.3919 0H32.9188C36.7819 0 39.9136 3.13165 39.9136 6.99475V16.0805H36.0006V6.99475C36.0006 6.90167 35.9969 6.80925 35.9898 6.71766L26.4628 16.079C26.4949 16.08 26.5272 16.0805 26.5595 16.0805H36.0006V19.7762H26.5595C22.6964 19.7762 19.4788 16.6139 19.4788 12.7508V3.68923H23.3919V12.7508C23.3919 12.9253 23.4054 13.0977 23.4316 13.2668L33.1682 3.6995C33.0861 3.6927 33.003 3.68923 32.9188 3.68923H23.3919V0Z\"\n        fill=\"currentColor\"\n      ></path>\n      <path\n        d=\"M13.7688 19.0956L0 3.68759H5.53933L13.6231 12.7337V3.68759H17.7535V17.5746C17.7535 19.6705 15.1654 20.6584 13.7688 19.0956Z\"\n        fill=\"currentColor\"\n      ></path>\n    </svg>\n  ),\n}\n\nexport function getIconForLanguageExtension(language: string) {\n  switch (language) {\n    case \"json\":\n      return <Icons.json />\n    case \"css\":\n      return <Icons.css className=\"fill-foreground\" />\n    case \"js\":\n    case \"jsx\":\n    case \"ts\":\n    case \"tsx\":\n    case \"typescript\":\n      return <Icons.ts className=\"fill-foreground\" />\n    default:\n      return <FileIcon />\n  }\n}\n"
  },
  {
    "path": "apps/www/components/logo-button.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { toast } from \"sonner\"\n\nimport { siteConfig } from \"@/config/site\"\nimport {\n  ContextMenu,\n  ContextMenuContent,\n  ContextMenuItem,\n  ContextMenuTrigger,\n} from \"@/components/ui/context-menu\"\nimport { Icons } from \"@/components/icons\"\n\nexport function LogoButton() {\n  function copyLogoAsSVG(path: string) {\n    fetch(path)\n      .then((response) => response.blob())\n      .then((blob) => {\n        const reader = new FileReader()\n        reader.onload = function (event) {\n          const svgContent = event.target?.result\n          navigator.clipboard.writeText(svgContent as string)\n        }\n        reader.readAsText(blob)\n        toast.success(\"Logo copied to clipboard\")\n      })\n  }\n\n  function copyLogoAsPNG(path: string) {\n    fetch(path)\n      .then((response) => response.blob())\n      .then((blob) => {\n        const item = new ClipboardItem({ \"image/png\": blob })\n        navigator.clipboard.write([item])\n        toast.success(\"Logo copied to clipboard\")\n      })\n  }\n  return (\n    <ContextMenu>\n      <ContextMenuTrigger asChild>\n        <Link\n          href=\"/\"\n          className=\"relative mr-6 flex items-center space-x-2\"\n          aria-label=\"Home\"\n        >\n          <Icons.logo className=\"size-6\" />\n          <span className=\"hidden font-bold md:inline-block\">\n            {siteConfig.name}\n          </span>\n        </Link>\n      </ContextMenuTrigger>\n      <ContextMenuContent>\n        <ContextMenuItem\n          className=\"flex items-center gap-2\"\n          onClick={() => copyLogoAsSVG(\"/icon.svg\")}\n        >\n          <Icons.logo className=\"size-4\" />\n          <span>Copy Logo as SVG</span>\n        </ContextMenuItem>\n        <ContextMenuItem\n          className=\"flex items-center gap-2\"\n          onClick={() => copyLogoAsPNG(\"/icon.png\")}\n        >\n          <Icons.logo className=\"size-4\" />\n          <span>Copy Logo as PNG</span>\n        </ContextMenuItem>\n      </ContextMenuContent>\n    </ContextMenu>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/main-nav.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\nimport { NavItem } from \"@/types\"\n\nimport { trackEvent } from \"@/lib/events\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\nexport function MainNav({\n  items,\n  className,\n  ...props\n}: React.ComponentProps<\"nav\"> & {\n  items: NavItem[]\n}) {\n  const pathname = usePathname()\n\n  return (\n    <nav className={cn(\"items-center gap-0.5\", className)} {...props}>\n      {items.map((item) => (\n        <Button key={item.href} variant=\"ghost\" asChild size=\"sm\">\n          <Link\n            href={item.href ?? \"\"}\n            className={cn(pathname === item.href && \"text-primary\")}\n            onClick={() => {\n              if (item.event) {\n                trackEvent({ name: item.event })\n              }\n            }}\n          >\n            {item.title}\n          </Link>\n        </Button>\n      ))}\n    </nav>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/mobile-nav.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport Link, { LinkProps } from \"next/link\"\nimport { useRouter } from \"next/navigation\"\n\nimport { docsConfig } from \"@/config/docs\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\"\n\nexport function MobileNav({ className }: { className?: string }) {\n  const [open, setOpen] = React.useState(false)\n\n  return (\n    <Popover open={open} onOpenChange={setOpen}>\n      <PopoverTrigger asChild>\n        <Button\n          variant=\"ghost\"\n          className={cn(\n            \"extend-touch-target h-8 touch-manipulation items-center justify-start gap-2.5 !p-0 hover:bg-transparent focus-visible:bg-transparent focus-visible:ring-0 active:bg-transparent dark:hover:bg-transparent\",\n            className\n          )}\n        >\n          <div className=\"relative flex h-8 w-4 items-center justify-center\">\n            <div className=\"relative size-4\">\n              <span\n                className={cn(\n                  \"bg-foreground absolute left-0 block h-0.5 w-4 transition-all duration-100\",\n                  open ? \"top-[0.4rem] -rotate-45\" : \"top-1\"\n                )}\n              />\n              <span\n                className={cn(\n                  \"bg-foreground absolute left-0 block h-0.5 w-4 transition-all duration-100\",\n                  open ? \"top-[0.4rem] rotate-45\" : \"top-2.5\"\n                )}\n              />\n            </div>\n            <span className=\"sr-only\">Toggle Menu</span>\n          </div>\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent\n        className=\"bg-background/90 no-scrollbar h-(--radix-popper-available-height) w-(--radix-popper-available-width) overflow-y-auto rounded-none border-none p-0 shadow-none backdrop-blur duration-100\"\n        align=\"start\"\n        side=\"bottom\"\n        alignOffset={-16}\n        sideOffset={14}\n      >\n        <div className=\"flex flex-col gap-12 overflow-auto px-6 py-6\">\n          <div className=\"flex flex-col gap-4\">\n            <div className=\"text-muted-foreground text-sm font-medium\">\n              Menu\n            </div>\n            <div className=\"flex flex-col gap-3\">\n              <MobileLink href=\"/\" onOpenChange={setOpen}>\n                Home\n              </MobileLink>\n              {docsConfig.mainNav.map(\n                (item, index) =>\n                  item.href && (\n                    <MobileLink\n                      key={index}\n                      href={item.href}\n                      onOpenChange={setOpen}\n                    >\n                      <span className=\"flex items-center gap-2\">\n                        {item.title}\n                        {item.label && (\n                          <span className=\"rounded-md bg-[#adfa1d] px-1.5 py-0.5 text-xs leading-none text-[#000000] no-underline group-hover:no-underline\">\n                            {item.label}\n                          </span>\n                        )}\n                        {item.paid && (\n                          <span className=\"rounded-md bg-gradient-to-r from-orange-400 to-orange-600 px-1.5 py-0.5 text-xs leading-none text-white no-underline group-hover:no-underline\">\n                            Pro\n                          </span>\n                        )}\n                      </span>\n                    </MobileLink>\n                  )\n              )}\n            </div>\n          </div>\n          <div className=\"flex flex-col gap-8\">\n            {docsConfig.sidebarNav.map((section, index) => {\n              return (\n                <div\n                  key={`${section.title}-${index}`}\n                  className=\"flex flex-col gap-4\"\n                >\n                  <div className=\"text-muted-foreground text-sm font-medium\">\n                    {section.title}\n                  </div>\n                  <div className=\"flex flex-col gap-3\">\n                    {section.items?.map(\n                      (item) =>\n                        item.href && (\n                          <MobileLink\n                            key={item.href}\n                            href={item.href}\n                            onOpenChange={setOpen}\n                          >\n                            <span className=\"flex items-center gap-2\">\n                              {item.title}\n                              {item.label && (\n                                <span className=\"rounded-md bg-[#adfa1d] px-1.5 py-0.5 text-xs leading-none text-[#000000] no-underline group-hover:no-underline\">\n                                  {item.label}\n                                </span>\n                              )}\n                              {item.paid && (\n                                <span className=\"rounded-md bg-gradient-to-r from-orange-400 to-orange-600 px-1.5 py-0.5 text-xs leading-none text-white no-underline group-hover:no-underline\">\n                                  Pro\n                                </span>\n                              )}\n                            </span>\n                          </MobileLink>\n                        )\n                    )}\n                  </div>\n                </div>\n              )\n            })}\n          </div>\n        </div>\n      </PopoverContent>\n    </Popover>\n  )\n}\n\nfunction MobileLink({\n  href,\n  onOpenChange,\n  className,\n  children,\n  ...props\n}: LinkProps & {\n  onOpenChange?: (open: boolean) => void\n  children: React.ReactNode\n  className?: string\n}) {\n  const router = useRouter()\n  return (\n    <Link\n      href={href}\n      onClick={() => {\n        router.push(href.toString())\n        onOpenChange?.(false)\n      }}\n      className={cn(\"text-2xl font-medium\", className)}\n      {...props}\n    >\n      {children}\n    </Link>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/mode-toggle.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\n\nimport { useMetaColor } from \"@/hooks/use-meta-color\"\nimport { Button } from \"@/components/ui/button\"\n\nexport function ModeToggle() {\n  const { setTheme, resolvedTheme } = useTheme()\n  const { setMetaColor, metaColor } = useMetaColor()\n\n  React.useEffect(() => {\n    setMetaColor(metaColor)\n  }, [metaColor, setMetaColor])\n\n  const toggleTheme = React.useCallback(() => {\n    setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\")\n  }, [resolvedTheme, setTheme])\n\n  return (\n    <Button\n      variant=\"ghost\"\n      size=\"icon\"\n      className=\"group/toggle extend-touch-target size-8\"\n      onClick={toggleTheme}\n      title=\"Toggle theme\"\n    >\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"24\"\n        height=\"24\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        className=\"size-4.5\"\n      >\n        <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n        <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\n        <path d=\"M12 3l0 18\" />\n        <path d=\"M12 9l4.65 -4.65\" />\n        <path d=\"M12 14.3l7.37 -7.37\" />\n        <path d=\"M12 19.6l8.85 -8.85\" />\n      </svg>\n      <span className=\"sr-only\">Toggle theme</span>\n    </Button>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/open-in-v0-button.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\n\nexport function OpenInV0Button({ url }: { url: string }) {\n  return (\n    <Button\n      aria-label=\"Open in v0\"\n      className=\"h-8 gap-1 rounded-[6px] bg-black px-3 text-xs text-white hover:bg-black hover:text-white dark:bg-white dark:text-black\"\n      asChild\n    >\n      <a\n        href={`https://v0.dev/chat/api/open?url=${url}`}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n      >\n        Open in{\" \"}\n        <svg\n          viewBox=\"0 0 40 20\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          className=\"size-5 text-current\"\n        >\n          <path\n            d=\"M23.3919 0H32.9188C36.7819 0 39.9136 3.13165 39.9136 6.99475V16.0805H36.0006V6.99475C36.0006 6.90167 35.9969 6.80925 35.9898 6.71766L26.4628 16.079C26.4949 16.08 26.5272 16.0805 26.5595 16.0805H36.0006V19.7762H26.5595C22.6964 19.7762 19.4788 16.6139 19.4788 12.7508V3.68923H23.3919V12.7508C23.3919 12.9253 23.4054 13.0977 23.4316 13.2668L33.1682 3.6995C33.0861 3.6927 33.003 3.68923 32.9188 3.68923H23.3919V0Z\"\n            fill=\"currentColor\"\n          ></path>\n          <path\n            d=\"M13.7688 19.0956L0 3.68759H5.53933L13.6231 12.7337V3.68759H17.7535V17.5746C17.7535 19.6705 15.1654 20.6584 13.7688 19.0956Z\"\n            fill=\"currentColor\"\n          ></path>\n        </svg>\n      </a>\n    </Button>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/ping-dot.tsx",
    "content": "export function PingDot() {\n  return (\n    <div className=\"relative inline-flex\">\n      <span className=\"absolute size-2 animate-ping rounded-full bg-green-500 opacity-75\"></span>\n      <span className=\"relative inline-flex size-2 rounded-full bg-green-500\"></span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/posthog-provider.tsx",
    "content": "\"use client\"\n\nimport { useEffect } from \"react\"\nimport { usePathname, useSearchParams } from \"next/navigation\"\nimport posthog from \"posthog-js\"\nimport { PostHogProvider } from \"posthog-js/react\"\n\nimport {\n  capturePostHogEvent,\n  initPostHog,\n  isPostHogEnabled,\n} from \"@/lib/posthog\"\n\ninitPostHog()\n\nexport function PostHogPageview(): React.ReactNode {\n  const pathname = usePathname()\n  const searchParams = useSearchParams()\n\n  useEffect(() => {\n    if (!isPostHogEnabled || !pathname) {\n      return\n    }\n\n    let url = window.origin + pathname\n    if (searchParams && searchParams.toString()) {\n      url = url + `?${searchParams.toString()}`\n    }\n\n    capturePostHogEvent(\"$pageview\", {\n      $current_url: url,\n    })\n  }, [pathname, searchParams])\n\n  return <></>\n}\n\nexport function PHProvider({ children }: { children: React.ReactNode }) {\n  if (!isPostHogEnabled) {\n    return children\n  }\n\n  return <PostHogProvider client={posthog}>{children}</PostHogProvider>\n}\n"
  },
  {
    "path": "apps/www/components/sections/component-demos.tsx",
    "content": "import { notFound } from \"next/navigation\"\nimport { mdxComponents } from \"@/mdx-components\"\n\nimport { source } from \"@/lib/source\"\n\nconst PAGE = \"home\"\n\nexport function ComponentDemos() {\n  const pages = source.getPages()\n  const page = pages.find((page) => page.url === PAGE)\n\n  if (!page) {\n    notFound()\n  }\n\n  const MDX = page.data.body\n\n  return (\n    <section id=\"component-demos\" className=\"container max-w-5xl py-14\">\n      <h2 className=\"text-foreground mb-2 text-center text-5xl leading-[1.2] font-bold tracking-tighter\">\n        Component Demos\n      </h2>\n      <h3 className=\"text-foreground/80 mx-auto mb-8 text-center text-lg font-medium tracking-tight text-balance\">\n        Here are some of the components that you can use to build your landing\n        pages.\n      </h3>\n      <MDX components={mdxComponents} />\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/cta.tsx",
    "content": "import { ChevronRight, HeartHandshake } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\nexport function CTASection() {\n  return (\n    <section id=\"cta\">\n      <div className=\"py-14\">\n        <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden border-y p-14\">\n          <div className=\"z-10 mx-auto size-24 rounded-[2rem] border bg-white/10 p-3 shadow-2xl backdrop-blur-md lg:size-32 dark:bg-black/10\">\n            <HeartHandshake className=\"mx-auto size-16 text-black lg:size-24 dark:text-white\" />\n          </div>\n          <div className=\"z-10 mt-4 flex flex-col items-center text-center text-black dark:text-white\">\n            <h1 className=\"text-3xl font-bold lg:text-4xl\">\n              Looking for templates instead?\n            </h1>\n            <p className=\"mt-2\">Check out Magic UI Pro</p>\n            <a\n              href=\"https://pro.magicui.design/\"\n              className={cn(\n                buttonVariants({\n                  size: \"lg\",\n                  variant: \"outline\",\n                }),\n                \"group mt-4 rounded-[2rem] px-6\"\n              )}\n            >\n              Get Magic UI Pro\n              <ChevronRight className=\"ml-1 size-4 transition-all duration-300 ease-out group-hover:translate-x-1\" />\n            </a>\n          </div>\n          <div className=\"absolute inset-x-0 bottom-0 h-full bg-linear-to-b from-transparent to-white to-70% dark:to-black\" />\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/expandable-masonary-section.tsx",
    "content": "\"use client\"\n\nimport { useRef, useState } from \"react\"\nimport dynamic from \"next/dynamic\"\nimport { AnimatePresence, motion } from \"motion/react\"\n\nimport { Button } from \"@/components/ui/button\"\n\nconst Masonry = dynamic(() => import(\"masonic\").then((mod) => mod.Masonry), {\n  ssr: false,\n})\n\ninterface ExpandableMasonarySectionProps {\n  children: React.ReactNode[]\n}\n\nexport function ExpandableMasonarySection({\n  children,\n}: ExpandableMasonarySectionProps) {\n  const [expanded, setExpanded] = useState(false)\n  const sectionRef = useRef<HTMLDivElement>(null)\n\n  const handleToggle = () => {\n    setExpanded(!expanded)\n  }\n\n  return (\n    <>\n      <motion.div\n        ref={sectionRef}\n        className=\"relative overflow-hidden\"\n        initial={{ maxHeight: \"800px\" }}\n        animate={{ maxHeight: expanded ? \"4000px\" : \"800px\" }}\n        transition={{ duration: 1.6, ease: [0.25, 0.1, 0.25, 1] }}\n        exit={{ maxHeight: \"800px\" }}\n      >\n        <Masonry\n          items={children}\n          columnGutter={16}\n          columnWidth={300}\n          render={({ data }) => <>{data}</>}\n        />\n        <AnimatePresence>\n          {!expanded && (\n            <motion.div\n              initial={{ opacity: 0 }}\n              animate={{ opacity: 1 }}\n              exit={{ opacity: 0 }}\n              className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-32 bg-linear-to-t\"\n            />\n          )}\n        </AnimatePresence>\n      </motion.div>\n      <Button\n        onClick={handleToggle}\n        className=\"mx-auto mt-4 block\"\n        variant=\"outline\"\n      >\n        {expanded ? \"Show Less\" : \"Show More\"}\n      </Button>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/hero.tsx",
    "content": "import Link from \"next/link\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { source } from \"@/lib/source\"\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { TechStack } from \"@/components/tech-stack\"\n\nexport function Hero() {\n  const pages = source.getPages() as Array<{\n    data?: { title?: string; date?: string }\n    url?: string\n  }>\n  const page = pages.sort((a, b) => {\n    const dateA = a?.data?.date\n    const dateB = b?.data?.date\n    if (!dateA && !dateB) return 0\n    if (!dateA) return 1\n    if (!dateB) return -1\n    return new Date(dateB).getTime() - new Date(dateA).getTime()\n  })[0]\n  const pageTitle = page?.data?.title\n\n  return (\n    <section id=\"hero\">\n      <div className=\"relative h-full overflow-hidden py-5 md:py-14\">\n        <div className=\"z-10 flex flex-col\">\n          <div className=\"mt-10 grid grid-cols-1 md:mt-20\">\n            <div className=\"flex flex-col items-start gap-6 px-7 pb-8 text-center md:items-center md:px-10\">\n              <Link\n                href={page?.url ?? \"\"}\n                className={cn(\n                  buttonVariants({\n                    variant: \"outline\",\n                    size: \"sm\",\n                  }),\n                  \"rounded-full\"\n                )}\n              >\n                🎉 <Separator className=\"mx-2 h-4\" orientation=\"vertical\" />\n                Introducing {pageTitle}\n                <ChevronRight className=\"text-muted-foreground ml-1 size-4\" />\n              </Link>\n              <div className=\"relative flex flex-col gap-4 md:items-center lg:flex-row\">\n                <h1\n                  className={cn(\n                    \"text-black dark:text-white\",\n                    \"relative mx-0 max-w-174 pt-5 md:mx-auto md:px-4 md:py-2\",\n                    \"text-left font-semibold tracking-tighter text-balance md:text-center\",\n                    \"text-5xl sm:text-7xl md:text-7xl lg:text-7xl\"\n                  )}\n                >\n                  UI library for Design Engineers\n                </h1>\n              </div>\n\n              <p className=\"text-primary max-w-xl text-left text-base tracking-tight text-balance md:text-center md:text-lg\">\n                150+ free and open-source animated components and effects built\n                with <b className=\"font-[550] dark:font-[580]\">React</b>,{\" \"}\n                <b className=\"font-[550] dark:font-[580]\">Typescript</b>,{\" \"}\n                <b className=\"font-[550] dark:font-[580]\">Tailwind CSS</b>, and{\" \"}\n                <b className=\"font-[550] dark:font-[580]\">Motion</b>\n                .\n                <br />\n                Perfect companion for{\" \"}\n                <b className=\"font-[550] dark:font-[580]\">shadcn/ui</b>.\n              </p>\n\n              <div className=\"flex w-full flex-col gap-4 gap-y-2 md:mx-auto md:max-w-xs md:flex-row md:justify-center\">\n                <Link\n                  href=\"/components\"\n                  className={cn(\n                    buttonVariants({\n                      variant: \"rainbow\",\n                      size: \"lg\",\n                    }),\n                    \"w-full gap-2\"\n                  )}\n                >\n                  Browse Components\n                  <ChevronRight className=\"ml-1 size-4 shrink-0 transition-all duration-300 ease-out group-hover:translate-x-1\" />\n                </Link>\n                <Link\n                  href=\"https://pro.magicui.design\"\n                  className={cn(\n                    buttonVariants({\n                      size: \"lg\",\n                      variant: \"rainbow-outline\",\n                    }),\n                    \"w-full gap-2\"\n                  )}\n                >\n                  Browse Templates\n                  <ChevronRight className=\"ml-1 size-4 shrink-0 transition-all duration-300 ease-out group-hover:translate-x-1\" />\n                </Link>\n              </div>\n            </div>\n          </div>\n\n          <div className=\"relative mx-auto flex w-full max-w-56 items-center justify-center\">\n            <TechStack\n              className=\"mx-auto flex w-full items-center justify-between\"\n              technologies={[\n                \"react\",\n                \"typescript\",\n                \"tailwindcss\",\n                \"motion\",\n                \"shadcn\",\n              ]}\n            />\n          </div>\n        </div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/showcase.tsx",
    "content": "import Image from \"next/image\"\nimport Link from \"next/link\"\nimport { ChevronRightIcon } from \"@radix-ui/react-icons\"\n\nimport { showcaseSource } from \"@/lib/source\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nfunction isExternalHref(href: string) {\n  try {\n    const url = new URL(href)\n    return url.protocol === \"http:\" || url.protocol === \"https:\"\n  } catch {\n    return false\n  }\n}\n\nexport interface ShowcaseCardProps {\n  title: string\n  image: string\n  href: string\n  affiliation?: string\n}\nexport function ShowcaseCard({\n  title,\n  image,\n  href,\n  affiliation,\n}: ShowcaseCardProps) {\n  const isExternal = isExternalHref(href)\n  return (\n    <Link\n      href={href}\n      prefetch={isExternal ? false : undefined}\n      rel={isExternal ? \"noopener noreferrer\" : undefined}\n      target={isExternal ? \"_blank\" : undefined}\n      className=\"group relative flex cursor-pointer flex-col gap-2 overflow-hidden\"\n    >\n      <Image\n        src={image}\n        alt={title}\n        width={500}\n        height={300}\n        className=\"size-full h-[300px] max-h-[300px] rounded-xl object-cover\"\n      />\n\n      <div className=\"flex flex-col\">\n        <div className=\"group inline-flex cursor-pointer items-center justify-start gap-1 text-xl font-semibold text-neutral-700 duration-200 hover:text-neutral-700 dark:text-neutral-300 dark:hover:text-neutral-200\">\n          {title}\n          <ChevronRightIcon className=\"size-4 translate-x-0 opacity-0 transition-all duration-300 ease-out group-hover:translate-x-1 group-hover:opacity-100\" />\n        </div>\n        <p className=\"text-sm text-neutral-400\">{affiliation}</p>\n      </div>\n    </Link>\n  )\n}\n\nexport function Showcase() {\n  const showcases = showcaseSource.getPages()\n  return (\n    <section id=\"showcase\" className=\"container py-10 md:py-14\">\n      <h2 className=\"text-foreground mb-2 text-center text-3xl leading-[1.2] font-semibold tracking-tighter text-balance md:text-4xl lg:text-5xl\">\n        Showcase\n      </h2>\n      <h3 className=\"text-foreground/80 mx-auto mb-8 text-center text-lg font-medium tracking-tight text-balance\">\n        Companies choose Magic UI to build their landing pages.\n      </h3>\n      <div className=\"relative flex flex-col\">\n        <Marquee className=\"max-w-screen [--duration:90s]\">\n          {showcases\n            .filter((showcase) => showcase.data.featured)\n            .map((showcase, idx) => (\n              <ShowcaseCard\n                key={idx}\n                href={showcase.data.href ?? showcase.url}\n                title={showcase.data.title ?? \"\"}\n                affiliation={showcase.data.affiliation ?? \"\"}\n                image={showcase.data.image ?? \"\"}\n              />\n            ))}\n        </Marquee>\n        <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 h-full w-1/12 bg-linear-to-r\"></div>\n        <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 h-full w-1/12 bg-linear-to-l\"></div>\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/testimonial-tweet-link.tsx",
    "content": "\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, ReactNode } from \"react\"\nimport Link from \"next/link\"\nimport { ArrowUpRight } from \"lucide-react\"\n\nimport { Button } from \"@/components/ui/button\"\n\ninterface TestimonialTweetLinkProps {\n  children: ReactNode\n  tweetUrl: string\n}\n\nconst interactiveSelector =\n  'a, button, input, select, textarea, summary, [role=\"button\"], [role=\"link\"]'\n\nconst isInteractiveTarget = (\n  target: EventTarget | null,\n  container: Element\n) => {\n  if (!(target instanceof Element)) {\n    return false\n  }\n\n  const interactiveElement = target.closest(interactiveSelector)\n\n  return interactiveElement !== null && interactiveElement !== container\n}\n\nexport function TestimonialTweetLink({\n  children,\n  tweetUrl,\n}: TestimonialTweetLinkProps) {\n  const navigateToTweet = () => {\n    window.location.assign(tweetUrl)\n  }\n\n  const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n    if (isInteractiveTarget(event.target, event.currentTarget)) {\n      return\n    }\n\n    navigateToTweet()\n  }\n\n  const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n    if (event.target !== event.currentTarget) {\n      return\n    }\n\n    if (event.key !== \"Enter\" && event.key !== \" \") {\n      return\n    }\n\n    event.preventDefault()\n    navigateToTweet()\n  }\n\n  return (\n    <div\n      className=\"group relative block contain-layout\"\n      onClick={handleClick}\n      onKeyDown={handleKeyDown}\n      role=\"link\"\n      tabIndex={0}\n    >\n      {children}\n      <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center rounded-lg bg-black/5 opacity-0 backdrop-blur-sm transition-opacity duration-200 ease-in-out will-change-[opacity] group-hover:pointer-events-auto group-hover:opacity-100\">\n        <Button\n          asChild\n          variant=\"default\"\n          size=\"default\"\n          className=\"pointer-events-auto h-8 w-fit translate-y-3 px-2 transition-transform duration-200 ease-in-out will-change-transform group-hover:translate-y-0\"\n        >\n          <Link href={tweetUrl}>\n            View Tweet\n            <ArrowUpRight className=\"h-4 w-4\" />\n          </Link>\n        </Button>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/testimonials.tsx",
    "content": "import { ExpandableMasonarySection } from \"@/components/sections/expandable-masonary-section\"\nimport { TestimonialTweetLink } from \"@/components/sections/testimonial-tweet-link\"\nimport { TweetCard } from \"@/registry/magicui/tweet-card\"\n\nconst allTweets = [\n  \"https://x.com/steventey/status/1722659583464968612\",\n  \"https://x.com/rauchg/status/1867249854613008822\",\n  \"https://x.com/mckaywrigley/status/1831098800351719924\",\n  \"https://x.com/chronark_/status/1754781648262967323\",\n  \"https://x.com/aidenybai/status/1793403298843869672\",\n  \"https://x.com/phuctm97/status/1793443202592288914\",\n  \"https://x.com/RayFernando1337/status/1821208623638573211\",\n  \"https://x.com/SullyOmarr/status/1668506160620769280\",\n  \"https://x.com/vahaah/status/1878800566144708650\",\n  \"https://x.com/DmytroKrasun/status/1793642777873633543\",\n  \"https://x.com/MarcKlingen/status/1793422145399455746\",\n  \"https://x.com/jordanphughes/status/1794287517430415390\",\n  \"https://x.com/jordienr/status/1681389309037772820\",\n  \"https://x.com/mckaywrigley/status/1831185841051590857\",\n  \"https://x.com/karmpat72748262/status/1889758543840002457\",\n  \"https://x.com/WhopIO/status/1722690049374830639\",\n  \"https://x.com/hailsxr/status/1853552782076477578\",\n  \"https://x.com/taishik_/status/1668510585926066176\",\n  \"https://x.com/sup_nim/status/1668525144409624578\",\n  \"https://x.com/saporito_eth/status/1801445101786304799\",\n  \"https://x.com/JakeDuth/status/1668442365625790465\",\n  \"https://x.com/0xRaduan/status/1668557577985179648\",\n  \"https://x.com/yazinsai/status/1668617800934641672\",\n  \"https://x.com/wes_walke/status/1668612106696941570\",\n  \"https://x.com/beneverman/status/1681477151042797568\",\n  \"https://x.com/DevAlien/status/1668618017528479745\",\n  \"https://x.com/fredmaiaarantes/status/1684676668445622272\",\n  \"https://x.com/DesignSumu/status/1668559314272022528\",\n  \"https://x.com/commandodev/status/1668640878225764354\",\n  \"https://x.com/SandBoxSo/status/1668570645741948930\",\n  \"https://x.com/sxndrao/status/1668634137547399168\",\n  \"https://x.com/sameerposwal03/status/1862084069833797788\",\n  \"https://x.com/eersnington/status/1854657826011967597\",\n  \"https://x.com/fardeen14693425/status/1857782464673923476\",\n  \"https://x.com/Md_Sadiq_Md/status/1858221399959359566\",\n  \"https://x.com/AwesomAmri/status/1668432554842619906\",\n  \"https://x.com/avansteenweghen/status/1783271768138146086\",\n  \"https://x.com/lizhagearty/status/1835827024981541193\",\n  \"https://x.com/namyakhann/status/1793412434121949344\",\n  //\"https://x.com/sphinxsaas/status/1879233539109216723\",\n  // \"https://x.com/chronark_/status/1779077288329433146\",\n  // \"https://x.com/_raoufai/status/1850950163051024470\",\n  // \"https://x.com/taishik_/status/1875316979831337058\",\n  // \"https://x.com/rauchg/status/1803626308720796147\",\n  // \"https://x.com/dillionverma/status/1879324180598165702\",\n  // \"https://x.com/Star_Knight12/status/1861814034363981989\",\n  // \"https://x.com/mohamedzamakhan/status/1859810055924895904\",\n  // \"https://x.com/DutchEngIishman/status/1795888864202043645\",\n].map((t) => t.split(\"/\").slice(-1)[0])\n\nexport function Testimonials() {\n  return (\n    <section id=\"testimonials\" className=\"container mx-auto py-10 md:py-14\">\n      <h2 className=\"text-foreground mb-10 text-center text-3xl leading-[1.2] font-semibold tracking-tighter text-balance md:text-4xl lg:text-5xl\">\n        What People Are Saying on Twitter\n      </h2>\n      <ExpandableMasonarySection>\n        {allTweets.map((id) => (\n          <TestimonialTweetLink\n            key={id}\n            tweetUrl={`https://x.com/i/status/${id}`}\n          >\n            <TweetCard\n              id={id}\n              className=\"border-border bg-card break-inside-avoid overflow-hidden rounded-xl border transition-[border-color,background-color,box-shadow] duration-200 ease-in-out hover:shadow-md\"\n            />\n          </TestimonialTweetLink>\n        ))}\n      </ExpandableMasonarySection>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sections/video-testimonials.tsx",
    "content": "\"use client\"\n\nimport type { SVGProps } from \"react\"\nimport { useState } from \"react\"\nimport Image from \"next/image\"\nimport { motion } from \"motion/react\"\n\nconst YOUTUBE_THUMBNAIL_BASE_URL = \"https://img.youtube.com/vi\"\nconst VIDEO_EMBEDS = [\n  \"https://www.youtube.com/embed/UGm8djxwC5s\",\n  \"https://www.youtube.com/embed/qh3NGpYRG3I\",\n  \"https://www.youtube.com/embed/AkN6xJcnVYs\",\n  \"https://www.youtube.com/embed/hlSu_ldrbQw\",\n  \"https://www.youtube.com/embed/ZYvvTehpA5I\",\n] as const\n\nfunction extractVideoId(url: string) {\n  try {\n    const parsed = new URL(url)\n    const pathnameParts = parsed.pathname.split(\"/\")\n    const lastSegment = pathnameParts.at(-1)\n    if (!lastSegment) {\n      return \"\"\n    }\n    return lastSegment.split(\"?\").at(0) ?? \"\"\n  } catch {\n    return \"\"\n  }\n}\n\nfunction buildEmbedSrc(url: string, shouldAutoplay: boolean) {\n  if (!shouldAutoplay) {\n    return url\n  }\n\n  return url.includes(\"?\") ? `${url}&autoplay=1` : `${url}?autoplay=1`\n}\n\nfunction PlayIcon(props: SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      viewBox=\"0 0 60 60\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n      focusable=\"false\"\n      {...props}\n    >\n      <title>Play</title>\n      <circle cx=\"30\" cy=\"30\" r=\"30\" opacity=\"0.85\" />\n      <polygon points=\"24,18 44,30 24,42\" fill=\"#fff\" />\n    </svg>\n  )\n}\n\nexport function VideoTestimonials() {\n  const [activeIndex, setActiveIndex] = useState<number | null>(null)\n\n  return (\n    <section\n      id=\"video-testimonials\"\n      className=\"container mx-auto py-10 md:py-14\"\n    >\n      <h2 className=\"text-foreground mb-10 text-center text-3xl leading-[1.2] font-semibold tracking-tighter text-balance md:text-4xl lg:text-5xl\">\n        Featured on YouTube\n      </h2>\n      <div className=\"grid auto-rows-[280px] grid-cols-1 gap-4 md:auto-rows-[300px] md:grid-cols-6 md:gap-6 lg:auto-rows-[320px]\">\n        {VIDEO_EMBEDS.map((embedUrl, index) => {\n          const videoId = extractVideoId(embedUrl)\n          const isActive = activeIndex === index\n          const thumbnailSrc = videoId\n            ? `${YOUTUBE_THUMBNAIL_BASE_URL}/${videoId}/hqdefault.jpg`\n            : undefined\n\n          const columnClasses =\n            index === 0\n              ? \"md:col-span-4 md:row-span-2\"\n              : index === 1 || index === 2\n                ? \"md:col-span-2 md:row-span-1\"\n                : \"md:col-span-3 md:row-span-1\"\n\n          return (\n            <motion.button\n              key={embedUrl}\n              type=\"button\"\n              aria-pressed={isActive}\n              aria-label={`Play testimonial ${index + 1}`}\n              onClick={() => {\n                setActiveIndex(index)\n              }}\n              onKeyDown={(event) => {\n                if (event.key === \"Enter\" || event.key === \" \") {\n                  event.preventDefault()\n                  setActiveIndex(index)\n                }\n              }}\n              className={`group bg-card focus-visible:outline-primary border-border hover:border-border/80 relative cursor-pointer overflow-hidden rounded-xl border transition-[border-color,transform] duration-200 ease-in-out focus-visible:outline focus-visible:outline-offset-2 ${columnClasses}`}\n              whileHover={{ scale: 1.01 }}\n            >\n              {!isActive && (\n                <>\n                  {thumbnailSrc ? (\n                    <Image\n                      fill\n                      priority={index === 0}\n                      src={thumbnailSrc}\n                      alt={`Preview still for testimonial ${index + 1}`}\n                      className=\"object-cover\"\n                      sizes=\"(min-width: 1024px) 33vw, (min-width: 768px) 50vw, 100vw\"\n                    />\n                  ) : (\n                    <span className=\"bg-muted text-muted-foreground flex h-full w-full items-center justify-center\">\n                      Video preview unavailable\n                    </span>\n                  )}\n                  <div className=\"bg-card/5 pointer-events-none absolute inset-0 z-10 opacity-0 backdrop-blur-[2px] transition-opacity duration-300 group-hover:opacity-100\" />\n                  <div className=\"pointer-events-none absolute inset-0 z-10 bg-linear-to-t from-black/20 to-transparent opacity-0 transition-opacity duration-300 group-hover:opacity-100\" />\n                  <span className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n                    <PlayIcon className=\"h-20 w-20 drop-shadow-xl transition-transform duration-200 group-hover:scale-[1.08]\" />\n                  </span>\n                </>\n              )}\n              {isActive && (\n                <iframe\n                  src={buildEmbedSrc(embedUrl, true)}\n                  title={`YouTube testimonial ${index + 1}`}\n                  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                  allowFullScreen\n                  className=\"h-full w-full\"\n                  loading=\"lazy\"\n                />\n              )}\n            </motion.button>\n          )\n        })}\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/sidebar-cta.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { CheckIcon, ChevronRight } from \"lucide-react\"\n\nimport { trackEvent } from \"@/lib/events\"\nimport { Button } from \"@/components/ui/button\"\nimport { PingDot } from \"@/components/ping-dot\"\nimport { AnimatedShinyText } from \"@/registry/magicui/animated-shiny-text\"\nimport { AuroraText } from \"@/registry/magicui/aurora-text\"\nimport { LineShadowText } from \"@/registry/magicui/line-shadow-text\"\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport function ProCTA() {\n  return (\n    <div className=\"border-border bg-card my-6 flex w-full flex-col gap-4 rounded-xl border p-6\">\n      <div className=\"flex items-center gap-2\">\n        <PingDot />\n        <span className=\"text-xs font-semibold tracking-tight text-emerald-500 uppercase\">\n          Limited Time Offer\n        </span>\n      </div>\n\n      <div className=\"space-y-3\">\n        <p className=\"text-foreground text-2xl leading-tight font-bold\">\n          Ship{\" \"}\n          <LineShadowText className=\"font-bold tracking-tighter italic\">\n            Faster\n          </LineShadowText>{\" \"}\n          with{\" \"}\n          <AuroraText\n            colors={[\n              \"#FF66CC\",\n              \"#FFDC18\",\n              \"#41FFD7\",\n              \"#38bdf8\",\n              \"#8338EC\",\n              \"#F72585\",\n              \"#3A86FF\",\n            ]}\n          >\n            Magic UI Pro\n          </AuroraText>\n        </p>\n        <p className=\"text-muted-foreground text-sm leading-relaxed font-medium\">\n          Stop building from scratch. <br /> Get{\" \"}\n          <span className=\"text-foreground font-semibold\">\n            8 production-ready templates\n          </span>{\" \"}\n          and{\" \"}\n          <span className=\"text-foreground font-semibold\">\n            50+ premium components\n          </span>{\" \"}\n          that your users will love.\n        </p>\n      </div>\n\n      <div className=\"space-y-2.5 font-medium\">\n        <div className=\"text-muted-foreground flex items-start gap-3 text-sm\">\n          <div className=\"border-border bg-foreground mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border\">\n            <CheckIcon className=\"text-primary-foreground size-2.5 stroke-4\" />\n          </div>\n          <span>Next.js 15 + TypeScript ready</span>\n        </div>\n        <div className=\"text-muted-foreground flex items-start gap-3 text-sm\">\n          <div className=\"border-border bg-foreground mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border\">\n            <CheckIcon className=\"text-primary-foreground size-2.5 stroke-4\" />\n          </div>\n          <span>Copy, paste, customize in minutes</span>\n        </div>\n        <div className=\"text-muted-foreground flex items-start gap-3 text-sm\">\n          <div className=\"border-border bg-foreground mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border\">\n            <CheckIcon className=\"text-primary-foreground size-2.5 stroke-4\" />\n          </div>\n          <span>Save 100+ hours of development</span>\n        </div>\n      </div>\n\n      <div className=\"space-y-4 pt-2\">\n        <div className=\"flex items-baseline justify-center gap-2\">\n          <span className=\"text-foreground text-3xl font-bold\">$199</span>\n          <span className=\"text-muted-foreground text-sm font-medium\">\n            once\n          </span>\n        </div>\n\n        <Button\n          asChild\n          className=\"bg-primary hover:bg-primary/90 text-primary-foreground w-full rounded-lg py-3 font-semibold shadow-sm transition-all duration-200 hover:shadow-md\"\n          onClick={() => trackEvent({ name: \"sidebar_cta_clicked\" })}\n        >\n          <Link\n            href=\"https://pro.magicui.design\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"flex items-center justify-center gap-2\"\n          >\n            Get Lifetime Access\n            <ChevronRight className=\"size-4\" />\n          </Link>\n        </Button>\n\n        <div className=\"text-center\">\n          <p className=\"text-muted-foreground text-xs\">\n            Trusted by <span className=\"font-semibold\">5,000+</span> developers\n          </p>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport function ProductHuntCTA() {\n  return (\n    <Link\n      href=\"https://www.producthunt.com/posts/magic-ui-2?utm_source=sidebar-cta&utm_medium=sidebar-cta&utm_campaign=product-hunt-sidebar-cta\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n      onClick={() => trackEvent({ name: \"product_hunt_sidebar_cta_clicked\" })}\n      className=\"group my-20 flex w-full flex-col items-center justify-center gap-2 rounded-xl bg-[#ff6154] p-4 text-center text-lg leading-tight font-medium text-white\"\n    >\n      <TextAnimate animate=\"blurInUp\" by=\"word\" className=\"text-2xl\">\n        Vote for Magic UI on Product Hunt Today!\n      </TextAnimate>\n      <AnimatedShinyText className=\"group inline items-center justify-center via-white/80 text-xs whitespace-pre-wrap text-white\">\n        ✨ Show your support and vote for us\n      </AnimatedShinyText>\n\n      <video\n        autoPlay\n        loop\n        playsInline\n        muted\n        src=\"https://cdn.magicui.design/agent-demo.mp4\"\n        className=\"w-full overflow-hidden rounded-xl shadow-2xl\"\n      />\n    </Link>\n  )\n}\n\nexport function SidebarCTA() {\n  return <ProCTA />\n}\n"
  },
  {
    "path": "apps/www/components/site-banner.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { trackEvent } from \"@/lib/events\"\n\nexport function ProBanner() {\n  return (\n    <div className=\"group relative top-0 bg-indigo-600 py-3 text-white transition-all duration-300 md:py-0\">\n      <div className=\"container flex flex-col items-center justify-center gap-4 md:h-12 md:flex-row\">\n        <Link\n          href=\"https://pro.magicui.design\"\n          onClick={() => trackEvent({ name: \"banner_cta_clicked\" })}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"inline-flex text-xs leading-normal md:text-sm\"\n        >\n          ✨{\" \"}\n          <span className=\"ml-1 font-[580] dark:font-[550]\">\n            {\" \"}\n            Introducing Magic UI Pro - 50+ blocks and templates to build\n            beautiful landing pages in minutes\n          </span>{\" \"}\n          <ChevronRight className=\"mt-[3px] ml-1 hidden size-4 transition-all duration-300 ease-out group-hover:translate-x-1 lg:inline-block\" />\n        </Link>\n      </div>\n      <hr className=\"absolute bottom-0 m-0 h-px w-full bg-neutral-200/30\" />\n    </div>\n  )\n}\n\nexport function ProductHuntBanner() {\n  return (\n    <div className=\"group relative top-0 bg-[#ff6154] py-3 text-white transition-all duration-300 md:py-0\">\n      <div className=\"container flex flex-col items-center justify-center gap-4 md:h-12 md:flex-row\">\n        <Link\n          href=\"https://www.producthunt.com/posts/magic-ui-2?utm_source=site-banner&utm_medium=banner&utm_campaign=product-hunt-banner\"\n          onClick={() => trackEvent({ name: \"product_hunt_banner_clicked\" })}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"inline-flex text-xs leading-normal md:text-sm\"\n        >\n          ✨{\" \"}\n          <span className=\"ml-1 font-[580] dark:font-[550]\">\n            {\" \"}\n            Magic UI is live on Product Hunt Today! Show your support and vote\n            for us.\n          </span>{\" \"}\n          <ChevronRight className=\"mt-[3px] ml-1 hidden size-4 transition-all duration-300 ease-out group-hover:translate-x-1 lg:inline-block\" />\n        </Link>\n      </div>\n      <hr className=\"absolute bottom-0 m-0 h-px w-full bg-neutral-200/30\" />\n    </div>\n  )\n}\n\nexport function SiteBanner() {\n  return <ProBanner />\n}\n"
  },
  {
    "path": "apps/www/components/site-footer.tsx",
    "content": "import { siteConfig } from \"@/config/site\"\n\nexport function SiteFooter() {\n  return (\n    <footer className=\"group-has-[.section-soft]/body:bg-surface/40 3xl:fixed:bg-transparent group-has-[.docs-nav]/body:pb-20 group-has-[.docs-nav]/body:sm:pb-0 dark:bg-transparent\">\n      <div className=\"container-wrapper px-4 xl:px-6\">\n        <div className=\"flex h-(--footer-height) items-center justify-between\">\n          <div className=\"text-muted-foreground w-full px-1 text-center text-xs leading-loose sm:text-sm\">\n            Built by{\" \"}\n            <a\n              href={siteConfig.links.twitter}\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              className=\"font-medium underline underline-offset-4\"\n            >\n              dillion\n            </a>\n            . The source code is available on{\" \"}\n            <a\n              href={siteConfig.links.github}\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              className=\"font-medium underline underline-offset-4\"\n            >\n              GitHub\n            </a>\n            .\n          </div>\n        </div>\n      </div>\n    </footer>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/site-header.tsx",
    "content": "import { docsConfig } from \"@/config/docs\"\nimport { Separator } from \"@/components/ui/separator\"\nimport { CommandMenu } from \"@/components/command-menu\"\nimport { DiscordLink } from \"@/components/discord-link\"\nimport { GitHubLink } from \"@/components/github-link\"\nimport { LogoButton } from \"@/components/logo-button\"\nimport { MainNav } from \"@/components/main-nav\"\nimport { MobileNav } from \"@/components/mobile-nav\"\nimport { ModeToggle } from \"@/components/mode-toggle\"\n\nexport function SiteHeader() {\n  return (\n    <header className=\"bg-background sticky top-0 z-50 w-full\">\n      <div className=\"container-wrapper 3xl:fixed:px-0 px-6\">\n        <div className=\"3xl:fixed:container flex h-(--header-height) items-center gap-2 **:data-[slot=separator]:!h-4\">\n          <MobileNav className=\"flex lg:hidden\" />\n          <LogoButton />\n          <MainNav items={docsConfig.mainNav} className=\"hidden lg:flex\" />\n          <div className=\"flex flex-1 items-center justify-between gap-2 md:justify-end\">\n            <div className=\"ml-auto flex items-center gap-2 md:flex-1 md:justify-end\">\n              <div className=\"hidden w-full flex-1 md:flex md:w-auto md:flex-none\">\n                <CommandMenu />\n              </div>\n              <Separator\n                orientation=\"vertical\"\n                className=\"ml-2 hidden lg:block\"\n              />\n              <GitHubLink />\n              <Separator orientation=\"vertical\" className=\"3xl:flex hidden\" />\n              <DiscordLink />\n              <Separator orientation=\"vertical\" />\n              <ModeToggle />\n            </div>\n          </div>\n        </div>\n      </div>\n    </header>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/tech-stack.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\ntype TechComponentType = {\n  name: string\n  icon: React.ReactNode\n}\n\ntype TechComponents = Record<string, TechComponentType>\n\nconst techComponents: TechComponents = {\n  nextjs: {\n    name: \"Next.js 14\",\n    icon: (\n      <svg\n        role=\"img\"\n        viewBox=\"0 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"size-8\"\n        aria-label=\"Next.js\"\n        fill=\"currentColor\"\n      >\n        <title>Next.js</title>\n        <path d=\"M11.5725 0c-.1763 0-.3098.0013-.3584.0067-.0516.0053-.2159.021-.3636.0328-3.4088.3073-6.6017 2.1463-8.624 4.9728C1.1004 6.584.3802 8.3666.1082 10.255c-.0962.659-.108.8537-.108 1.7474s.012 1.0884.108 1.7476c.652 4.506 3.8591 8.2919 8.2087 9.6945.7789.2511 1.6.4223 2.5337.5255.3636.04 1.9354.04 2.299 0 1.6117-.1783 2.9772-.577 4.3237-1.2643.2065-.1056.2464-.1337.2183-.1573-.0188-.0139-.8987-1.1938-1.9543-2.62l-1.919-2.592-2.4047-3.5583c-1.3231-1.9564-2.4117-3.556-2.4211-3.556-.0094-.0026-.0187 1.5787-.0235 3.509-.0067 3.3802-.0093 3.5162-.0516 3.596-.061.115-.108.1618-.2064.2134-.075.0374-.1408.0445-.495.0445h-.406l-.1078-.068a.4383.4383 0 01-.1572-.1712l-.0493-.1056.0053-4.703.0067-4.7054.0726-.0915c.0376-.0493.1174-.1125.1736-.143.0962-.047.1338-.0517.5396-.0517.4787 0 .5584.0187.6827.1547.0353.0377 1.3373 1.9987 2.895 4.3608a10760.433 10760.433 0 004.7344 7.1706l1.9002 2.8782.096-.0633c.8518-.5536 1.7525-1.3418 2.4657-2.1627 1.5179-1.7429 2.4963-3.868 2.8247-6.134.0961-.6591.1078-.854.1078-1.7475 0-.8937-.012-1.0884-.1078-1.7476-.6522-4.506-3.8592-8.2919-8.2087-9.6945-.7672-.2487-1.5836-.42-2.4985-.5232-.169-.0176-1.0835-.0366-1.6123-.037zm4.0685 7.217c.3473 0 .4082.0053.4857.047.1127.0562.204.1642.237.2767.0186.061.0234 1.3653.0186 4.3044l-.0067 4.2175-.7436-1.14-.7461-1.14v-3.066c0-1.982.0093-3.0963.0234-3.1502.0375-.1313.1196-.2346.2323-.2955.0961-.0494.1313-.054.4997-.054z\" />\n      </svg>\n    ),\n  },\n  react: {\n    name: \"React\",\n    icon: (\n      <svg\n        role=\"img\"\n        viewBox=\"0 0 32 32\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-label=\"React\"\n        className=\"size-8\"\n        fill=\"currentColor\"\n      >\n        <title>React</title>\n        <path d=\"m16 13.146c-1.573 0-2.854 1.281-2.854 2.854s1.281 2.854 2.854 2.854 2.854-1.281 2.854-2.854-1.281-2.854-2.854-2.854zm-7.99 8.526-.63-.156c-4.688-1.188-7.38-3.198-7.38-5.521s2.693-4.333 7.38-5.521l.63-.156.177.625c.474 1.635 1.083 3.229 1.818 4.771l.135.281-.135.286c-.734 1.536-1.344 3.13-1.818 4.771zm-.921-9.74c-3.563 1-5.75 2.536-5.75 4.063s2.188 3.057 5.75 4.063c.438-1.391.964-2.745 1.578-4.063-.615-1.318-1.141-2.672-1.578-4.063zm16.901 9.74-.177-.625c-.474-1.635-1.083-3.229-1.818-4.766l-.135-.286.135-.286c.734-1.536 1.344-3.13 1.818-4.771l.177-.62.63.156c4.688 1.188 7.38 3.198 7.38 5.521s-2.693 4.333-7.38 5.521zm-.657-5.677c.641 1.385 1.172 2.745 1.578 4.063 3.568-1.005 5.75-2.536 5.75-4.063s-2.188-3.057-5.75-4.063c-.438 1.385-.964 2.745-1.578 4.063zm-16.255-4.068-.177-.625c-1.318-4.646-.917-7.979 1.099-9.141 1.979-1.141 5.151.208 8.479 3.625l.453.464-.453.464c-1.182 1.229-2.26 2.552-3.229 3.958l-.182.255-.313.026c-1.703.135-3.391.406-5.047.813zm2.531-8.838c-.359 0-.677.073-.943.229-1.323.766-1.557 3.422-.646 7.005 1.422-.318 2.859-.542 4.313-.672.833-1.188 1.75-2.323 2.734-3.391-2.078-2.026-4.047-3.172-5.458-3.172zm12.787 27.145c-.005 0-.005 0 0 0-1.901 0-4.344-1.427-6.875-4.031l-.453-.464.453-.464c1.182-1.229 2.26-2.552 3.229-3.958l.177-.255.313-.031c1.703-.13 3.391-.401 5.052-.813l.63-.156.177.625c1.318 4.646.917 7.974-1.099 9.135-.49.281-1.042.422-1.604.411zm-5.464-4.505c2.078 2.026 4.047 3.172 5.458 3.172h.005c.354 0 .672-.078.938-.229 1.323-.766 1.563-3.422.646-7.005-1.422.318-2.865.542-4.313.667-.833 1.193-1.75 2.323-2.734 3.396zm7.99-13.802-.63-.161c-1.661-.406-3.349-.677-5.052-.813l-.313-.026-.177-.255c-.969-1.406-2.047-2.729-3.229-3.958l-.453-.464.453-.464c3.328-3.417 6.5-4.766 8.479-3.625 2.016 1.161 2.417 4.495 1.099 9.141zm-5.255-2.276c1.521.141 2.969.365 4.313.672.917-3.583.677-6.24-.646-7.005-1.318-.76-3.797.406-6.401 2.943.984 1.073 1.896 2.203 2.734 3.391zm-10.058 20.583c-.563.01-1.12-.13-1.609-.411-2.016-1.161-2.417-4.49-1.099-9.135l.177-.625.63.156c1.542.391 3.24.661 5.047.813l.313.031.177.255c.969 1.406 2.047 2.729 3.229 3.958l.453.464-.453.464c-2.526 2.604-4.969 4.031-6.865 4.031zm-1.588-8.567c-.917 3.583-.677 6.24.646 7.005 1.318.75 3.792-.406 6.401-2.943-.984-1.073-1.901-2.203-2.734-3.396-1.453-.125-2.891-.349-4.313-.667zm7.979.838c-1.099 0-2.224-.047-3.354-.141l-.313-.026-.182-.26c-.635-.917-1.24-1.859-1.797-2.828-.563-.969-1.078-1.958-1.557-2.969l-.135-.286.135-.286c.479-1.01.995-2 1.557-2.969.552-.953 1.156-1.906 1.797-2.828l.182-.26.313-.026c2.234-.188 4.479-.188 6.708 0l.313.026.182.26c1.276 1.833 2.401 3.776 3.354 5.797l.135.286-.135.286c-.953 2.021-2.073 3.964-3.354 5.797l-.182.26-.313.026c-1.125.094-2.255.141-3.354.141zm-2.927-1.448c1.969.151 3.885.151 5.859 0 1.099-1.609 2.078-3.302 2.927-5.063-.844-1.76-1.823-3.453-2.932-5.063-1.948-.151-3.906-.151-5.854 0-1.109 1.609-2.089 3.302-2.932 5.063.849 1.76 1.828 3.453 2.932 5.063z\" />\n      </svg>\n    ),\n  },\n  typescript: {\n    name: \"Typescript \",\n    icon: (\n      <svg\n        viewBox=\"0 0 32 32\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-label=\"Typescript\"\n        className=\"size-8\"\n        fill=\"currentColor\"\n      >\n        <path d=\"m0 16v16h32v-32h-32zm25.786-1.276c.813.203 1.432.568 2.005 1.156.292.312.729.885.766 1.026.01.042-1.38.974-2.224 1.495-.031.021-.156-.109-.292-.313-.411-.599-.844-.859-1.505-.906-.969-.063-1.594.443-1.589 1.292-.005.208.042.417.135.599.214.443.615.708 1.854 1.245 2.292.984 3.271 1.635 3.88 2.557.682 1.031.833 2.677.375 3.906-.51 1.328-1.771 2.234-3.542 2.531-.547.099-1.849.083-2.438-.026-1.286-.229-2.505-.865-3.255-1.698-.297-.323-.87-1.172-.833-1.229.016-.021.146-.104.292-.188s.682-.396 1.188-.688l.922-.536.193.286c.271.411.859.974 1.214 1.161 1.021.542 2.422.464 3.115-.156.281-.234.438-.594.417-.958 0-.37-.047-.536-.24-.813-.25-.354-.755-.656-2.198-1.281-1.651-.714-2.365-1.151-3.01-1.854-.406-.464-.708-1.01-.88-1.599-.12-.453-.151-1.589-.057-2.042.339-1.599 1.547-2.708 3.281-3.036.563-.109 1.875-.068 2.427.068zm-7.51 1.339.01 1.307h-4.167v11.839h-2.948v-11.839h-4.161v-1.281c0-.714.016-1.307.036-1.323.016-.021 2.547-.031 5.62-.026l5.594.016z\" />\n      </svg>\n    ),\n  },\n  tailwindcss: {\n    name: \"Tailwind CSS\",\n    icon: (\n      <svg\n        role=\"img\"\n        viewBox=\"0 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-label=\"Tailwind css\"\n        className=\"size-8\"\n        fill=\"currentColor\"\n      >\n        <title>Tailwind CSS</title>\n        <path d=\"m12.001 4.8c-3.2 0-5.2 1.6-6 4.8 1.2-1.6 2.6-2.2 4.2-1.8.913.228 1.565.89 2.288 1.624 1.177 1.194 2.538 2.576 5.512 2.576 3.2 0 5.2-1.6 6-4.8-1.2 1.6-2.6 2.2-4.2 1.8-.913-.228-1.565-.89-2.288-1.624-1.176-1.194-2.537-2.576-5.512-2.576zm-6 7.2c-3.2 0-5.2 1.6-6 4.8 1.2-1.6 2.6-2.2 4.2-1.8.913.228 1.565.89 2.288 1.624 1.177 1.194 2.538 2.576 5.512 2.576 3.2 0 5.2-1.6 6-4.8-1.2 1.6-2.6 2.2-4.2 1.8-.913-.228-1.565-.89-2.288-1.624-1.176-1.194-2.537-2.576-5.512-2.576z\" />\n      </svg>\n    ),\n  },\n  motion: {\n    name: \"Motion\",\n    icon: (\n      <svg\n        role=\"img\"\n        viewBox=\"0 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-label=\"Motion\"\n        className=\"size-8\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      >\n        <title>Motion</title>\n        <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n        <path d=\"M12 12l-8 -8v16l16 -16v16l-4 -4\" />\n        <path d=\"M20 12l-8 8l-4 -4\" />\n      </svg>\n    ),\n  },\n  shadcn: {\n    name: \"shadcn\",\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-label=\"shadcn\"\n        viewBox=\"0 0 256 256\"\n        className=\"size-8\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n      >\n        {/* <rect width=\"256\" height=\"256\" fill=\"none\"></rect> */}\n        <line\n          x1=\"208\"\n          y1=\"128\"\n          x2=\"128\"\n          y2=\"208\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"16\"\n        ></line>\n        <line\n          x1=\"192\"\n          y1=\"40\"\n          x2=\"40\"\n          y2=\"192\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"16\"\n        ></line>\n      </svg>\n    ),\n  },\n}\n\nexport function TechStack({\n  technologies,\n  className,\n}: {\n  technologies: string[]\n  className?: string\n}) {\n  return (\n    <div className={cn(\"flex flex-row gap-2\", className)}>\n      {technologies.map((tech) => (\n        <Tooltip key={tech}>\n          <TooltipTrigger>{techComponents[tech].icon}</TooltipTrigger>\n          <TooltipContent>\n            <p>{techComponents[tech].name}</p>\n          </TooltipContent>\n        </Tooltip>\n      ))}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/template-open.tsx",
    "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport { GitHubLogoIcon } from \"@radix-ui/react-icons\"\nimport { ArrowRightIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\ninterface TemplateOpenProps {\n  url: string\n  free?: boolean\n}\n\nexport function TemplateOpen({ url, free = false }: TemplateOpenProps) {\n  if (free) {\n    return (\n      <Link\n        href={url}\n        target=\"_blank\"\n        className={cn(\n          buttonVariants({\n            variant: \"default\",\n          }),\n          \"not-prose group relative w-full shrink gap-2\"\n        )}\n      >\n        Download\n        <GitHubLogoIcon className=\"size-4\" />\n      </Link>\n    )\n  }\n\n  return (\n    <Link\n      href=\"https://pro.magicui.design/\"\n      target=\"_blank\"\n      className={cn(\n        buttonVariants({\n          variant: \"default\",\n        }),\n        \"not-prose group relative w-full shrink gap-1\"\n      )}\n    >\n      Buy Now\n      <ArrowRightIcon className=\"size-4 transition-all duration-300 ease-out group-hover:translate-x-1\" />\n    </Link>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/template-preview.tsx",
    "content": "import { ReactNode } from \"react\"\nimport Link from \"next/link\"\nimport { ExternalLinkIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\nexport function TemplatePreview({\n  href,\n  children,\n}: {\n  href: string\n  children: ReactNode\n}) {\n  return (\n    <Link\n      className={cn(\n        buttonVariants({\n          variant: \"outline\",\n        }),\n        \"not-prose group relative w-full shrink gap-2\"\n      )}\n      href={href}\n      target=\"_blank\"\n    >\n      {children}\n      <ExternalLinkIcon className=\"size-4\" />\n    </Link>\n  )\n}\n"
  },
  {
    "path": "apps/www/components/theme-provider.tsx",
    "content": "\"use client\"\n\nimport {\n  ThemeProvider as NextThemesProvider,\n  ThemeProviderProps,\n} from \"next-themes\"\n\nexport function ThemeProvider({ children, ...props }: ThemeProviderProps) {\n  return <NextThemesProvider {...props}>{children}</NextThemesProvider>\n}\n"
  },
  {
    "path": "apps/www/components/ui/accordion.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Accordion({\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n  return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n  className,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n  return (\n    <AccordionPrimitive.Item\n      data-slot=\"accordion-item\"\n      className={cn(\"border-b last:border-b-0\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction AccordionTrigger({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n  return (\n    <AccordionPrimitive.Header className=\"flex\">\n      <AccordionPrimitive.Trigger\n        data-slot=\"accordion-trigger\"\n        className={cn(\n          \"focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        <ChevronDownIcon className=\"text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200\" />\n      </AccordionPrimitive.Trigger>\n    </AccordionPrimitive.Header>\n  )\n}\n\nfunction AccordionContent({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n  return (\n    <AccordionPrimitive.Content\n      data-slot=\"accordion-content\"\n      className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n      {...props}\n    >\n      <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n    </AccordionPrimitive.Content>\n  )\n}\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger }\n"
  },
  {
    "path": "apps/www/components/ui/alert.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n  \"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-background text-foreground\",\n        destructive:\n          \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nconst Alert = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n  <div\n    ref={ref}\n    role=\"alert\"\n    className={cn(alertVariants({ variant }), className)}\n    {...props}\n  />\n))\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h5\n    ref={ref}\n    className={cn(\"mb-1 leading-none font-medium tracking-tight\", className)}\n    {...props}\n  />\n))\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n    {...props}\n  />\n))\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n"
  },
  {
    "path": "apps/www/components/ui/avatar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Avatar = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Image>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Image\n    ref={ref}\n    className={cn(\"aspect-square h-full w-full\", className)}\n    {...props}\n  />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Fallback>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Fallback\n    ref={ref}\n    className={cn(\n      \"bg-muted flex h-full w-full items-center justify-center rounded-full\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"
  },
  {
    "path": "apps/www/components/ui/badge.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n        secondary:\n          \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        destructive:\n          \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n        outline: \"text-foreground\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nexport interface BadgeProps\n  extends\n    React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n  return (\n    <div className={cn(badgeVariants({ variant }), className)} {...props} />\n  )\n}\n\nexport { Badge, badgeVariants }\n"
  },
  {
    "path": "apps/www/components/ui/button.tsx",
    "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n        outline:\n          \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n        secondary:\n          \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n        ghost:\n          \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n        rainbow:\n          \"group relative animate-rainbow cursor-pointer border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.08*1rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(calc(0.8*1rem))] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n        \"rainbow-outline\":\n          \"group relative animate-rainbow cursor-pointer border-0 border-input bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] px-4 text-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.08*1rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(calc(0.8*1rem))] dark:bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n      },\n      size: {\n        default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n        sm: \"h-8 rounded-lg gap-1.5 px-3 has-[>svg]:px-2.5\",\n        lg: \"h-10 rounded-lg px-6 has-[>svg]:px-4\",\n        icon: \"size-9\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nfunction Button({\n  className,\n  variant,\n  size,\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"button\"> &\n  VariantProps<typeof buttonVariants> & {\n    asChild?: boolean\n  }) {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      data-slot=\"button\"\n      className={cn(buttonVariants({ variant, size, className }))}\n      {...props}\n    />\n  )\n}\n\nexport { Button, buttonVariants }\n"
  },
  {
    "path": "apps/www/components/ui/calendar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n  ChevronDownIcon,\n  ChevronLeftIcon,\n  ChevronRightIcon,\n} from \"lucide-react\"\nimport { DayButton, DayPicker, getDefaultClassNames } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/components/ui/button\"\n\nfunction Calendar({\n  className,\n  classNames,\n  showOutsideDays = true,\n  captionLayout = \"label\",\n  buttonVariant = \"ghost\",\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        \"bg-background group/calendar p-3 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[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      formatters={{\n        formatMonthDropdown: (date) =>\n          date.toLocaleString(\"default\", { 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          \"h-[--cell-size] w-[--cell-size] select-none p-0 aria-disabled:opacity-50\",\n          defaultClassNames.button_previous\n        ),\n        button_next: cn(\n          buttonVariants({ variant: buttonVariant }),\n          \"h-[--cell-size] w-[--cell-size] select-none p-0 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          \"has-focus:border-ring border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] relative rounded-md border\",\n          defaultClassNames.dropdown_root\n        ),\n        dropdown: cn(\n          \"bg-popover absolute inset-0 opacity-0\",\n          defaultClassNames.dropdown\n        ),\n        caption_label: cn(\n          \"select-none font-medium\",\n          captionLayout === \"label\"\n            ? \"text-sm\"\n            : \"[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5\",\n          defaultClassNames.caption_label\n        ),\n        table: \"w-full border-collapse\",\n        weekdays: cn(\"flex\", defaultClassNames.weekdays),\n        weekday: cn(\n          \"text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal\",\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-muted-foreground select-none text-[0.8rem]\",\n          defaultClassNames.week_number\n        ),\n        day: cn(\n          \"group/day relative aspect-square h-full w-full select-none p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md\",\n          defaultClassNames.day\n        ),\n        range_start: cn(\n          \"bg-accent rounded-l-md\",\n          defaultClassNames.range_start\n        ),\n        range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n        range_end: cn(\"bg-accent rounded-r-md\", defaultClassNames.range_end),\n        today: cn(\n          \"bg-accent text-accent-foreground rounded-md 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\n                className={cn(\"size-4\", className)}\n                {...props}\n              />\n            )\n          }\n\n          return (\n            <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n          )\n        },\n        DayButton: CalendarDayButton,\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  ...props\n}: React.ComponentProps<typeof DayButton>) {\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      ref={ref}\n      variant=\"ghost\"\n      size=\"icon\"\n      data-day={day.date.toLocaleDateString()}\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        \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 flex aspect-square h-auto w-full min-w-[--cell-size] flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md [&>span]:text-xs [&>span]:opacity-70\",\n        defaultClassNames.day,\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport { Calendar, CalendarDayButton }\n"
  },
  {
    "path": "apps/www/components/ui/card.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\n      \"bg-card text-card-foreground rounded-xl border shadow\",\n      className\n    )}\n    {...props}\n  />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n    {...props}\n  />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"leading-none font-semibold tracking-tight\", className)}\n    {...props}\n  />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"text-muted-foreground text-sm\", className)}\n    {...props}\n  />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex items-center p-6 pt-0\", className)}\n    {...props}\n  />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"
  },
  {
    "path": "apps/www/components/ui/collapsible.tsx",
    "content": "\"use client\"\n\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"
  },
  {
    "path": "apps/www/components/ui/command.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { SearchIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n} from \"@/components/ui/dialog\"\n\nfunction Command({\n  className,\n  ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n  return (\n    <CommandPrimitive\n      data-slot=\"command\"\n      className={cn(\n        \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\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 = true,\n  ...props\n}: React.ComponentProps<typeof Dialog> & {\n  title?: string\n  description?: string\n  className?: string\n  showCloseButton?: boolean\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(\"overflow-hidden p-0\", className)}\n        showCloseButton={showCloseButton}\n      >\n        <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n          {children}\n        </Command>\n      </DialogContent>\n    </Dialog>\n  )\n}\n\nfunction CommandInput({\n  className,\n  ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n  return (\n    <div\n      data-slot=\"command-input-wrapper\"\n      className=\"flex h-9 items-center gap-2 border-b px-3\"\n    >\n      <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n      <CommandPrimitive.Input\n        data-slot=\"command-input\"\n        className={cn(\n          \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        {...props}\n      />\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        \"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CommandEmpty({\n  ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n  return (\n    <CommandPrimitive.Empty\n      data-slot=\"command-empty\"\n      className=\"py-6 text-center text-sm\"\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        \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\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(\"bg-border -mx-1 h-px\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CommandItem({\n  className,\n  ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n  return (\n    <CommandPrimitive.Item\n      data-slot=\"command-item\"\n      className={cn(\n        \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\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        \"text-muted-foreground ml-auto text-xs tracking-widest\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Command,\n  CommandDialog,\n  CommandEmpty,\n  CommandGroup,\n  CommandInput,\n  CommandItem,\n  CommandList,\n  CommandSeparator,\n  CommandShortcut,\n}\n"
  },
  {
    "path": "apps/www/components/ui/context-menu.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <ContextMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto h-4 w-4\" />\n  </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-[--radix-context-menu-content-transform-origin] overflow-hidden rounded-md border p-1 shadow-lg\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.Portal>\n    <ContextMenuPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-[--radix-context-menu-content-available-height] min-w-[8rem] origin-[--radix-context-menu-content-transform-origin] overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n        className\n      )}\n      {...props}\n    />\n  </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <ContextMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <ContextMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </ContextMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName =\n  ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <ContextMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-4 w-4 fill-current\" />\n      </ContextMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <ContextMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"text-foreground px-2 py-1.5 text-sm font-semibold\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.Separator\n    ref={ref}\n    className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n    {...props}\n  />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\n        \"text-muted-foreground ml-auto text-xs tracking-widest\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\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"
  },
  {
    "path": "apps/www/components/ui/dialog.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Dialog({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n  return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n  return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n  return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n  return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n  return (\n    <DialogPrimitive.Overlay\n      data-slot=\"dialog-overlay\"\n      className={cn(\n        \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DialogContent({\n  className,\n  children,\n  showCloseButton = true,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n  showCloseButton?: boolean\n}) {\n  return (\n    <DialogPortal data-slot=\"dialog-portal\">\n      <DialogOverlay />\n      <DialogPrimitive.Content\n        data-slot=\"dialog-content\"\n        className={cn(\n          \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        {showCloseButton && (\n          <DialogPrimitive.Close\n            data-slot=\"dialog-close\"\n            className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n          >\n            <XIcon />\n            <span className=\"sr-only\">Close</span>\n          </DialogPrimitive.Close>\n        )}\n      </DialogPrimitive.Content>\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 text-center sm:text-left\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"dialog-footer\"\n      className={cn(\n        \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DialogTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n  return (\n    <DialogPrimitive.Title\n      data-slot=\"dialog-title\"\n      className={cn(\"text-lg leading-none font-semibold\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n  return (\n    <DialogPrimitive.Description\n      data-slot=\"dialog-description\"\n      className={cn(\"text-muted-foreground text-sm\", className)}\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"
  },
  {
    "path": "apps/www/components/ui/dropdown-menu.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction DropdownMenu({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n  return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n  return (\n    <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n  )\n}\n\nfunction DropdownMenuTrigger({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n  return (\n    <DropdownMenuPrimitive.Trigger\n      data-slot=\"dropdown-menu-trigger\"\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuContent({\n  className,\n  sideOffset = 4,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n  return (\n    <DropdownMenuPrimitive.Portal>\n      <DropdownMenuPrimitive.Content\n        data-slot=\"dropdown-menu-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n          className\n        )}\n        {...props}\n      />\n    </DropdownMenuPrimitive.Portal>\n  )\n}\n\nfunction DropdownMenuGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n  return (\n    <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n  )\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant = \"default\",\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n  inset?: boolean\n  variant?: \"default\" | \"destructive\"\n}) {\n  return (\n    <DropdownMenuPrimitive.Item\n      data-slot=\"dropdown-menu-item\"\n      data-inset={inset}\n      data-variant={variant}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  checked,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n  return (\n    <DropdownMenuPrimitive.CheckboxItem\n      data-slot=\"dropdown-menu-checkbox-item\"\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      checked={checked}\n      {...props}\n    >\n      <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CheckIcon className=\"size-4\" />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.CheckboxItem>\n  )\n}\n\nfunction DropdownMenuRadioGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n  return (\n    <DropdownMenuPrimitive.RadioGroup\n      data-slot=\"dropdown-menu-radio-group\"\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n  return (\n    <DropdownMenuPrimitive.RadioItem\n      data-slot=\"dropdown-menu-radio-item\"\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    >\n      <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CircleIcon className=\"size-2 fill-current\" />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.RadioItem>\n  )\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n  inset?: boolean\n}) {\n  return (\n    <DropdownMenuPrimitive.Label\n      data-slot=\"dropdown-menu-label\"\n      data-inset={inset}\n      className={cn(\n        \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n  return (\n    <DropdownMenuPrimitive.Separator\n      data-slot=\"dropdown-menu-separator\"\n      className={cn(\"bg-border -mx-1 my-1 h-px\", 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        \"text-muted-foreground ml-auto text-xs tracking-widest\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction DropdownMenuSub({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n  return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n  inset?: boolean\n}) {\n  return (\n    <DropdownMenuPrimitive.SubTrigger\n      data-slot=\"dropdown-menu-sub-trigger\"\n      data-inset={inset}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <ChevronRightIcon className=\"ml-auto size-4\" />\n    </DropdownMenuPrimitive.SubTrigger>\n  )\n}\n\nfunction DropdownMenuSubContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n  return (\n    <DropdownMenuPrimitive.SubContent\n      data-slot=\"dropdown-menu-sub-content\"\n      className={cn(\n        \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuPortal,\n  DropdownMenuRadioGroup,\n  DropdownMenuRadioItem,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuTrigger,\n}\n"
  },
  {
    "path": "apps/www/components/ui/form.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport {\n  Controller,\n  FormProvider,\n  useFormContext,\n  type ControllerProps,\n  type FieldPath,\n  type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Label } from \"@/components/ui/label\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n  name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n  {} as FormFieldContextValue\n)\n\nconst FormField = <\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n  ...props\n}: ControllerProps<TFieldValues, TName>) => {\n  return (\n    <FormFieldContext.Provider value={{ name: props.name }}>\n      <Controller {...props} />\n    </FormFieldContext.Provider>\n  )\n}\n\nconst useFormField = () => {\n  const fieldContext = React.useContext(FormFieldContext)\n  const itemContext = React.useContext(FormItemContext)\n  const { getFieldState, formState } = useFormContext()\n\n  const fieldState = getFieldState(fieldContext.name, formState)\n\n  if (!fieldContext) {\n    throw new Error(\"useFormField should be used within <FormField>\")\n  }\n\n  const { id } = itemContext\n\n  return {\n    id,\n    name: fieldContext.name,\n    formItemId: `${id}-form-item`,\n    formDescriptionId: `${id}-form-item-description`,\n    formMessageId: `${id}-form-item-message`,\n    ...fieldState,\n  }\n}\n\ntype FormItemContextValue = {\n  id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n  {} as FormItemContextValue\n)\n\nconst FormItem = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const id = React.useId()\n\n  return (\n    <FormItemContext.Provider value={{ id }}>\n      <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n    </FormItemContext.Provider>\n  )\n})\nFormItem.displayName = \"FormItem\"\n\nconst FormLabel = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n  const { error, formItemId } = useFormField()\n\n  return (\n    <Label\n      ref={ref}\n      className={cn(error && \"text-destructive\", className)}\n      htmlFor={formItemId}\n      {...props}\n    />\n  )\n})\nFormLabel.displayName = \"FormLabel\"\n\nconst FormControl = React.forwardRef<\n  React.ElementRef<typeof Slot>,\n  React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n  const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n  return (\n    <Slot\n      ref={ref}\n      id={formItemId}\n      aria-describedby={\n        !error\n          ? `${formDescriptionId}`\n          : `${formDescriptionId} ${formMessageId}`\n      }\n      aria-invalid={!!error}\n      {...props}\n    />\n  )\n})\nFormControl.displayName = \"FormControl\"\n\nconst FormDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n  const { formDescriptionId } = useFormField()\n\n  return (\n    <p\n      ref={ref}\n      id={formDescriptionId}\n      className={cn(\"text-muted-foreground text-[0.8rem]\", className)}\n      {...props}\n    />\n  )\n})\nFormDescription.displayName = \"FormDescription\"\n\nconst FormMessage = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n  const { error, formMessageId } = useFormField()\n  const body = error ? String(error?.message ?? \"\") : children\n\n  if (!body) {\n    return null\n  }\n\n  return (\n    <p\n      ref={ref}\n      id={formMessageId}\n      className={cn(\"text-destructive text-[0.8rem] font-medium\", className)}\n      {...props}\n    >\n      {body}\n    </p>\n  )\n})\nFormMessage.displayName = \"FormMessage\"\n\nexport {\n  Form,\n  FormControl,\n  FormDescription,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormMessage,\n  useFormField,\n}\n"
  },
  {
    "path": "apps/www/components/ui/input.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"border-input file:text-foreground placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-base transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-1 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n"
  },
  {
    "path": "apps/www/components/ui/label.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n  \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n    VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n  <LabelPrimitive.Root\n    ref={ref}\n    className={cn(labelVariants(), className)}\n    {...props}\n  />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n"
  },
  {
    "path": "apps/www/components/ui/popover.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n  <PopoverPrimitive.Portal>\n    <PopoverPrimitive.Content\n      ref={ref}\n      align={align}\n      sideOffset={sideOffset}\n      className={cn(\n        \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-[--radix-popover-content-transform-origin] rounded-md border p-4 shadow-md outline-none\",\n        className\n      )}\n      {...props}\n    />\n  </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n"
  },
  {
    "path": "apps/www/components/ui/scroll-area.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n  <ScrollAreaPrimitive.Root\n    ref={ref}\n    className={cn(\"relative overflow-hidden\", className)}\n    {...props}\n  >\n    <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n      {children}\n    </ScrollAreaPrimitive.Viewport>\n    <ScrollBar />\n    <ScrollAreaPrimitive.Corner />\n  </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n  <ScrollAreaPrimitive.ScrollAreaScrollbar\n    ref={ref}\n    orientation={orientation}\n    className={cn(\n      \"flex touch-none transition-colors select-none\",\n      orientation === \"vertical\" &&\n        \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n      orientation === \"horizontal\" &&\n        \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n      className\n    )}\n    {...props}\n  >\n    <ScrollAreaPrimitive.ScrollAreaThumb className=\"bg-border relative flex-1 rounded-full\" />\n  </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n"
  },
  {
    "path": "apps/www/components/ui/select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"border-input ring-offset-background data-[placeholder]:text-muted-foreground focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap focus:ring-1 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <ChevronDown className=\"h-4 w-4 opacity-50\" />\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollUpButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronUp className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollDownButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronDown className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n  SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] origin-[--radix-select-content-transform-origin] overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectScrollUpButton />\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n      <SelectScrollDownButton />\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Label\n    ref={ref}\n    className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"focus:bg-accent focus:text-accent-foreground relative flex w-full cursor-default items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </SelectPrimitive.ItemIndicator>\n    </span>\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Separator\n    ref={ref}\n    className={cn(\"bg-muted -mx-1 my-1 h-px\", className)}\n    {...props}\n  />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectScrollDownButton,\n  SelectScrollUpButton,\n  SelectSeparator,\n  SelectTrigger,\n  SelectValue,\n}\n"
  },
  {
    "path": "apps/www/components/ui/separator.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Separator = React.forwardRef<\n  React.ElementRef<typeof SeparatorPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n  (\n    { className, orientation = \"horizontal\", decorative = true, ...props },\n    ref\n  ) => (\n    <SeparatorPrimitive.Root\n      ref={ref}\n      decorative={decorative}\n      orientation={orientation}\n      className={cn(\n        \"bg-border shrink-0\",\n        orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n"
  },
  {
    "path": "apps/www/components/ui/sheet.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Overlay\n    className={cn(\n      \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n  \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n  {\n    variants: {\n      side: {\n        top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n        bottom:\n          \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n        left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n        right:\n          \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n      },\n    },\n    defaultVariants: {\n      side: \"right\",\n    },\n  }\n)\n\ninterface SheetContentProps\n  extends\n    React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n    VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Content>,\n  SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n  <SheetPortal>\n    <SheetOverlay />\n    <SheetPrimitive.Content\n      ref={ref}\n      className={cn(sheetVariants({ side }), className)}\n      {...props}\n    >\n      <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </SheetPrimitive.Close>\n      {children}\n    </SheetPrimitive.Content>\n  </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Title\n    ref={ref}\n    className={cn(\"text-foreground text-lg font-semibold\", className)}\n    {...props}\n  />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Description\n    ref={ref}\n    className={cn(\"text-muted-foreground text-sm\", className)}\n    {...props}\n  />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n  Sheet,\n  SheetPortal,\n  SheetOverlay,\n  SheetTrigger,\n  SheetClose,\n  SheetContent,\n  SheetHeader,\n  SheetFooter,\n  SheetTitle,\n  SheetDescription,\n}\n"
  },
  {
    "path": "apps/www/components/ui/sidebar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { useIsMobile } from \"@/hooks/use-mobile\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetHeader,\n  SheetTitle,\n} from \"@/components/ui/sheet\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\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      <TooltipProvider delayDuration={0}>\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 has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n            className\n          )}\n          {...props}\n        >\n          {children}\n        </div>\n      </TooltipProvider>\n    </SidebarContext.Provider>\n  )\n}\n\nfunction Sidebar({\n  side = \"left\",\n  variant = \"sidebar\",\n  collapsible = \"offcanvas\",\n  className,\n  children,\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          \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\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          data-sidebar=\"sidebar\"\n          data-slot=\"sidebar\"\n          data-mobile=\"true\"\n          className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>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 text-sidebar-foreground hidden 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        className={cn(\n          \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n          side === \"left\"\n            ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n            : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\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=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\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\"\n      className={cn(\"size-7\", 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        \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\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        \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\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        \"bg-background relative flex w-full flex-1 flex-col\",\n        \"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(\"bg-background h-8 w-full 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(\"bg-sidebar-border mx-2 w-auto\", 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        \"flex min-h-0 flex-1 flex-col gap-2 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  asChild = false,\n  ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot : \"div\"\n\n  return (\n    <Comp\n      data-slot=\"sidebar-group-label\"\n      data-sidebar=\"group-label\"\n      className={cn(\n        \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction SidebarGroupAction({\n  className,\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      data-slot=\"sidebar-group-action\"\n      data-sidebar=\"group-action\"\n      className={cn(\n        \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:absolute after:-inset-2 md:after:hidden\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      {...props}\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-1\", 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 flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] 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 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\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_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(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  asChild = false,\n  isActive = false,\n  variant = \"default\",\n  size = \"default\",\n  tooltip,\n  className,\n  ...props\n}: React.ComponentProps<\"button\"> & {\n  asChild?: boolean\n  isActive?: boolean\n  tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n  const Comp = asChild ? Slot : \"button\"\n  const { isMobile, state } = useSidebar()\n\n  const button = (\n    <Comp\n      data-slot=\"sidebar-menu-button\"\n      data-sidebar=\"menu-button\"\n      data-size={size}\n      data-active={isActive}\n      className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n      {...props}\n    />\n  )\n\n  if (!tooltip) {\n    return button\n  }\n\n  if (typeof tooltip === \"string\") {\n    tooltip = {\n      children: tooltip,\n    }\n  }\n\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>{button}</TooltipTrigger>\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  asChild = false,\n  showOnHover = false,\n  ...props\n}: React.ComponentProps<\"button\"> & {\n  asChild?: boolean\n  showOnHover?: boolean\n}) {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      data-slot=\"sidebar-menu-action\"\n      data-sidebar=\"menu-action\"\n      className={cn(\n        \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:absolute after:-inset-2 md:after:hidden\",\n        \"peer-data-[size=sm]/menu-button:top-1\",\n        \"peer-data-[size=default]/menu-button:top-1.5\",\n        \"peer-data-[size=lg]/menu-button:top-2.5\",\n        \"group-data-[collapsible=icon]:hidden\",\n        showOnHover &&\n          \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n        className\n      )}\n      {...props}\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        \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n        \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n        \"peer-data-[size=sm]/menu-button:top-1\",\n        \"peer-data-[size=default]/menu-button:top-1.5\",\n        \"peer-data-[size=lg]/menu-button:top-2.5\",\n        \"group-data-[collapsible=icon]:hidden\",\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.useMemo(() => {\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        \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n        \"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  asChild = false,\n  size = \"md\",\n  isActive = false,\n  className,\n  ...props\n}: React.ComponentProps<\"a\"> & {\n  asChild?: boolean\n  size?: \"sm\" | \"md\"\n  isActive?: boolean\n}) {\n  const Comp = asChild ? Slot : \"a\"\n\n  return (\n    <Comp\n      data-slot=\"sidebar-menu-sub-button\"\n      data-sidebar=\"menu-sub-button\"\n      data-size={size}\n      data-active={isActive}\n      className={cn(\n        \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n        \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n        size === \"sm\" && \"text-xs\",\n        size === \"md\" && \"text-sm\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      {...props}\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"
  },
  {
    "path": "apps/www/components/ui/skeleton.tsx",
    "content": "import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  return (\n    <div\n      className={cn(\"bg-primary/10 animate-pulse rounded-md\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Skeleton }\n"
  },
  {
    "path": "apps/www/components/ui/sonner.tsx",
    "content": "\"use client\"\n\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner } from \"sonner\"\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>\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      toastOptions={{\n        classNames: {\n          toast:\n            \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n          description: \"group-[.toast]:text-muted-foreground\",\n          actionButton:\n            \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n          cancelButton:\n            \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n        },\n      }}\n      {...props}\n    />\n  )\n}\n\nexport { Toaster }\n"
  },
  {
    "path": "apps/www/components/ui/switch.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Switch = React.forwardRef<\n  React.ElementRef<typeof SwitchPrimitives.Root>,\n  React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n  <SwitchPrimitives.Root\n    className={cn(\n      \"peer focus-visible:ring-ring focus-visible:ring-offset-background data-[state=checked]:bg-primary data-[state=unchecked]:bg-input inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  >\n    <SwitchPrimitives.Thumb\n      className={cn(\n        \"bg-background pointer-events-none block h-4 w-4 rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n      )}\n    />\n  </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n"
  },
  {
    "path": "apps/www/components/ui/table.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n  HTMLTableElement,\n  React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n  <div className=\"relative w-full overflow-auto\">\n    <table\n      ref={ref}\n      className={cn(\"w-full caption-bottom text-sm\", className)}\n      {...props}\n    />\n  </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tbody\n    ref={ref}\n    className={cn(\"[&_tr:last-child]:border-0\", className)}\n    {...props}\n  />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tfoot\n    ref={ref}\n    className={cn(\n      \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n      className\n    )}\n    {...props}\n  />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n  HTMLTableRowElement,\n  React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n  <tr\n    ref={ref}\n    className={cn(\n      \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n      className\n    )}\n    {...props}\n  />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n  HTMLTableCellElement,\n  React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <th\n    ref={ref}\n    className={cn(\n      \"text-muted-foreground h-10 px-2 text-left align-middle font-medium [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n      className\n    )}\n    {...props}\n  />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n  HTMLTableCellElement,\n  React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <td\n    ref={ref}\n    className={cn(\n      \"p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n      className\n    )}\n    {...props}\n  />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n  HTMLTableCaptionElement,\n  React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n  <caption\n    ref={ref}\n    className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n    {...props}\n  />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableFooter,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableCaption,\n}\n"
  },
  {
    "path": "apps/www/components/ui/tabs.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Tabs({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n  return (\n    <TabsPrimitive.Root\n      data-slot=\"tabs\"\n      className={cn(\"flex flex-col gap-2\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      data-slot=\"tabs-list\"\n      className={cn(\n        \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n  return (\n    <TabsPrimitive.Trigger\n      data-slot=\"tabs-trigger\"\n      className={cn(\n        \"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot=\"tabs-content\"\n      className={cn(\"flex-1 outline-none\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger }\n"
  },
  {
    "path": "apps/www/components/ui/tooltip.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction TooltipProvider({\n  delayDuration = 0,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n  return (\n    <TooltipPrimitive.Provider\n      data-slot=\"tooltip-provider\"\n      delayDuration={delayDuration}\n      {...props}\n    />\n  )\n}\n\nfunction Tooltip({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n  return (\n    <TooltipProvider>\n      <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n    </TooltipProvider>\n  )\n}\n\nfunction TooltipTrigger({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n  return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n  className,\n  sideOffset = 0,\n  children,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n  return (\n    <TooltipPrimitive.Portal>\n      <TooltipPrimitive.Content\n        data-slot=\"tooltip-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" />\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n"
  },
  {
    "path": "apps/www/components/version-select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronDownIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\n\nconst DOMAINS = {\n  v3: \"https://v3.magicui.design\",\n  v4: \"https://magicui.design\",\n} as const\n\nexport function VersionSelect({ className }: { className?: string }) {\n  const [version, setVersion] = React.useState<keyof typeof DOMAINS>(\"v4\")\n\n  const handleVersionChange = (value: keyof typeof DOMAINS) => {\n    setVersion(value)\n    window.location.href = DOMAINS[value]\n  }\n\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger\n        className={cn(\n          \"bg-background text-foreground hover:bg-accent hover:text-accent-foreground flex h-7 w-14 cursor-pointer items-center justify-between rounded-full border py-1 pr-0.5 pl-2 text-sm font-medium\",\n          className\n        )}\n      >\n        {version}\n        <div className=\"flex size-5 items-center justify-center rounded-full border\">\n          <ChevronDownIcon className=\"text-muted-foreground size-4\" />\n        </div>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent align=\"start\" className=\"min-w-[120px]\">\n        <DropdownMenuItem\n          onClick={() => handleVersionChange(\"v3\")}\n          className={cn(\n            \"flex justify-between\",\n            version === \"v3\" && \"bg-accent text-accent-foreground\"\n          )}\n        >\n          Tailwind v3\n          {version === \"v3\" && <CheckIcon className=\"ml-2 size-4\" />}\n        </DropdownMenuItem>\n        <DropdownMenuItem\n          onClick={() => handleVersionChange(\"v4\")}\n          className={cn(\n            \"flex justify-between\",\n            version === \"v4\" && \"bg-accent text-accent-foreground\"\n          )}\n        >\n          Tailwind v4\n          {version === \"v4\" && <CheckIcon className=\"ml-2 size-4\" />}\n        </DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  )\n}\n"
  },
  {
    "path": "apps/www/components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"new-york\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.cjs\",\n    \"css\": \"styles/globals.css\",\n    \"baseColor\": \"neutral\",\n    \"cssVariables\": true,\n    \"prefix\": \"\"\n  },\n  \"aliases\": {\n    \"components\": \"@/components\",\n    \"utils\": \"@/lib/utils\",\n    \"ui\": \"@/components/ui\",\n    \"lib\": \"@/lib\",\n    \"hooks\": \"@/hooks\"\n  },\n  \"iconLibrary\": \"lucide\"\n}"
  },
  {
    "path": "apps/www/config/docs.ts",
    "content": "import { NavItem, NavItemWithChildren } from \"@/types\"\n\ninterface DocsConfig {\n  mainNav: NavItem[]\n  sidebarNav: NavItemWithChildren[]\n}\n\nexport interface DocNavLink {\n  url: string\n  name: string\n}\n\nfunction flattenSidebarItems(\n  items: NavItemWithChildren[],\n  acc: DocNavLink[] = []\n): DocNavLink[] {\n  for (const item of items) {\n    if (item.href) {\n      acc.push({ url: item.href, name: item.title })\n    }\n    if (item.items?.length) {\n      flattenSidebarItems(item.items, acc)\n    }\n  }\n  return acc\n}\n\nfunction getFlattenedDocsNav(): DocNavLink[] {\n  const result: DocNavLink[] = []\n  for (const section of docsConfig.sidebarNav) {\n    if (section.items?.length) {\n      flattenSidebarItems(section.items, result)\n    }\n  }\n  return result\n}\n\nexport function getNeighboursFromConfig(currentUrl: string): {\n  previous?: DocNavLink\n  next?: DocNavLink\n} {\n  const nav = getFlattenedDocsNav()\n  const normalized = currentUrl.replace(/\\/$/, \"\") || \"/\"\n  const index = nav.findIndex((item) => {\n    const itemNorm = item.url.replace(/\\/$/, \"\") || \"/\"\n    return itemNorm === normalized\n  })\n  if (index < 0) return {}\n  return {\n    previous: index > 0 ? nav.at(index - 1) : undefined,\n    next: index < nav.length - 1 ? nav.at(index + 1) : undefined,\n  }\n}\n\nexport const docsConfig: DocsConfig = {\n  mainNav: [\n    {\n      title: \"Components\",\n      href: \"/components\",\n    },\n    {\n      title: \"Templates\",\n      href: \"https://pro.magicui.design\",\n      event: \"header_cta_clicked\",\n      label: \"\",\n    },\n    {\n      title: \"Showcase\",\n      href: \"/showcase\",\n    },\n  ],\n  sidebarNav: [\n    {\n      title: \"Getting Started\",\n      items: [\n        {\n          title: \"Introduction\",\n          href: \"/docs\",\n          items: [],\n        },\n        {\n          title: \"Installation\",\n          href: \"/docs/installation\",\n          items: [],\n        },\n        {\n          title: \"MCP\",\n          href: \"/docs/mcp\",\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Story\",\n          href: \"/docs/story\",\n          items: [],\n          label: \"New\",\n        },\n        {\n          title: \"Legacy\",\n          href: \"/docs/legacy\",\n          items: [],\n          label: \"\",\n        },\n      ],\n    },\n    {\n      title: \"Templates\",\n      items: [\n        {\n          title: \"CodeForge\",\n          href: `/docs/templates/codeforge`,\n          items: [],\n          label: \"New\",\n          paid: true,\n          event: \"template_codeforge_clicked\",\n        },\n        {\n          title: \"AI Agent\",\n          href: `/docs/templates/agent`,\n          items: [],\n          label: \"\",\n          paid: true,\n          event: \"template_agent_clicked\",\n        },\n        {\n          title: \"Dev Tool\",\n          href: `/docs/templates/devtool`,\n          items: [],\n          label: \"\",\n          paid: true,\n          event: \"template_devtool_clicked\",\n        },\n        {\n          title: \"Mobile\",\n          href: `/docs/templates/mobile`,\n          items: [],\n          label: \"\",\n          paid: true,\n          event: \"template_mobile_clicked\",\n        },\n        {\n          title: \"SaaS\",\n          href: `/docs/templates/saas`,\n          items: [],\n          label: \"\",\n          paid: true,\n          event: \"template_saas_clicked\",\n        },\n        {\n          title: \"Startup\",\n          href: `/docs/templates/startup`,\n          items: [],\n          label: \"\",\n          paid: true,\n          event: \"template_startup_clicked\",\n        },\n        {\n          title: \"Portfolio\",\n          href: `/docs/templates/portfolio`,\n          items: [],\n          label: \"\",\n          event: \"template_portfolio_clicked\",\n        },\n        {\n          title: \"Changelog\",\n          href: `/docs/templates/changelog`,\n          items: [],\n          label: \"New\",\n          paid: false,\n          event: \"template_changelog_clicked\",\n        },\n        {\n          title: \"Blog\",\n          href: `/docs/templates/blog`,\n          items: [],\n          label: \"New\",\n          paid: false,\n          event: \"template_blog_clicked\",\n        },\n      ],\n    },\n    {\n      title: \"Components\",\n      items: [\n        {\n          title: \"Marquee\",\n          href: `/docs/components/marquee`,\n          items: [],\n        },\n        {\n          title: \"Terminal\",\n          href: `/docs/components/terminal`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Hero Video Dialog\",\n          href: `/docs/components/hero-video-dialog`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Bento Grid\",\n          href: `/docs/components/bento-grid`,\n          items: [],\n        },\n        {\n          title: \"Animated List\",\n          href: `/docs/components/animated-list`,\n          items: [],\n        },\n        {\n          title: \"Dock\",\n          href: `/docs/components/dock`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Globe\",\n          href: `/docs/components/globe`,\n          items: [],\n        },\n        {\n          title: \"Tweet Card\",\n          href: `/docs/components/tweet-card`,\n          items: [],\n        },\n        {\n          title: \"Orbiting Circles\",\n          href: `/docs/components/orbiting-circles`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Avatar Circles\",\n          href: `/docs/components/avatar-circles`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Icon Cloud\",\n          href: `/docs/components/icon-cloud`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Lens\",\n          href: `/docs/components/lens`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Pointer\",\n          href: `/docs/components/pointer`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Smooth Cursor\",\n          href: `/docs/components/smooth-cursor`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Progressive Blur\",\n          href: `/docs/components/progressive-blur`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Dotted Map\",\n          href: `/docs/components/dotted-map`,\n          items: [],\n          label: \"New\",\n        },\n      ],\n    },\n    {\n      title: \"Special Effects\",\n      items: [\n        {\n          title: \"Animated Beam\",\n          href: `/docs/components/animated-beam`,\n          items: [],\n        },\n        {\n          title: \"Border Beam\",\n          href: `/docs/components/border-beam`,\n          items: [],\n        },\n        {\n          title: \"Shine Border\",\n          href: `/docs/components/shine-border`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Magic Card\",\n          href: `/docs/components/magic-card`,\n          items: [],\n        },\n        {\n          title: \"Meteors\",\n          href: `/docs/components/meteors`,\n          items: [],\n        },\n        {\n          title: \"Confetti\",\n          href: `/docs/components/confetti`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Particles\",\n          href: `/docs/components/particles`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Animated Theme Toggler\",\n          href: `/docs/components/animated-theme-toggler`,\n          items: [],\n          label: \"New\",\n        },\n      ],\n    },\n    {\n      title: \"Animations\",\n      items: [\n        {\n          title: \"Blur Fade\",\n          href: `/docs/components/blur-fade`,\n          items: [],\n          label: \"\",\n        },\n      ],\n    },\n    {\n      title: \"Text Animations\",\n      items: [\n        {\n          title: \"Text Animate\",\n          href: `/docs/components/text-animate`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Typing Animation\",\n          href: `/docs/components/typing-animation`,\n          items: [],\n          label: \"New\",\n        },\n        {\n          title: \"Line Shadow Text\",\n          href: `/docs/components/line-shadow-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Aurora Text\",\n          href: `/docs/components/aurora-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Video Text\",\n          href: `/docs/components/video-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Number Ticker\",\n          href: `/docs/components/number-ticker`,\n          items: [],\n        },\n        {\n          title: \"Animated Shiny Text\",\n          href: `/docs/components/animated-shiny-text`,\n          items: [],\n        },\n        {\n          title: \"Animated Gradient Text\",\n          href: `/docs/components/animated-gradient-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Text Reveal\",\n          href: `/docs/components/text-reveal`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Hyper Text\",\n          href: `/docs/components/hyper-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Word Rotate\",\n          href: `/docs/components/word-rotate`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Scroll Based Velocity\",\n          href: `/docs/components/scroll-based-velocity`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Sparkles Text\",\n          href: `/docs/components/sparkles-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Morphing Text\",\n          href: `/docs/components/morphing-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Spinning Text\",\n          href: `/docs/components/spinning-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Text Highlighter\",\n          href: \"/docs/components/highlighter\",\n          items: [],\n          label: \"New\",\n        },\n      ],\n    },\n    {\n      title: \"Device Mocks\",\n      items: [\n        {\n          title: \"Safari\",\n          href: `/docs/components/safari`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"iPhone\",\n          href: `/docs/components/iphone`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Android\",\n          href: `/docs/components/android`,\n          items: [],\n          label: \"\",\n        },\n      ],\n    },\n    {\n      title: \"Buttons\",\n      items: [\n        {\n          title: \"Rainbow Button\",\n          href: `/docs/components/rainbow-button`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Shimmer Button\",\n          href: `/docs/components/shimmer-button`,\n          items: [],\n        },\n        {\n          title: \"Ripple Button\",\n          href: \"/docs/components/ripple-button\",\n          items: [],\n          label: \"\",\n        },\n      ],\n    },\n    {\n      title: \"Backgrounds\",\n      items: [\n        {\n          title: \"Flickering Grid\",\n          href: `/docs/components/flickering-grid`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Animated Grid Pattern\",\n          href: `/docs/components/animated-grid-pattern`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Retro Grid\",\n          href: `/docs/components/retro-grid`,\n          items: [],\n        },\n        {\n          title: \"Ripple\",\n          href: `/docs/components/ripple`,\n          items: [],\n        },\n        {\n          title: \"Dot Pattern\",\n          href: `/docs/components/dot-pattern`,\n          items: [],\n        },\n        {\n          title: \"Grid Pattern\",\n          href: `/docs/components/grid-pattern`,\n          items: [],\n        },\n        {\n          title: \"Striped Pattern\",\n          href: `/docs/components/striped-pattern`,\n          items: [],\n          label: \"New\",\n        },\n        {\n          title: \"Interactive Grid Pattern\",\n          href: `/docs/components/interactive-grid-pattern`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Light Rays\",\n          href: `/docs/components/light-rays`,\n          items: [],\n          label: \"New\",\n        },\n      ],\n    },\n    {\n      title: \"Community\",\n      items: [\n        {\n          title: \"Shiny Button\",\n          href: `/docs/components/shiny-button`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"File Tree\",\n          href: `/docs/components/file-tree`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Code Comparison\",\n          href: `/docs/components/code-comparison`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Scroll Progress\",\n          href: `/docs/components/scroll-progress`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Neon Gradient Card\",\n          href: `/docs/components/neon-gradient-card`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Comic Text\",\n          href: `/docs/components/comic-text`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Cool Mode\",\n          href: `/docs/components/cool-mode`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Pixel Image\",\n          href: \"/docs/components/pixel-image\",\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Pulsating Button\",\n          href: \"/docs/components/pulsating-button\",\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Warp Background\",\n          href: `/docs/components/warp-background`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Interactive Hover Button\",\n          href: `/docs/components/interactive-hover-button`,\n          items: [],\n          label: \"\",\n        },\n        {\n          title: \"Animated Circular Progress Bar\",\n          href: `/docs/components/animated-circular-progress-bar`,\n          items: [],\n          label: \"\",\n        },\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "apps/www/config/site.ts",
    "content": "export const siteConfig = {\n  name: \"Magic UI\",\n  url: \"https://magicui.design\",\n  ogImage: \"https://magicui.design/og\",\n  description:\n    \"Beautifully designed landing page components built with React & Tailwind CSS.\",\n  links: {\n    twitter: \"https://twitter.com/dillionverma\",\n    discord: \"https://discord.gg/87p2vpsat5\",\n    github: \"https://github.com/magicuidesign/magicui\",\n    instagram: \"https://instagram.com/magicuidesign/\",\n  },\n  keywords: [\n    \"React\",\n    \"Tailwind CSS\",\n    \"Motion\",\n    \"Landing Page\",\n    \"Components\",\n    \"Next.js\",\n  ],\n}\n\nexport type SiteConfig = typeof siteConfig\n"
  },
  {
    "path": "apps/www/content/blog/animated-landing-page.mdx",
    "content": "---\ntitle: \"How To Create A Responsive Animated Landing Page (With Examples)\"\ndescription: \"Create your animated landing page. Learn how to boost conversions that lead to engaging user experiences. Try Magic UI's landing page templates today!\"\nimage: https://cdn.magicui.design/assets/3331905c-8373-4d3b-a89e-093216d2869b.png\nauthor: Dillion Verma\ntags:\n  - landing page examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nDo you want to avoid your landing pages falling flat and not converting as you hoped? Adding animation could be the secret sauce to revitalize user engagement and boost conversion rates. In this blog, you will learn how to create animated landing pages and their vital role in enhancing user experience, increasing conversions, and creating a lasting impression. This blog also highlights [landing page examples](https://magicui.design/blog/landing-page-examples) to inspire your creative journey and offers insights to help you easily create animated landing pages.\n\nMagic UI's solution, the [startup landing page template](https://pro.magicui.design/docs/templates/startup), provides an excellent foundation to start your animated landing page creation journey. With this user-friendly tool, you can quickly learn about creating animated landing pages and find inspiration from many examples available.\n\n## What Is An Animated Landing Page\n\n![Animated Landing Page](https://cdn.magicui.design/assets/9pwmcrqtcho.jpg)\n\nLanding page animations are dynamic elements integrated into a webpage to boost user engagement and enhance the overall experience.\n\n### Animation Effects\n\nThese animations can include effects such as:\n\n- Sliding images\n- [Fading text](https://www.giessereilexikon.com/en/foundry-lexicon/Encyclopedia/show/fading-effect-3762/)\n- Interactive buttons\n\n### Purpose of Animation\n\nTheir primary purpose is to highlight critical features, guide user behavior, and make the page visually appealing, which can ultimately drive [higher conversion rates](https://www.coursera.org/articles/what-is-conversion-rate).\n\n### Storytelling with Animation\n\nBeyond aesthetics, animations play a significant role in storytelling by smoothly directing visitors through the content.\n\nThey create a more immersive and engaging experience when used effectively, drawing attention to important information and calls to action.\n\n### Animation and Performance\n\nUsing animations judiciously to balance visual appeal and page performance is essential, ensuring the page remains functional and fast-loading.\n\n### Animation Benefits\n\nToday, landing page animation is an excellent opportunity to stand out and a long-term investment in your brand. It can bring a truly memorable experience to your website visitors, who will become your customers.\n\n## How Does Animation Impact Your Landing Pages And UX\n\n![Animated Landing Page](https://cdn.magicui.design/assets/2kxr8auimr.jpg)\n\nAnimation can [significantly impact](https://www.nngroup.com/articles/animation-purpose-ux/) landing pages and user experience (UX). Here’s how incorporating animation can enhance your landing page's effectiveness and improve user engagement:\n\n### Capturing Attention\n\nAnimation can draw users' attention to specific elements on your landing page, such as calls to action (CTAs) or key messages.\n\nBy using subtle animations, like a button that changes color or a text block that fades in, you can guide users to important information without overwhelming them. This helps keep visitors focused on what matters most, increasing the likelihood of conversions.\n\n### Enhancing User Engagement\n\nInteractive animations can make your landing page more engaging. Animated infographics or interactive sliders can encourage users to explore content more thoroughly.\n\nWhen users interact with animated elements, they are more likely to stay on the page longer, which can:\n\n- Reduce bounce rates\n- Improve overall engagement metrics\n\n### Improving Information Retention\n\nAnimations can aid storytelling and convey complex information more effectively. For instance, using animations to illustrate a process or demonstrate a product can help users understand the benefits of what you’re offering.\n\nThis can lead to:\n\n- Better information retention\n- Stronger connection with your brand\n\n### Creating a Professional Look\n\nWell-executed animations can enhance the aesthetic appeal of your landing page, giving it a polished and professional look.\n\nThis can help build trust with your audience, as a visually appealing page is often associated with credibility and quality. Users are more likely to engage with a brand that presents itself well.\n\n### Encouraging Action\n\nAnimations can be used strategically to encourage users to take action. For example, a subtle bounce effect on a CTA button can create a sense of urgency, prompting users to click.\n\nYou can increase conversion rates by making your CTAs more visually appealing and dynamic.\n\n### Try MagicUI Now\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- [Tailwind CSS](https://www.geeksforgeeks.org/introduction-to-tailwind-css/)\n- Motion\n\n#### MagicUI Features\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n#### Design Meets Development\n\nWith our focus on animation and a design-centric approach, [MagicUI](https://pro.magicui.design/docs/templates/startup) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nAlong with our free component library, MagicUI Pro can:\n\n- Save you thousands of hours\n- Create a beautiful landing page\n- Convert your visitors into customers with our website templates\n\nUse our [startup landing page template today](https://pro.magicui.design/docs/templates/startup).\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 9 Types Of Design Components Of Creating Animated  Landing Pages\n\n![Animated Landing Page](https://cdn.magicui.design/assets/7lhegnmyxmc.jpg)\n\n### 1\\. Animated text\n\nAnimated text allows you to apply motion effects to text elements on a landing page, such as:\n\n- Fade-ins\n- Slides\n- Zooms\n\nThese animations draw attention to crucial messages, making them more noticeable and memorable. Using animated text, you’ll guide visitors' focus to essential areas of your page, including headlines or calls to action.\n\n### 2\\. Button effects\n\nAnimated CTA buttons might shimmer, pulse, change color, or grow in size when hovered over, creating a visually appealing invitation for users to click.\n\nUtilizing animated [CTA buttons](https://www.optimizely.com/optimization-glossary/call-to-action/) can enhance user engagement by making the desired action stand out, which increases the likelihood of conversions. Magic UI's shimmer button shimmers around the edges, drawing attention to your CTA.\n\n### 3\\. Videos\n\nAdding videos to landing pages, whether as embedded content or dynamic backgrounds, can significantly boost engagement.\n\n#### Informative Video Embeds\n\nEmbedded videos allow you to share detailed information or showcase products, making complex ideas easy to understand.\n\n#### Immersive Video Backgrounds\n\nUsing videos as backgrounds adds a visual element that captures attention and sets the mood, creating an immersive experience. Both methods can increase visitor interaction and drive conversions.\n\n### 4\\. Parallax scroll effects\n\nParallax scrolling is a design technique where background elements move slower than foreground content as you scroll, creating a sense of depth and immersion.\n\n#### Engaging Parallax Scrolling\n\nIncluding [parallax scrolling](https://www.w3schools.com/howto/howto_css_parallax.asp) on your landing page enhances the user experience by making the page more engaging and visually appealing. This effect draws users in, encouraging them to explore your content more thoroughly.\n\n### 5\\. Scrolling animation\n\nScrolling animations are another form of interactive landing page animation—and they’re one of the most commonly used.\n\n#### User-Paced Scrolling\n\nThey are triggered when the user scrolls up or down, allowing the visitor to consume your content at their own pace.\n\n#### Scroll Animation Types\n\nSimple scrolling animations can take the form of animated text, but they can also bring motion to graphics or images. Other forms of scrolling animation include:\n\n- Parallax scrolling\n- Animated transitions\n- Fade-ins and fade-outs\n\n### 6\\. Animated graphics and illustrations\n\nAnimated graphics and illustrations are good ways to bring your landing page to life. These can range from subtle, user-triggered graphics to eye-catching animations encouraging visitors to explore your website.\n\n#### Modern Animation Stars\n\nWhile GIFs were once the most popular form of landing page animation, today, Lottie animations are more popular because they’re smaller, faster, and much higher quality. Animated charts are another popular animated landing page graphic.\n\n### 7\\. Animated backgrounds\n\nIf you’re looking to create an impressive cinematic effect on your landing page, you may want to consider an animated background.\n\n#### Immersive Background Layers\n\nThese place animated grids, videos, photos, or graphics behind the content in the foreground, creating a profoundly immersive experience that feels like you’re moving through a page rather than simply scrolling through it.\n\n#### Storytelling with Animation\n\nIf your landing page focuses on a specific story, then this form of landing page animation, which pairs text with visual aids, can be very effective.\n\n### 8\\. Carousels and slideshows\n\nMost landing pages aren’t long, so it’s important to conserve screen space whenever possible. Slideshows, image galleries, and horizontal-scrolling sections are great ways to maximize screen space while still injecting movement and life into your landing page.\n\n#### Bandwidth-Friendly Showcase\n\nYou can show readers more visual examples of your work without using precious bandwidth. Animated carousels like our Marquee component are a great way to show testimonials on your landing page without cluttering the page.\n\n#### Creative Carousel Display\n\nYou can present it horizontally or vertically or use #D to add more dramatic effects to your page.\n\n### 9\\. Hover animations\n\nHover animations are triggered in response to user interactions. They occur when visitors move their cursor over selected elements, causing them to move, change size or color, switch up the background images, and more.\n\nHover animations are one of the more subtle forms of animation and are often used to highlight specific text and visuals through micro-interactions.\n\n## 3 Easy & Efficient Ways To Add Animation To Your Landing Page\n\n![Animated Landing Page](https://images.unsplash.com/photo-1677078610152-8a627d8ced8d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxJVCUyMHRlYW18ZW58MHx8fHwxNzIzMDE3Mzk4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. MagicUI\n\n[MagicUI](https://magicui.design/) is a versatile UI library designed to simplify the integration of animations into landing pages. It offers over 20 pre-built animated components, such as interactive buttons and sliders, built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Motion\n\n#### Endless Customization\n\nThese highly customizable components allow seamless adaptation to your branding and design needs.\n\n#### Design and Dev Harmony\n\nBy bridging the gap between design and development, [MagicUI](https://magicui.design/) helps create captivating digital experiences with minimal effort. Its focus on design-centric animations and its efficiency in saving time makes it an invaluable tool for enhancing user engagement.\n\n#### Pro-Level Power-up\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) provides advanced features and website templates to further streamline the creation of beautiful, high-converting landing pages.\n\n### 2\\. CSS Animations\n\n[CSS animations](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animations/Using_CSS_animations) are a powerful way to add movement and visual interest without relying on JavaScript.\n\n#### CSS Animation Basics\n\nUsing CSS properties, you can create animations by defining keyframes and applying them to [HTML elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element). You can animate elements to fade, slide, or bounce as users interact with the page.\n\n### 3\\. Webflow Interactions\n\nIf you're using Webflow, you can leverage its built-in interactions and animations feature. Webflow provides a visual interface to design animations and interactions without writing code.\n\n#### Interactive Animation Triggers\n\nYou can create animations triggered by user actions, such as scrolling or clicking, and apply them to various elements on your landing page.\n\n## Examples Of Great Animated Landing Page\n\n![Animated Landing Page](https://images.unsplash.com/photo-1499914485622-a88fac536970?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjMwMTc0MDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Langfuse\n\nLangfuse is a tech startup designed to enhance observability for AI applications, particularly those using large language models (LLMs).\n\n#### AI Performance Insights\n\nIt integrates seamlessly with existing AI models to provide detailed insights into their performance, helping developers understand and improve their AI systems.\n\n#### AI Performance Insights\n\n[Langfuse uses Magic UI](https://langfuse.com/) to build its landing page and components, such as an animated video to show its products and an animated beam to display how its products integrate with other tools. It also uses the shimmer button, which shines bright around the edges when hovered over.\n\n### Cognosys\n\nCognosys is a productivity tool that lets you do more in less time. Like Langfuse, It was built with [Magic UI](https://pro.magicui.design/docs/templates/startup).\n\n#### Gradual Content Reveal\n\nThey use scrolling animation effects, where the content gradually appears when the user scrolls down. [Scroll animations are triggered](https://www.cognosys.ai/) when the user scrolls up or down, allowing the visitor to consume the content at their own pace.\n\n#### Animated Explainer\n\nThey also use other components like the animated beam to explain better how their product works and integrates with others.\n\n### Road 13 Vineyards - The John Oliver Collection\n\nCanadian wine company Road 13 Vineyards used Vev to create their animated landing page to promote their new range of products, The John Oliver Collection.\n\n#### Animated Storytelling\n\nThe first element to note is animated text. As the reader scrolls, paragraphs slide horizontally across the screen, telling the story of John Oliver and why Road 13 has created a collection dedicated to him.\n\n#### Dynamic Scroll Design\n\nThe flipping from vertical to horizontal scroll instantly engages the reader and shows them that this isn’t a standard e-commerce site but an engaging digital story.\n\n### Contra\n\nContra utilizes decorative rather than functional hover effects. Hovering over the floating images gently shifts them, which complements the airiness of this design.\n\n### Dissolution\n\nDissolution is a [science fiction-inspired video](https://playdissolution.com/) game that uses three-dimensional background images of a spacecraft for a deeply immersive experience.\n\nScrolling down the page feels akin to moving through it, like being dropped straight into the video game.\n\n### DN - The Craftsmen\n\nDagens Næringsliv—or DN—is a Norwegian newspaper. Their Vev-created advertising feature for Lexus, The Craftsmen, contains some excellent examples of landing page animation.\n\n#### Cinematic Welcome\n\nArriving on the page takes you to a sleek animated background, immediately creating a cinematic effect.\n\n#### Immersive Vehicle Reveal\n\nAs you land on a futuristic photo of a Lexus vehicle, the camera slowly pans in, pulling you into the narrative.\n\n### Origami Metaphor\n\nScrolling down further takes you to an animated graphic of an origami bird being formed. Accompanied by the text ‘precision to the fingertips,’ the delicate and systematic construction of the origami bird conveys the care that went into creating the new Lexuses far better than a block of text could.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Animated Landing Page Best Principles To Keep In Mind\n\n![Animated Landing Page](https://images.unsplash.com/photo-1637855195094-992d3d578f42?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxJVCUyMHRlYW18ZW58MHx8fHwxNzIzMDE3Mzk4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen designing an [animated landing page](https://visme.co/blog/animated-landing-pages/), it's crucial to follow certain principles to ensure the animations enhance user experience rather than detract from it. Here’s a breakdown of the fundamental tenets to keep in mind:\n\n### Make Objects Move Naturally\n\nFor animations to look convincing, they need to adhere to the rules of physics. This means avoiding linear movements that appear mechanical and artificial.\n\n#### Natural Object Motion\n\nInstead, use easing—where objects start slowly and speed up or start quickly and slow down—to create a more natural effect.\n\n#### Realistic Movement Paths\n\nAdditionally, objects should follow arcs in their movement, mimicking real-world motion. Avoid making multiple elements move simultaneously to prevent cognitive overload.\n\n#### Focused Animation Flow\n\nInstead, animate elements one at a time to make the content more accessible to follow and understand.\n\n### Reveal Elements in the Right Order\n\nThe sequence of elements on the page should guide the user’s attention. For horizontally or vertically aligned elements, ensure they appear one by one at a consistent pace.\n\n#### Diagonal Focus Flow\n\nIf dealing with a complex arrangement of objects, like a grid, animate them from the top left to the bottom right to direct the user’s focus diagonally.\n\n#### Logical Animation Path\n\nThis method helps maintain a logical flow and ensures users can easily follow the narrative of the animation.\n\n### Timing is Everything\n\nThe duration of animations is critical. They should be long enough for users to notice but not so long that they become impatient.\n\n#### Optimal Animation Speed\n\nResearch suggests that the optimal timing for [animations](https://www.sliderrevolution.com/design/animated-landing-page/) is between 100 and 500 milliseconds. Animations for mobile devices with smaller screens can be quicker, while those for desktops can be slower.\n\n#### Responsive Animation Timing\n\nAdjust the timing based on the size of the object and the distance it travels to keep the experience engaging and appropriate for the device.\n\n### Animate With Style\n\nConsistency in animation style is key to maintaining a cohesive brand identity. Avoid using a variety of animation effects across different pages, as this can create a disjointed user experience.\n\n#### Consistent Brand Animation\n\nSelect an animation style that aligns with your brand and apply it uniformly across the website. While a bounce effect might work for a playful brand, it may not be suitable for a more serious brand like an insurance company.\n\n### Use Animation with Purpose\n\nToo many animated effects can be overwhelming and make it hard for visitors to know what to pay attention to.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. This library provides over 20 animated components, allowing users to create visually appealing and interactive web applications effortlessly.\n\n### Design-Development Harmony\n\nWith a focus on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering users to craft captivating digital experiences. The highly customizable components seamlessly adapt to match desired branding and design requirements, making them ideal for creating stunning user interfaces with minimal effort.\n\n### Saving Time and Creating Beautiful Landing Pages with MagicUI Pro\n\nIn addition to the free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) offers a valuable resource for users looking to save time and create beautiful landing pages.\n\n### Conversion Optimization\n\nWith MagicUI Pro, users can effectively leverage website templates to convert visitors into customers. By incorporating MagicUI Pro into their projects, design engineers can enhance the user experience and increase engagement with animated landing pages that stand out from the competition.\n\n### Start Your Journey\n\nReady to get started? Use the [startup landing page template](https://pro.magicui.design/docs/templates/startup) today and discover the power of MagicUI Pro for yourself.\n"
  },
  {
    "path": "apps/www/content/blog/animation-libraries.mdx",
    "content": "---\ntitle: \"10 Best Animation Libraries to Get Your Web Design Project Started\"\ndescription: \"Discover the 10 best animation libraries to kickstart your web design project with dynamic visuals and smooth transitions.\"\nimage: https://cdn.magicui.design/assets/6d260e11-f00c-419f-8b3e-3b27662e6412.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nAnimation breathes life into static interfaces, and engaging animations can significantly improve user experience. However, manually creating animations can take time and effort. Animation libraries are pre-built collections of animations that make it easy for web designers to incorporate animations into their projects. Using an animation library lets you quickly start your web design project with a selection of animations you can customize to fit your needs.\n\nThe more you learn about animation libraries, the better you'll be at picking the right one for your project and the quicker you can get to animating and improving your design with [web design best practices](https://magicui.design/blog/web-design-best-practices). In this guide, we’ll cover the ins and outs of animation libraries to help you kickstart your next web design project.\n\nBefore we start, MagicUI's startup landing page template is a valuable tool for learning about animation libraries and starting your web design project. This premade template has a clean, professional layout with plenty of space to showcase your business, products, and services. Better yet, it offers a selection of customizable animations to help you create an attention-grabbing interface.\n\n## What are Animation Libraries?\n\n![Animation Libraries](https://cdn.magicui.design/assets/e7ttqxwa9h9.jpg)\n\nAnimation libraries are [collections of pre-built code components](https://www.awwwards.com/awwwards/collections/animation-libraries-examples-inspiration/) that simplify adding animations to web designs. These libraries typically include various animation functions, properties, and utilities that developers can use to create dynamic and engaging visual effects. By leveraging animation libraries, designers and developers can save time and effort compared to building animations from scratch.\n\n### The Benefits of Using Animation Libraries\n\n#### Enhanced User Experience (UX)\n\nAnimations can significantly [improve the user experience](https://www.nngroup.com/videos/ux-animations/) by making websites more interactive and visually appealing. They can also guide users through the interface and provide visual feedback on actions. For example, a subtle animation can indicate a button is clickable or a form has been successfully submitted. Animations can also create micro-interactions, adding a touch of delight and personality to a website.\n\n#### Increased Conversion Rates \n\nStudies have shown that animations can boost conversion rates by capturing user attention and making websites more memorable. A well-placed animation can draw the user's eye to a specific call to action, increasing the likelihood that they will take the desired action. For example, a subtle animation can highlight a discount or promotion, encouraging users to purchase.\n\n#### Reduced Development Time\n\nAnimation libraries provide pre-built components that can be easily integrated into web projects, reducing the time and effort required to create custom animations. This can be particularly beneficial for teams with tight deadlines or limited resources. By using an animation library, developers can focus on making the core functionality of their web application and leave the animations to the experts.\n\n#### Consistent Design\n\nDesigners and developers can maintain a consistent visual style and user experience by using a consistent animation library across multiple projects. This can create a strong brand identity and improve user recognition. For example, a company can use the same animation library for its website, mobile app, and marketing materials, creating a cohesive brand experience.\n\n### Sources\n\nIn addition to the benefits listed above, animation libraries can also help to:\n\n#### Improve Accessibility\n\nAnimations can make websites more accessible to users with disabilities. They can provide visual cues for deaf or hard-of-hearing users or alternative content for blind or low-vision users.\n\n#### Create A More Engaging User Experience\n\nAnimations can enhance the user experience by making websites fun and interactive. They can create games, quizzes, or other interactive elements.\n\n#### Differentiate From Competitors\n\nBy using animations effectively, businesses can differentiate themselves and create a more memorable brand experience.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## 10 Best Animation Libraries\n\n![Animation Libraries](https://images.unsplash.com/photo-1622674850896-dafe9f125ed2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzI1MDYyNjI2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. MagicUI: The UI Library for Designers\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nAlong with our free component library, MagicUI Pro can save you thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### 2\\. GSAP: The Animation Library for Complex Animations \n\nGSAP is a powerful and highly [customizable animation](https://daily.dev/blog/10-best-ui-animation-libraries-for-beginners-2024) library for creating complex and sophisticated animations. It offers advanced features like timelines, easing functions, and tweening, allowing you to control the timing and behavior of your animations precisely.\n\n#### Benefits \n\n- Advanced animation features: GSAP provides rich tools for creating intricate and dynamic animations.\n- Highly customizable: You can tailor GSAP to your needs by adjusting its settings and parameters.\n- Excellent performance: GSAP is designed to deliver smooth and efficient animations, even for demanding applications.\n- Versatile integration: GSAP can be integrated into various development environments and frameworks, making it a flexible choice for different projects.\n\n#### Example \n\n- I am creating dynamic page loading effects, animating scrolling elements, or animating custom SVG paths.\n\n### 3\\. Lottie: The Animation Library for After Effects Users  \n\nLottie is a unique animation library that allows you to integrate After Effects animations directly into your web projects. By exporting your After Effects animations as JSON files, you can easily embed them into your HTML and customize their behavior using Lottie's API.\n\n#### Benefits\n\n- Smooth integration with after effects: Lottie bridges the gap between design and development, enabling designers to create stunning animations that developers can quickly implement.\n- High-quality animations: Lottie preserves your After Effects animations' visual fidelity and quality, ensuring a polished and professional look.\n- Lightweight and efficient: Lottie's optimized codebase ensures that your animations load quickly and perform well on various devices.\n\n#### Example\n\n- I am adding illustrations with subtle movements, creating animated logos, or animating complex character designs.\n\n### 4\\. Popmotion: The Animation Library for Physics-Based Animations  \n\nPopmotion is a [performant animation library](https://www.linkedin.com/pulse/10-best-website-animation-libraries-stunning-designs-qia6f) that focuses on physics-based animations. It offers features like springs, dampers, and inertia, allowing you to create realistic and engaging animations that feel natural and intuitive.\n\n#### Benefits\n\n- Physics-based animations: Popmotion's physics engine provides realistic and responsive animations that mimic real-world behavior.\n- High performance: The library is optimized for speed and efficiency, ensuring smooth animations even on resource-constrained devices.\n- Integrates well with React: Popmotion is designed to work smoothly with React, making it a popular choice for React-based web applications.\n\n#### Example\n\n- Implement realistic spring animations for interactive elements like buttons or menus.\n\n### 5\\. Mo.js: The Versatile Animation Library  \n\nMo.js is a versatile animation library that supports both 2D and 3D animations. It offers a wide range of features, including particle effects, shapes, and physics simulations, allowing you to create visually stunning and interactive effects.\n\n#### Benefits\n\n- Versatile animation capabilities: Mo.js provides rich tools for creating complex and customizable animations.\n- Mo.js supports 2D and 3D animations. Whether you need simple 2D effects or more advanced 3D visualizations, Mo.js has you covered.\n- Physics-based animations: Mo.js includes features for simulating physical phenomena, such as gravity, friction, and collisions.\n\n#### Example\n\n- Creating particle effects, animating custom shapes, or simulating physical phenomena.\n\n### 6\\. Velocity.js: The High-Performance Animation Library  \n\nVelocity.js is a high-performance animation library that is optimized for DOM manipulation. It offers a simple API and a wide range of animation effects, making adding animations to your web elements easy.\n\n#### Benefits\n\n- High performance: Velocity.js is designed to deliver fast and efficient animations, especially when working with DOM elements.\n- Easy to use: The library's straightforward API and clear documentation make it accessible to developers of all skill levels.\n- Versatile animation effects: Velocity.js supports a variety of animation effects, including fades, slides, rotations, and custom easing functions.\n\n#### Example\n\n- Adding element scaling and fading effects, animating scrolling elements, or creating simple transitions between page states.\n\n### 7\\. ScrollReveal.js: The Animation Library for Scrolling Effects  \n\nScrollReveal.js is a simple library that allows you to trigger animations based on scrolling behavior. It makes it easy to reveal content as users scroll down the page, creating engaging and interactive scrolling experiences.\n\n#### Benefits\n\n- Easy to use: ScrollReveal.js has a straightforward API and requires minimal configuration.\n- Engaging scrolling experiences: It can create visually exciting and interactive scrolling effects.\n- Customizable: You can customize the timing, easing, and other aspects of the animations to suit your specific needs.\n\n#### Example\n\n- Revealing hidden content as users scroll down, creating parallax effects, or animating elements as they enter the viewport.\n\n### 8\\. Kute.js: The Animation Library for All Types of Effects  \n\nKute.js is a versatile animation library that supports various animation types. It offers features like easing functions, timelines, and custom animations, allowing you to create complex and sophisticated effects.\n\n#### Benefits\n\n- Versatile animation capabilities: Kute.js provides a rich set of tools for creating various animations.\n- Customizable: You can tailor the animations to your needs by adjusting their settings and parameters.\n- Timelines and sequences: Kute.js allows you to create complex animations with multiple steps and transitions.\n\n#### Example\n\n- I was animating text properties, color changes, or creating complex animations with multiple steps.\n\n### 9\\. Theatre.js: The Animation Library for CSS Preprocessors  \n\nTheatre.js is a declarative animation library that works well with CSS preprocessors. It offers a simple syntax for creating animation timelines and sequences, making managing and maintaining complex animations easier.\n\n#### Benefits\n\n- Declarative syntax: Theatre.js's declarative approach simplifies defining and managing animations.\n- Works well with CSS preprocessors: It integrates smoothly with CSS preprocessors like Sass and Less, allowing you to style your animations using CSS.\n- Timelines and sequences: Theatre.js provides features for creating complex animations with multiple steps and transitions.\n\n#### Example\n\n- We are creating animation timelines for complex animations, animating multiple elements simultaneously, or creating interactive animations.\n\n### 10\\. Animate.css: The Animation Library for Quick Effects  \n\nAnimate.css is a collection of ready-made CSS animations that can be easily applied to your web elements. It offers a variety of animation effects without requiring JavaScript, making it a quick and easy way to add animations to your website.\n\n#### Benefits\n\n- No JavaScript required: Animate.css is entirely CSS-based, eliminating the need for additional scripting.\n- Quick and easy to implement: Add the appropriate CSS class to your elements to apply the desired animation.\n- Variety of animation effects: Animate.css offers various pre-built animations covering multiple use cases.\n\n#### Example\n\n- Applying pre-built hover effects, attention-grabbing animations, or creating simple transitions between page states.\n\n## How to Create an Animation Library\n\n![Animation Libraries](https://images.unsplash.com/photo-1479920252409-6e3d8e8d4866?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3b3JraW5nfGVufDB8fHx8MTcyNTA2MjY0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Required Skills and Tools\n\nTo create your own animation library, you'll need a solid understanding of:\n\n#### JavaScript\n\nA firm grasp of [JavaScript programming](https://www.programiz.com/javascript) is essential for developing animation libraries. You must be comfortable working with functions, objects, and JavaScript concepts.\n\n#### Animation concepts\n\nFamiliarize yourself with the principles of animation, such as timing, easing, and keyframes. This knowledge will help you create smooth and engaging animations.\n\n#### Web Development Principles\n\nA basic understanding of HTML, CSS, and web development best practices is also helpful. This will ensure that your animation library integrates smoothly with web projects.\n\nWhile not strictly necessary, having experience with animation software or tools can also be beneficial. This can help you visualize and design animations before implementing them in code.\n\n### Planning and Design\n\n#### Define The Library's Functionalities\n\nDetermine the types of animations you want to support, such as fades, slides, rotations, or custom paths. Consider the level of customization you want to provide to users.\n\n#### Design The Animation Styles\n\nDecide on the visual appearance of your animations, including timing, easing, and other properties. Consider creating a style guide or design system to ensure consistency.\n\n### Code Development\n\n#### Create Animation Functions\n\nWrite JavaScript functions that handle different animation types. These functions should take parameters to allow users to customize the animations.\n\n#### Implement Properties And Utilities\n\nInclude properties for controlling animation timing, easing, and other aspects. Consider adding utility functions to simplify everyday animation tasks.\n\n#### Consider Modularity And Reusability\n\nDesign your library to be modular and reusable, allowing developers to integrate and customize its components quickly.\n\n#### Optimize Performance\n\nWhen writing your code, pay attention to performance optimization. Use techniques like requestAnimationFrame to ensure smooth animations, especially on older devices or with complex animations.\n\n### Documentation and Testing\n\n#### Write Clear Documentation\n\nProvide comprehensive documentation that explains how to use your library, including usage examples, API references, and tutorials.\n\n#### Thoroughly Test The Library\n\nTest your library on various browsers, devices, and screen sizes to ensure it works as expected in different environments. Pay attention to performance issues and compatibility with other web technologies.\n\n#### Consider Accessibility\n\nEnsure that your animation library is accessible to users with disabilities. Use techniques like ARIA attributes to provide alternative text for animations and avoid creating visually confusing effects.\n\n#### Gather Feedback\n\nSeek feedback from other developers to identify areas for improvement and ensure that your library meets users' needs.\n\n### Considerations and Challenges\n\n#### Learning Curve\n\n[Creating an animation library](https://codeburst.io/step-by-step-build-your-own-react-animation-library-part-1-818a08404bca) can be time-consuming and requires significant time and effort.\n\n#### Maintenance And Updates\n\nOnce your library is released, you must maintain and update it to address bugs, add new features, and keep it compatible with the latest web technologies.\n\n#### Community Support\n\nBuilding a community around your animation library can be challenging, but it can provide valuable feedback and contributions.\n\n#### Competition\n\nMany existing animation libraries are available, so you must differentiate your library by offering unique features, better performance, or superior documentation. If you're new to animation development or need more time or resources to create your library, using an existing library that meets your needs might be more practical. Many excellent options are available, each with its strengths and weaknesses.\n\nWhen creating your animation library, focus on making it easy to use, well-documented, and performs well in different environments. Consider the needs of your target audience and tailor your library to meet their specific requirements.\n\n## Using MagicUI for Streamlined Web Design with Animations\n\n![Animation Libraries](https://images.unsplash.com/photo-1515378791036-0648a3ef77b2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3b3JraW5nfGVufDB8fHx8MTcyNTA2MjY0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### What Exactly Is MagicUI?\n\n[MagicUI is a comprehensive UI](https://pro.magicui.design/docs/templates/startup) library that simplifies creating animated user interfaces. It offers a rich collection of pre-built animated components designed to enhance the visual appeal and interactivity of your web applications. MagicUI is built on React, TypeScript, Tailwind CSS, and Framer Motion, providing a powerful and flexible framework for crafting engaging user experiences.\n\n### Why Use MagicUI? The Benefits of a UI Library for Animation\n\nA UI library like [MagicUI helps developers](https://pro.magicui.design/docs/templates/startup) save time and money. First, its pre-built components significantly reduce development time, allowing you to focus on core functionalities rather than spending hours creating animations from scratch. Secondly, incorporating animations into your web applications can make a more engaging and visually appealing experience for your users.\n\nMagicUI's components are designed to [provide subtle and intuitive animations](https://pro.magicui.design/docs/templates/startup) that enhance usability and delight users. Finally, MagicUI follows a consistent design language, ensuring a cohesive and visually pleasing appearance across your entire application. This helps to create a strong brand identity and improve user recognition.\n\n### How to Use MagicUI: A Step-by-Step Guide\n\n#### Installation\n\nInstall MagicUI using npm or yarn:\n\n```bash\nnpm install magicui\n```\n\n#### Integration with React\n\nImport the desired MagicUI components into your React components:\n\n```javascript\nimport { Button, Card, Modal } from \"magicui\"\n```\n\n#### Customization\n\nUse props and CSS to customize the components' styles, animations, and behaviors. [MagicUI provides a flexible](https://pro.magicui.design/docs/templates/startup) API for tailoring components to your specific design requirements.\n\n#### Adding Animations\n\nYou can use [MagicUI's built-in animations](https://pro.magicui.design/docs/templates/startup) or create custom animations using Framer Motion. MagicUI offers a variety of animation options, including fades, slides, rotations, and more.\n\n#### Example\n\nConsider creating a simple modal dialog. To achieve this, you can [use MagicUI's Button](https://pro.magicui.design/docs/templates/startup), Card, and Modal components. The Button component will trigger the opening of the modal when clicked, while the Modal component will display the modal's content.\n\nThe Card component provides a container for the modal content. You can further customize the appearance and behavior of these components using props and CSS. For instance, when clicked, you could customize the Button component to have a specific color, font, and animation. You could also customize the Modal component to appear with a fade-in animation and close with a fade-out animation. MagicUI's flexibility allows you to create unique and engaging user experiences.\n\nBy leveraging MagicUI, you can quickly and easily add animations to your web applications, enhancing their visual appeal and overall user experience. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to explore the benefits of animation UI libraries and create beautifully animated landing pages with MagicUI.\n\n## Best Practices for Web Design with Animations\n\n![Animation Libraries](https://images.unsplash.com/photo-1616628188859-7a11abb6fcc9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxzdGlja3klMjBub3Rlc3xlbnwwfHx8fDE3MjUwNjI2Njd8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Keep it Simple and Purposeful\n\nAnimations can [enhance your web design](https://www.linkedin.com/pulse/enhancing-user-experience-power-animations-web-design), but only if you use them with a clear goal. Overloading users with flashy animations can be distracting and overwhelming. Instead, use animations strategically to improve the user experience. Focus on giving each animation a specific purpose, such as highlighting important information, guiding users through the interface, or providing visual feedback. Avoid using purely decorative animations that do not serve a functional purpose.\n\n### Consider Accessibility\n\nAnimations can also hinder accessibility. For users who cannot see or process animations, provide alternative content or descriptions that convey the same information. Use easing functions to ensure smooth transitions and create gradual transitions that are easier for users with visual impairments to follow. Utilize [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes) to describe animations and provide additional context for assistive technologies like screen readers.\n\n### Optimize Performance\n\nFile sizes can bloat your animations, hindering performance. Reduce the size of images and other assets used in animations to improve loading times. Also, use lazy loading to defer non-essential animations until needed, especially on mobile devices or slower connections. Finally, avoid excessive complexity, keep animations simple, and avoid overly complex effects that can strain device resources.\n\n### Test Across Devices and Browsers\n\nThorough testing ensures animations work as expected across various devices, screen sizes, and browsers. Test on different operating systems and consider the capabilities of older devices. You can also use browser developer tools to inspect animations, identify performance bottlenecks, and debug any issues.\n\n### Use Appropriate Timing and Easing\n\nSelect appropriate durations for animations based on their purpose and the user interface context. Avoid overly long or short animations that can disrupt the user experience. Choose easing functions that create natural and smooth transitions. Consider using ease-in-out or ease-in for more subtle animations and more dramatic effects.\n\n### Avoid Overloading Users\n\nLimit the number of animations on your site to avoid overwhelming users. Instead, consider\n\nProgressive disclosure will gradually reveal animations as users interact with the page rather than display them all simultaneously.\n\n### Use Animations Sparingly\n\nWhile animations can enhance your web design, too many can detract from the user experience. Instead, focus on the quality and effectiveness of your animations, using them to improve usability, provide visual feedback, or create a more engaging interaction.\n\n### Prioritize User Needs\n\nWhen incorporating animations into your web design, always consider the user's needs first. Avoid using purely decorative animations that do not contribute to the overall user experience. Regularly assess the impact of your animations on user behavior and satisfaction. If an animation is not serving its intended purpose, consider removing or modifying it.\n\nFollowing these best practices, you can effectively use animations to enhance your web design and create a more engaging and enjoyable user experience. Remember to use animations thoughtfully and strategically, considering your users' needs and your website's overall goals.\n\n## Frequently Asked Questions (FAQs) on Animation Libraries\n\n![Animation Libraries](https://images.unsplash.com/photo-1522152302542-71a8e5172aa1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx3b3JraW5nfGVufDB8fHx8MTcyNTA2MjY0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Can I use MagicUI with other frameworks besides React? \n\n[MagicUI focuses on React](https://pro.magicui.design/docs/templates/startup), but integrating it with other frameworks is possible, though it requires extra work. You'll need to consider how to integrate MagicUI's components with your chosen framework and manage their state. You may even have to create custom wrappers or adapters to bridge the gap between MagicUI and your framework.\n\n### Are there any performance considerations when using animation libraries?\n\nYes, performance considerations exist when using animation libraries. Complex animations can impact the performance of your web application, especially on older devices or slower connections. To ensure optimal performance:\n\n#### Minimize File Sizes \n\nOptimize images and other assets used in animations to reduce their file size.\n\n#### Use Lazy Loading \n\nDefer loading of non-essential animations until they are needed. This is especially important on mobile devices or slower connections.\n\n#### Avoid Excessive Complexity \n\nKeep animations simple and avoid overly complex effects that strain device resources.\n\n#### Test Performance \n\nRegularly test your web application to ensure that animations do not negatively impact performance. Use browser developer tools to profile your animations and identify potential bottlenecks.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n### What are some common mistakes to avoid when using animation libraries? \n\n#### Avoid Overusing Animations\n\n[Excessive use of animations](https://medium.com/@sikirus81/how-too-many-animations-ruin-user-experience-a2eb7040c1a8#:~:text=Too%20many%20will%20cause%20laggy,task%20and%20interrupts%20their%20flow.) can overwhelm users and obscure your website's purpose. Instead of using animations for their own sake, focus on strategically implementing animations to improve your site's usability. Prioritize user experience, not visual flair.\n\n#### Use Animations With a Purpose\n\nAnimations should serve a functional purpose, such as guiding users through the interface, providing visual feedback, or highlighting important information. Avoid using purely decorative animations that do not contribute to the overall user experience.\n\n#### Ignore Performance Considerations at Your Own Risk\n\nEnsure your animations are optimized for performance to avoid impacting the user experience. Avoid overly complex animations or animations not optimized for different devices and browsers.\n\n#### Consider Accessibility When Using Animation Libraries\n\nMake sure your animations are accessible to users with disabilities. Avoid creating animations that are difficult for users with visual or auditory impairments to perceive or understand.\n\n#### Test Your Animations Thoroughly\n\nTest your [animations across different devices](https://www.linkedin.com/advice/1/how-do-you-test-mobile-animations-different-devices), browsers, and screen sizes to ensure they work as expected and not cause any issues.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications. This allows us to create stunning user interfaces with minimal effort. [MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library, MagicUI Pro can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/animation-on-scroll-css.mdx",
    "content": "---\ntitle: Mastering Animation on Scroll CSS for Dynamic Web Design\ndescription: >-\n  Learn how to implement stunning and performant animation on scroll CSS. This\n  guide covers modern CSS, Intersection Observer, and key optimization tips.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9d7cee40-56c0-4ee4-ab49-68d3b63500a0/animation-on-scroll-css-digital-workflow.jpg\nauthor: Dillion Verma\ntags:\n  - animation on scroll css\n  - css animation\n  - intersection observer\n  - scroll effects\n  - web performance\npublishedOn: \"2025-12-09T09:35:50.453604+00:00\"\nfeatured: true\n---\n\nAnimating elements as a user scrolls down a page is a classic way to add a bit of life to an otherwise static layout. The basic idea is simple: as content enters the viewport, we can trigger fades, slides, or other transformations. This turns a standard page into a more dynamic experience, revealing content at just the right moment and adding a polished, professional feel.\n\n## The Power of Purposeful Scroll Animations\n\n![A clean, minimalist 3D rendering of a floating smartphone displaying digital content, surrounded by abstract elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c1559a5b-65ba-4670-99a7-6c08383e401e/animation-on-scroll-css-smartphone-interface.jpg)\n\nLet's be clear: scroll animations are way more than just decorative flair. When used thoughtfully, they're powerful storytelling tools. They can transform passive scrolling into an interactive journey, guiding the user through a narrative one section at a time. This approach is fantastic for managing cognitive load by presenting information right when it’s most relevant.\n\nInstead of hitting visitors with a wall of text and images all at once, you can introduce elements sequentially. Imagine a key product feature sliding into view just as the user scrolls to its description—that creates an immediate visual connection. This kind of contextual reveal makes complex information far easier to digest and remember.\n\n### Boosting User Engagement and Perception\n\nStrategic motion has a real, measurable impact on how users perceive and interact with your site. A website that feels alive and responsive naturally holds attention longer, encouraging people to stick around and explore. There's a subtle satisfaction that comes from triggering a smooth animation, and it keeps users engaged and scrolling.\n\nThe data backs this up. For SaaS websites, adding well-designed scroll animations has been shown to improve user engagement by **47%** and lift conversion rates by as much as **20%**. These animations also contribute to a reduction in bounce rates by up to **35%**, simply by guiding visitors' attention to key areas. You can dig into more of the [transformative effects on user experience](https://www.nngroup.com/articles/animation-usability/) and see the numbers for yourself.\n\n> The goal isn't just to make things move; it's to make the user's journey more intuitive and compelling. A simple fade-in can make a brand feel more intentional, while a parallax effect can create a sense of depth and immersion.\n\nWhen it comes down to it, purposeful scroll animations achieve a few key things for your site:\n\n- **Guide Attention:** Motion is a natural eye-catcher. You can use it to direct users toward important calls-to-action or value propositions.\n- **Enhance Storytelling:** Animations help control the pacing of your brand's narrative, making the whole experience feel more curated and cinematic.\n- **Improve User Experience:** By making interactions feel responsive and polished, you build a sense of quality and reliability around your brand.\n\n## The Future Is Here With Native CSS Scroll Animations\n\n![Two stylized code editors, one dark and one light themed, displaying colorful programming code.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3ba2ffa9-1d08-489d-952b-c73b8f8a1d58/animation-on-scroll-css-code-editors.jpg)\n\nFor years, if you wanted animations to react to the user’s scroll position, you had to reach for JavaScript. It worked, of course, but it always felt a bit disconnected and often came with a performance penalty. That's all changing. We can now build incredibly smooth, precise scroll-linked effects using nothing but CSS, which is a massive win for web developers.\n\nThis new approach completely flips how we think about animation timelines. Instead of an animation running over a set number of seconds, its progress is tied directly to the user's scrollbar. As you scroll down, the animation plays forward. Scroll back up, and it smoothly reverses. This creates an immediate, tactile connection between the user's action and what they see on screen.\n\nIt’s perfect timing, too. Scroll-triggered animations are one of the biggest trends in web design right now, turning simple pages into more cinematic, immersive experiences. As noted in a recent breakdown of [animation trends on webpeak.org](https://webpeak.org/blog/css-js-animation-trends), these effects can significantly reduce cognitive load. Doing it natively in CSS is by far the most performant way to get it done.\n\n### Understanding the Core Syntax\n\nThe real magic comes from two new CSS properties: `animation-timeline` and `animation-range`. When paired with the standard `@keyframes` we already know and love, they unlock all this new potential.\n\nYou'll primarily work with two kinds of timelines:\n\n- **`scroll()`:** This links your animation to the scroll progress of the _entire page_ (or another scrollable container). This is your go-to for things like a reading progress bar that fills up at the top of an article as you scroll.\n- **`view()`:** This links the animation to an element's journey through the viewport. The animation only progresses as that specific element moves into, through, and out of the visible screen area. It’s absolutely perfect for those classic \"fade-in\" or \"slide-in\" effects on sections as they appear.\n\nLet's walk through a quick example—a simple progress bar. First, you define the keyframes for the animation, which in this case just scales a bar from 0% to 100% width. No surprises here.\n\n```css\n@keyframes grow-progress {\n  from {\n    transform: scaleX(0);\n  }\n  to {\n    transform: scaleX(1);\n  }\n}\n```\n\nNext, you apply this to your progress bar element. The key is adding `animation-timeline: scroll()`. This is what tells the browser, \"Hey, don't use a timer for this. Use the page scroll instead.\"\n\n```css\n.progress-bar {\n  transform-origin: left;\n  animation: grow-progress linear;\n  animation-timeline: scroll(root block);\n}\n```\n\n### Navigating Browser Support and Fallbacks\n\nWhile this native **animation on scroll CSS** technique is powerful, it's also the new kid on the block. As of today, support is solid in the latest versions of Chrome, Edge, and Safari, and it's gaining ground quickly. But for any real-world production site, you'll need a fallback strategy for browsers that aren't on board yet.\n\nThankfully, CSS gives us a clean way to handle this with the `@supports` feature query. This lets you write styles that only apply if the browser actually understands what `animation-timeline` is.\n\n> For older browsers, the best practice is to define a simple, static state. The element won't animate, but it will be perfectly visible and usable. This is a classic progressive enhancement strategy: deliver a solid baseline experience for everyone, then layer on the fancy stuff for those who can see it.\n\nFor example, you could make sure your element is visible by default, then wrap your new animation code inside a `@supports` block.\n\n```css\n.animated-element {\n  /* Default state for all browsers */\n  opacity: 1;\n  transform: translateY(0);\n}\n\n@supports (animation-timeline: scroll()) {\n  /* Apply modern animations only if supported */\n  .animated-element {\n    opacity: 0;\n    animation: fade-in linear;\n    animation-timeline: view();\n  }\n}\n```\n\nThis ensures a graceful degradation. Everyone gets the content, but users on modern browsers get the enhanced, animated experience.\n\n## Build Animations with the Intersection Observer API\n\nWhile native CSS scroll timelines are the exciting future, the most reliable, battle-tested method for triggering an **animation on scroll CSS** effect today is the **Intersection Observer API**. This JavaScript-based approach is incredibly efficient and has near-universal browser support, making it the go-to for production sites that need to work everywhere, for everyone.\n\nThe idea is simple but powerful. Instead of constantly watching an element's position on the page (which is a performance nightmare), the Intersection Observer just tells you when an element enters or leaves the screen. That's it. Once we get that signal, we can add a CSS class to kick off an animation. It's fast because the browser does all the heavy lifting, freeing up your main thread for more important things.\n\n### The HTML and CSS Foundation\n\nBefore we write a single line of JavaScript, let's get our basic structure in place. We need some content to create a scrollable page and, of course, the elements we want to animate. For this example, we'll use some simple `div` elements and give them a class of `.reveal-me`.\n\nOur HTML is pretty minimal—just a few sections to create some space to scroll through.\n\n```mdx\n<section className=\"spacer\"></section>\n<div className=\"reveal-me\">\n  <h3>Animate Me!</h3>\n  <p>I will fade and slide in on scroll.</p>\n</div>\n<section className=\"spacer\"></section>\n<div className=\"reveal-me\">\n  <h3>Me Too!</h3>\n  <p>This method works for multiple elements.</p>\n</div>\n<section className=\"spacer\"></section>\n```\n\nNext up is the CSS. Here, we'll define two states for our elements. The initial state, `.reveal-me`, will have an `opacity: 0` and be shifted down slightly with `transform`. This is how the element looks _before_ it scrolls into view.\n\nWhen our JavaScript adds the `.visible` class, the element will smoothly transition to `opacity: 1` and its final position.\n\n```css\n.reveal-me {\n  opacity: 0;\n  transform: translateY(50px);\n  transition:\n    opacity 0.6s ease-out,\n    transform 0.6s ease-out;\n}\n\n.reveal-me.visible {\n  opacity: 1;\n  transform: translateY(0);\n}\n```\n\nThis separation of concerns is what makes the pattern so clean. CSS handles the entire look and feel of the animation; JavaScript is just the trigger.\n\n### Bringing It to Life with JavaScript\n\nNow for the magic. We'll create a new `IntersectionObserver` that keeps an eye on our target elements. The observer takes a callback function that runs whenever an element's visibility changes.\n\nInside the callback, we get a list of `entries`. We just loop through them and check the `isIntersecting` property. If it's `true`, the element is now on screen, and we add our `.visible` class to it. Simple as that.\n\nHere's a crucial pro-tip: once an element has animated in, there's no need to keep watching it. We can tell the observer to stop watching that specific element by calling `observer.unobserve(entry.target)`. This is a great performance optimization that prevents the browser from doing unnecessary work.\n\nHere’s the complete JavaScript code that ties it all together:\n\n```javascript\nconst animatedElements = document.querySelectorAll(\".reveal-me\")\n\nconst observer = new IntersectionObserver((entries) => {\n  entries.forEach((entry) => {\n    if (entry.isIntersecting) {\n      entry.target.classList.add(\"visible\")\n      observer.unobserve(entry.target) // Stop observing once visible\n    }\n  })\n})\n\nanimatedElements.forEach((element) => {\n  observer.observe(element)\n})\n```\n\nThis pattern is robust, performant, and something you can drop into almost any project. It hits that sweet spot between having full control and letting the browser handle the hard parts efficiently.\n\n> This technique of triggering animations on viewport entry is incredibly versatile. You can take it much further to build more complex effects, like animations whose speed changes based on scroll velocity. To dive deeper into this advanced topic, explore our documentation on creating [scroll-based velocity components](https://magicui.design/docs/components/scroll-based-velocity), which builds on similar principles of observing element positions.\n\nBy pairing a simple JavaScript observer with declarative CSS transitions, you get a powerful, widely supported system for creating engaging scroll animations. It’s a fundamental technique that ensures your pages feel dynamic without sacrificing performance—a must-know for any front-end developer.\n\n## Choosing the Right Lightweight Animation Library\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/9eHEOAn2FOA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWhile building scroll animations from scratch with the Intersection Observer gives you ultimate control, let's be honest—sometimes you just need to get the job done fast. This is where lightweight JavaScript libraries really shine.\n\nThey handle all the tedious observer setup behind the scenes, letting you whip up impressive **animation on scroll CSS** effects just by adding a few data attributes to your HTML. It's the perfect middle ground: more power than CSS classes alone, but way less overhead than a full-blown animation engine.\n\n### Comparison of Lightweight Scroll Animation Libraries\n\nThe world of scroll animation libraries is surprisingly vast, but a few key players have emerged as go-to options for their performance and simplicity. When I'm picking a library, I'm laser-focused on three things: its gzipped size, whether it has dependencies, and how quickly I can get started without drowning in documentation. After all, the whole point is to save time.\n\nHere’s a quick rundown of some popular choices to help you decide which one fits your project's needs.\n\n| Library     | Gzipped Size | Dependencies | Implementation Method | Best For                                              |\n| :---------- | :----------- | :----------- | :-------------------- | :---------------------------------------------------- |\n| **AOS.js**  | ~6 KB        | None         | `data-aos` attributes | Quick, versatile effects with minimal setup.          |\n| **Sal.js**  | ~3.5 KB      | None         | `data-sal` attributes | Performance-focused projects needing high efficiency. |\n| **Trig.js** | ~4 KB        | None         | CSS classes           | Ultra-lightweight, CSS-driven animations.             |\n\nUltimately, the goal is to choose a tool that fits your performance budget and workflow. A small, dependency-free library is often the most pragmatic choice for adding a touch of polish without slowing things down.\n\nAs the decision tree shows, while native CSS is king for performance, libraries offer a crucial blend of ease and compatibility. For a deeper dive into even more options, check out our comprehensive guide to the best [animation libraries for modern web development](https://magicui.design/blog/animation-libraries).\n\n### A Practical Example with AOS.js\n\nLet's walk through a quick example with **AOS.js (Animate On Scroll)**. It's one of the most popular libraries out there for a reason—its attribute-based approach is incredibly intuitive.\n\nFirst, you’ll need to add the library's CSS and JavaScript to your project. The quickest way to get going is by linking them from a CDN in your HTML's `<head>` and before the closing `</body>` tag.\n\nNext, find any HTML element you want to animate and give it a `data-aos` attribute. Want a `div` to fade in from the bottom as you scroll to it? Just write this:\n\n```html\n<div data-aos=\"fade-up\">This will fade up on scroll!</div>\n```\n\nFinally, add one line of JavaScript to kick things off:\n\n```javascript\nAOS.init()\n```\n\n> That's really all there is to it. AOS finds every element with a `data-aos` attribute and handles the rest. It's an insanely efficient way to add that professional polish to a landing page without a ton of custom code.\n\nLooking ahead, the scroll animation space is always evolving. In 2025, we're seeing a big push toward hyper-efficient, CSS-powered libraries. [Trig.js](https://trig.js.org/), for example, stands out by using a CSS-first approach that keeps its footprint tiny—around **4KB**—and performance lightning-fast. Compare that to more feature-rich tools like GSAP's ScrollTrigger, which can easily top **100KB**, and you can see why these lightweight options are so compelling.\n\n## Fine-Tuning for Performance and Accessibility\n\nLet's be honest: a slick scroll animation that stutters and lags is worse than no animation at all. The secret to those buttery-smooth effects you see on award-winning sites isn't magic—it's about working _with_ the browser, not fighting it.\n\n![Diagram comparing optimized and janky animation, illustrating smooth versus chaotic visual effects.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/97422c76-dea6-45d4-95f5-6d0742d11d44/animation-on-scroll-css-animation-comparison.jpg)\n\nIf you take one thing away from this guide, let it be this: **only animate `transform` and `opacity`**.\n\nThese two properties are your golden tickets. The browser can hand them off to a separate compositor thread, which means it can move, scale, rotate, and fade elements without forcing the entire page to recalculate layouts or repaint pixels. Trying to animate properties like `width`, `height`, or `margin` is a one-way street to jank city.\n\nBut performance is only half the story. We also have to think about the people on the other side of the screen. For some users, especially those with vestibular disorders or motion sensitivity, excessive animation can be disorienting or even physically uncomfortable. This is where thoughtful accessibility comes into play.\n\n### Respecting User Preferences\n\nThankfully, there's a standard, built-in way for users to tell us they'd prefer less motion: the `prefers-reduced-motion` media query. Honoring this request isn't just a \"nice-to-have\"—it's a critical part of creating an inclusive experience.\n\nThe implementation is refreshingly simple. You just wrap your animation rules in a media query that checks if the user _hasn't_ opted for a calmer experience.\n\n> We should always treat motion as a progressive enhancement. The core content needs to be perfectly accessible without it. The animations are just an extra layer for those who want and can tolerate them.\n\nHere’s what that looks like in your CSS:\n\n```css\n/* Animation styles go here */\n@media (prefers-reduced-motion: no-preference) {\n  .fade-in-element {\n    animation: fadeIn 1s ease-out;\n    animation-timeline: view(); /* For native CSS animations */\n  }\n}\n```\n\nThis small addition is the mark of a developer who cares about the user experience. Making sure your **animation on scroll CSS** is both smooth and considerate elevates your work from just functional to truly professional.\n\nFor a deeper dive into getting your entire site running faster, you can [learn more about how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance) in our comprehensive guide.\n\n## Common Questions About Scroll Animations\n\nWhen you start digging into scroll-triggered animations, a few questions always seem to surface. Tackling these head-on will save you a ton of headaches and debugging time down the road, and help you build something that’s not just cool, but also solid and performant.\n\nLet's get into some of the most common ones I hear.\n\n### Which CSS Properties Are Best to Animate for Performance?\n\nFor animations that feel buttery smooth, you want to stick to **`transform`** and **`opacity`**. Period. These two are your best friends because the browser can offload them to the compositor thread.\n\nWhat does that mean? It means they don't trigger expensive layout recalculations (reflow) or repaints on the main thread, which is where all the heavy lifting happens. Trying to animate properties like `width`, `height`, `margin`, or `top` is a one-way ticket to a janky, stuttering mess, as the browser has to re-calculate the entire page layout for every single frame.\n\nSo, keep it simple: transforms and opacity are the way to go.\n\n### Can Animation on Scroll CSS Hurt My SEO?\n\nShort answer: yes, if you're not careful. Heavy JavaScript libraries can bloat your page and slow down load times, which is a major signal for search rankings. Another classic pitfall is hiding content for a fade-in effect in a way that search engine crawlers can't see it.\n\n> The trick is to hide elements visually without removing them from the DOM. Using `opacity: 0` and a `transform` (like `translateY(20px)`) is the safest bet. The element is invisible to the user but fully present and readable for search bots.\n\nAlways lean towards lightweight techniques and double-check that your core content is always part of the page's structure from the get-go.\n\n### How Should I Handle Scroll Animations on Mobile Devices?\n\nPerformance on mobile is everything. A slick animation isn't worth much if it drains the battery or makes the page lag. For this reason, it’s often a smart move to simplify—or even completely disable—complex animations on smaller screens. A fast, clean experience will always win over a slow, stuttering one.\n\nYou've got a couple of solid options here:\n\n- **CSS Media Queries:** This is the simplest approach. Just use `@media` rules to apply less intense animations or turn them off entirely (`transform: none !important; opacity: 1 !important;`) below a certain viewport width.\n- **JavaScript Checks:** Before you even initialize your Intersection Observer or a third-party library, run a quick check on the `window.innerWidth`. If it's below your mobile breakpoint, just don't run the animation script at all.\n\nAnd a pro tip: always test on real mobile devices. Browser simulators are great, but they don't give you a true sense of how an animation performs with the limited resources of an actual phone.\n\n---\n\nReady to build stunning, high-performance landing pages without the hassle? **Magic UI** offers over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. Start creating beautiful interfaces in minutes. [Explore Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/ant-design-alternatives.mdx",
    "content": "---\ntitle: \"22 Best Ant Design Alternatives For React Development\"\ndescription: \"With so many Ant Design alternatives available, choosing the right one can be challenging. Let us help you with options for your React projects.\"\nimage: https://cdn.magicui.design/assets/4a11579f-b39e-47c1-9a25-a4df45e20750.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-27\"\nfeatured: false\n---\n\nAre you on the quest for a better [UI Frameworks](https://magicui.design/blog/ui-frameworks)? Imagine comparing different design frameworks to find the best one for your project. Ant Design alternatives could be the key to the solution you need. Lucky for you, here’s a blog on finding the perfect Ant Design alternative.\n\nMagic UI’s [React component library](https://magicui.design/) is a handy tool that can help you make the best choice from the array of design frameworks. It is perfect as the best Ant Design alternative.\n\n## What Is Ant Design?\n\n![Ant Design Alternatives](https://images.unsplash.com/photo-1524868857876-218cafbdda8b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMHBjJTIwd2l0aCUyMGZyaWVuZHxlbnwwfHx8fDE3MTk1NjAzMDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAnt Design is an outstanding design system that comes packed with:\n\n- Designing principles\n- Style guides\n- Vast library of components\n\nThese components are meticulously crafted to provide a rich user interface experience for developing and maintaining enterprise background applications. The library is dominantly written in TypeScript, which defines all the required types. It is designed to integrate seamlessly with the front-end workflow described by the NPM + WebPack + dva scheme. Ant Design is developed by Alibaba Group and is based on the popular stack of:\n\n- React\n- Redux\n- React-Router\n\n### Key Features of Ant Design\n\n#### 1\\. Enterprise-Class UI design\n\nAnt Design offers an enterprise-class user interface specifically designed for web applications.\n\n#### 2\\. Quality React Components\n\nThe library provides a set of high-quality pre-built React components that can be used out of the box.\n\n#### 3\\. TypeScript Implementation\n\nWritten in TypeScript, the library ensures predictable static types, making it easier for developers to work with.\n\n#### 4\\. Design Resources and Development Tools\n\nAnt Design has a complete package of design resources and development tools to streamline the front-end development process.\n\n#### 5\\. Internationalization Support\n\nThe library supports internationalization for dozens of languages, allowing developers to create multilingual applications effortlessly.\n\n#### 6\\. Theme Customization\n\nAnt Design enables powerful theme customization in every detail, allowing developers to create visually stunning and cohesive user interfaces.\n\n### Enterprise App Development with Pre-Built Components\n\n[Ant Design](https://www.uxpin.com/studio/blog/ant-design-introduction/) provides alternatives like Ant Design Pro, which offers a rich set of pre-built components, layouts, and tools to accelerate the development of enterprise applications. With its growing popularity, Ant Design has become a preferred choice for developers looking to create robust web applications focusing on user experience and design aesthetics.\n\n### A Go-To Design System for Enterprise Applications\n\nAnt Design has established itself as a go-to design system for building enterprise-grade web applications that are visually appealing, highly functional, and efficient. With its extensive range of components, themes, and tools, Ant Design empowers developers to create exceptional user interfaces that provide an exceptional user experience.\n\n## 8 Key Ant Design Benefits\n\n![Ant Design Alternatives](https://images.unsplash.com/photo-1601933470096-0e34634ffcde?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxoYXBweSUyMHdpdGglMjBmcmllbmRzJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzE5NTYwMzMzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Well Maintained\n\nAnt Design’s team continually works to improve the design system with frequent updates. Engineers also report finding little or no bugs.\n\n### 2\\. Comprehensive Library\n\nAnt Design has a component, pattern, or icon to solve every design problem. Each element has multiple versions to accommodate any scenario.\n\n### 3\\. Native Library\n\nAnt Design Mobile offers an extensive library for building native cross-platform applications.\n\n### 4\\. Animation Library\n\nAnt Motion animates common patterns and micro-interactions to complement its native and web component libraries.\n\n### 5\\. Third-party Libraries\n\nAnt Design’s third-party React libraries include data visualizations, infinite scroll, maps, media queries, and others that increase the design system’s capabilities.\n\n### 6\\. Internationalization-ready\n\nAnt Design’s internationalization feature supports languages worldwide with the option for developers to add more.\n\n### 7\\. Forms\n\nAn extensive form library with excellent form handling.\n\n### 8\\. Scaffolds\n\n100+ template projects for:\n\n- Dashboards\n- Reports\n- Tables\n- Admin UIs\n- Chat\n- Logins and more\n\n### Free and Customizable UI Library for Building Stunning Web Applications\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## 6 Reasons Why Consider Ant Design Alternatives For Your React Developments\n\n![Ant Design Alternatives](https://images.unsplash.com/photo-1526948531399-320e7e40f0ca?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxjb2RlciUyMHdpdGglMjBmcmllbmR8ZW58MHx8fHwxNzE5NTYwMzQ3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Opinionated Design\n\nAnt Design has a specific language that may not fit all project requirements. Deviating from the default styling can be challenging. Ant Design's opinionated design may not align with a project's requirements or restrictions.\n\nDevelopers may have difficulty customizing the default styling to blend with the project's unique design motifs. This can lead to frustration and increased development time as developers struggle to align Ant Design's design language with the specific project requirements.\n\n### 2\\. Performance\n\nAnt Design's comprehensive component library can lead to larger bundle sizes, which may impact performance, especially for smaller projects. The extensive range of components provided by Ant Design can result in larger bundle sizes for projects with limited resources or requiring faster load times. This can lead to performance issues, especially for smaller projects or applications where speed is crucial for a smooth user experience.\n\n### 3\\. Learning Curve\n\nAnt Design's features can have a steeper learning curve, especially for developers new to the library. Ant Design has many features and functionalities, making it somewhat overwhelming for developers unfamiliar with the library. New developers may need more time to know Ant Design, which can slow development and hinder the project's overall progress.\n\n### 4\\. Vendor Lock-in\n\nRelying on Ant Design's components and APIs can make it more difficult to migrate to other UI libraries in the future. Ant Design's usage in a project can create a dependency that makes it challenging to transition to other UI libraries in the future. This vendor lock-in can limit future development choices and hinder the project's scalability and flexibility.\n\n### 5\\. Compatibility\n\nAnt Design may not always be compatible with the latest versions of React or other dependencies, requiring careful version management. Ant Design's compatibility with the latest versions of React or other essential libraries may not always be seamless. This can lead to version management issues, requiring developers to carefully monitor updates and changes to ensure compatibility and prevent conflicts with other dependencies.\n\n### 6\\. Overhead\n\nThe inclusion of Ant Design adds an additional dependency and potential overhead to your project, which may not be necessary for simpler applications. Ant Design introduces an additional dependency to a project, leading to potential overhead that may not be justified for simpler applications. This can impact the project's overall performance, increase load times, and add unnecessary complexity to the development process.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## 22 Best Ant Design Alternatives For React Development\n\n![Ant Design Alternatives](https://images.unsplash.com/photo-1602992708529-c9fdb12905c9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzE5NTYwMzU5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Material-UI\n\nMaterial-UI is a React component library that implements Google's Material Design principles. Key features include:\n\n- Wide range of customizable UI components\n- Theming support\n- Good documentation\n\nMaterial-UI's pros compared to Ant Design include a more modern design aesthetic and easier integration with Material Design guidelines. However, some users may find Material-UI's customization options more limited than Ant Design's.\n\n### 3\\. Chakra UI\n\nChakra UI is a popular React component library focusing on accessibility and developer experience. Key features include:\n\n- Flexible component system\n- Design tokens for easy theming\n- Built-in dark mode support\n\nThe pros of Chakra UI over Ant Design include a simpler API for faster development and better accessibility features. Chakra UI may not offer as many components and customization options as Ant Design.\n\n### 4\\. React Bootstrap\n\nReact Bootstrap is a library of reusable UI components based on the Bootstrap framework for React applications. Key features include:\n\n- Responsive grid layouts\n- Pre-styled components\n- Easy integration with Bootstrap themes\n\nThe pros of React Bootstrap compared to Ant Design include a familiar design language for users already familiar with Bootstrap and strong community support. React Bootstrap may not offer as many advanced components and design customizations as Ant Design.\n\n### 5\\. Semantic UI React\n\nSemantic UI React is the official React integration for the Semantic UI framework, offering a wide range of UI components focusing on semantic HTML and ease of use. Key features include:\n\n- Declarative API\n- Theming support\n- Responsive design out of the box\n\nCompared to Ant Design, Semantic UI React has pros, including a simpler API for rapid prototyping and a focus on accessibility and best practices. Semantic UI React may not provide as many design customization options as Ant Design.\n\n### 6\\. Evergreen\n\nEvergreen is a UI framework for building design systems prioritizing consistency, accessibility, and developer experience. Key features include:\n\n- Set of reusable UI components\n- Design tokens for theming\n- Support for responsive design\n\nPros of Evergreen compared to Ant Design include a focus on accessibility and consistency in design across applications. Evergreen may not offer as many components and customization options as Ant Design.\n\n### 7\\. Blueprint\n\nBlueprint is a React-based UI toolkit for building desktop applications focusing on clean and minimalistic design. Key features include:\n\n- Set of well-tested components\n- Theming support\n- Detailed documentation\n\nThe pros of Blueprint compared to Ant Design include a lightweight library focused on performance and a consistent design language. Blueprint may not offer as many components and customization options as Ant Design.\n\n### 8\\. Grommet\n\nGrommet is a React-based component library emphasizing accessibility, responsive design, and theming capabilities. Key features include:\n\n- Range of UI components\n- Responsive grid system\n- Support for dark mode\n\nThe pros of Grommet compared to Ant Design include a strong focus on accessibility and responsive design principles. Grommet may not offer as many customization options as Ant Design.\n\n### 9\\. Tailwind UI\n\nTailwind UI is a collection of professionally designed UI components built with the Tailwind CSS framework. Key features include:\n\n- Variety of pre-designed components\n- Responsive design out of the box\n- Customizable design tokens\n\nThe pros of Tailwind UI compared to Ant Design include a modern design aesthetic and a focus on utility-first CSS for faster prototyping. Tailwind UI may not offer as many components and theming options as Ant Design.\n\n### 10\\. PrimeReact\n\nPrimeReact is a rich set of UI components for React applications built by PrimeTek Informatics. Key features include:\n\n- Wide range of components\n- Customizable themes\n- Ease of integration with other PrimeReact libraries\n\nPros of PrimeReact compared to Ant Design include an extensive set of components and strong community support from PrimeTek. PrimeReact may not offer as many design customization options as Ant Design.\n\n### 11\\. Carbon Design System\n\nCarbon Design System is an open-source design system for building digital products created by IBM. Key features include:\n\n- Comprehensive set of UI components\n- Theming support\n- Accessibility features\n\nPros of Carbon Design System compared to Ant Design include a focus on enterprise design patterns and accessibility best practices. Carbon Design System may not offer as many customization options as Ant Design.\n\n### 12\\. Materialize\n\nMaterialize is an open-source responsive front-end developing a framework that works beautifully and provides easy integration with your platform. It allows the user to interact with the system quickly and gives many features that offer a slick, out-of-the-box material design.\n\n### 13\\. Topcoat\n\nTopcoat is a front-end designing and development framework that provides many exciting features and templates predefined in the platforms, so you can integrate them directly with your web app or website. It has impressive features that work with:\n\n- Smooth performance\n- Provides building blocks to get your site up and running\n- Various themes that are highly customizable and manageable\n\n### 14\\. MUI CSS\n\nMUI CSS is a lightweight CSS framework that works with Google integration material design guidelines and provides sophisticated front and development for your web app and website. It offers:\n\n- Tons of amazing features\n- Allows you to integrate the system into any third-party platform\n- Authorize the content management systems.\n\n### 15\\. Foundation\n\nFoundation is a responsive front-end framework that works beautifully and gives your website a beautiful design. It offers various customizable features that work with every program module to give you a better outcome. It provides:\n\n- Responsive grid\n- HTML\n- CSS UI templates\n- Components\n- Code snippets\n- Interface elements\n- Optional functionality provided by JavaScript extensions\n\n### 16\\. Skeleton\n\nSkeleton is a small collection of CSS files that allows you to develop a beautiful website. It has many functions and a predefined CSS library that helps you beautifully create a sophisticated website layout.\n\n### 17\\. Bourbon\n\nBourbon is a comprehensive library of pure Sass mixins and functions intended to style sheet authors more efficiently. One of the greatest benefits of Bourbon is that it works everywhere and for everything. Built for Sass and Compass, Bourbon provides a solution for any project, whether a simple website or a sophisticated web app.\n\n### 18\\. Animate.css\n\nAnimate.css is a platform that offers a library ready to use for cross-browser animations in web projects. The software is installed either with the npm or CDN. Users can add the class to an element and name any animations. Users can use the keyframes apart from using the helper classes like the animated class to get dashing.\n\n### 19\\. Mantine\n\nMantine includes more than 100 customizable components and 50 hooks to cover you in any situation.\n\n### 20\\. LESS\n\nLESS is a backward-compatible language extension for CSS used for writing DRY CSS. It comes with variables, mixins, operations, and functions. Variables allow you to store values that can be reused throughout your stylesheet and update them when the variable changes. LESS runs on both the client side and server side.\n\n### 21\\. HTMLMAG\n\nHTMLMAG is a website dedicated to the semantic development of HTML, CSS, and JavaScript.\n\n### 22\\. WrapBootstrap\n\nWrapBootstrap is a platform that serves as a marketplace for premium Bootstrap-based templates to help developers impress their visitors and customers.\n\n## Choosing The Right Path\n\n![Ant Design Alternatives](https://images.unsplash.com/photo-1603202662747-00e33e7d1468?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx0ZWFtJTIwZGlzY3Vzc2lvbnxlbnwwfHx8fDE3MTk1NjAzODB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen choosing the best React library for your project, several factors must be considered:\n\n- Ant Design is known for its design elegance and comprehensive feature set, making it a powerhouse in React UI libraries.\n- Material-UI boasts extensive capabilities that cater to a wide range of applications.\n- If simplicity and ease of use are what you prioritize, Chakra UI is a compelling choice.\n- Magic UI is the go-to library for those looking to enhance user experience through animations.\n\n### The Right Fit\n\nConsider your project's specific needs, your design philosophy, and the level of customization and community support you desire. Ant Design alternatives offer various options that cater to different needs, ensuring you find the perfect fit for your project.\n\n### Beyond Ant Design\n\nThe best React UI library is subjective and depends on your project's unique demands and personal development preferences. Considering these factors, you can make an informed decision that will make your project a success.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n"
  },
  {
    "path": "apps/www/content/blog/ant-design-vs-material-ui.mdx",
    "content": "---\ntitle: \"The Ultimate Comparison Between Ant Design Vs Material UI\"\ndescription: \"Ant Design vs Material UI: This comparison will help you understand the strengths and weaknesses of each design system for your project.\"\nimage: https://cdn.magicui.design/assets/3c28ce2a-2c11-496d-b6ac-eca83a77fb64.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-21\"\nfeatured: false\n---\n\nAre you caught up in the vast array of options while navigating the landscape of [UI Frameworks](https://magicui.design/blog/ui-frameworks)? Ant Design Vs Material UI? Wouldn't it be great if you could get a detailed comparison between these two solutions for React projects? If you're embarking on a new React project, this article will discuss Ant Design and Material UI, giving you a deeper understanding of both.\n\nMagic UI, a [React component library](https://magicui.design/), will help you craft the perfect user interface for your next project. For example, compare Ant Design and Material UI for React projects. Leveraging this solution will save you time and enable you to create stunning interfaces effortlessly. Let’s learn the intricacies and see how Magic UI can enhance your development process.\n\n## What Is Ant Design?\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1612832021455-245704c6755a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTkwNDc1MDV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAnt Design is an open-source design system launched by Alibaba Group in 2015, focusing on React developers. It offers many pre-built UI components and adheres to Chinese design principles and guidelines, making it popular among developers. The library provides essential components such as form controls, navigation elements, and data visualization tools, enabling users to create aesthetically appealing designs effortlessly.\n\nAnt Design stands out as a comprehensive and user-friendly UI framework that caters to the needs of both developers and designers. Its simplicity, accessibility, internationalization support, community, and integration with design tools make it a top choice for creating stunning and functional user interfaces in React applications.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Is Material UI?\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1551434678-e076c223a692?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXZ8ZW58MHx8fHwxNzE5MDQ3NTE3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is another popular open-source library for building React applications. It was launched in 2014 and has since become one of the most widely used UI libraries for React. Material UI provides a comprehensive set of pre-built components based on [Google's Material Design guidelines](https://builtin.com/articles/10-insights-googles-material-design-guidelines). These components are highly customizable and can be used to create modern and responsive user interfaces.\n\nOne of the benefits of using Material UI is its focus on accessibility. The library offers a range of accessibility features, such as support for screen readers and keyboard navigation. Material UI has excellent documentation and a large community of developers contributing to its development.\n\n## Ant Design Vs Material UI: Detailed Comparison\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1520803283706-c5b9b80aab05?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb21wYXJpc29ufGVufDB8fHx8MTcxOTA0NzUyOHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Learning Curve and Community Support\n\nThe learning curve of a UI library can either make or break the developer's experience. Material UI is quite manageable for individuals with experience in React and Material Design principles. On the other hand, Ant Design presents a challenge due to its strict design guidelines and extensive range of enterprise-level components.\n\nWith comprehensive tutorials and documentation from resources like Official documentation, GeeksforGeeks tutorials, UXPin tutorials, Medium articles, and DigitalOcean tutorials, developers can navigate the complexities of Ant Design with relative ease.\n\n### Customization and Theming\n\nCustomization and theming are essential for tailoring the user interface to specific requirements and ensuring a unique and consistent experience. Ant Design allows customization of UI elements and primary colors.\n\nAt the same time, Material UI provides tools for customization using the sx prop, a Material palette generator for theme colors, and mui-theme-creator for overall theme design. Both offer customization and theming capabilities, though with different modes of operation.\n\n### Components and Templates\n\n[Ant Design and Material UI](https://npmtrends.com/ant-design-vs-material-ui) boast a wide range of UI components for web applications. Ant Design's components are written in TypeScript with predictable static typing and offer internationalization support.\n\nMaterial UI offers modular, customizable components that can be tailored using the component key within the theme and the class name within the sx prop. Material UI has a built-in responsive grid system for layout consistency across various screen sizes and orientations.\n\n### Icons\n\nIcons play a crucial role in enhancing the visual appeal of UI designs, and both Ant Design and Material UI offer a comprehensive collection. Ant Design's 788 icons are known for their clarity, intuitiveness, simplicity, visual balance, and consistent stroke widths and proportions. These icons can be accessed through the @ant-design/icons package. On the other hand, Material UI allows developers to incorporate icons into their projects directly through the codebase easily.\n\n### Design Philosophy\n\nAnt Design follows a traditional and business-oriented design philosophy, catering to productivity and enterprise-level applications. [Material UI](https://github.com/mui/material-ui), inspired by Google's Material Design principles, focuses on clean, modern aesthetics emphasizing visual consistency and usability. Both frameworks appeal to different design philosophies, enabling developers to choose based on their project requirements and design principles.\n\n### Popularity and Adoption\n\nAnt Design has seen widespread adoption by Chinese companies and is gaining global recognition. Material Design, closely associated with Google products, is widely used across various organizations worldwide. Both frameworks offer versatility for building modern web applications and have a broad user base from different geographical regions and industries.\n\n### Accessibility in UI Frameworks\n\nAnt Design and Material UI prioritize accessibility in UI design, offering a wide range of accessible components and keyboard navigation support. While both frameworks excel in this area, proper implementation and testing are crucial for creating accessible web applications that cater to diverse user needs and preferences.\n\n### Bridging the Gap Between Design and Development\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. With a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Ant Design Vs Material UI In React Projects\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1527689368864-3a821dbccc34?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx3ZWIlMjBwcm9qZWN0fGVufDB8fHx8MTcxOTA0NzU0M3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nBoth Material UI and Ant Design are optimized for performance, with components designed to be efficient and responsive. Material UI offers a sleek performance profile, partly due to its focus on Google's Material Design. This emphasis prioritizes responsive interactions and lightweight animations. Material UI is known for its straightforward implementation and [extensive library of ready-to-use components](https://dev.to/jacobandrewsky/component-librarires-should-you-use-them-4ff7). This comprehensive selection can flatten the learning curve for React developers, making it easier to create dynamic user interfaces quickly.\n\n### Comprehensive Components and Structured Design Approach\n\nAnt Design offers a comprehensive set of components, but its design language may require some acclimatization. This may be particularly true for developers unfamiliar with its design principles. The structured approach to UI design provided by Ant Design can be extremely beneficial for large-scale applications. Maintaining consistency and order is paramount with Ant Design, making it the ideal choice for projects with high complexity and functionality requirements.\n\n### Community Support and Documentation\n\nBoth Material UI and Ant Design have strong community support and extensive documentation. Material UI boasts a large and active community, with many resources available, such as third-party plugins, extensions, and tutorials. The library's popularity ensures developers can easily find solutions to common problems and share best practices.\n\n#### Ant Design's Growing Appeal\n\nAnt Design also enjoys robust community support, especially among enterprise users in Asian markets. The community provides valuable insights into using the library in complex projects, with an increasing number of resources available in English. This increase makes Ant Design more accessible to a broader audience.\n\n#### Equipping Developers for Success\n\nBoth libraries offer comprehensive documentation. Material UI provides detailed guides and examples that cover its components and customization features. Ant Design's documentation is equally comprehensive, offering clear instructions and interactive examples to demonstrate the use of its components and design language.\n\n### Integration and Compatibility with React Projects\n\nMaterial UI and Ant Design are both built with React and designed to integrate seamlessly with React applications. They also support modern React features, such as hooks and functional components, allowing developers to utilize React's capabilities within the UI layer fully.\n\n#### Compatibility and Integration in the React Ecosystem\n\nBoth libraries offer components compatible with server-side rendering (SSR) and can be used in conjunction with other libraries and frameworks in the React ecosystem. This compatibility ensures developers can use either library without worrying about significant integration issues, making Material UI and Ant Design versatile for React projects.\n\n#### Choosing Between Libraries\n\nWhen deciding between Material UI and Ant Design for React projects, developers must consider various factors such as performance, ease of use, community support, and integration capabilities. Each library offers rich features and components with distinct characteristics that may influence the decision-making process based on the project's specific requirements.\n\n#### High-Quality UI for React\n\nMaterial UI and Ant Design can deliver high-quality, accessible, and performant user interfaces for React projects. The choice may depend on the nuances of the project's needs and the developer's personal preferences.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Use Cases\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1592434134753-a70baf7979d5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxodWF3ZWl8ZW58MHx8fHwxNzE5MDQ3OTQyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen reviewing the use cases of both Ant Design and Material UI, it is clear that they each possess their own unique set of advantages and drawbacks.\n\nAnt Design offers an excellent user experience that is perfect for enterprise-level projects. The consistent design guidelines and accessibility focus make it the ideal option for building applications that will be used by a wide range of users. It’s a good choice if you need multilingual support in your project.\n\nAnt Design has been used in a plethora of real-world cases, especially in Chinese tech companies, such as:\n\n- Alibaba\n- Tencent (QQ, WeChat, etc.)\n- Baidu\n- Xiaomi\n- [Ele.me](http://Ele.me)\n- Taobao\n- [JD.com](http://JD.com)\n- Tmall\n- Ctrip\n- Huawei\n\nMaterial UI is perfect for modern, engaging projects requiring an intuitive user interface. Its components are inspired by Material Design, and it emphasizes animation and motion to offer an experience tailored precisely to your users’ needs. It also lends itself perfectly to responsive design and customizations that can be done quickly and easily.\n\nThere are numerous real-world applications of Material UI, including:\n\n- Google (Google Drive, Google Calendar, Google Maps, Google Photos, etc.)\n- Airbnb\n- Uber\n- Netflix\n- Spotify\n- LinkedIn\n- Dropbox\n- Microsoft (Office 365, Outlook, OneNote, etc.)\n- GitHub\n- Trello\n\n## Comparing Pros & Cons Of Ant Design And Material UI\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1577900258307-26411733b430?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxwcm9zJTIwYW5kJTIwY29uc3xlbnwwfHx8fDE3MTkwNDc5NTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Ant Design\n\n#### Pros\n\n- Strict design guidelines ensure a consistent and efficient user experience.\n- Emphasis on accessibility makes it usable by a wide range of users.\n- Wide range of enterprise-level components and internationalization tools.\n- Good performance and scalability.\n- Large user base in China.\n\n#### Cons\n\n- Less flexibility in terms of customization.\n- More minimalist and simple design aesthetic may not be suitable for all projects.\n\n### Material UI\n\n#### Pros\n\n- Material Design-inspired components provide a cohesive and intuitive user experience.\n- Emphasis on animation and motion makes for a more engaging user experience.\n- Built-in theme system allows for easy customization of the look and feel of the components.\n- Good performance and scalability.\n- More popular among developers than Ant Design.\n- Large global user base.\n\n#### Cons\n\n- Less enterprise-level components and internationalization tools compared to Ant Design.\n- More modern and creative design aesthetics may not be suitable for all projects.\n\n### Free and Open-Source UI Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Choosing Between Material UI And Ant Design For Your React UI\n\n![Ant Design Vs Material UI](https://images.unsplash.com/photo-1512314889357-e157c22f938d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcxOTA0Nzk3N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen selecting a React UI library for your project, the decision between Material UI and Ant Design can be pivotal. Both libraries have strengths and cater to different design philosophies and project requirements. Making an informed choice requires careful consideration of several factors impacting the development process and the final product.\n\nSeveral key factors should influence your choice between Material UI and Ant Design:\n\n### Design Aesthetic\n\nMaterial UI will be a natural choice if your project requires adherence to Google's Material Design guidelines. Conversely, Ant Design might be more suitable if you prefer a design language incorporating Chinese design principles or targeting enterprise-level applications.\n\n### Component Availability\n\nEvaluate the range of components each library offers and determine whether they align with your project's needs. While both libraries provide a comprehensive set of components, specific elements like [data visualization components](https://ninjatables.com/effective-data-visualization/) or internationalization tools may sway your decision.\n\n### Customization Needs\n\nConsider the level of customization you need. Material UI offers more flexibility with theming and customization, which might be crucial for projects requiring a unique brand identity.\n\n### Development Speed\n\nIf rapid development is a priority, assess which library offers more ready-to-use components that fit your needs. This can significantly speed up the development process.\n\n### Community and Support\n\nThe size and activity level of the library's community can be important for getting support. Material UI generally has a larger English-speaking community, while Ant Design has strong support, particularly in Asia.\n\n### Performance\n\nAnalyze the performance implications of each library, especially if your project is performance-sensitive. Both libraries are optimized for performance, but the actual impact can vary based on how they are used within your project.\n\n### Learning Curve\n\nConsider your team's familiarity with each library. A steeper learning curve might lead to longer development times, so choose a library that aligns with your team's expertise.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in the world of UI frameworks, offering a blend of aesthetic appeal and functionality that can transform how you design your web applications. With over 20 animated components to choose from, MagicUI provides a wide array of tools that you can leverage to create visually stunning interfaces that captivate your users from the get-go. Designed to simplify the process of UI creation, MagicUI does the heavy lifting for you, enabling you to focus on functionality while still providing your users with a memorable experience.\n\n### Crafted with Cutting-Edge Tech\n\nMagicUI's components are built with the latest technologies, including React, TypeScript, Tailwind CSS, and Framer Motion. This amalgamation of cutting-edge tools ensures you're equipped to create beautiful, highly responsive, and engaging interfaces. By incorporating [MagicUI](https://magicui.design/) into your projects, you can rest easy knowing you're leveraging the best the UI world offers.\n\n### Effortless Integration and Customization\n\nThe real magic of MagicUI lies in its seamless integration with your existing applications. Whether revamping an existing project or starting from scratch, MagicUI slots effortlessly into your development workflow. Its customizable components allow you to tailor your interfaces to your brand's unique aesthetics, ensuring your application remains consistent with your brand identity.\n\n### Beyond the Free Version\n\nBut that's not all—MagicUI offers even more value with MagicUI Pro, a solution that saves you countless hours and provides you with a range of website templates that you can use to convert visitors into customers. With MagicUI Pro, you're not just getting a UI framework; you're getting a partner in success that streamlines your development process and sets you up for success.\n\n### Transform Your Development Process\n\nSo, what are you waiting for? Get [Magic](https://magicui.design/) today and witness the transformation in your application development process. Make the most of your web development journey with a tool designed to make your life easier and your applications stand out from the rest.\n\nThe power of MagicUI is yours for the taking—what will you create with it?\n"
  },
  {
    "path": "apps/www/content/blog/app-landing-page.mdx",
    "content": "---\ntitle: \"20 Best App Landing Page Examples For Design Inspiration\"\ndescription: \"Get inspired with these 20 outstanding app landing page examples that will help you create a visually appealing and effective page for your app.\"\nimage: https://cdn.magicui.design/assets/c050747e-7a2c-4b95-8cf7-03228cf2ee5b.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you looking to create a stunning mobile app landing page but need help finding inspiration among the examples online? Crafting the perfect app landing page is crucial to hook users and keep them engaged. Luckily, there’s a perfect solution for you inspired by [top landing page examples](https://magicui.design/blog/landing-page-examples)!\n\nThe Magic UI [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a valuable tool for designing an attractive and engaging mobile app landing page quickly and easily.\n\n## What Is An App Landing Page?\n\n![App Landing Page](https://images.unsplash.com/photo-1586953208448-b95a79798f07?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx1aXxlbnwwfHx8fDE3MjE0NTg3NTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nApp landing pages are designed to promote your mobile application and drive downloads. Whether through a marketing campaign and/or organic search traffic, this is where your leads will land to get more information about your app and download it. These landing pages usually contain the following:\n\n- The app’s description\n- Features\n- Value propositions\n- [Call-to-action buttons](https://blog.hubspot.com/marketing/call-to-action-examples)\n- [Links to drive conversions](https://kaiserthesage.com/conversion-link-building/)\n\nThe main task of the landing pages is to convert a visitor into a lead or a buyer after launching your app with the incentive to complete a target action. Such an action may be:\n\n- Purchase\n- Subscription to the newsletter\n- Registration\n- Downloading\n- Sending contacts, etc.\n\n## 20 Best App Landing Page Examples For Design Inspiration\n\n![App Landing Page](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx1aXxlbnwwfHx8fDE3MjE0NTg3NTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Amazon Music\n\nAmazon Music shows that even with big players like Spotify and Apple Music around, they’re not afraid of sluggishly competing in the music streaming marketplace. This app landing page entices new customers with a sweet deal and showcases their benefits in a way that differentiates them from competitors.\n\n- On its app landing page, Amazon Music mentioned that it has the “most ad-free top podcasts” and that you can start and skip “any song, ad-free.”\n- They also throw a little shade at Tidal, saying you can “listen in HD, with no extra cost.” Their messaging goes the extra mile to do some differentiating.\n\n### 2\\. Uber\n\nBooking a ride with Uber has become second nature to many of us, and its landing page plays a significant role. You’ll first notice the bold, contrasting color scheme that captures attention and conveys a sense of efficiency.\n\n- Its uncluttered, interactive design with a layout emphasizing key features (ride options, safety measures, and pricing) makes it easy for users to scan and understand the app’s benefits quickly.\n- It also includes social proof through customer ratings and reviews, showcasing the app’s reliability and trustworthiness.\n- The CTA is prominently displayed, with the option to download the app for both iOS and Android users.\n\n### 3\\. Slack\n\nIf you’ve ever used Slack, you know how efficient and user-friendly it is. Its landing page effectively conveys this through its clean and straightforward design. From the headline—” Where work happens”—to the visuals and copy, it communicates how Slack can improve communication and collaboration in the workplace.\n\n- The layout is well-structured, with a clear hierarchy that guides users through the page.\n- Slack places its CTAs at the top and bottom of the page, making it easy for users to act at any point while scrolling.\n- Screenshots of the app in use, customer testimonials, and social proof in the form of logos for companies that use Slack all contribute to building trust and credibility.\n- You’ll love Slack’s landing page. It has lots of white space, large fonts, and minimalistic elements, making it easy for the eyes.\n- Scrolling through and absorbing information is painless, which contributes to higher engagement.\n\n### 4\\. Cameo\n\nCameo’s unique service: personalized shoutouts from celebrities, athletes, and influencers that you can send to your friends, family, or coworkers. Talent earn money for a minute of their time, and customers get the thrill of a lifetime. It’s a charming idea, and an easy-to-use app lies at the heart of it.\n\n- It’s not always possible to highlight everything your app does, but clever use of animation or video can showcase either functionality or results.\n- Cameo provides a sample from “Mr. Wonderful” himself, Shark Tank’s Kevin O’Leary. Another video, showing a fan’s reaction to a message from Cody Ko, is even more powerful.\n\n### 5\\. FitnessAI\n\nGetting into weightlifting can be intimidating. It's hard not to feel like a total dork when flanked by people pumping iron with bulging biceps who know what they're doing. FitnessAI makes it less intimidating with an iPhone app that generates customized workouts shaped by data from over 5.9 million workouts.\n\n- The design finds the right balance between the physicality of hitting the gym and data science.\n- The hero image, all muscle and gunmetal grays, captures the essence of weightlifting.\n- What follows are clear explanations of how the app works and why real data differentiates the mobile app from other weightlifting apps.\n- AI-driven saas apps often lean too heavily on the big-brained intricacies of their product.\n- FitnessAI doesn’t overdo it with the complexities of data science. They make it easy for anyone to understand how it works.\n\n### 6\\. Cash App\n\nThere are a few competing peer-to-peer payment apps, but Cash App has the advantage of being tied to Square, one of the earliest innovators in digital payments, which gives it a solid reputation.\n\n- This app landing page is a portal to setting up an account, downloading the app from the Apple App Store or Google Play, and seeking customer support.\n- Being a part of Square means that Cash App doesn’t have to make a case for itself like newer companies that have yet to prove themselves. This allows them to keep things short with a stripped-down design that only has what’s necessary.\n- Cash App’s web design could have been straightforward and unembellished. But there’s enough visual pizzazz to capture your attention. The blinking money symbol while loading and the moving visuals of the landing page keep things interesting.\n\n### 7\\. BrightLock\n\nImagine pointing the light on your phone at a locked door and having it click open. This may seem like something straight out of a science fiction movie, but this is a technology of today. BrightLock's mobile app makes it safe and secure to open smart lock doors at home and at work with a flick of your smartphone. The landing page built with Webflow captures the sophistication of the lock systems BrightLock sells.\n\n- The minimalist design is full of whites, grays, and well-defined lines.\n- This website design, with a modern feel, shows that technology can improve even an everyday task like opening doors.\n\n### 8\\. Bellish\n\nKnitting is a low-tech pursuit requiring only yarn, needles, and a whole lot of patience. Bellish brings tech to this creative pursuit with a mobile app that generates sweater patterns, color swatches, and other tools to help improve your knitting skills.\n\n- This mobile app website, created with Webflow, is full of thoughtful design and well-ordered organization to demonstrate how the app works.\n- The app landing page design is soft, from its gently stylized logo to the screenshots showing the simplicity of the Bellish app.\n- The user experience captures the feel of the relaxing pursuit of knitting.\n- It shows how the Bellish app can make the entire knitting process, from pattern design to row counting, easier and more efficient.\n\n### 9\\. Aura\n\nAura is yet another mobile app for mindfulness, stress management, and improving sleep. It offers a variety of meditations, sounds, music, and other features to help you achieve peace of mind.\n\n- This layout contains tranquil images of rising sun, mountains, beaches, and other nature scenes.\n- Along with these images are screenshots and information about the app. This Webflow responsive design captures the app’s sense of calm.\n\n### 10\\. Headspace\n\nHeadspace’s landing page is a masterclass in simplicity and clarity. The headline is short yet effective—”Meditation & Sleep Made Simple.” It conveys the app’s value proposition and target audience (people who want to improve their sleep and mindfulness).\n\n- The page's visuals are minimal but impactful. They feature a calming color palette and animations that showcase the app’s features.\n- It also includes a video demo, giving users a taste of the app’s interface and functionality.\n- The copy is concise and persuasive, highlighting the benefits of using Headspace.\n- One unique element of this landing page is the all-encompassing “Try for free” CTA. This leads users to download the app and sign up for a free trial, eliminating any barriers to experiencing the app’s benefits.\n\n### 11\\. Ibotta\n\nIbotta offers real cashback on everyday purchases in participating stores. Users can scan receipts or link their loyalty cards to earn cashback, which they can then redeem through PayPal or a bank account.\n\n- The landing page’s design is simple, with a consistent color palette and visuals that follow a similar style.\n- Its bright colors and playful icons convey a sense of fun and excitement, aligning with the app’s value proposition.\n- Ibotta’s copy is very concise and to the point, delivering its message in a couple dozen words.\n- The layout is strategically designed to showcase the app’s different features and how it works without overwhelming the user.\n- Due to its simple design, the page loads quickly, contributing to a seamless user experience.\n\n### 12\\. Whatsapp\n\nThe WhatsApp landing page markets itself as a hub of secure and private global communication, enabling users and businesses alike to:\n\n- Express themselves freely\n- Forge connections\n- Engage with communities through an intuitive and trustworthy platform\n\n### 13\\. Dropbox\n\nDropbox's landing page delivers a clean, distraction-free design, reflecting the simplicity and clarity of its file-sharing service. It's about making your life easier, and the well-designed landing page communicates this from the get-go.\n\n### 14\\. Tinder\n\nTinder's new landing matches its app’s bold approach to modern dating. It’s as straightforward as its swiping feature, sparking curiosity and engagement instantly. Each of these landing pages also tells a story that resonates with its target audience, proving that when it comes to conversion, it's not just what you say; it's how you present it.\n\n### 15\\. Everand\n\nEverand's landing page turns the page on engagement with its clean, inviting design, and a treasure trove of ebooks and audiobooks just a subscription away—enticing book lovers into a world colored by stories.\n\n### 16\\. Evernote\n\nEvernote plays it cool with a landing page that’s as organized as the notes within the app. Clean lines, clear value propositions, and an unmistakable CTA make it a minimalist's dream of landing pages.\n\n### 17\\. Revolut\n\nRevolut's landing page presents itself as a financial control center, offering a sleek, user-centric interface that promises to simplify personal and business finance through innovative features and global accessibility.\n\n### 18\\. Duolingo\n\nThis language-learning and app website uses vibrant colors and a charming owl to keep things light, fun, and engaging. Duolingo’s page is a lesson in balancing information with playfulness.\n\n### 19\\. ArriveSafe\n\nLetting your family and loved ones know where you are improves your safety and eases the worries of those who care about you. ArriveSafe shows your loved ones where you’re at and where you’re going. And with versions in the Apple App Store and Google Play, you can get this peace of mind whatever your preferred mobile device. The design feels effortless with a logical structure and large blocks of content.\n\n- Several scroll-triggered animations bring a lively energy to the user experience.\n- The web design uses interactions to demonstrate how ArriveSafe works in 3 steps, allowing users to engage and learn more. This is a great example of a designer doing the extra work to create a more compelling user experience.\n\n### 20\\. Acorns\n\nIs there a better name for an investment app that lets you stow away little chunks of money for a reward on a later day than Acorns? With oak leaves and a quaint little acorn of a logo, this web design doesn’t overdo it with the theme — and that’s a good thing. Showing a bit of restraint makes for a more focused design.\n\n- Along with the clear lines of the design are several screenshots.\n- Some are flat, and others show angled smartphones.\n- This mix in perspectives adds depth to the design, keeping it from being too static.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## What Is A Landing Page Used For?\n\n![App Landing Page](https://images.unsplash.com/photo-1463717993767-4ded88224b61?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMG1vYmlsZXxlbnwwfHx8fDE3MjE0NTg3Nzl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAn app landing page is a crucial asset for a mobile application at every stage of its life cycle.\n\n- [Before the launch](https://blog.getsocial.im/how-to-launch-an-app-a-15-step-guide-to-a-successful-app-launch/), it is a platform to gauge audience engagement and interest before the product release.\n- During the launch phase, it becomes a crucial tool for advertising and promoting the app for installation.\n- After the app is launched, the landing page plays a significant role by keeping users interested in the application and providing detailed information that may not be readily available on platforms like Google Play or the App Store.\n\n### Benefits of Having an App Landing Page\n\nThere are several key benefits to having a landing page for your mobile application.\n\n- It allows you to tap into search traffic, significantly increasing the number of downloads over time.\n- Setting up your landing page with strategic calls to action and regularly updated content turns it into a mini-store for selling your app. A\n- A [mobile app landing page](https://unbounce.com/landing-page-examples/best-mobile-landing-page-examples/) enables you to build a subscriber base and find beta testers during product development.\n- Once the app is launched, you can seamlessly transition your subscription landing page into a sales funnel by replacing the capture form with \"Download Application\" buttons and adjusting the call to action. This streamlined process enhances app installation, boosts organic user acquisition, and increases re-engagement with your app.\n\n## Elements Of A High-Converting Landing Page For An App\n\n![App Landing Page](https://images.unsplash.com/photo-1474377207190-a7d8b3334068?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWJzaXRlJTIwYnV0dG9ufGVufDB8fHx8MTcyMTQ1ODg2N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nCraft a compelling headline and a concise value proposition that clearly explains what your app offers and how it benefits users. Highlight its unique features to stand out in a crowded market.\n\n### CTA Button\n\nPlace a well-designed CTA button above the fold (this is what’s visible before a web user scrolls), with persuasive text that encourages users to take action immediately.\n\n### Reviews and Ratings\n\nDisplay positive user reviews, ratings, and testimonials to build trust and credibility.\n\n### App Store Badges\n\nIncorporate recognizable app store badges (e.g., App Store and Google Play) that link directly to your app's download page on the respective app store.\n\n### Features\n\nProvide a comprehensive list of your app's features and explain how they address users' pain points or improve their lives.\n\n### MagicUI Startup Landing Page Template\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## What Are The Benefits Of Landing Pages For Apps?\n\n![App Landing Page](https://images.unsplash.com/photo-1616628188859-7a11abb6fcc9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxzdGlja3klMjBub3Rlc3xlbnwwfHx8fDE3MjE0NTg3OTJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nLanding pages are vital tools in your marketing arsenal when promoting mobile apps. Here are some perks of building a landing page to promote your app.\n\n### More Conversions\n\nLanding pages allow you to speak more directly to your target audience and steer them towards your call to action. This direct approach often results in more app downloads than sending visitors to a regular download page.\n\n### Create Fully Branded Experiences\n\nRather than being stuck with the generic look of app store pages, landing pages let you create a [branded experience that excites potential users](https://builtin.com/articles/app-marketing-tactics) about your app. A well-designed landing page can compellingly present your brand, boosting your app's initial impact.\n\n### Provide More Precise Messaging\n\nWith a landing page, you have more space to persuade potential customers than app store pages. You can delve into your app's features and benefits, include testimonials, or add trust signals like review scores.\n\n### Keep Users in Your Ecosystem\n\nApp store pages can redirect potential customers to similar apps from other developers, potentially losing you a customer. Landing pages help keep users focused on your app, providing links to educational resources if they need more info before downloading.\n\n### Control Your Call to Action\n\nLanding pages let you control your call to action, making it specific to your app and brand. You can tailor the messaging to reflect your app's unique value, giving you an edge over generic messages like \"Download\" or \"Get\" on app store pages.\n\n### Target the Right Audience\n\nLanding pages help you direct your messaging towards the right audience, ensuring that your app appeals to the most likely to download it. By targeting your audience precisely, you can craft a compelling pitch that resonates with potential users.\n\n## How To Build Mobile App Landing Pages\n\n![App Landing Page](https://images.unsplash.com/photo-1629904853893-c2c8981a1dc5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzIxNDU4ODEzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Establish Your Conversion Goal First\n\nBefore rolling up your sleeves and designing your app landing page, you need to [set a clear conversion goal](https://www.abconvert.io/blog/mastering-conversion-goals-a-comprehensive-guide-to-boosting-your-websites-performance). What action do you want your visitors to take on that page? Do you want them to download your app directly? Would you prefer to subscribe to your service first? Or they may need to purchase a product for the app to work correctly. Your conversion goal shapes your calls-to-action, copy, design, and more. So, before anything else, decide what this goal is.\n\n### Start with Mobile\n\nSince apps are created primarily for mobile phones, designing your mobile version first makes sense. Most of your visitors will visit this page via mobile anyway, so why not prepare for them first? Plus, it’s generally easier to create a desktop version from a mobile one than the other way around.\n\n### Keep Their Attention\n\nThis is true of all landing pages, but app landing pages that aim for direct downloads should have a 1:1 attention ratio. Don’t overwhelm your visitors with too much information; instead, give them the essentials they need to convert. Use bullet points, headings, and short paragraphs to keep things scannable.\n\n### Show the Device\n\nShow your app running on a device that’s as similar as possible to what your users have. This could be an iPhone, an Android phone, or another device based on your target audience. This visual cue helps visitors picture themselves using your app and hit that download button. And keep your visuals fast-loading – a slow post-click experience can frustrate users and tank your conversions.\n\n### Stay Fast\n\nDon’t let a heavy page slow you down. It can be tempting to throw in every app feature and detail, but visitors may bounce if your page takes more than a few seconds to load. Keep your pages fast and easy to navigate to increase your chances of converting visitors into users.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Mobile App Landing Page Best Practices\n\n![App Landing Page](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyMTQ1ODgyNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Clear and Compelling Headlines\n\nYour headline is the first thing users see on your mobile app landing page. Make it punchy, clear, and irresistible. Think of it as the billboard for your new app – it’s got to hook them in fast.\n\n### Engaging Visuals\n\nHumans are visual creatures, so play to the gallery. Use high-quality images or videos that reflect your app's vibe.\n\n### Concise Copy\n\nKeep your copy concise and to the point. Highlight benefits, not just features, and make every word earn its place.\n\n### Strong Call-to-Action (CTA)\n\nYour CTA is your “ask,” so don't mumble. Whether it's ‘Download Now,’ ‘Get Started,’ or ‘Learn More,’ make it [loud and clear](https://www.grammarly.com/blog/call-to-action/). And please, for the love of conversion, make that download link pop!\n\n### Fast Load Times\n\nYou're done if your page loads like a sloth climbing a tree. Speed is key. Ensure your landing page loads quickly to keep those first few potential customers, paying customers, and users on the hook.\n\n### Mobile Optimization\n\nThis is a mobile app landing page, so if it isn’t optimized for your mobile devices, that’s a facepalm moment. Ensure it looks just as stunning on a smartphone as on a desktop app.\n\n### Social Proof\n\nPeople trust other people more in investment apps than they trust marketing spiels. Include reviews, customer testimonials or, or user numbers to cash app downloads to show that real humans love your app.\n\n### A/B Testing\n\nDon't just guess what works – test it. Use [A/B testing to fine-tune your landing page](https://www.semrush.com/blog/a-b-testing-landing-pages/). Change one element at a time and measure. Rinse and repeat.\n\n### Analytics\n\nPlug in your analytics tools and monitor what happens. How long do people stay? What do they click? Use data to make decisions, not just gut feelings.\n\n### Continuous Optimization\n\nKeep refining and updating your app landing pages based on user feedback and analytics. The world changes fast, and so should your app landing page examples, too.\n\n## How To Retarget Website Visitors For Higher Conversions\n\n![App Landing Page](https://images.unsplash.com/photo-1556155092-490a1ba16284?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxhbmFseXRpY3N8ZW58MHx8fHwxNzIxNDU4ODM2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nRetargeting your landing page visitors is a powerful strategy to re-engage those who have shown interest in your mobile app but have yet to convert. To begin, assess visitors who have interacted with the content. Then, create a custom audience based on these potential users.\n\n### Reignite Interest\n\nDesign a visually appealing and compelling ad that aligns with the content and messaging of the landing page these individuals previously viewed. Emphasize the [app's unique selling points](https://www.techtarget.com/whatis/definition/unique-selling-point-USP) and highlight any special offers or features to entice them further. The ad should link to the next stage in the funnel; depending on the landing page content, this might be an event or newsletter registration or directly sending the viewer to an app store.\n\n### Targeted Engagement\n\nIf your landing page audience can be further segmented, this is the perfect opportunity to create more personalized ads and A/B test what works well for conversion. The key is to test, learn, and optimize continually.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specifically designed for design engineers. it offers a range of visually appealing and interactive elements that can be easily integrated into web applications with a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThis allows for the creation of stunning user interfaces with minimal effort. The highly customizable components enable seamless adaptation to match desired branding and design requirements. [MagicUI](https://magicui.design/) bridges the gap between design and development by focusing on animation and a design-centric approach, empowering users to craft captivating digital experiences.\n\n### The Power of MagicUI Pro: Elevating Landing Page Creation\n\nWith MagicUI Pro's additional features, users can save thousands of hours and create beautiful landing pages that convert visitors into customers. A seamless integration of design and development can lead to a transformative experience with MagicUI.\n\n#### Effortless Efficiency\n\nMagicUI Pro offers comprehensive tools and features that make landing page creation efficient and effective. By leveraging MagicUI Pro's power, users can save significant time and effort while creating visually stunning landing pages. The seamless integration of design and development capabilities allows users to create captivating landing pages that convert visitors into customers.\n\n#### ​Captivating Conversions\n\nWith access to a range of templates and features, MagicUI Pro empowers users to create visually appealing, highly functional, and user-friendly landing pages. The templates provided by MagicUI Pro are designed to help users make the most of their landing page creation experience, ensuring that every aspect of the page is optimized for performance and conversion. The comprehensive set of features offered by MagicUI Pro makes it an essential tool for anyone looking to create captivating landing pages that drive results.\n\n### The Startup Landing Page Template: A Gateway to Success\n\nThe startup landing page template offered by [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) is a powerful tool for businesses looking to establish a strong online presence. By leveraging the features of the startup landing page template, businesses can create a landing page that effectively communicates their brand message and value proposition.\n\nThe template is designed to be visually appealing and user-friendly, ensuring that visitors are engaged from the moment they land on the page. With features such as customizable components and animations, the startup landing page template empowers users to create a landing page that is unique to their brand and business. By utilizing the [startup landing page template](https://pro.magicui.design/docs/templates/startup), businesses can create a strong foundation for their online presence and drive meaningful results.\n"
  },
  {
    "path": "apps/www/content/blog/best-react-component-library.mdx",
    "content": "---\ntitle: \"What Is The Best React Component Library For Your Project?\"\ndescription: \"Find out which is the best React component library fit for your project. Make the right choice and enhance your development workflow.\"\nimage: https://cdn.magicui.design/assets/23dd340c-5e04-4368-8736-21b624c92e77.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-13\"\nfeatured: false\n---\n\nAre you struggling to find the perfect React component library to elevate your [UI Frameworks](https://magicui.design/blog/ui-frameworks) design? Choosing the best option is crucial to enhance your project’s performance. You want to ensure it's efficient, visually appealing, and aligns with your project's objectives. In this blog, we’ll explore the top React component libraries to help you pick the right one for your project, saving you time and effort.\n\nWhen deciding on the best React component library for your project, Magic UI's [React component library](https://magicui.design/) is a valuable tool. Its intuitive design and customizable components can enhance your project's UI Frameworks, making it easier to achieve your goals with efficiency and style.\n\n## What Is A React Component Library?\n\n![Best React Component Library](https://images.unsplash.com/photo-1607706189992-eae578626c86?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxmcm9udCUyMGVuZCUyMGNvZGV8ZW58MHx8fHwxNzE5MDU5MjAyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nA React UI component library is a tool or software system that provides ready-to-use components for React-based applications and sites. These component libraries help accelerate software development while offering many benefits to developers and businesses.\n\nA component library can contain tables, charts, buttons, maps, colors, and so on. Many tools also allow you to customize these and use them in your applications based on their design or style. The usage of these React UI component libraries is increasing since there are many React-based [software systems](https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/) on the web. React is a JavaScript library that helps you develop user interfaces for mobile and web applications without hassle.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## Best Reasons Why You Should Use A Component Library\n\n![Best React Component Library](https://images.unsplash.com/photo-1633180888652-c561b86040f1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcxOTA0Nzk3N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nUsing a React component library can offer numerous benefits to your project. One key advantage is the consistency it provides across your projects. Instead of creating elements from scratch each time, you can rely on pre-designed, pre-tested components, ensuring a uniform look and feel across all your projects.\n\n### Efficiency and Field\n\nAnother benefit is efficiency and speed. With a library of components, you can save significant time by not starting each new project from scratch. Simply grab pre-made components, make necessary tweaks, and you're good to go, accelerating the development process.\n\n### Quality Control\n\nQuality control is another important advantage. Component libraries are usually thoroughly tested, minimizing bugs and ensuring a more reliable user experience. By reusing components that have already been vetted, you enhance the overall quality of your projects.\n\n### Scalability\n\nScalability is also a key benefit. As your projects grow, a React component library can scale with them. You can use existing components or add new ones as needed, meeting your project's evolving requirements without building everything from scratch.\n\n### Collaboration\n\nA [component library](https://dev.to/domysee/benefits-of-a-component-library-2baa) makes collaboration easier, particularly when working in a team. Everyone can utilize it as a shared resource, ensuring consistency and simplifying collaboration processes.\n\n### Explore Creativity\n\nUtilizing a React component library allows you to focus more on creativity. By covering the basics, you can concentrate on the creative aspects of your design, such as user experience, innovative features, and overall aesthetics.\n\n### Build Engaging UIs with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. Utilize our [React component library](https://magicui.design/) for free today at [magicui.design/docs](http://magicui.design/docs).\n\n## 14 Best React Component Library Recommendations To Choose From\n\n![Best React Component Library](https://images.unsplash.com/photo-1524508762098-fd966ffb6ef9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTkwNDc1MDV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Material UI\n\nMaterial UI is the React implementation of the well-known design language Material Design. Google developed Material Design to provide a united, consistent, real-life-like design experience for all its products and services.\n\nIt provides a material design touch to React-based applications. Material UI provides several pre-built UI components like buttons, forms, grid systems, navigation tabs, etc., making it one of the best component librarys for React. Material-UI has garnered a lot of positive feedback and popularity within the developer community\n\n### 3\\. Bootstrap\n\nBootstrap began as an internal tool at X (formerly Twitter) to maintain a consistent look across the platform. In 2011, it was open-sourced for the wider web development community to use. Bootstrap is one of the most widely used component libraries, focusing on responsive, mobile-first web design.\n\nBootstrap offers a robust collection of CSS and JavaScript components, such as its grid system and responsive UI components like buttons, navigation menus, and forms, that streamline the process of building clean and consistent web layouts.\n\n### 4\\. Ant Design\n\nAnt Design proclaimed itself as the second most popular among various best component librarys for React, and they are right about that. It has been widely used, and according to npm trends, it has around 1.2 million weekly downloads.\n\nAnt Design is like Material UI, providing several UI components that look aesthetic and clean. It is based on the design language Ant Design, which has its design patterns and principles, making it one of the best component libraries for React.\n\n### 5\\. React Bootstrap\n\nIf you’re in the world of web development, or more specifically, if you’re into front-end development, you may already be familiar with Bootstrap. Bootstrap is another popular and one of the best component libraries for React. It provides a collection of reusable UI components and styles that can be used in any web application.\n\n### 6\\. Semantic UI React\n\nYou may have heard of or even used Semantic UI before. Semantic UI React is an easy-to-use, highly customizable, and of the best component librarys for React, offering reusable UI components and styles. Semantic UI React is built on top of Semantic UI, and it is one of the popular libraries that provides reusable React components that are highly customizable. According to npm trends, Semantic UI React garners around 250,000+ weekly downloads.\n\n### 7\\. Chakra UI\n\nChakra UI falls into the same category as MUI as a component library and component library for React applications. It emphasizes accessibility, developer ergonomics, and a customizable design system. Chakra UI provides a collection of well-designed and accessible components that can be easily customized to match your project's branding and style. According to npm trends, Chakra UI has around 460,000 weekly downloads, around 31.8K+ stars, and 2.8K+ forks on GitHub.\n\n### 8\\. Blueprint UI\n\nBlueprint is one of the best component librarys for React. Blueprint provides several reusable components, like icons, calendars, tables, etc., which you can use to make your React application. According to npm trends, Blueprint has around 240,000 weekly downloads and a steadily growing user base. This popularity is due to its comprehensive and well-designed set of UI components and its ease of use and customization. Blueprint has around 20K+ stars and 2.1K+ forks on GitHub.\n\n### 9\\. Mantine\n\nMantine is an easy-to-use, highly customizable, and one of the popular component librarys for React that provide developers with various reusable components and utilities for creating modern web applications. Its range of features and components includes forms, modals, navigation elements, and much more, making it one of the best component librarys for React available today.\n\n### 10\\. NextUI\n\nNext UI is a React library that offers a collection of visually appealing pre-built components. While it stands out for its aesthetics, there's a potential downside to consider. Some users have reported experiencing performance issues, particularly with slow loading times and freezing when changing themes on desktop.\n\nThis could be a concern if a smooth user experience is critical for your project. It's also worth noting that despite the name, Next UI is not directly affiliated with the popular React framework Next.js. It has got 19K GitHub stars and more than 100K weekly downloads on NPM.\n\n### 11\\. Grommet\n\nGrommet is one of the best-known component libraries for React. It provides accessibility, modularity, responsiveness, and theming support. It is very flexible and easy to change, so developers can create UIs that meet their needs and match their brand. It has around 37,000 weekly downloads and is becoming popular among developers due to its simplicity.\n\n### 12\\. Evergreen\n\nEvergreen is another well-known among various best component librarys for React offered by Segment, designed to help create delightful software products. It’s also a design system that provides flexibility and doesn’t limit developers to any specific configuration or outdated integration. Evergreen has around 12,872 weekly downloads, which has been steadily increasing over the past few months.\n\n### 13\\. Fluent UI\n\nIf you’ve used Microsoft products, you’ve used Fluent UI. Fluent UI is a set of UI components built from Microsofts design language. The UI library offers compatibility with desktop, Android, and iOS devices and is used by sites such as Office 365, OneNote, Azure DevOps, and other Microsoft products. It’s packed with a lot of prebuilt components that make it easy to prototype applications extremely quickly. The library has 9k stars on Github and is well supported by Microsoft.\n\n### 14\\. Rebass\n\nRebass is a lightweight library that creates theme-able components based on the Styled System library. Rebass is a primitive component library, meaning it’s stylistically unopinionated by default (you inject your own style) and focuses on only primitive components (such as buttons, layout components, etc.). If you don’t want to rely completely on component libraries and intend to extend an existing one during development, you should check out Rebass. It’s rapidly gaining popularity. The project currently has over 6k stars on GitHub.\n\n## What Makes A Good Component Library For Your Project?\n\n![Best React Component Library](https://images.unsplash.com/photo-1542626991-cbc4e32524cc?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxwcm9qZWN0JTIwZGV2ZWxvcG1lbnR8ZW58MHx8fHwxNzE5MDU5MTQ3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Project Needs\n\nWhen considering a React component library, it is essential to evaluate whether it provides the components and features required for your project. Your project's scale and type, as well as any specific requirements you have, should be taken into account. For instance, large enterprise applications demand a library that can handle high complexity levels.\n\n### Longevity\n\nAnother crucial factor is the library's update frequency and future support. Opt for a library that is actively maintained. This ensures that you won't have to switch to another library later. Knowing that you'll receive ongoing support offers peace of mind.\n\n### Learning Curve\n\nThe ease of use for a new developer is vital. Choosing a library that is easy for newcomers to learn fosters adaptability, particularly in team settings. Pick a library that new developers can easily pick up and use to enhance confidence and efficiency.\n\n### Customizability\n\nCan the library be customized to suit your brand's design guidelines? Some libraries are more customizable than others. If you have specific design requirements, ensure you pick a library that can be tailored to meet your needs.\n\n### Community\n\nDoes the library have a large and active community? A robust community can provide support and help resolve any issues you may encounter while using the library. A thriving community can serve as a valuable resource for developers.\n\n### Documentation\n\nCheck if the library is well-documented. Good documentation simplifies the learning process and problem-solving. Well-documented libraries can be a great asset when you need help or clarification on any feature.\n\n### Performance\n\nPerformance is key when selecting a React component library. Some libraries outperform others. If you need a highly performant library, choose one renowned for its speed and responsiveness. High performance can enhance the overall user experience and application efficiency.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Making The Right Choice For Your Project\n\n![Best React Component Library](https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWIlMjBwcm9qZWN0fGVufDB8fHx8MTcxOTA0NzU0M3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nIt is essential to consider various factors to select the best React component library for a project. These considerations ensure that the chosen library aligns with the project's unique needs, goals, and constraints. Here are some important factors to keep in mind:\n\n### Specific Project Needs and Priorities\n\nBefore selecting a React component library, it is important to evaluate the project's specific needs and priorities. Assess whether advanced React components are necessary or if lightweight components will suffice. Consider any specialized requirements that may influence the choice of a component library.\n\n### Customization vs. Pre-Built Themes\n\nWhen evaluating React component libraries, it is crucial to balance the importance of customization against the availability of ready-made themes and styles that come out of the box. Some projects may require extensive customization, while others can benefit from pre-built themes to speed up development.\n\n### Bundle Sizes and Performance Implications\n\nFor larger React projects, bundle sizes and performance implications are critical factors to consider. Lighter libraries tend to optimize better for performance, especially when dealing with a large codebase. Evaluating these aspects can help prevent performance bottlenecks.\n\n### Functionality and Interactions Coverage\n\nEnsure that the React components provided by a library cover the project's required functionality and interactions. The availability of essential components can streamline development and reduce the need for custom solutions.\n\n### Team Skills and Learning Curve\n\nAssess the development team's skills in React, CSS, and design systems to ensure that the chosen component library aligns with their expertise. Consider the library's learning curve and its theming capabilities to facilitate efficient integration into the project.\n\n### Enterprise-Level Complexity vs. Startup Needs\n\nFor enterprise-level projects with complex requirements, libraries like Ant Design may be suitable due to their extensive scope. Startups and smaller projects may benefit more from libraries with lower barriers to entry that can speed up development.\n\n### Compatibility and Migration\n\nIf migrating an existing codebase to a new React component library, consider the similarities between the current tech stack and React components. The library's compatibility with the existing codebase can simplify the migration process.\n\n### Testing and Validation\n\nBefore committing to a specific React component library, it is advisable to try out 1-2 shortlisted options on a small scale. This testing phase allows developers to assess the compatibility, functionality, and performance of the library before scaling it across the entire codebase.\n\n### Accessibility Considerations\n\nAccessibility is a critical aspect of web development, and it is essential to ensure that the chosen React component library supports accessibility features. Most libraries offer good accessibility support, but it is crucial to validate this aspect before making a final decision.\n\n### Documentation and Community Support\n\nThe availability of comprehensive documentation and a large community of users can significantly impact the learning curve and troubleshooting process. Choosing a React component library with robust documentation and an active community can streamline development and provide access to valuable resources.\n\nBy carefully evaluating these factors, developers can select the best React component library for their project, enhancing productivity, and achieving long-term success.\n\n## Developer Preferences\n\nDevelopers have various preferences regarding React component libraries. Some prefer a more lightweight and minimalist approach, such as Headless UI and Horizon UI, which provide a smaller set of core components with more emphasis on customization.\n\n### Material UI and Ant Design\n\nThose looking for an extensive set of ready-made components out-of-the-box may opt for libraries like Material UI and Ant Design. These libraries require less custom CSS but, due to their advanced components, come with steep learning curves.\n\n### Balancing Customization and Pre-Built Components\n\nA middle ground is found in Chakra UI, which strikes a balance between customization and built-in React components. This library is well-suited for developers comfortable with CSS, React skills, and knowledge of React Hooks.\n\n### Material UI and Ant Design for Advanced Customization\n\nDevelopers may turn to React libraries like Material UI and Ant Design for templating and theming capabilities. These libraries offer plentiful options for overriding styles and themes, requiring a level of proficiency in design systems and performance-tuning skills for larger projects.\n\nThere is also the option of using multiple component libraries to maximize efficiency and get the best from using libraries.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n"
  },
  {
    "path": "apps/www/content/blog/best-react-native-ui-library.mdx",
    "content": "---\ntitle: \"Best React Native UI Library? 17 Top Libraries To Choose From\"\ndescription: \"Best React Native UI Library? 17 Top Libraries To Choose From\"\nimage: https://cdn.magicui.design/assets/8kkoo2zuljh.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-17\"\nfeatured: false\n---\n\nAre you looking for recommendations on the best React Native UI library? Navigating the vast sea of [UI Frameworks](https://magicui.design/blog/ui-frameworks) can be overwhelming, particularly when seeking a top-notch solution that aligns seamlessly with your project requirements. Not to worry, as this blog is precisely tailored to help you find the perfect fit for your needs, addressing the challenge of identifying the best React Native UI library.\n\nIntroducing Magic UI, a [React component library](https://magicui.design/) bound to make your selection process easier and more efficient. It's a valuable tool designed to assist you in achieving your goals, such as finding the best React Native UI library. Whether you're a seasoned developer or just starting out, this blog has provided insights and recommendations to help you navigate the world of UI Frameworks effectively.\n\n## What Is A React Native UI Library?\n\n![Best React Native UI Library](https://cdn.magicui.design/assets/qgjpqxvdkil.jpg)\n\nReact Native UI libraries provide pre-built, reusable components (buttons, menus, etc.) tailored to React Native development. These platform-specific components make app construction easier and faster by minimizing boilerplate code, ensuring design consistency, and providing pre-built functionalities. These components provide attributes and functions via JavaScript APIs, allowing us to change the appearance and behavior of UI with our React Native code. Each component is often built with native UI elements from both iOS and Android, resulting in a platform-specific appearance and feel while keeping cross-platform functionality.\n\nThe rise of React Native has led to a surge in the popularity of React Native UI libraries and components, the most essential tools in the [React Native ecosystem](https://reactnative.dev/). They are vital in optimizing React Native development by giving developers full access to pre-designed and customizable UI components. These ready-to-use RN UI libraries not only streamline the complex process of creating visually appealing, feature-rich, and user-friendly interfaces but also provide a significant relief to developers by saving them a lot of time and effort.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## 17 Best React Native UI Libraries You Should Know About\n\n![Best React Native UI Library](https://cdn.magicui.design/assets/j0iecqi5wuf.jpg)\n\n### 1\\. Magic UI - Enhancing User Experience with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI components are highly customizable and focus on animation and a design-centric approach. With MagicUI, developers can easily create stunning user interfaces with minimal effort. MagicUI bridges the gap between design and development, empowering developers to craft captivating digital experiences.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. NativeBase - Versatile Solution for Developers\n\nNativeBase is a dynamic front-end framework that is a versatile solution for developers. It offers a collection of essential cross-platform React Native components, providing a solid foundation for building apps. NativeBase components are built with React Native and some JavaScript functionality, offering various customizable properties. Developers can leverage third-party native libraries out of the box, enhancing the versatility of their apps. NativeBase is fully open-source and has tens of thousands of stars on GitHub. The library is also now available for web users, enabling developers to achieve a native look and feel for their apps.\n\n### 3\\. React Native Elements - A Treasure Trove of Customizable Components\n\nReact Native Elements is an open-source, cross-platform React Native UI toolkit that offers various customizable components. Developers can find many options from pricing to overlay, badge to platform-specific search bars. React Native Elements focuses on the structure of components more than design, making it easy for developers to use minimal boilerplate code to get the components ready for use. With 20.7k stars on Github, React Native Elements is a toolkit worth exploring.\n\n### 4\\. Teaset - Simple UI Library for Design Enthusiasts\n\nTeaset is a UI library featuring 20+ pure JS (ES6) for component content classes. It focuses on content display and action control, making it a great addition to the list of React Native component libraries. With a few thousand stars on Github, Teaset is a fit for those who appreciate simplicity and design in their projects.\n\n### 5\\. React Native Maps - Customizable Map Components for iOS and Android\n\nReact Native Maps is a useful library that provides customizable map components for iOS and Android apps. Developers can offer users different map experiences and combine the components with the Animated API to create animated effects. React Native Maps is compatible with React Native ≥v0.64.3 and allows developers to render polygons, polylines, and more on the map.\n\n### 6\\. React Native Gifted Chat - Add Chat Functionality to Your Apps\n\nReact Native Gifted Chat is a library that allows developers to add chat functionality to their apps. It supports a range of features such as text messages, emojis, and more and offers options for customizing the look and feel of apps. With great documentation and a range of themes and styles to choose from, [React Native Gifted Chat](https://github.com/FaridSafi/react-native-gifted-chat) makes it easy for developers to create beautiful apps.\n\n### 7\\. Lottie for React Native - Add Animations to Your Apps\n\nLottie is a library from Airbnb that helps developers add animations to their apps. It works by exporting animation data in JSON format from an After Effects extension, making it easy to render animations on the web and in React Native apps. With thousands of stars on Github, [Lottie for React Native](https://github.com/react-native-community/lottie-react-native) offers a curated collection of animation files to make apps more visually appealing.\n\n### 8\\. Ignite CLI - Launch Projects Faster\n\nThe Ignite CLI starter kit was developed to help programmers launch their projects faster. It includes flexible and easy-to-use boilerplates for both iOS and Android platforms. With many built-in components, Ignite CLI can save developers two to four weeks of development time.\n\n### 9\\. React Native Vector Icons - Best Library for Icons\n\nReact Native Vector Icons offers a library of 3,000+ icons that can be easily customized, styled, and extended for app use. With thousands of stars on Github, React Native Vector Icons is a perfect fit for buttons, logos, navbars, and more, making it one of the best React Native component libraries for icons.\n\n### 10\\. Shoutem UI - Professional-Looking UI for React Native Apps\n\nShoutem UI is a library that offers a professional-looking UI for React Native iOS and Android apps. With over 25 composable and customizable UI components, developers can build complex UIs and apply custom CSS-like styling and animations using the Shoutem themes library.\n\n### 11\\. React Native Mapview - Map Components for Android and iOS\n\nReact Native Mapview offers map components for Android and iOS apps, with features like markers, polygons, and customizable map styles. Developers can customize map view position, track region/location and points of interest, and use the Animated API to control the map's center and zoom.\n\n### 12\\. React Native Camera - Create Camera Apps with Ease\n\nReact Native Camera is a component library that allows developers to create camera apps for React Native. It supports videos, photos, text recognition, barcode scanning, face detection, and more, making it popular among specialists.\n\n### 13\\. React Native Snap Carousel - Create Sliders for Apps\n\nReact Native Snap Carousel offers programmers various parallax images, layouts, previews, and performant handling of items, making it ideal for adding sliders to iOS or Android apps. With an API for customization, React Native Snap Carousel allows users to change the appearance and behavior of the component.\n\n### 14\\. React Native Paper - Cross-Platform Component Library\n\nReact Native Paper is a cross-platform component library that supports global themes and offers many components such as buttons, navigation bars, loaders, and more. Developers can create light and dark themes, add custom fonts, color schemes, and use the Material Design UI.\n\n### 15\\. Nachos UI - Customizable UI Components\n\nNachos UI includes over 30 ready-to-use UI components and supports Prettier, Yarn, and Jest Snapshot Testing. Developers can choose pre-styled inputs like forms or text buttons and customize them to fit their needs, making it a highly customizable and open-source instrument.\n\n### 16\\. Victory Native - Charting Library for React Native\n\nVictory Native is a charting library for React Native applications that simplifies the process of adding data visualization to apps. It's a valuable tool for creating engaging dashboards or reports within apps.\n\n### 17\\. React Native Firebase - Simplify Integration with Firebase Services\n\nReact Native Firebase brings the power of Firebase to React Native developers, providing easy-to-use Firebase modules for authentication, real-time database, cloud storage, cloud messaging, and more. The library simplifies the integration of Firebase services into apps, allowing developers to focus on delivering core functionalities without getting bogged down by infrastructure setup.\n\n## How To Choose The Best React Native UI Library\n\n![Best React Native UI Library](https://cdn.magicui.design/assets/n0lb55ugygf.jpg)\n\nWhen choosing the best React Native UI library for your mobile app, you must consider several factors to ensure that the library aligns with your project requirements and goals. Here are some key factors to take into account:\n\n### Project Requirements\n\nBefore selecting a React Native UI library, start by understanding your project's specific needs. Consider the complexity of the UI, the necessity for custom components, and the overall design language you want to achieve. Libraries that offer a wide range of pre-built components might be suitable for projects that require rapid development and standard UI elements.\n\n### Design Consistency\n\nThe library you choose should provide a consistent design system that can be easily applied across your entire application. This is essential to maintain a cohesive user experience. Look for libraries offering theming capabilities to ensure your app reflects your brand identity.\n\n### Cross-Platform Compatibility\n\nEnsure that the selected library is cross-platform and provides a consistent look and feel on iOS and Android. This is crucial for reaching a broader audience without writing platform-specific code.\n\n### Community and Support\n\nAn active community and support are invaluable when implementing a UI library. Look for libraries with a large user base, which are often more reliable and regularly updated. Access to resources like documentation, tutorials, and forums can help resolve issues quickly.\n\n### Performance\n\nAssess the performance implications of the UI library you are interested in. Some libraries may have heavier components, leading to slower app performance, particularly on older devices. Opt for libraries that are optimized for performance and have a minimal impact on load times and responsiveness.\n\n### Customization and Scalability\n\nThe library should allow for customization to meet your unique requirements and be scalable to accommodate the growth of your application over time. A library that limits customization or scalability can become a bottleneck as your app scales and evolves.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## 5 Reasons Why Use A React Native UI Library For Your Mobile Apps\n\n![Best React Native UI Library](https://cdn.magicui.design/assets/t9i2i8kmgms.jpg)\n\n### 1\\. Cross-platform Compatibility\n\nReact Native UI Components are compatible with Android and iOS platforms, making it easier for developers to create apps that can run on multiple platforms without writing separate code for each. This cross-platform compatibility significantly reduces the time and effort required to develop applications for different operating systems.\n\n### 2\\. Reusability\n\nThe pre-built components in React Native UI Libraries can be easily reused in other projects, saving developers time and effort. This reusability feature allows developers to work more efficiently and effectively by leveraging existing components for various app projects.\n\n### 3\\. Customization\n\nThe components in React Native UI Libraries are highly customizable, allowing developers to change their appearance and behavior to meet the specific needs of their projects. Customization options such as color schemes, fonts, and animation styles enable developers to create unique and visually appealing applications tailored to their target audience.\n\n### 4\\. Improved UX\n\nReact Native UI Components provide a consistent look and feel across different platforms, making the apps more user-friendly and visually appealing. Consistency in design elements and user interactions enhances the overall user experience of mobile applications, resulting in increased user engagement and satisfaction.\n\n### 5\\. Improved Coding Experience\n\nUsing community-developed UI components within a React Native framework helps onboard experienced contributions from a wide sphere into your app project. The collaboration and contribution from a diverse community of developers enhance the coding experience and quality of the applications, resulting in robust and feature-rich mobile apps.\n\n## Installing A React Native Library\n\n![Best React Native UI Library](https://cdn.magicui.design/assets/avbqbhui67s.jpg)\n\nTo install a React Native UI library, you need to navigate to your project directory and run the installation command. For example, if you want to install 'react-native-webview,' you would use the npm install command:\n\n    ```npm install react-native-webview```\n\nOnce installed, you may need to link the library to your native projects.\n\n### Dependency Management for iOS Projects\n\nFor iOS, React Native uses CocoaPods to manage dependencies. To link a library, run pod install in the iOS directory of your project or use the npx pod-install shortcut. Rebuild the app binary to start using the new library with npm run iOS.\n\n### Managing Dependencies in Android\n\nFor Android projects, React Native uses Gradle to manage dependencies. After installing a [library with native dependencies](https://reactnative.dev/docs/libraries#:~:text=You%20can%20install%20a%20particular,netinfo%40%5E2.0.0%20), you must re-build the app binary using npm run android.\n\nBy following these steps, you can easily install React Native UI libraries to enhance the functionality and design of your applications.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n"
  },
  {
    "path": "apps/www/content/blog/best-react-ui-framework.mdx",
    "content": "---\ntitle: \"How To Select The Best React UI Framework For Your Project\"\ndescription: \"Choosing the best React UI framework is essential for the success of your project. Let us help you navigate the options and find the best one for your needs.\"\nimage: https://cdn.magicui.design/assets/bd08f1b7-dedc-4fd7-aea6-57eb3f1da77d.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-18\"\nfeatured: false\n---\n\nAre you looking for the ideal React UI Framework for your project? Picture this: you're lost in the wild world of [UI Frameworks](https://magicui.design/blog/ui-frameworks), searching for the best option to suit your needs and the project you're working on. The endless options are overwhelming and intriguing, making the journey to find the optimal framework like an exciting treasure hunt. But what if there was a guide to point you in the right direction, to help you sift through the vast expanse of React UI Frameworks and find the perfect match for your needs?\n\nMeet Magic UI. This [React component library](https://magicui.design/) could be your knight in shining armor, aiding you in finding the Best React UI Framework. It doesn't just stop there. Magic UI simplifies the process and helps you compare React UI frameworks, enabling you to make an informed decision confidently. Let Magic UI elevate your UI design game.\n\n## What Is A React UI Framework?\n\n![Best React UI Framework](https://images.unsplash.com/photo-1531547629769-f2e504fe4521?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx3b25kZXJpbmclMjBvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTkwNjEwMTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact is a robust library that developers favor when creating user interfaces. React is a fluffy, comfortable couch in plain English that you can modify to fit like a glove. The React UI frameworks, on the other hand, can be thought of as stylish slipcovers to drape over this couch. This slipcover isn't just for show; it adds value by giving your couch a fresh look while adding some functionality.\n\n### React UI Frameworks - The Basics\n\nReact is a library that allows developers to build user interfaces by breaking them down into individual components. This is incredibly advantageous because it enables developers to build dynamic and interactive applications using these Lego-like, reusable components. By creating these components, which are called React components, you can display dynamic data, handle user input, and respond to user events.\n\n### What Exactly Are React UI Frameworks?\n\nThese are collections of pre-built React-based components you can use to create user interfaces quickly. These pre-built components enable developers to create user interfaces for their applications rapidly. These components can be categorized into small, reusable elements, such as navigational menus, tables, buttons, forms, etc.\n\n### Why Would You Want to Use a React UI Framework?\n\nReact UI frameworks can streamline the UI development process, assisting developers in creating user interfaces with a visually pleasing aesthetic. These frameworks provide a consistent look and feel and offer design standards to streamline UI development.\n\n### What Benefits Can React UI Frameworks Offer?\n\nReact UI frameworks can significantly reduce development time by providing pre-built components for user interfaces. By using these components, developers can reduce development effort and time. Also, these frameworks provide a consistent look and feel to the user interface, making it visually appealing.\n\n### What Are Some of the Best React UI Frameworks Out There?\n\nSome of the most popular React UI frameworks include Material-UI, Ant Design, Semantic UI, Blueprint, Chakra UI, and Evergreen. These frameworks provide a wide range of pre-built components for developers to use in their applications.\n\n### How Can You Get Started With a React UI Framework?\n\nTo start with a [React UI framework](https://react.dev/), visit the respective framework's website and read the documentation. The documentation provides a step-by-step guide on installing and using the framework in your project. These guides often include code snippets showing how to use the pre-built components provided by the framework.\n\n## Selecting The Best React UI Framework For Your Project\n\n![Best React UI Framework](https://images.unsplash.com/photo-1452457750107-cd084dce177d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxjaG9vc2luZyUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcxOTA2MTAwOHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen selecting the best React framework for your project, it is essential to consider various factors.\n\nHere are some key factors to keep in mind:\n\n### Accessibility and Usability\n\nAccessibility and usability are crucial considerations when choosing a React framework. Ensure that the framework you choose provides efficient and user-friendly features that improve the accessibility of your product.\n\n### Performance and Speed\n\nThe performance and speed of a React framework can significantly impact your project's success. Selecting a fast and efficient framework is crucial to ensure that your application runs smoothly and responds quickly to user interactions.\n\n### Customization and Flexibility\n\nCustomization and flexibility are essential factors to consider when choosing a React framework. Ensure that the framework allows you to customize the user interface according to your requirements and provides the flexibility to adapt to changing needs.\n\n### Community Support and Documentation\n\nCommunity support and documentation are essential factors when choosing a React framework. Ensure that the framework you choose has an active community that offers support and resources to help you navigate its complexities.\n\n### Integrations and Compatibility\n\nIntegrations and compatibility are crucial factors to consider when selecting a React framework. Ensure your chosen framework integrates well with other tools and platforms and is compatible with your existing technology stack.\n\n### Scalability and Future-Proofing\n\nScalability and future-proofing are essential considerations when choosing a React framework. Ensure that your chosen framework can scale with your business and technology needs and remain relevant and supported.\n\n### Choosing the Right React UI Framework\n\nThere is no doubt that React is one of the most preferred front-end libraries by web developers. Choosing the best UI framework for React is crucial to your development journey. Ensure that you clearly understand the client’s requirements, your team’s skillset, and the objectives and the architecture of the app you’re building before making a decision.\n\nHere are some general guidelines that may help you decide:\n\n- If you want a full-featured and easy-to-use React framework that supports SSR and SSG, choose Next.js.\n- If you want a fast and modern React framework that focuses on SSG, choose Gatsby.\n- If you want a simple and quick way to start a React project without much hassle, choose Create React App.\n\n### Magic UI Complementing Your Framework Choice\n\n[Magic UI](https://magicui.design/) complements the effectiveness of your chosen React framework by providing additional features and components that enhance the user experience. By incorporating Magic UI into your project, you can take advantage of additional functionalities that may not be available in your primary React library.\n\n### Magic UI and Your Design Aesthetic\n\nMagic UI adds a touch of magic to your chosen React framework by providing additional components and features that enhance your project's design aesthetic. By incorporating Magic UI into your project, you can create dynamic and visually appealing user interfaces that align with your project's design and functionality requirements.\n\n### Enhancing User Experience with Magic UI\n\n[Magic UI](https://magicui.design/) enhances the user experience of your React project by providing additional features and components that improve usability, accessibility, and overall user satisfaction. By incorporating Magic UI into your project, you can create a seamless user experience that keeps users engaged and satisfied.\n\n### Boosting Salience with Magic UI\n\nBy using Magic UI in conjunction with your chosen React framework, you can boost salience and enhance the effectiveness of your user interface. Magic UI provides additional features and components that maximize the benefits of using any React component framework, helping you create more dynamic and visually appealing user interfaces that align with your project's design and functionality requirements.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## Top 9 React UI Frameworks Worth Considering For Your Project\n\n![Best React UI Framework](https://images.unsplash.com/flagged/photo-1573162915884-74c45ba4cfe6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3aW5kb3dzJTIwbGFwdG9wfGVufDB8fHx8MTcxOTA2MDk4NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Chakra UI\n\nChakra UI is an accessible framework prioritizing developer productivity and user experience. This framework empowers developers to create beautiful and inclusive interfaces with minimal effort. Chakra UI offers a unique set of accessible React JS UI components, supports developing responsive designs out of the box, and allows users to develop new components quickly.\n\n### 3\\. Fluent UI\n\nDeveloped by Microsoft, fluent UI was initially known as the Fabric React UI Library. This React UI framework contains several components like inputs and notifications, making it easy to integrate into React applications. The components and graphics of Fluent UI resemble MS Office products, with default settings generally suitable for most projects. It provides a consistent user experience, a straightforward web development approach, and cross-platform support.\n\n### 4\\. Evergreen\n\nEvergreen, designed by Segment, provides users with customizable 30+ components. This React framework focuses on simplicity, consistency, and performance, allowing users to build modern web applications easily. Evergreen offers a streamlined approach to web development, with default and classic themes for developing CSS components.\n\n### 5\\. Material-UI\n\nMaterial-UI is a React UI framework that follows Google’s Material Design principles. It offers a range of customizable components like buttons, cards, sliders, and more. Material-UI components can be styled according to the Material Design guidelines, enhancing application speed. The powerful theming framework and responsive components make Material-UI a standout choice for creating sleek and intuitive interfaces.\n\n### 6\\. Ant Design\n\nAnt Design, developed by Alibaba Group, consists of 50 components inspired by the company’s design language. It provides everything needed to develop professional applications quickly, with a focus on design systems and accessibility features. Ant Design offers multi-language support, catering to a global audience.\n\n### 7\\. Semantic UI React\n\nSemantic UI React integrates Semantic UI with React, offering a semantic and intuitive approach to UI development. It provides a range of React components with unique functionalities and customization options. The React UI components are accessible and feature cross-browser compatibility.\n\n### 8\\. Grommet\n\nHPE developed Grommet as a CSS framework for React, focusing on building responsive and intuitive mobile websites. Grommet offers extensive theming, a design-focused approach, and responsive components. It provides support for disabled users, modularity, and flexibility in design.\n\n### 9\\. Fluent UI\n\nDeveloped by Microsoft, Fluent UI offers pre-built components like inputs and notifications for application development. The components are customizable and provide a straightforward web development approach. Fluent UI supports desktop, Android, and iOS devices, offering adaptive styling and a modern user experience.\n\n## Benefits Of Using React UI Frameworks\n\n![Best React UI Framework](https://images.unsplash.com/photo-1628348068343-c6a848d2b6dd?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8Y2hhcnR8ZW58MHx8fHwxNzE5MDYwMzQ4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Ease of Use\n\nDue to their component-based nature, React UI frameworks are easy to use. They help break down complex user interfaces into smaller, reusable components, saving time and reducing errors during development. This feature allows amateur developers to focus on learning essential elements rather than building them from the ground up, enhancing the learning curve and boosting productivity.\n\n### Strong Community Support\n\nReact has a large, active community that provides tutorials, documentation, and open-source libraries to help developers learn the framework. By joining this community, developers can collaborate with other React enthusiasts, enhancing their skills and creating valuable connections in the industry.\n\n### Top-notch Components\n\nReact UI frameworks provide well-crafted, reliable, and easy-to-use components. These components enable developers to efficiently design seamless, aesthetically pleasing user experiences. Using pre-built components, developers can focus on customizing their applications and improving user experience without worrying about bugs or inconsistencies.\n\n### Speedy Development Process\n\nWith React UI frameworks, developers can speed up the development process by leveraging the rich ecosystem of libraries, components, and design elements. This allows them to focus on building functional, high-quality applications that meet user needs and preferences. The strong community support also contributes to expedited development timelines, as developers can easily find solutions to common challenges.\n\n### Cross-platform Compatibility\n\nReact UI frameworks are designed to be cross-platform compatible, ensuring that applications run smoothly on all modern browsers and devices. This feature eliminates the need to write [custom CSS](https://css-tricks.com/what-are-the-benefits-of-using-a-css-framework/) for different platforms, saving time and effort during development. By using a React UI framework, developers can ensure that their applications are accessible to all users, regardless of the device or browser they use.\n\n## How Does React’s Virtual DOM Improve Performance?\n\n![Best React UI Framework](https://images.unsplash.com/photo-1667372335879-9b5c551232e5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxrdWJlcm5ldGVzfGVufDB8fHx8MTcxOTA2MDk0N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact’s virtual DOM improves performance by reducing the amount of direct manipulation of the actual DOM. When the state of a React application changes, the virtual DOM will first update a virtual representation of the UI. Then React will compare the virtual DOM with the actual DOM and determine the minimal changes that need to be made to the actual DOM to bring it in line with the virtual DOM.\n\n### Virtual DOM and Batching\n\nThis approach is more efficient than manipulating the actual DOM directly because it allows React to minimize the number of changes that need to be made to the actual DOM. This minimization of changes results in fewer costly DOM operations and, as a result, improved overall performance.\n\nReact also batches multiple updates together to enhance performance further. This means that React will wait until all state updates are done before it updates the real DOM, which will avoid unnecessary re-rendering and computations.\n\n### MagicUI: A Free React UI Library for Building Stunning UIs\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## How Does React Differ From Other Popular JavaScript Libraries For Building UIs?\n\n![Best React UI Framework](https://images.unsplash.com/photo-1505238680356-667803448bb6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxqYXZhc2NyaXB0fGVufDB8fHx8MTcxOTA2MDkyM3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact is a JavaScript library that focuses on building reusable UI components and efficiently managing application states. By creating components that can be reused across different parts of an application, React promotes a modular and scalable approach to designing user interfaces.\n\nThis reusability helps developers save time and maintain consistency in design throughout an application. React uses a virtual DOM to improve performance by minimizing direct manipulation of the actual DOM. This approach allows React to update only the changed parts of the DOM, resulting in faster rendering and improved user experience.\n\n### Angular: Full-Featured Framework with Built-In Solutions\n\nAngular is a full-featured framework that provides built-in solutions for many common features required in single-page applications. These features include routing, dependency injection, and form handling.\n\nBy offering a comprehensive set of tools and functionalities out of the box, Angular simplifies the development process, making it easier for developers to build complex applications. Angular also follows a more opinionated approach to structuring applications, which can help maintain consistency across projects. This opinionated nature can sometimes lead to a steeper learning curve for developers who are new to the framework.\n\n### Vue.js: Lightweight Framework with Easy Learning Curve\n\nVue.js is a lightweight JavaScript framework that, like React, focuses on building reusable UI components and provides a virtual DOM for improved performance. Vue.js also offers built-in solutions for common features like routing, making it a versatile choice for building single-page applications.\n\nOne of Vue.js's main advantages is its simplicity and ease of learning. The framework's straightforward API is easy to understand, making it an excellent choice for developers new to front-end development. Despite being less widely used than React and Angular, Vue.js has gained popularity for its simplicity and flexibility.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed exclusively for design engineers. With over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion, MagicUI offers an impressive collection of visually appealing and interactive elements designed to be easily integrated into web applications. The primary aim of MagicUI is to allow the creation of stunning user interfaces with minimal effort.\n\n### A Focus on Design and Animation\n\n[MagicUI](https://magicui.design/) components are highly customizable, providing seamless adaptation to suit specific branding and design requirements. By focusing on animation and employing a design-centric approach, MagicUI bridges the gap between design and development, enabling the creation of captivating digital experiences.\n\n### MagicUI Pro: A Premium Option\n\nMagicUI Pro is offered as an upgrade to the free component library. With MagicUI Pro, users can save countless hours using beautiful landing pages and website templates to convert visitors into customers. The wide range of features in the Pro version allows for maximum creativity and efficiency in UI design.\n\n### Try MagicUI Today!\n\nMagicUI is a fantastic option for enhancing React projects with stunning visuals and seamless animations. Visit [https://magicui.design/docs](https://magicui.design/docs) to explore the free [React component library](https://magicui.design/) and take your UI design to the next level.\n"
  },
  {
    "path": "apps/www/content/blog/best-saas-landing-pages.mdx",
    "content": "---\ntitle: \"25 Best SaaS Landing Pages & Why They Boost Conversions\"\ndescription: \"Discover the best SaaS landing pages that are proven to boost conversions and drive success for businesses. Find out why they work so well.\"\nimage: https://cdn.magicui.design/assets/6077508e-e187-4512-9b31-a91fd61a232d.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nCrafting compelling landing pages for software as a service (SaaS) products is both an art and a science. It's about grabbing the attention of potential customers and guiding them through a journey that ends with a conversion. And the good news is that you don't have to reinvent the wheel. The best SaaS landing pages serve as valuable templates to draw inspiration from and adapt for your products.\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup), can provide a valuable starting point. This tool is instrumental in helping you achieve your objectives of looking for [landing page examples](https://magicui.design/blog/landing-page-examples) and gathering inspiration for designing your SaaS landing pages.\n\n## What Is A SaaS Landing Page?\n\n![Best SaaS Landing Pages](https://cdn.magicui.design/assets/q8xfban5tn.jpg)\n\nA SaaS landing page is a sales page aimed at cold-selling your product or service to your website visitors. It is used in the products and services marketing strategy where users are asked for an immediate sale without any prior purchaser contact.\n\n### Purpose of a SaaS Landing Page\n\nA SaaS landing page is a page on your website that an interested visitor can land on to find more information about your product. It’s designed to promote or sell your software online. It doesn't necessarily have to be related to the actual application, but it should provide information about how it works and what benefits it can provide.\n\n### Additional Functions of a SaaS Landing Page\n\nThese pages can also be used to announce new features, promote events, generate leads, or capture emails for a mailing list. Elements are commonly found on landing pages as well, such as:\n\n- [Demo videos](https://blog.hubspot.com/marketing/demo-video)\n- Interface screenshots\n- Chatbots\n\n### Importance of Understanding Your Audience\n\nUnderstanding your audience is the most important factor in creating a good SaaS landing page.\n\n- What are their needs?\n- What will motivate them to purchase?\n- What do you want the result of the page to be?\n\nAfter you've answered those questions, you can create an effective SaaS landing page that informs potential customers and encourages them to convert into leads, contacts, or even customers.\n\n### Conversion Rates for SaaS Landing Pages\n\nThe average [conversion rate of a landing page](https://popupsmart.com/blog/what-is-a-good-landing-page-conversion-rate) is around 2.35%, so you will need all the techniques, inspiration, and best practices to ensure your landing page's conversion rate meets or exceeds the average.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## 6 Key Elements Of A High Converting SaaS Landing Page\n\n![Best SaaS Landing Pages](https://cdn.magicui.design/assets/jm0xicf3b1a.jpg)\n\n### 1\\. Hero Section\n\nThe hero section is the first thing users see when they visit a SaaS landing page. It's crucial to capture attention immediately and provide essential information to keep the visitor manageable.\n\n### 2\\. Features/Benefits\n\nThis section is where you highlight the unique selling points of your SaaS product. A detailed comparison table showing features for each subscription tier can be highly effective for potential customers to understand the value they get for the price.\n\n### 3\\. Social Proof\n\nAdding social proof to your landing page can significantly boost conversions. Build trust with potential customers who are considering a free trial with the help of:\n\n- Testimonials\n- Customer logos\n- Star ratings\n- Case studies\n\n### 4\\. Contact Form\n\nIncluding a contact form on your landing page can help capture leads who have unanswered questions. Placing the form lower on the page can encourage users still on the fence to reach out for more information.\n\n### 5\\. Demo Video\n\nProviding a product demo video can be an effective way to showcase your SaaS product's capabilities. This can help users better understand how your product can solve their pain points and lead to higher conversion rates.\n\n### 6\\. Call-To-Action (CTA)\n\nWhile [multiple CTAs](https://www.telerik.com/blogs/how-many-ctas-are-too-many) can create distractions and reduce conversions, using FOMO elements like a countdown timer can encourage users to click the CTA button. Keep your CTA clear and compelling to drive users to take action and sign up for a free trial.\n\n### Elevate Your Web Design with Animated Components\n\nMagicUI is a free and open-source UI library designed for design engineers, offering over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nBoost your website design with visually appealing and interactive elements that can be easily integrated into web applications for stunning user interfaces. MagicUI bridges the gap between design and development to empower you to create captivating digital experiences.\n\nUse MagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to save time and create a beautiful, high-converting landing page.\n\n## 25 Best SaaS Landing Pages & The Reasons Why They Convert\n\n![Best SaaS Landing Pages](https://cdn.magicui.design/assets/erp58wta7zl.jpg)\n\n### 1\\. [langfuse.com](http://langfuse.com)\n\n[Langfuse](https://magicui.design/showcase/langfuse) is a tech startup designed to enhance observability for AI applications, particularly those using large language models (LLMs). It integrates seamlessly with existing AI models to provide detailed insights into their performance, helping developers understand and improve their AI systems. Langfuse builds its landing page using [Magic UI](https://pro.magicui.design/docs/templates/startup). Using animated components offered by Magic UI makes the landing page engaging, and its clean design maintains a 1:1 attention ratio.\n\n### 2\\. Cognosys\n\n[Cognosys](https://magicui.design/showcase/cognosys) is a platform that leverages advanced artificial intelligence to enhance business operations and decision-making. It integrates various AI capabilities to provide comprehensive solutions for:\n\n- Data analysis\n- Automation\n- Predictive insights\n\nThe platform is designed to help organizations optimize their workflows, improve efficiency, and gain valuable insights from their data. Their landing page leverages Magic UI's capabilities to deliver interactive and customizable interfaces easily. The page is incredibly dynamic. Lots of animations and effects give the impression of action.\n\n### 3\\. ClickUp\n\nClickUp is in direct competition with [Monday.com](http://Monday.com) as a project management software, which is why their landing page also highlights how its features stand out against Monday’s offerings. This is done through a neatly organized comparison table that’s both informative and easy to navigate.\n\nSimple imagery and very little text crowd the page, while customer testimonials and award badges boost their credibility. A standout feature is the practical CTA button, which offers a seamless transition for users to import their [Monday.com](http://Monday.com) account to ClickUp.\n\n### 4\\. Zapier\n\nZapier is an application that allows workflow automation and makes various integrations possible. They’ve strategically created a landing page for each specific integration so that users can find the exact information they need. This landing page is particular to the Zapier integration for Keap, a platform for managing customer relationships.\n\nNaturally, anyone searching for Keap integrations will come across this landing page. It effectively showcases how Zapier enhances Keap’s functionality and details the range of integrations available.\n\nThe page features trust badges from some of their major partners and call-to-action buttons for free sign-ups via your:\n\n- Google\n- Facebook\n- Microsoft account\n\nThe content on the page is thoughtfully crafted with the customer’s pain points in mind and explains how each integration can be used and automated.\n\n### 5\\. SurveyMonkey\n\nSurveyMonkey is a tool designed for conducting and gathering survey results from a target audience. Unlike many landing pages, this particular page includes dropdown menus for additional pages in the header.\n\n- It keeps the content on the page focused so the reader doesn’t get distracted.\n- It jumps straight into the pricing plan options and a form to contact sales, efficiently guiding visitors toward making a decision.\n- The page comprehensively details what you can do with SurveyMonkey tools and the various scenarios and situations you could use them for.\n\n### 6\\. Leadpages\n\nLeadpages is a small website and landing page builder. While its main website has a lot of information, this landing page provides a more streamlined approach.\n\n- The main selling point is that you can build a landing page in 30 minutes or less using a combination of templates and AI technology.\n- They include a short video explaining the product and brief written content explaining what it enables you to do.\n- They cover how Leadpages can resolve your problems and increase leads and sales. There are a couple of customer testimonials and a good distribution of CTA buttons.\n\n### 7\\. PandaDoc\n\nPandaDoc is a corporate document management system streamlines organizing, sending, and tracking documents for e-signatures.\n\n- This landing page is specifically built for the purpose of requesting a demo.\n- It includes a demo request form, a short explanation of what you can do with PandaDoc, and some trust badges.\n- It is plain and simple but very effective for users at a point in the sales funnel where they’re ready to commit just a little bit more.\n\n### 8\\. Wix\n\nWix is a well-known drag-and-drop website builder that gives almost infinite possibilities for website design. Of course, there’s some fierce competition in the world of no-code website builders, so the Wix team has created this landing page to help boost conversions.\n\n- You first see a bold CTA to enter your email address and get started.\n- Some sleek information blocks outline how Wix can help you achieve your goals.\n- The landing page is very minimalistic, with only a few images and CTA buttons. It’s free from excess dropdown menus or unnecessary buttons.\n\n### 9\\. Typeform\n\nTypeform, as the name might suggest, was originally a form builder and has now sidestepped to provide the functionality needed for a landing page builder.\n\n- This landing page gives you an interactive example that shows visitors how their forms work without leaving the page.\n- They clearly explain how to build high-converting landing pages, including custom forms.\n- Customer testimonials also foster a sense of trust in the product.\n- The landing page is clean and fuss-free.\n\n### 10\\. Influencity\n\nInfluencity is a platform where marketers can connect with industry-relevant influencers.\n\n- Its landing page is built to encourage leads to sign up for a free trial.\n- The page runs through general features that help you do what you need to and find the best influencers for your brand.\n- It has one customer testimonial, social proof badges, and social media links so you can follow its account.\n\n### 11\\. Hurree\n\nHurree promotes its product as a pinboard for website analytics. It’s essentially a custom dashboard builder that helps you display and analyze a wide range of business metrics.\n\n- This Hurree landing page has a clear purpose to encourage visitors to enter their email addresses and create a free account.\n- On the left-hand side of the page, the benefits of using Hurree dashboards are detailed in bullet points, and customer reviews are mentioned, but otherwise, that’s it.\n- You can’t scroll down for more information; this one is short and sweet.\n\n### 12\\. Asana\n\nProject management software Asana’s landing page design utilizes space and a simple color palette to make its hero section stand out without being too distracted.\n\n- This makes the white CTA button all the more evident to site visitors.\n- The page also features product demos that showcase what the product will actually look like from a user’s perspective.\n- You’ll notice that every main feature is succinctly introduced throughout the full landing page with internal links.\n\n### 13\\. WeTransfer\n\nThe Netherlands-based file transfer solution WeTransfer uses straightforward microcopy and an easily readable font to hook site visitors in immediately.\n\n- Clicking on the black CTA button takes you straight to the pricing page so prospects can find the right plan for them.\n- The landing page also uses vibrant visuals and contrasting colors.\n- These creative liberties make the full landing page feel friendlier, inspiring, and more likely to evoke positive emotions in site visitors.\n\n### 14\\. Bitly\n\nUnlike the copy-light landing page of WeTransfer, Bitly’s full landing page has more text in it.\n\n- It offsets the text using white space and illustrations to ensure that the full landing page doesn’t overwhelm site visitors.\n- The primary CTA uses a bright color that contrasts with the other landing page elements.\n- It’s also more prominently designed than secondary CTAs to ensure that most attention is drawn toward the primary CTA.\n- You’ll notice that the company name and CTA use colors that aren’t prominent on the page.\n- Scrolling down the full landing page will lead you to client brand logos, a great way to incorporate social proof into your landing page.\n\n### 15\\. HubSpot\n\nWhile HubSpot’s design style is a bit denser than some of the other examples on this list, it keeps its CTAs consistent throughout the full landing page.\n\n- The primary CTA is, of course, highlighted in orange to stand out to prospects.\n- The landing page also contains plenty of support resources, like FAQ sections and a chatbot, to help interested visitors learn more about the product.\n- Regarding social proof, the full landing page shows HubSpot’s awards and testimonial videos.\n\n### 16\\. Miro\n\nThe first thing you’ll notice when you land on Miro’s landing page is the interplay between the black-and-white text and the yellow thumbnail to the side. This makes the catchy headline stand out while drawing attention to the animated product demo.\n\n- Lower down the landing page, you’ll see client testimonials and clever use of color to separate page sections.\n- The CTA button uses blue (a cool color) to contrast against the warm yellow color in the video thumbnail.\n\n### 17\\. Loom\n\nTo reflect Loom’s brand identity as a screen recording software, its landing page heavily focuses on multimedia elements — particularly videos.\n\n- The landing page focuses solely on the product's main features to keep the value proposition as simple as possible.\n- The landing page also shows screenshots for web and mobile screens since their solution lets you embed Loom videos on multiple devices.\n- The full landing page does a good job of communicating versatility without going too deep into detail.\n\n### 18\\. Wistia\n\n- Wistia follows best practices by using a single CTA\n- Bright backgrounds to contrast buttons\n- Interlinking to relevant product integrations\n- The landing page also features a chatbot that can instantly answer common questions\n\n### 19\\. Figma\n\nFigma’s enterprise software landing page is an excellent example of personalization.\n\n- The landing page's CTAs, sections, and overall tone of voice reflect the target audience, which in this case is enterprise customers.\n- To keep the full landing page consistent with Figma’s brand palette and visual style, it features many sharp and vibrant elements against a white background.\n- You’ll also find more in-depth resources than typical B2C SaaS landing page design would call for.\n\nEnterprise SaaS marketing is all about overcoming the longer sales cycle since these types of users don’t make purchase decisions on a whim. As such, Figma includes various resources, including an economic report and customer success stories.\n\n### 20\\. Canva\n\nSaaS landing page design must adapt depending on which product, tool, or feature is being highlighted.\n\n- Canva’s logo maker landing page uses simple text and a CTA button with a darker shade of violet to prompt users to start creating.\n- The landing page also makes the task feel less daunting for new users by showing screenshots of the interface and telling them that they can get their logos in minutes.\n- It might not be the best SaaS landing page if you’re trying to advertise a full-suite platform, but when covering a single tool, Canva hits the nail right on the head.\n\n### 21\\. Zoom\n\nZoom is video conferencing software that prides itself on intuitive functionality. When creating landing pages, It follows the same tenet of simplicity.\n\n- Zoom has distinct locations for each industry they’re targeting on its website.\n- Taking this segmented approach ensures that the web copy always feels relevant to the person reading it.\n- The landing page also has personalized videos for every segment, statistics, and benefits targeted to each user’s pain points.\n- There are also customer success stories for every industry that Zoom targets to boost conversions.\n\n### 22\\. [Monday.com](http://Monday.com)\n\n[Monday.com](http://Monday.com) is project management software that offers robust solutions for task management, HR, marketing, and general business operations. Its landing page has many of the critical features that make an effective SaaS landing page.\n\n- It has an attention-grabbing headline that immediately captures visitor interest and a simple, uncluttered design.\n- The page also incorporates social proof badges and testimonials, but the best part is the simple and interactive comparison table that clearly outlines the differences between [Monday.com](http://Monday.com) and other similar products.\n\nThis landing page effectively answers all the questions those interested in a project management SaaS want to know. CTA buttons are strategically located throughout the page to move the visitor along the sales funnel.\n\n### 23\\. Dropbox\n\nNormally, we wouldn't advise a long-scrolling landing page, but Dropbox has hit the nail on the head by combining its home page with a veritable LP. This won't work for a wide variety of websites, as there are generally too many opportunities for distraction when so much information is contained on one page. Still, it works exceptionally well here for a few reasons.\n\n- Given that the concept behind the offering is simple, it's not hard to explain how it's helpful in just a few pages and images, and it becomes more compelling the more you read their succinct copy blocks.\n- All signs point to sign-ups or sales.\n- Even the CTAs that don't link to a form link to other information, which, in turn, also link to the opportunity to sign up or buy.\n- Everything funnels down the same way, so little gets in the way.\n\n### 24\\. Marketo\n\nWhile other landing page spreads need multiple images to showcase their power, Marketo's does not. It's important to point out that it's not that we find this LP perfect, but more so that they're aptly leveraging an important element beyond the offering itself: support.\n\nWhether it matters if users are familiar with the Adobe family of products is still up for debate.\n\n- Whoever visits this landing page will know they're getting a 2-in-1 package with their sign-up.\n- They will get an easily digestible 4-minute intro demo and access to an entire video library.\n- While it may take time and direct hands-on support from an expert, most folks want an easy way to learn a potential solution at their leisure, and not having to commit to a meeting might be what best suits their need.\n\n### 25.  Domo\n\nIf there's one thing Domo does exceptionally well with this landing page, it's certainly a focus on the customer. Not only do they explain that their free trial incorporates the user's data from the get-go instead of a hokey, generic demo that showcases all of its -neatest- or most helpful features, but Domo even outlines precisely what you'll be able to walk away with after your 60-minute onboarding session.\n\nThe language on the page speaks directly to the visitor, using a lot of 'you' perspective and, in addition, providing what you'll be able to accomplish in a short amount of time. It's not just a great way to exemplify their proof of concept but also frame their free trial and offering. They even encourage continued exploration afterward to ensure trial users get first-hand experience figuring out how and why Domo can solve many of their current pain points.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Do You Need A Landing Page For Your SaaS Product?\n\n![Best SaaS Landing Pages](https://cdn.magicui.design/assets/19uc82cco85.jpg)\n\nHaving a dedicated landing page for your SaaS product can significantly impact your conversion rates. Here are some benefits of having a dedicated landing page for a SaaS product:\n\n### Greater Control Over the Conversion Process\n\nA landing page is another website, meaning you have much greater control over the [conversion process](https://www.sciencedirect.com/topics/engineering/conversion-process). This control allows you to tailor the content, design, and user experience to optimize conversions.\n\n### Optimized Design\n\nWith a dedicated landing page, you can set up a design template for your page, which presents visitors with all the key information in an organized manner. This optimized design can help increase engagement and guide visitors toward the desired action.\n\n### Focused on Conversions\n\nLanding pages allow you to create a seamless path for visitors interested in buying your product. They are designed specifically for this purpose and are focused solely on making conversions. This focus on conversions can lead to higher conversion rates than directing traffic to a general website.\n\n## SaaS Landing Page Best Practices\n\n![Best SaaS Landing Pages](https://cdn.magicui.design/assets/apturpxxpw5.jpg)\n\n### Keep it Simple\n\nA cluttered landing page can overwhelm visitors, so keeping your SaaS landing page design straightforward and easy to navigate is vital. A minimalist design approach, with a clear value proposition and concise product features, will keep potential customers engaged. Leveraging a prominent SaaS landing page builder and template can reduce the stress of creating a design from scratch.\n\n### Use Strong Headlines\n\n[Strong headlines](https://training.npr.org/2015/10/25/the-checklist-for-writing-good-headlines/) are essential for capturing a visitor's attention and drawing them into reading the rest of the landing page. By focusing on your product's benefits and delivering them in a concise and easily digestible manner, you'll increase the chances of conversion.\n\n### Highlight Benefits\n\nRather than solely listing product features, emphasize how your solution can [address potential customers' pain points](https://blog.hubspot.com/sales/uncover-business-pain) and improve their lives. Demonstrating the value of your product in solving specific problems will resonate more with prospects.\n\n### Use High-Quality Visuals\n\nOpt for high-quality images or videos that accurately represent your brand when showcasing your product's benefits and features. Generic stock photos can be a turn-off, so use visuals that align with your product and brand identity.\n\n### Make it Mobile-friendly\n\nIt is crucial to ensure that your landing page is optimized for mobile viewing. Easy-to-read text and tap-friendly buttons are essential for a seamless mobile user experience.\n\n### Reduce Friction\n\nEliminating barriers to conversion, like confusing navigation or complex forms, is key to driving more sign-ups or sales. Make sure visitors can easily understand your product and its value proposition and how to take the next step.\n\n### Use A/B Testing\n\n[A/B testing](https://www.kameleoon.com/ab-testing) is a powerful tool for optimizing your landing pages. Experiment with headlines, images, and calls to action to determine what resonates best with your audience and drives more conversions.\n\n### Continuously Optimize\n\nOptimizing your landing pages shouldn't stop after launch. Monitor your SaaS marketing metrics regularly and use insights to make data-driven improvements to your landing page over time.\n\n### Use a Landing Page Builder/Template\n\nLeveraging a landing page builder with clean, customizable templates can simplify your design process. [Magic UI](https://magicui.design/), for example, provides a collection of visually appealing and interactive components that can be easily integrated into web applications, helping you create stunning landing pages with minimal effort.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed to provide design engineers with a vast array of visually appealing and interactive components for web applications. These components offer over 20 animated elements that can be easily integrated into projects and are built using:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThis library aims to bridge the gap between design and development by emphasizing animation and a design-centric approach. The highly customizable nature of [MagicUI](https://magicui.design/) components allows for seamless adaptation to meet branding and design requirements.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n"
  },
  {
    "path": "apps/www/content/blog/best-web-design-tools.mdx",
    "content": "---\ntitle: \"15 of The Best Web Design Tools to Take Your Website to The Next Level\"\ndescription: \"Discover 15 best web design tools to create stunning, high-performing websites. Explore top solutions for design and optimization.\"\nimage: https://cdn.magicui.design/assets/737b3a61-e8ac-4f11-b566-3e1d1672e00b.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nIf you have a vision for your website, you can see it. You have a good grasp of [web design best practices](https://magicui.design/blog/web-design-best-practices) and are ready to create something that suits your needs and achieves your goals. But when you open your design software, you suddenly feel overwhelmed.\n\nThere are so many tools and features to choose from, and you need help figuring out where to start. If this scenario sounds familiar, you're in the right place. In this guide, we'll introduce you to 15 of the best web design tools to help you take your website to the next level.\n\nOne of those tools is MagicUI's startup landing page template. This pre-designed template can help you create your website quickly and efficiently so you can get back to business quickly.\n\n## What are Web Design Tools?\n\n![Best Web Design Tools](https://images.unsplash.com/photo-1635405050330-b0824eb1bf26?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHx3ZWIlMjBkZXNpZ258ZW58MHx8fHwxNzI0Mzg0NzYzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Key Categories and Their Functions\n\n#### Design Tools\n\n- Wireframing and Prototyping: These tools help you visualize the layout and structure of your website before diving into coding. They allow you to create low-fidelity wireframes and high-fidelity prototypes, providing a tangible representation of your design concepts.\n- Graphic Design: For those with a keen eye for aesthetics, graphic design tools enable you to create stunning visuals, including logos, icons, and illustrations, that enhance the overall user experience.\n\n#### Website Builders\n\n- Drag-and-Drop Interfaces: These user-friendly platforms eliminate the need for coding, making website creation accessible to everyone. To assemble your site, you can simply drag and drop elements like text, images, and buttons.\n- Templated Designs: Website builders often offer pre-designed templates to kickstart your project. These templates provide a solid foundation, saving you time and effort.\n\n#### Development Tools\n\n- Code Editors: For developers who prefer to write code manually, code editors provide a structured environment with syntax highlighting, autocompletion, and debugging capabilities.\n- Version Control: Tools like Git help you manage changes to your codebase, making collaboration easier and ensuring you can revert to previous versions if needed.\n\n#### Content Management Systems (CMS)\n\n- Managing Website Content: CMS platforms like WordPress, Joomla, and Drupal simplify updating and managing website content, even for non-technical users.\n- Extensibility: These platforms often come with a vast ecosystem of plugins and themes, allowing you to customize your website's functionality and appearance.\n\n#### Collaboration Tools\n\n- Real-time Communication: Tools like Slack, Asana, and Trello facilitate seamless communication and collaboration among team members involved in the web design process.\n- Task Management: These tools help you organize and track tasks, ensuring that projects stay on schedule and deliverables are met.\n\n### Choosing the Right Tools\n\nThe [best web design tools](https://www.indeed.com/career-advice/career-development/web-design-tools) for you will depend on your specific needs, skill level, and project requirements. Consider the following factors when making your selection:\n\n#### The Complexity of Your Project\n\nA website builder is sufficient for a simple website. A combination of design tools, development tools, and a CMS may be necessary for more complex projects.\n\n#### Your level Of Technical Expertise\n\nIf you're new to web design, a website builder or a tool with a user-friendly interface can be a good starting point. Tools that provide greater control and flexibility will be more suitable for experienced developers.\n\n#### Collaboration Requirements\n\n[Collaboration tools](https://www.techtarget.com/searchunifiedcommunications/definition/team-collaboration-tools) are essential for effective communication and project management when working with a team.\n\n#### Budget\n\nSome web design tools are free, while others require a subscription or licensing fee. When evaluating different options, consider your budget. Understanding the various categories of web design tools and their functionalities allows you to make informed decisions and select the tools that best support your website creation process.\n\nEnhance by discussing the evolution of web design tools and why choosing the right tool is critical in today’s market. Add insights about emerging trends in web design tools to\n\n### Evolution of Web Design Tools\n\nHistorically, web design was labor-intensive, requiring extensive coding knowledge and manual design efforts. Early tools were limited, often necessitating a deep understanding of HTML and CSS. However, the introduction of graphical user interfaces and drag-and-drop functionality marked a pivotal shift, making web design more accessible.\n\n### Key Developments\n\n#### Visual Design Tools\n\nThe emergence of wireframing and prototyping tools, such as Adobe XD and Figma, allowed designers to create interactive models of their websites before coding. This facilitated better communication of ideas and streamlined the design process.\n\n#### Website Builders\n\nPlatforms like Wix and Squarespace democratized web design, enabling users without coding skills to create professional-looking websites through intuitive interfaces and pre-designed templates.\n\n#### Development Frameworks\n\nThe rise of frameworks such as Bootstrap and React has empowered developers to build responsive and dynamic websites more efficiently, promoting best practices in coding and design.\n\n#### Content Management Systems (CMS)\n\nTools like WordPress have simplified content management, allowing users to update their sites easily while leveraging a rich ecosystem of plugins and themes for customization.\n\n### Importance of Choosing the Right Tools\n\nSelecting appropriate web design tools is crucial in today’s competitive market. The right tools can enhance productivity, improve collaboration, and ensure that websites effectively meet user needs.\n\n### Factors to Consider\n\n#### Project Complexity\n\nMore straightforward projects only require essential website builders, while more complex sites might benefit from a combination of design and development tools.\n\n#### Technical Expertise\n\nBeginners may prefer user-friendly platforms, whereas seasoned developers might seek tools that offer greater control and customization.\n\n#### Collaboration Needs\n\nTools that facilitate communication and task management, like Slack or Trello, are essential for keeping team projects on track.\n\n#### Budget Constraints\n\nVarious tools, from free options to premium subscriptions, are available at different price points, allowing teams to find solutions that fit their financial plans.\n\n### Emerging Trends in Web Design Tools\n\nThe future of web design tools is likely to be shaped by several emerging trends:\n\n#### AI Integration\n\nTools incorporating artificial intelligence can automate routine tasks, provide design suggestions, and enhance user experience through personalization.\n\n#### No-Code Development\n\nThe no-code movement is gaining traction. It allows users to create complex applications without writing code, further democratizing web development.\n\n#### Responsive Design Tools\n\nAs mobile usage continues, tools prioritizing responsive design will ensure websites function well across various devices.\n\n#### Collaboration Features\n\nEnhanced real-time collaboration features will become standard, allowing teams to collaborate seamlessly, regardless of location. Make the content forward-looking.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## How Web Design Tools Streamline the Website Creation Process\n\n![Best Web Design Tools](https://images.unsplash.com/photo-1542744094-3a31f272c490?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWIlMjBkZXNpZ258ZW58MHx8fHwxNzI0Mzg0NzYzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Efficiency on Steroids: How Web Design Tools Speed Up Site Creation\n\nWeb design tools are like digital assistants, [automating repetitive tasks](https://www.cflowapps.com/automate-repetitive-tasks/#:~:text=Automating%20repetitive%20tasks%20refers%20to,focus%20on%20more%20important%20tasks.) and streamlining the website creation. For instance, designers can use drag-and-drop interfaces to assemble pages quickly instead of manually coding every element. This not only saves time but also reduces the risk of errors.\n\n### Collaborate Like a Pro: How Web Design Tools Improve Teamwork\n\nMany web design tools are designed to facilitate collaboration among team members. This mainly benefits larger projects involving designers, developers, and content creators. Features like real-time editing, version control, and comment threads ensure everyone is on the same page and can work together efficiently.\n\n## How Web Design Tools Help You Prototype Your Ideas\n\n[Prototyping tools](https://webflow.com/blog/prototyping-tools) allow designers to create interactive mockups of websites, helping to visualize and test design concepts before implementation. This early feedback loop can prevent costly mistakes and ensure the final product meets user needs.\n\n### Quality Control: How Web Design Tools Enhance the Design Process\n\nWeb design tools often provide built-in design elements, templates, and libraries, ensuring consistency and quality in the final product. These resources can help designers create visually appealing and user-friendly websites without starting from scratch.\n\n### Save Money: How Web Design Tools Reduce Project Costs\n\nBy using the right web design tools, businesses can reduce development costs and time-to-market. For example, website builders can help non-technical users create basic websites without hiring a developer. Additionally, efficient tools can help teams work faster, reducing project timelines.\n\n### Meet the UI Library That Can Help You Make Your Website More Interactive\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. [MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## 15 of The Best Web Design Tools\n\n![Best Web Design Tools](https://images.unsplash.com/photo-1542744095-0d53267d353e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHx3ZWIlMjBkZXNpZ258ZW58MHx8fHwxNzI0Mzg0NzYzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. MagicUI: UI Components for Fast and Easy Development \n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### 2\\. Adobe XD: The Best Web Design Tool for Prototyping and Collaboration\n\nAdobe XD is a [powerful design tool](https://www.dotyeti.com/blog/best-web-design-tools-ever/) integrated with the Adobe Creative Cloud. It offers a seamless workflow for designers already familiar with Adobe products. It provides features like prototyping, user testing, and integration with other Adobe tools like Photoshop and Illustrator.\n\n#### Example\n\nThe Starbucks design team used Adobe XD to create interactive mobile app prototypes, allowing them to test different design concepts before implementation.\n\n### 3\\. Sketch: The Best Web Design Tool for Vector Graphics and Prototyping\n\nSketch is a macOS-based design tool that focuses on vector graphics and prototyping. It is popular among designers who prefer a more minimalist interface and a focus on core design features. For example, Uber's design team used Sketch to create the initial designs for their ride-hailing app, demonstrating its capabilities for creating complex interfaces.\n\n### 4\\. Canva: The Best Web Design Tool for Non-Designers\n\nCanva is a user-friendly tool with pre-designed templates and drag-and-drop functionality, ideal for beginners or those who need to create simple designs quickly. Canva offers various design elements, including fonts, images, and icons.\n\n#### Example\n\nA small business owner used Canva to create marketing materials like social media posts and flyers, saving time and effort.\n\n### 5\\. InVision: The Best Web Design Tool for Prototyping\n\nInVision is a leading prototyping tool that allows designers to create interactive prototypes and gather user feedback. InVision offers features like hotlinking, annotations, and collaboration tools.\n\n#### Example\n\nThe Dropbox design team used InVision to create interactive prototypes of their file-sharing platform, allowing them to test user flows and gather feedback before development.\n\n### 6\\. Framer: The Best Web Design Tool for Advanced Prototyping\n\nFramer is a flexible prototyping tool that supports code-based interactions and animations. It is suitable for designers with a strong understanding of coding who want to create highly customized prototypes.\n\n#### Example\n\nThe Facebook design team used Framer to create complex prototypes of its news feed algorithm, demonstrating its capabilities for prototyping advanced interactions.\n\n### 7\\. ProtoPie: The Best Web Design Tool for Mobile Prototyping\n\nProtoPie is a mobile-focused [prototyping tool](https://marker.io/blog/web-design-tools) with advanced animation and interaction capabilities. ProtoPie is ideal for designers who want to create prototypes that closely resemble the final product on mobile devices.\n\n#### Example\n\nThe design team at a mobile gaming company used ProtoPie to create interactive prototypes of their games, allowing them to test gameplay mechanics and user experience.\n\n### 8\\. Wix: The Best Web Design Tool for Beginners\n\nWix is a versatile website builder with many templates and customization options. Wix suits businesses and individuals who want to create professional-looking websites without coding knowledge.\n\n#### Example\n\nA small business owner used Wix to create an online store for their handmade products, providing a platform to reach a wider audience.\n\n### 9\\. Squarespace: The Best Web Design Tool for Visual Aesthetics\n\nSquarespace is a popular choice for clean, modern websites and is known for its elegant design templates. It is ideal for businesses and individuals who want to create a visually appealing website focused on simplicity.\n\n#### Example\n\na photographer used Squarespace to create a portfolio website to showcase their work, providing a professional online presence.\n\n### 10\\. Weebly: The Best Web Design Tool for Simple Sites\n\nWeebly is a user-friendly website builder with a drag-and-drop interface and a focus on simplicity. Weebly is suitable for beginners who want to create an essential website quickly.\n\n#### Example\n\nA student used Weebly to create a personal website to showcase their academic achievements and projects.\n\n### 11\\. Visual Studio Code: The Best Web Development Tool\n\nVisual Studio Code is a free, open-source code editor with a vast ecosystem of extensions and integrations. It is suitable for developers who want a customizable and powerful code editor.\n\n#### Example\n\nA web developer used Visual Studio Code to create a complex web application, leveraging its features like code completion, debugging, and version control.\n\n### 12\\. Sublime Text: The Best Lightweight Code Editor\n\nSublime Text is a lightweight and customizable code editor known for its speed and efficiency. Sublime Text suits developers who prefer a minimalist interface and fast performance.\n\n#### Example\n\nA freelance web developer used Sublime Text to create a small website for a client, appreciating its efficiency and ease of use.\n\n### 13\\. Adobe Dreamweaver: The Best All-in-One Web Development Tool\n\nAdobe Dreamweaver is a professional-grade web development tool with a visual interface and\n\ncoding assistance. Adobe Dreamweaver is suitable for developers who want a comprehensive tool for creating and managing websites.\n\n#### Example\n\nA web development agency used Adobe Dreamweaver to create a large-scale website for a corporate client, leveraging features like live preview, code hinting, and FTP integration.\n\n### 14\\. Figma: The Best Web Design Tool for Team Collaboration\n\nIn addition to being a design tool, Figma offers robust collaboration features, making it a popular choice for teams. Figma allows multiple users to simultaneously work on the same project, making it ideal for remote teams.\n\n#### Example\n\nA distributed design team using Figma collaborated on a complex project with team members in different parts of the world.\n\n### 15\\. Slack: The Best Communication Tool for Remote Web Design Teams\n\nSlack is a widespread communication and collaboration platform that streamlines team workflows. It offers features like channels, direct messaging, and file sharing.\n\n#### Example\n\nA web development team communicated and collaborated on a project using Slack. Team members shared code, discussed design decisions, and provided feedback.\n\n## 10 Best Web Design Practices for a Successful Website\n\n![Best Web Design Tools](https://images.unsplash.com/photo-1629598110510-59b992cab1d5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8c3RpY2t5JTIwbm90ZXN8ZW58MHx8fHwxNzI0Mzg0ODgxfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. First and Foremost: User Experience (UX)\n\nA positive user experience is crucial for attracting and retaining visitors. A well-designed website makes it easy for users to find what they need and complete their goals. A great UX can increase conversions, improve customer satisfaction, and enhance brand reputation. It can also help businesses build trust and loyalty among their customers.\n\n### 2\\. Think Mobile First\n\nWith smartphones' increasing popularity, [designing websites](https://marker.io/blog/web-design-tools) optimized for mobile devices is essential. A mobile-friendly website provides a better user experience and can improve search engine rankings. A mobile-first approach ensures that your website is accessible to a broader audience and can help you reach more potential customers. It can also improve your website's load times and performance on mobile devices.\n\n### 3\\. Embrace Clean and Minimalist Design\n\nA clutter-free and minimalist design is easier to navigate and more visually appealing. It helps to improve readability and reduces the cognitive load on users. A clean design can enhance the overall user experience and make it easier for visitors to find the necessary information. It can also improve your website's loading speed and search engine rankings.\n\n### 4\\. Consistent Branding Matters\n\nA consistent brand identity helps to create a solid and memorable impression on users. It reinforces your brand's values and message. A consistent brand can help you build trust and recognition among your target audience. It can also improve brand loyalty and customer satisfaction.\n\n### 5\\. Call-to-Actions (CTAs) Need to Be Clear\n\nCTAs guide users toward specific actions, such as purchasing or signing up for a newsletter. A clear and compelling CTA can increase conversions. Effective CTAs can drive sales, generate leads, and achieve other business goals. They can also help to improve your website's conversion rate.\n\n### 6\\. Fast Loading Times are a Must\n\nUsers have short attention spans and are likelier to abandon a website if it takes less time to load. Fast loading times can improve user experience and [search engine rankings](https://blog.hubspot.com/marketing/top-search-engines). A fast-loading website can reduce bounce rates, increase time spent on the site, and improve conversions. It can also help your website rank higher in search engine results.\n\n### 7\\. High-quality imagery is Essential\n\nHigh-quality images can enhance the visual appeal of your website and make it more engaging. They can also help to convey your brand's message and tone. High-quality imagery can improve the overall user experience and make your website more memorable. It can also help to attract and retain visitors.\n\n### 8\\. Accessibility is Key\n\nDesigning a website that is accessible to people with disabilities is both ethical and legal. It can also help to improve your website's reach and inclusivity. An accessible website can help you reach a wider audience and improve your brand's reputation. It can also help to avoid legal issues and fines.\n\n### 9\\. Regular Updates are Necessary\n\nKeeping your website's content fresh and up-to-date is essential for maintaining user engagement and search engine rankings. Regular updates can attract new visitors, keep existing visitors interested, and improve your website's search engine visibility.\n\n### 10\\. Track Analytics\n\nAnalytics tools provide valuable insights into your website's performance and user behavior. This data can help you make data-driven decisions to improve your website and achieve your business goals. Analytics can help you identify areas for improvement, track conversions, and measure the effectiveness of your marketing efforts. It can also help you optimize your website for better results.\n\n## How MagicUI Can Elevate Your Web Design\n\n![Best Web Design Tools](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBsYXB0b3B8ZW58MHx8fHwxNzI0Mzg0Nzk4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Unlocking the Potential of MagicUI for Your Next Web Project \n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library designed to streamline the web design process. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These components are visually appealing, interactive, and highly customizable, allowing you to create stunning user interfaces with minimal effort.\n\n### Accelerate Development Time with MagicUI\n\n[MagicUI's pre-built components](https://pro.magicui.design/docs/templates/startup) can significantly reduce development time, allowing you to focus on other aspects of your project. Instead of spending hours creating a single UI element from scratch, you can use MagicUI, customize a component to fit your vision, and move on to the next item on your to-do list.\n\n### Enhance Your Website’s Visual Appeal\n\nMagicUI's components are designed to adhere to best practices in UI design, ensuring a consistent and visually appealing user experience. [MagicUI can help you](https://pro.magicui.design/docs/templates/startup) create a stunning website to impress visitors and clients.\n\n### Improve User Engagement\n\nThe animated components in MagicUI capture user attention and make your website more engaging. Instead of using static elements that do little to excite your visitors, you can incorporate [MagicUI’s animated components](https://pro.magicui.design/docs/templates/startup) to create a more dynamic and exciting web experience.\n\n### Customize with Ease\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), allowing you to tailor them to your specific branding and design requirements. You can easily change colors, animations, and layouts to create the perfect UI for your website or application.\n\n### MagicUI Pro: Your One-Stop Solution\n\nIn addition to the free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) offers a collection of pre-designed website templates to help you create beautiful and functional websites even faster. These templates are designed to convert visitors into customers, making them ideal for businesses and startups.\n\n### Experience the Magic of MagicUI \n\nReady to elevate your web design with MagicUI? Visit our website to explore our templates and [learn more about how MagicUI](https://pro.magicui.design/docs/templates/startup) can help you achieve your design goals.\n\n## Frequently Asked Questions About Best Web Design Tools\n\n### What is the difference between a website builder and a web design tool?\n\nA website builder is a user-friendly platform that allows you to create websites without coding knowledge. It typically offers pre-designed templates, drag-and-drop functionality, and built-in features like e-commerce and blogging.\n\nA web design tool is a more comprehensive software application that gives you greater control over the design and development process. It often requires coding knowledge or a basic understanding of web development principles.\n\n### Which web design tool is best for beginners?\n\nIf you're a beginner, a website builder like Wix, Squarespace, or Weebly is a good starting point. These tools are user-friendly and offer a wide range of templates and features. However, a code editor like Visual Studio Code or Sublime Text can be a good option if you want to learn web development.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n### How do I choose the right web design tool for my project?\n\nThe best web design tool for your project depends on your specific needs and skill level. Consider the following factors when making your decision:\n\n#### Complexity of Your Website  \n\nA [website builder](https://zapier.com/blog/best-website-builders/) might be sufficient for a simple website. However, a web design tool with greater customization options may be necessary for more complex websites.\n\n#### Your Level of Technical Expertise  \n\nA website builder is a good option if you need more coding experience. If you have some coding knowledge, a web design tool that allows for more customization might be better suited.\n\n#### Your Budget  \n\nSome web design tools are free, while others require a subscription fee. When choosing a tool, consider your budget.\n\n#### Your Team’s Needs  \n\nIf you’re working with a team of [designers and developers](https://uxplanet.org/designers-developers-collaborative-design-process-for-innovation-c931206ed2ac), a tool that supports collaboration and version control might be necessary.\n\nBy carefully considering these factors, you can choose the web design tool that best meets your project’s requirements.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI is a free, open-source](https://pro.magicui.design/docs/templates/startup) UI library specifically designed for design engineers. The library includes over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\n### Why Use MagicUI?  \n\nMagicUI provides a collection of visually appealing and interactive animated components that can be easily integrated into a web application. [Using MagicUI will help you](https://pro.magicui.design/docs/templates/startup) create stunning user interfaces with minimal effort.\n\n### What are the Benefits of MagicUI?  \n\nThe components in [MagicUI are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match your desired branding and design requirements. With a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering engineers to craft captivating digital experiences.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/best-web-developer-portfolios.mdx",
    "content": "---\ntitle: \"32 Examples Of Best Web Developer Portfolios For Design Inspiration\"\ndescription: \"Create a standout web developer portfolio inspired by the best web developer portfolios. Try Magic UI's landing page templates for a winning start.\"\nimage: https://cdn.magicui.design/assets/0034f8a8-3657-4019-a6a3-298dfa912a4b.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nBuilding a captivating web developer portfolio is like creating the perfect landing page—the key to making a lasting impression on potential clients and employers. Maybe you're a fresh graduate looking to make your mark in the industry or a seasoned developer exploring new opportunities. Whatever the case, best web developer portfolios with [landing page examples](https://magicui.design/blog/landing-page-examples) can inspire you to craft a portfolio that stands out from the crowd.\n\nWant to create a standout portfolio that resonates with potential clients and employers? Check out Magic UI's solution, a [startup landing page template](https://pro.magicui.design/docs/templates/startup) that can help you make a lasting impression.\n\n## What Is A Web Developer Portfolio?\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1621857093087-7daa85ab14a6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3ZWIlMjBkZXZlbG9wZXJ8ZW58MHx8fHwxNzIyNTg2NjU5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nA web developer portfolio is crucial for showcasing a [developer's skills and past work](https://www.indeed.com/career-advice/resumes-cover-letters/build-your-work-portfolio). At its core, it is a dedicated website where developers display their projects, providing potential clients or employers with a clear view of their capabilities.\n\n### Project Showcase\n\nTypically, a portfolio includes a gallery or list of previous projects, with detailed descriptions of:\n\n- Each project\n- The technologies used\n- The developer's role in its completion\n\nThis section helps demonstrate the developer’s practical experience and technical proficiency.\n\n## Benefits Of Using A Portfolio Site As a Web Developer\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1499951360447-b19be8fe80f5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8ZGV2ZWxvcGVyJTIwcG9ydGZvbGlvfGVufDB8fHx8MTcyMjU4NjY3MXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA web developer portfolio offers several significant benefits, even if it’s not a strict requirement for landing most junior positions.\n\n### Showcase Your Skills\n\nA well-crafted portfolio allows you to demonstrate your skills and expertise tangibly. Rather than just talking about your abilities, you can show actual examples of your work, which helps potential employers or clients better understand your capabilities.\n\n### Stand Out from the Competition\n\nIn a competitive job market, having a portfolio can set you apart from other candidates who may only rely on their resumes.\n\nA portfolio provides concrete evidence of your skills and creativity, making a stronger impression on recruiters and hiring managers.\n\n### Build Your Personal Brand\n\nYour portfolio is an opportunity to present your personal brand and style. It reflects your web development and design approach, helping you attract clients or employers who appreciate your unique qualities.\n\n### Demonstrate Your Dedication\n\nCreating and maintaining a portfolio shows a commitment to your profession. It indicates you are:\n\n- Proactive\n- Invested in your career\n- Serious about showcasing your work\n\n### Provide Evidence of Growth\n\nYou can continually update your portfolio as you gain more experience and complete new projects. This keeps your work current and shows how you’ve evolved and grown as a developer over time.\n\n#### Portfolio Importance\n\nWhile a portfolio might not be essential for every entry-level position, it significantly enhances your ability to demonstrate your skills and stand out in the job market.\n\n#### Portfolio Benefits\n\nIt allows you to showcase your work effectively, build your personal brand, and highlight your dedication to the field. It is also very much needed if you plan to offer freelance web development services.\n\n### MagicUI: A Design Engineer's Dream Tool\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers.\n\n#### Features of Our Component Collection\n\n- Over 20 animated components\n- Built with React, TypeScript, Tailwind CSS, and Framer Motion\n- Visually appealing and interactive elements\n- Easy integration into web applications\n- Create stunning user interfaces with minimal effort\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n#### Why Choose MagicUI\n\n- Focus on animation and design-centric approach\n- Bridges the gap between design and development\n- Empowers the creation of captivating digital experiences\n- Free component library available\n- MagicUI Pro saves thousands of hours\n- Create beautiful landing pages with website templates\n- Convert visitors into customers\n\nDiscover the perfect solution for your startup with our startup landing page template. Designed to attract and engage your audience, this template offers a professional and polished look to kickstart your online presence. Today, use our startup landing page template ([https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup)) to transform your website and captivate visitors. Start now!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 32 Examples Of Best Web Developer Portfolios For Design Inspiration\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx3ZWJzaXRlJTIwcG9ydGZvbGlvfGVufDB8fHx8MTcyMjU4NjcwMXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Matt Farley\n\nMatt Farley's [front-end and UX/UI developer portfolio](http://www.mattfarley.ca/) showcases his eight years of experience. Matt's website is designed with simplicity, highlighting his work effectively.\n\nThis front-end web developer portfolio example demonstrates that a simple, crisp design can often tell a better story than a complex, feature-rich site.\n\n### 2\\. Lauren Waller\n\nLauren Waller's dynamic web portfolio showcases her previous work and capabilities in designing unique web landscapes. This simple design allows users to navigate quickly to her:\n\n- Work\n- Background details\n- Shop\n\n#### Lauren's Expertise\n\nLauren's portfolio includes:\n\n- Experience in web development\n- Photo filters\n- Various projects built in Webflow\n\n### 3\\. Sara Soueidan\n\nSara Soueidan's online portfolio highlights her web design and development capabilities. She guides readers through her various technical skills, including:\n\n- Responsive design\n- Web accessibility\n- Platform performance\n\n#### Client Showcase\n\nSara also showcases a portfolio of top clients like:\n\n- Netflix\n- Khan Academy\n- WebMD\n- SuperFriendly\n\n### 4\\. Chris Dermody\n\nChris Dermody's portfolio includes work history, experience, and [thought leadership content](http://chrisdermody.com/). Combining product management and web design best practices, he showcases a client deck that includes brands like:\n\n- Pushpop\n- Reservadeck\n- AIhairstyles\n\nIn the About section, Chris also emphasizes his leadership skills.\n\n### 5\\. Brittany Chiang\n\nBrittany Chiang's structured portfolio resembles a resume, with a timeline highlighting her career highlights and professional capabilities. Her straightforward, easy-to-understand design encourages potential clients to review her:\n\n- Work history\n- Projects\n- Experience\n\n### 6\\. Charles Bruyerre\n\nCharles Bruyerre's portfolio features an interactive background and a unique style that gives it a modern and playful look. He also lists his:\n\n- Instagram\n- Behance\n- LinkedIn profiles for additional information\n\n### 7\\. Keita Yamada\n\nKeita Yamada's clean and concise portfolio includes a homepage with his bio, a project page, and a contact page. Visitors can switch between light and dark themes by clicking on options on the website.\n\n### 8\\. Bruno Simon\n\nBruno Simon's [interactive web developer portfolio](https://bruno-simon.com/) impresses clients with creative 3D animation features. Visitors can navigate his portfolio by controlling a car to explore various sections, including:\n\n- Projects\n- Social media links\n\n### 9\\. Ian Dunkerley\n\nIan Dunkerley's portfolio showcases all essential information on a single page, from work to contact details. This minimalist approach effectively highlights his skills and experience.\n\n### 10\\. Patrick David\n\nPatrick David's creative portfolio combines stylish typography with beautiful graphics to create a visually appealing effect. It conveys originality and confidence in his web design skills.\n\n### 11\\. Jack Jeznach\n\nJack Jeznach's portfolio captures attention with a [creative concept](https://jacekjeznach.com/) and seamless background animation. His informative design provides easy access to competencies and job experience.\n\n### 12\\. Max Bock\n\nMax Bock's straightforward web developer portfolio showcases his expertise in making websites. He provides tools and advice for industry professionals, emphasizing his:\n\n- Skills\n- Knowledge\n\n### 13\\. Olaolu\n\nOlaolu's playful and engaging portfolio features bright colors and geometric shapes, catering to the evolving web landscape.\n\n### 14\\. Jason Lengstorf\n\nJason Lengstorf's bold and colorful portfolio showcases his design skills and engaging content creation.\n\n### 15\\. Oluwakemi Adeleke\n\nOluwakemi Adeleke's highly personal portfolio showcases the individual behind the designs, emphasizing:\n\n- Accessibility\n- Personalization\n\n### 16\\. Robb\n\nRobb's [animated and engaging portfolio](https://robbowen.digital/) emphasizes personality and a playful design approach.\n\n### 17\\. Cassie Codes\n\nCassie Codes' interactive and whimsical portfolio showcases her career and aspirations, demonstrating thought leadership.\n\n### 18\\. Jhey Tompkins\n\nJhey Tompkins' portfolio leverages testimonials to develop a strong reputation, emphasizing:\n\n- Past work\n- Client satisfaction\n\n### 19\\. Denise Chandler\n\nDenise Chandler's colorful and entertaining portfolio highlights her web design and development capabilities with a uniquely entertaining homepage.\n\n### 20\\. Adham Dannaway\n\nAdham Dannaway's impressive portfolio showcases his [unique combination](http://adhamdannaway.com/) of design and coding skills, creating an engaging experience for visitors.\n\n### 21\\. Lynn and Tonic\n\nLynn and Tonic's front-end technology portfolio is quirky and memorable, showcasing an excellent command of technology and unconventional design approaches.\n\n### 22\\. Gift Egwuenu\n\nGift Egwuenu's personalized portfolio links directly to her social and developer accounts, showcasing her:\n\n- Expertise\n- Career breadth\n\n### 23\\. Timmy O'Mahony\n\nTimmy O'Mahony's portfolio showcases [back-end programming skills](https://timmyomahony.com/) effectively, offering a thorough overview of his expertise.\n\n### 24\\. Oluwadare Oluwaseyi\n\nOluwadare Oluwaseyi's bold and engaging portfolio emphasizes his complete command of the page and effectively showcases his design skills.\n\n### 25\\. Josh Comeau\n\nJosh Comeau's comprehensive portfolio offers insight into various web development and design aspects and showcases his professional expertise.\n\n### 26\\. Brice Clain\n\nBrice Clain's animated portfolio creates a memorable experience for visitors, engaging them with:\n\n- Project histories\n- Interactive elements\n\n### 27\\. Ram Maheshwari\n\nRam Maheshwari's portfolio focuses on front-end development for websites and web applications, showcasing his credentials and work effectively.\n\n### 28\\. Tamal Sen\n\nTamal Sen's portfolio creates a strong developer aesthetic with a dark theme mimicking an integrated development environment (IDE), illustrating his previous work.\n\n### 29\\. Kenneth Jimmy\n\nKenneth Jimmy's straightforward portfolio design provides easy access to his works, resume, and blog, showcasing his modern application development capabilities.\n\n### 30\\. Edewor Onyedika\n\nEdewor Onyedika's portfolio relies on simple animated elements and a [unique heading](https://www.edwardh.io/) to entice potential clients, encouraging visitors to explore further.\n\n### 31\\. Seán Halpin\n\nSeán Halpin's engaging portfolio showcases his [creative website designs](https://www.seanhalpin.design/) with a responsive user interface, demonstrating his design creativity.\n\n### 32\\. Maxime Bonhomme\n\nMaxime Bonhomme's minimalist web developer portfolio emphasizes text content and white space to highlight essential information effectively.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## What To Include In Your Web Developer Portfolio\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1588912914078-2fe5224fd8b8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxob21lcGFnZXxlbnwwfHx8fDE3MjI1ODY3MTR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Homepage/Introduction\n\nThe homepage is the digital front door to your web developer portfolio website. It should give visitors a taste of what they can expect from the rest of your site.\n\nA clean, professional design sets the tone for a great user experience. Your homepage must include an introduction summarizing who you are and what differentiates you from your competitors. Think of this as your digital elevator pitch; it should be:\n\n- Short\n- Sweet\n- Compelling\n\n### Portfolio/Work Samples\n\nYour portfolio section should include a curated selection of your best work. A detailed case study or project description should accompany each project.\n\n#### Portfolio Content\n\nThis information should include:\n\n- Images or visuals\n- Links to live examples\n- Details on your role and the technologies used\n\n#### Case Study Benefits\n\nThese case studies demonstrate your capability, range, and creativity. They provide clients with real-world examples of your work and give them a sense of what you can do for them.\n\n### About Me\n\nThe [About Me section](https://www.thebalancemoney.com/how-to-write-about-me-page-examples-4142367) serves as a digital handshake, a place to introduce yourself and give visitors a glimpse of your personality.\n\n#### About Section\n\nHere, you can share your background, skills, and experience. A professional bio, details about your education, certifications, and significant accomplishments will help visitors get to know you better.\n\n#### Personal Touch\n\nPersonal stories or anecdotes can further humanize you and help potential clients or employers connect with you individually.\n\n### Services/Skills\n\nYour web developer portfolio website's Services/Skills section outlines your services and highlights your technical skills. Specify which web development languages, frameworks, and tools you’re proficient in.\n\nYou can also mention any specialized services you offer, like UX/UI design or SEO. This section should clearly explain what you can do for your clients and what makes you uniquely qualified.\n\n### Contact Information\n\nYour web developer portfolio website needs to make it easy for visitors to contact you. The Contact Information section should provide visitors multiple ways to connect with you.\n\n#### Get in Touch\n\nConsider including a contact form, email address, and links to your professional social media profiles (e.g., LinkedIn). Ideally, this section should be easy to find and use in your site's top navigation or footer.\n\n### Testimonials/Reviews\n\nClient testimonials and reviews are powerful tools for establishing credibility and building trust with potential clients. When creating your web developer portfolio website, include quotes or feedback from previous clients or colleagues.\n\nPositive testimonials reinforce your reputation and demonstrate your track record of satisfied clients. These reviews can be a deciding factor for someone considering hiring you for their next project.\n\n### Blog/Articles\n\nIf you have a blog or write articles, consider incorporating a section of your web developer portfolio website to showcase your writing.\n\nSharing insights, tutorials, or case studies can help establish you as an authority in your field. By creating this content, you’re delivering value to visitors before they even decide to hire you. It also helps demonstrate your knowledge and expertise to potential clients.\n\n### Responsive Design\n\nGiven the increasing use of mobile devices, responsive design is a must for any web developer's portfolio website. It ensures your site looks great and functions correctly on any desktop computer, smartphone, or tablet device.\n\nBy showing that you can create websites that adapt to all screen sizes, you’re showcasing your skills and commitment to user experience.\n\n### Call to Action (CTA)\n\nYour web developer portfolio website should include clear [Call to Action (CTAs)](https://unbounce.com/landing-page-articles/what-is-a-cta/) throughout. CTAs like “Hire Me,” “Request a Quote,” or “View My Work” guide visitors through the following steps.\n\nBy including these CTAs, you encourage visitors to engage with you further and take the next step toward becoming clients or employers. Strategically including these CTAs can significantly increase your website's conversion rate.\n\n### (Optional) Resume/CV\n\nIf you prefer to have a downloadable version of your resume or CV, consider including this on your web developer portfolio website.\n\nEnsure it’s updated with your most recent work experience, skills, and accomplishments. This can benefit employers or clients who want a more in-depth look at your background and qualifications.\n\n## Checklist For Hitting The Publish Button\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1566207474742-de921626ad0c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHx3b3JkcHJlc3N8ZW58MHx8fHwxNzIyNTg2Nzg0fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Is the Website Easy To Read and Free of Errors?\n\nAs a web developer creating your portfolio, you want potential clients to focus on your work, not any distractions. Typos and other errors should be thoroughly checked for and corrected. Ensure your website is easily read with appropriate:\n\n- Color schemes\n- Fonts\n- Layout\n\n### Is the Call to Action Working?\n\nThe [call-to-action button](https://adespresso.com/blog/call-to-action-examples/) on your website is vital for converting visitors into clients. Test it thoroughly to ensure this feature functions smoothly. A dysfunctional button may make potential clients doubt your abilities as a developer.\n\n### Is the Website Easy to Navigate?\n\nYour website should have a [user-experience (UX)](https://www.productplan.com/glossary/user-experience/) design, especially regarding navigation. Make it simple for visitors to navigate your portfolio. Consider implementing filtering options to help clients find examples of specific web development projects.\n\n### Is the Website Fast?\n\nYour website's loading speed is an essential factor for potential clients. A slow website may deter clients from hiring you. Ensure your website follows best practices for speed and performance.\n\n### Is the Website Consistent?\n\nMaintain consistency throughout your web development portfolio. Clashing themes, branding, or projects may need to be clarified for visitors. Tailor your portfolio to your target audience to create a cohesive and inviting experience.\n\n## Enhancing Your Portfolio To Stand Out From Competition\n\n![Best Web Developer Portfolios](https://images.unsplash.com/photo-1519389950473-47ba0277781c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3b3JraW5nJTIwaW4lMjB0ZWFtfGVufDB8fHx8MTcyMjU4NjgwNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nWeb developer employment is [forecasted to grow 16% through 2032](https://www.bls.gov/ooh/computer-and-information-technology/web-developers.htm#tab-6), creating roughly 19,000 new positions each year in the US (BLS).\n\nAs demand for front-end developers grows, so does supply. As competition grows for available development roles, it’s more important than ever to position yourself as a qualified professional in the IT space.\n\n### Adding Personality to Your Portfolio\n\nAdding personality to your portfolio helps you stand out and makes your website memorable. It’s more than just presenting your work—it’s about expressing who you are as a developer and what makes you unique.\n\nStart by incorporating your style into the design of your portfolio. This can be achieved through color schemes, typography, and overall layout that reflect your taste and approach.\n\n#### Personal Branding\n\nIncluding a personal touch in your [About Me](https://mailchimp.com/resources/how-to-write-about-me-page/) section can also add character. Share anecdotes, your journey into web development, or even some of your interests outside of work.\n\n#### Content Strategy\n\nEngaging content, such as blogs or articles, can provide insights into your expertise and passions. A well-crafted portfolio isn’t just a showcase of your work; it represents your brand and creative flair.\n\n### Using Magic UI’s Animated Components\n\nIncorporating animated components from [Magic UI](https://pro.magicui.design/) can significantly enhance your portfolio by adding a dynamic and interactive element. Magic UI offers a range of animated UI components that can make your portfolio more engaging and visually appealing.\n\n#### Interactive Elements\n\nAnimated buttons, transitions, and interactive elements can create a more immersive experience for visitors, showcasing your ability to implement modern design trends and interactive features.\n\n#### Attention Grabbers\n\nThese animations can highlight key areas of your portfolio, such as project showcases or contact forms, drawing attention to important elements and improving user engagement.\n\n#### UI/UX Showcase\n\nUsing Magic UI’s components can also demonstrate your proficiency in integrating advanced UI/UX elements, which can impress potential clients or employers.\n\n#### Design Sophistication\n\nIncorporating these animations makes your portfolio more attractive and reflects your skills in creating sophisticated, user-friendly designs.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in UI libraries, offering over 20 animated components to make your landing pages pop. With MagicUI, you can easily create visually stunning and interactive elements that seamlessly integrate into your web applications. The best part? It's free and open-source, allowing you to craft captivating digital experiences effortlessly.\n\n### Bridging the Gap Between Design and Development\n\nOne of the challenges in creating landing pages is ensuring they are visually appealing and technically sound. [MagicUI](https://magicui.design/) bridges the gap between design and development by offering highly customizable components that can be adapted to match your branding and design requirements seamlessly. This means you can focus on creating beautiful landing pages without dealing with the technical complexities.\n\n### MagicUI Pro: Elevate Your Landing Page Game\n\nWith [MagicUI Pro](https://pro.magicui.design/), you can take your landing page design to the next level. Using our website templates, you can save thousands of hours and create a beautiful landing page that converts visitors into customers. MagicUI Pro equips you with everything you need to make a stunning startup landing page that captures attention and drives results.\n\n### Design Made Easy With MagicUI\n\nThe call-to-action (CTA) is one of the most crucial elements of a landing page. With MagicUI, you can effortlessly design compelling CTAs that drive conversions. Our [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the perfect starting point for creating a CTA that resonates with your target audience and compels them to act.\n\n[Get MagicUI today](https://magicui.design/) and see the difference it can make in your landing page design.\n"
  },
  {
    "path": "apps/www/content/blog/bootstrap-vs-react.mdx",
    "content": "---\ntitle: \"Bootstrap Vs React, Which Is The Right Frontend Framework?\"\ndescription: \"Bootstrap vs React: two popular frontend frameworks. Which one is right for your project? Explore the differences between them in this guide.\"\nimage: https://cdn.magicui.design/assets/908bb05d-0c52-4b15-abf8-d1b95cad5a91.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-14\"\nfeatured: false\n---\n\nIn the dynamic world of [UI Frameworks](https://magicui.design/blog/ui-frameworks), the choice between Bootstrap and React can significantly impact the success of your front-end development projects. Imagine being tasked with comparing Bootstrap and React for front-end development, looking to make the best decision for your project within a limited timeframe. This is where clear insights and valuable information can become your lifelines, aiding you in making informed decisions that drive project success.\n\nMagic UI's [React component library](https://magicui.design/) could be the very tool you need to ace Bootstrap and React analysis for your front-end development efforts. In this blog, we'll delve into the depths of both frameworks, offering comparisons, insights, and practical tips to help you make the best choice for your project. So, let's dive in and unravel the mysteries of Bootstrap vs React to help you confidently achieve your front-end development objectives.\n\n## What Is React?\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1522252234503-e356532cafd5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb2RlfGVufDB8fHx8MTcxOTA1ODg5MXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nFacebook developed and maintained [React JS](https://react.dev/), a versatile library enabling developers to easily create dynamic user interfaces. While some may debate its classification as a framework, React’s declarative approach to programming and virtual DOM significantly enhances performance and efficiency in developing web applications.\n\nWith a vast user base, including tech giants like Facebook, Instagram, and Airbnb, React is well-established and widely adopted in the industry. Its popularity has spurred the creation of various UI libraries and component frameworks, making it easier for developers to build and maintain projects while focusing on unique features.\n\n## What Is Bootstrap?\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1629904853893-c2c8981a1dc5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxib290c3RyYXB8ZW58MHx8fHwxNzE5MDU4ODYwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nBootstrap is an open-source front-end system that contains HTML, CSS, and JavaScript-based plan parts and communications that assist us with planning responsive applications. It is the stage that is most generally involved in creating portable and work area applications. The first name is Twitter Blueprint since Bootstrap was made as an interior structure by the Twitter group. It has an extremely responsive plan format, system, networks, and multi-site similarity.\n\n### The Core Tenets of Bootstrap\n\nThanks to its rich set of resources, Bootstrap has become the second most popular UI design framework. Its primary goal was to streamline developers' work and promote consistency through its internal tools. This has significantly influenced the UI design landscape, making it a must-know for developers and designers.\n\n### From Internal Tool to Industry Standard\n\nMark Otto and Jacob Thornton developed this framework to standardize the use of a framework by Twitter employees. This is how the framework came to be known as Twitter Bootstrap. In 2011, the developers launched this project on GitHub for everyone’s access.\n\nAs of May 2022, approximately 4.25 million people have downloaded [Bootstrap for web development](https://www.npmtrends.com/bootstrap-vs-bootstrap-material-design-vs-material-components-web-vs-material-design-lite-vs-materialize-css).\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## When To Use React\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1552664730-d307ca884978?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxhZ2lsZXxlbnwwfHx8fDE3MTkwNjA0MDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAccording to BuiltWith Trends, 12,376,396 live websites are using React as of September 2023.\n\nHere are certain situations where using ReactJS can be beneficial for developers as well as clients:\n\n### 1\\. Easy debugging of codes\n\nWhen a component is updated, development and QA teams can guarantee that the remaining app features will continue to function. This is possible because every component on a web page is not dependent and can be updated quickly without affecting other components.\n\n### 2\\. Developing a Complex User Interface\n\nA sophisticated UI is made when developers can add unique user interface components from any web page into one unit. In such cases, ReactJS is very useful.\n\n### 3\\. Smoother reloads are necessary\n\nReactJS is efficient in upgrading the data on web pages. It makes it easy to develop dynamic websites where the data must be displayed requires frequent changes.\n\nUse [React](https://trends.builtwith.com/websitelist/React) when you’re building dynamic, interactive UIs and need a component-based architecture. React is often used for single-page applications or any web app where the state needs to be managed across components.\n\n### Bridging the Design-Development Gap\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## When To Use Bootstrap\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1552581234-26160f608093?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXZlbG9wbWVudCUyMHRlYW18ZW58MHx8fHwxNzE5MDYwMzk2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAccording to SimilarTech, as of September 2023, 3,869,506 websites use Bootstrap, which represents 21.2% of all websites.\n\nHere are some situations when using Bootstrap will be useful:\n\n### 1\\. Rapid Development\n\nDevelopers with an introductory knowledge of CSS or HTML can develop an application quickly.\n\n### ‍2. Easy To Use\n\nUnlike other frameworks built for more expert coders, Bootstrap's primary audience is beginners.\n\n### ‍3. UI Components\n\nBootstrap provides various interface components that are ideal for developers to create valuable front-ends.\n\n### ‍4. Responsiveness\n\nBootstrap is ideal for building responsive websites that quickly adapt to multiple browsers and platforms.\n\n### ‍5. Grid System\n\nBecause of its use of Flexbox, the responsive grid system in Bootstrap is the most adopted and valuable for developers. The grid system makes column alignment, rowing, and numbering responsive for all screen sizes.\n\nUse [Bootstrap](https://www.similartech.com/technologies/bootstrap) when you want to style your website and make it responsive quickly. It’s particularly helpful for prototyping or when the default Bootstrap aesthetics align with your design goals.\n\n## Bootstrap Vs React: A Detailed Comparison\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1621570072957-367f1c501dba?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBjb21wdXRlcnxlbnwwfHx8fDE3MTkwNTg4Mjl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nBootstrap is renowned for its user-friendly development of websites and online apps;Its performance must be monitored. The framework's extensive library and unused resources have been criticized for slowing performance. They overlook that it may be customized to improve the app's speed, regardless of the content.\n\nWith React apps, the user experience is lighter and quicker, with individual components functioning well. React.Js component-based design makes single-page applications more robust, while reusability reduces code bloat, and DOM manipulation speeds up page loading. Thus, it enhances app performance and user satisfaction.\n\n### Scalability of Bootstrap vs React\n\nBootstrap is a mobile-first programming framework for building scalable websites and apps. It allows responsive website content to be scaled up or down based on the user's browser, app, or screen. The framework's single universal code eliminates cross-browser problems and compatibility concerns, making it preferred among developers.\n\nBecause React applications are pure JavaScript, developers may use conventional coding practices to make the project more scalable. React is an excellent framework for building scalable UIs with virtual DOM and component reuse.\n\n### Bootstrap vs React – App Design\n\nWhen selecting a framework, consider flexibility above rigid architecture and rules. A framework should always be seen as a guide, not as procedures and standards.\n\n### Bootstrap’s architecture\n\nBootstrap’s design is a View-Controller architecture with two components – Logic Layer and View Layer. The views component focuses on visual displays, whereas the view controller defines all visual component functionality. The display layer contains six modules, whereas the logic layer includes twelve components with a purpose.\n\n### React.Js architecture\n\nIt lacks a built-in architectural pattern like other libraries and frameworks. React is a component-based view layer for applications. React components operate as functions that update the underlying user interface. The underlying design of React.Js is based on continuous interaction between user activities and application component states. The current version of React components is ideal for building applications with minimal functionality.\n\n### UX: Bootstrap vs React\n\nTwitter Bootstrap is a web-responsive front-end framework that provides a consistent user experience. The framework's responsive design uniformizes online users, developers, and viewers across all platforms, increasing confidence and value.\n\nReact apps have a better user experience and generate web pages faster. The apps include sophisticated user interfaces and a clean, organized structure. Buttons, forms, text fields, and other UI components are well-designed and easy to use. The rapid rendering also allows for seamless information representation. Nothing prevents React.Js applications from providing \"bug-free\" speed if appropriately designed.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Using Bootstrap With React\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1581276879432-15e50529f34b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxyZWFjdHxlbnwwfHx8fDE3MTkwNTgzOTB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nIt is possible to use Bootstrap in React to work on the front end of an application or website. You\n\ncan use Bootstrap with React using one of these methods:\n\n- Using the CDN for Bootstrap\n- Importing Bootstrap as a dependency in React\n- Installing the react-bootstrap or reactstrap packages from the React Bootstrap library\n\nThe idea is to highlight that the fate of both programs resides in their union. Combining will soothe customers’ expanding desires for web developers. Some developers have already combined both characteristics, but this is a difficult task that can easily go wrong if an individual does not possess higher expertise. By combining the two, React developers can benefit from the famed grid system and other remarkable Bootstrap components as well as the flexibility and simplicity of the original base used by web designers.\n\n### Addressing React's UI Design Shortcomings\n\nNow, Bootstrap can cover this gap because React lacks built-in tools for developing responsive, streamlined, and logical designs. Conversely, the Bootstrap script can be challenging and lengthy. Therefore, using Reacts Grid, Row, and Column components to arrange web pages instead of HTML would be more favorable for consumers.\n\n### Empowering All Designers with a Streamlined Workflow\n\nWeb designers of all levels of expertise can profit from this integration. The suggestion is not to make web design more approachable but to enable highly talented web designers to advance and inexperienced web designers to build easily. By narrowing these horizons of creativity, the possibilities for 2022 and beyond become unfathomable.\n\n### Bridging the Design-Development Gap\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## What Are The Advantages And Disadvantages Of Using React? What Of Bootstrap?\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1634117622592-114e3024ff27?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxjaGFydHxlbnwwfHx8fDE3MTkwNjAzNDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Advantages of React\n\n### Profoundly productive\n\nWeb applications created through reacting are profoundly productive. This is one reason why react rapidly moves up in driving web structures.\n\nIn react web application advancement, each change refreshes the whole virtual DOM. There are two forms of virtual DOM in the React memory.\n\n### SEO Friendly\n\nThe React library is SEO-friendly and centers on speed. Thanks to the virtual DOM and server-side delivery, this is currently not an issue since Google or some other web crawler doesn’t need to utilize JavaScript straightforwardly for content delivery.\n\nJavaScript-based sites can cause problems due to DOM re-delivering. Long stacking time may likewise be the reason for issues with the actual site.\n\n### Component-based architecture\n\nIt is expected that vanilla Javascript-based applications will get into a phase while dealing with the condition of information a client’s program turns into a migraine for engineers. With the information and intricacy of an application developer, it becomes challenging to keep up with utilizing vanilla Javascript.\n\n### Flourishing Community\n\nRespond certainly has solid local area support, which can be credited to its open-source nature. Whether you deal with an issue, a bug, or whatever else, you should rest assured the local area will continuously be there to furnish you with any assistance they can work with.\n\n### Virtual DOM\n\nOne of React’s standout features is its Virtual DOM (Document Object Model). Instead of manipulating the actual DOM directly, React utilizes a virtual representation of the DOM. This enables React to efficiently update and render UI components by selectively rendering only the necessary DOM elements that have changed. As a result, React offers significant performance improvements compared to traditional DOM manipulation, leading to faster rendering and a smoother user experience.\n\n### Efficient State Management\n\nManaging state is a fundamental aspect of front-end development, and React provides robust mechanisms for handling component state and data flow. With features like stateful components, context API, and third-party libraries such as Redux, developers have ample flexibility in managing application states effectively. This enables better organization of data, improved performance, and enhanced debugging capabilities.\n\n### Rich Ecosystem and Community Support\n\nReact boasts a vibrant ecosystem with many tools, libraries, and resources to streamline development workflows. From popular libraries like React Router for routing to Material-UI for pre-designed UI components, React’s ecosystem offers solutions for various development needs. React benefits from strong community support, with a vast community of developers contributing to its growth through documentation, tutorials, and open-source projects.\n\n### Cross-Platform Compatibility\n\nWith the rise of mobile and web applications, cross-platform compatibility has become increasingly important for developers. React’s versatility extends beyond web development, as it can be used to build native mobile applications using frameworks like React Native. By leveraging a single codebase, developers can efficiently target multiple platforms, saving time and effort while ensuring a consistent user experience across different devices.\n\n### Easy Integration with Existing Projects\n\nIntegrating React into existing projects is seamless, thanks to its flexible architecture and compatibility with other libraries and frameworks. Whether you’re working with a legacy codebase or incorporating React into a new project, its modular nature allows for gradual adoption without needing a complete overhaul. This flexibility enables teams to leverage React’s capabilities incrementally, enhancing productivity and minimizing disruption.\n\n### Performance Optimization\n\nReact offers various optimization techniques to improve application performance and responsiveness. From code splitting and lazy loading to memoization and server-side rendering (SSR), React provides developers with tools to optimize bundle sizes, reduce time to interactive (TTI), and enhance overall user experience. By optimizing performance, developers can ensure that their React applications are fast, efficient, and scalable.\n\n### Disadvantages of React\n\n### Continuous updates\n\nThis JavaScript library is more like a set of evolving coding practices. Its latest versions are affected by recent updates and contributions around the world. So, learning React is a continuous process as the updates keep coming.\n\n### Increased complexity of code\n\nJSX, a combination of HTML and JavaScript, has a slightly intricate pattern for developers. So, using it also increases the code complexity.\n\n### Only focuses on View\n\nUsing ReactJS for app development will only help you focus on the View part of the MVC architecture. You must integrate it with other necessary tools like APIs or routing to take care of the rest.\n\n### Advantages of Bootstrap\n\n### Responsive design\n\nBootstrap's features help create a design that is responsive in structure and style. It is also compatible with various platforms.\n\n### Time-saving\n\nBootstrap offers ready-to-use resources that eliminate the need for coding and help you debug your site quickly. Even in custom development, Bootstrap's LESS and CSS preprocessors help save time.\n\n### Styling Components\n\nBootstrap provides a variety of themes, user templates, grid systems, and plugins that can be customized according to your project requirements.\n\n### Consistency and Compatibility\n\nYou can accomplish cross-browser consistency through excellent JavaScript and CSS compatibility in Bootstrap. It is compatible with all browsers, including Chrome, Safari, Firefox, Opera, and Internet Explorer.\n\n### Substantial community support\n\nBootstrap is an open-source framework. Hence, it is available on GitHub for free to use. The framework has garnered significant support from the community.\n\n### Easy to use\n\nYou can start using Bootstrap for development with basic knowledge of CSS and HTML.\n\n### Disadvantages of Bootstrap\n\n### Similar website templates\n\nBootstrap offers a very limited range of templates. So, all websites and apps built using Bootstrap will look more or less the same. To avoid the similarities, you have to implement extensive customization, and that too manually. This will take a lot of time and beats the framework's purpose.\n\n### Learning curve\n\nIt will take some time for developers to learn and master the framework. It also depends upon their knowledge of frontend technologies before training. They might have to get familiar with the class components and combinations.\n\n### Rewriting and Overriding\n\nIf your project requires heavy customization, your designs will start from standard Bootstrap designs. As a result, it will give way to consistency and compatibility issues.\n\n## Which Companies Use Bootstrap? What Of React?\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1606857521015-7f9fcf423740?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxjb21wYW55fGVufDB8fHx8MTcxOTA2MDMzM3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Companies Using Bootstrap\n\n### Apple Maps Connect\n\nApple products use MapKit JS to make their maps interactive for various platforms. This MapkitJS uses Bootstrap to build the UI designs.\n\n### Vogue\n\nVogue is a fashion magazine that uses Bootstrap to create responsive website designs and templates that are compatible with different devices. It uses a Bootstrap 12 grid layout to fit different content-based details on the same screen.\n\n### Whatsapp\n\nThe UI of the Whatsapp web app has been made using Bootstrap for creative design and better facilities and features than the desktop app.\n\n### Lyft\n\nIt is a ride-sharing organization that utilizes Bootstrap’s grid functions with creative drop-down plugins in its websites. This framework helped develop the websites quickly.\n\n### Companies Using React\n\n### Facebook\n\nFB is one of the largest social media sites globally, and it uses ReactJS as its Ad Manager. The FB web app is built using over 20 thousand React components.\n\n### PayPal\n\nPayPal is a renowned finance organization that uses ReactJS to improve its bookmarks, navigational workflows, and early rendering of PayPal’s payment gateway app.\n\n### Instagram\n\nFB, the parent company of Instagram, uses many ReactJS components to develop different functionalities of Instagram, too.\n\n### Twitter\n\nTwitter is the largest microblogging web app in America. This website uses ReactJS to enhance the user experience, update the content, and make a browser-based UI. The Twitter site was renovated using React architecture, and a PWA (Progressive Web App) was made.\n\n### The BBC\n\nBBC, aka the British Public Service Broadcaster, is a news channel that develops its web app using [ReactJS](https://www.etatvasoft.com/blog/reactjs-examples/), which makes it more navigational. This framework provides a super-fast UX and makes the website amazingly accessible across different devices.\n\n### Netflix\n\nNetflix is a popular video streaming platform that uses ReactJS to fix performance glitches and lessen the processing time for speedy startup speed and seamless UX.\n\n## Which One Should You Choose Between Bootstrap And React?\n\n![Bootstrap Vs React](https://images.unsplash.com/photo-1531539134685-27d854339120?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkaXNjdXNzfGVufDB8fHx8MTcxOTA2MDMxOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nBootstrap is ideal if you want complete flexibility over rows and columns for your unique designs. The technology saves the most time and allows even complex programs to be built quickly. Bootstrap requires basic HTML, CSS, and JavaScript components, making it suitable for creating scalable websites. Bootstrap could be the right choice for your project if you are unsure how to create reliable and high-quality software.\n\n### Focus on User Interaction and Performance\n\nOn the other hand, React is suitable if you're working on a front-end user interface that requires higher user interaction. React handles the lower-level algorithms, allowing you to focus on the interface view model. React's virtual DOM can help maintain website performance if you're struggling with an out-of-control codebase. React is also a good choice if you cannot build scalable solutions independently.\n\n### When to Choose React over React-Bootstrap\n\nReact's component-based architecture makes it perfect for creating simple, small-scale user interfaces. At the same time, Bootstrap offers unparalleled compatibility across numerous screen sizes, platforms, and browsers, making it perfect for creating complex web applications.\n\nReact Bootstrap is an excellent toolkit for building UI components and is more commonly used by web developers than any other React JS framework. To choose between Bootstrap and React for your next project, you must define your web development needs and consider factors such as the framework's business model, app type, features, and commercial viability.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Comparing Bootstrap and React for Front-End Development\n\nWhen it comes to building user interfaces, developers have a plethora of choices. Two significant ones are Bootstrap and React. Bootstrap is a front-end framework that simplifies the website design process, enabling developers to create responsive and mobile-first projects. React, on the other hand, is a JavaScript library that allows developers to create dynamic and interactive user interfaces.\n\n### Bootstrap Versatile, React Responsive\n\nBootstrap is a versatile framework covering many design elements, including typography, forms, buttons, navigation bars, and other elements developers often need for web development. React, on the other hand, is a JavaScript library that allows developers to create dynamic and interactive user interfaces.\n\n### Building Blocks for UIs\n\nDue to its component-based architecture, React allows developers to create reusable UI components that can be used across different parts of the application. Components can be nested within other components, allowing complex UI structures to be broken down into simpler, reusable parts.\n\n### Pre-Built Styles with Bootstrap\n\nUnlike React, Bootstrap is not a JavaScript library but a CSS framework. Instead, it consists of HTML, CSS, and JavaScript files. Bootstrap can be used for both simple and complex web projects. It provides a light, responsive grid system that ensures that web projects look good on all devices.\n\n### React's Component-Based Architecture for Reusability\n\nReact, in contrast, is a JavaScript library that assists developers in creating dynamic and interactive user interfaces. Its component-based architecture allows users to create reusable UI components that can be used in different application parts. Components can be nested within other components, allowing for complex UI structures to be broken down into simpler, reusable parts.\n\n### Customization Options in React and Bootstrap\n\nBootstrap Uses conventional CSS, React uses JSX. Bootstrap offers greater versatility than React, but React offers a more customizable and dynamic user interface. Use React to develop scalable, robust, and modular applications with ease.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/cards-ui-design.mdx",
    "content": "---\ntitle: A Guide to Modern Cards UI Design\ndescription: >-\n  Explore our complete guide to cards UI design. Learn core principles, common\n  layouts, and accessibility best practices to build intuitive interfaces.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-e13e7ad9-0502-4ca1-ab86-30ae64c01666.jpg\nauthor: Dillion Verma\ntags:\n  - cards ui design\n  - ui design patterns\n  - user interface\n  - web design\n  - component design\npublishedOn: \"2025-11-01T09:43:47.690365+00:00\"\nfeatured: true\n---\n\nThink of card UI design as a way to tidy up a messy room. Instead of having information scattered everywhere, you group related items into neat, rectangular boxes. Each of these \"cards\" is a self-contained unit, holding just enough information—like a picture, a title, and maybe a button—to be useful on its own. It's a simple concept that makes websites and apps feel instantly more organized and scannable.\n\n## Why Cards Are Essential in Modern UI Design\n\n![A grid of visually appealing UI cards displaying different content types, showcasing the modularity and scannability of card-based design.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/46ba2d77-8a64-4c4d-b5a5-de16b49a312a.jpg)\n\nImagine trying to find a specific recipe in a disorganized pile of papers versus flipping through a well-organized recipe box. That’s the exact difference **cards UI design** makes. It takes what could be a chaotic jumble of information and packages it into clean, bite-sized modules that people can understand at a glance.\n\nEach card serves as a compact preview for something bigger. Take a look at any e-commerce site: the product card gives you a quick hit of the essentials—an image, name, and price—just enough to get you interested without hitting you with a wall of text. This modular, summary-first approach is the secret to its success.\n\n### Creating a Consistent User Experience\n\nOne of the biggest wins for card-based design is how gracefully it adapts to different screens. We all jump between our phones, tablets, and desktops, and cards ensure the experience feels familiar no matter the device.\n\nA grid of cards that looks great on a big desktop monitor can neatly stack into a single, scrollable feed on a phone. Because the content inside each card is already grouped together contextually, that visual relationship stays intact. This natural responsiveness makes cards a go-to for building flexible, modern interfaces.\n\nThis consistency pays off in a few key ways:\n\n- **Reduces Cognitive Load:** People don't have to relearn your interface when they switch devices. The pattern is predictable.\n- **Improves Scannability:** The defined edges of each card guide the eye, letting users quickly hop from one item to the next.\n- **Enhances Usability:** Each card is its own interactive world. Tapping it leads to one place, making navigation feel simple and direct.\n\n> A well-designed card is more than just a box for content; it's a doorway. It offers a quick summary and a clear next step for anyone who wants to dive deeper, making it one of the most powerful patterns in any designer's toolkit.\n\n### The Power of Modularity and Flexibility\n\nThe modular nature of cards is a game-changer for designers and developers. Think of them like LEGO bricks. You can rearrange them, stack them, and reuse them to build all sorts of layouts without having to start from scratch every time.\n\nThis makes them incredibly efficient, especially for sites with tons of content, like news feeds, social media platforms, or even project management tools like [Trello](https://trello.com/). Once you establish that simple, repeatable card pattern, you have a foundation for an interface that’s not just visually clean but also easy to scale and maintain. It's an intuitive system that sets users up for success from the moment they land on the page.\n\n## The Anatomy of an Effective UI Card\n\n![A diagram showing the different components of a UI card, including the container, media, headline, supporting text, and call-to-action button.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7a291169-2284-4abd-a0d0-8584c10bce78.jpg)\n\nTo build a really great card, you have to know what it’s made of. Think of it like a chef understanding their ingredients—each component, from the container down to the call-to-action button, has a role to play. When you know how they work together, you can create designs that aren't just pretty but are genuinely useful.\n\nEvery piece has a job. When combined thoughtfully, they create an experience that feels intuitive and guides the user effortlessly. Let's break down the strategic purpose of each element in a successful **cards ui design**.\n\n### The Foundational Components\n\nThe most fundamental piece of any UI card is the **container**. This is the card's outer shell, the defined space that holds everything else together. It’s what tells the user, \"Hey, all this stuff belongs together.\" Usually, a subtle shadow, a clean border, or a simple block of color is enough to lift it from the background and signal that the whole package is a single, clickable unit.\n\nInside that container, the **media element** is almost always the first thing that catches the eye. This could be a photo, a short video, or an illustration that gives you the gist of the content in a split second. Quality visuals are non-negotiable here; they communicate information way faster than text and make the whole card more inviting.\n\n> A well-structured UI card is a masterclass in information hierarchy. It tells a story at a glance, guiding the user’s eye from the most important visual cue to the final action, all within a few square inches of screen space.\n\nNext up is **typography**. This is more than just throwing text on the card; it’s about styling it to create a clear visual path for the user's eye.\n\n- **Headline or Title:** This is your bold, attention-grabbing statement. It tells the user what the card is about in just a few words.\n- **Supporting Text:** This is the wingman to the headline. A short description or snippet that gives a little more context, like a product summary or the first line of an article.\n- **Metadata:** These are the finer details—a date, an author's name, or category tags. They provide useful, secondary information without cluttering the main message.\n\nBy playing with font size, weight, and color, you create a natural flow, leading the user from the most critical info down to the nice-to-haves.\n\n### Driving Engagement with Interactive Elements\n\nWhile the container and its content provide the _what_, **interactive elements** provide the _what's next_. These are the parts of the card that users can actually do something with—click, tap, or hover to make something happen. The most classic example is the call-to-action (CTA) button.\n\nA good CTA is impossible to miss. It should pop with a contrasting color and use clear, direct language like \"View Details\" or \"Add to Cart.\" There's no room for ambiguity; the user needs to know exactly what happens when they click. In some designs, the entire card is clickable, taking the user straight to a detail page. For more dynamic interactions, you can even explore animated components like those in the [Magic UI's card components](https://magicui.design/docs/components/magic-card) documentation.\n\nIcons also play a huge part. They act as universal shortcuts for actions like \"favorite,\" \"share,\" or \"comment,\" saving precious space and making the card easier to scan. Every interactive element needs a crystal-clear purpose to keep the user’s journey smooth and frustration-free.\n\nTo put it all together, here's a quick rundown of each component's role and how to get it right.\n\n### Anatomy of a UI Card Component\n\n| Component           | Primary Function                                        | Design Best Practice                                          |\n| :------------------ | :------------------------------------------------------ | :------------------------------------------------------------ |\n| **Container**       | To group related content and define a clickable area    | Use subtle shadows or borders for depth and separation.       |\n| **Media (Image)**   | To provide instant visual context and capture attention | Optimize images for fast loading without sacrificing quality. |\n| **Headline**        | To deliver the most critical information quickly        | Keep it short, descriptive, and visually dominant.            |\n| **Supporting Text** | To offer additional details and context                 | Use a smaller font size and keep it to 1-2 concise lines.     |\n| **CTA Button**      | To prompt a specific user action                        | Make it visually distinct with clear, action-oriented text.   |\n| **Icons**           | To provide shortcuts for secondary actions              | Use universally recognized symbols to ensure clarity.         |\n\nMastering these individual elements is the first step toward designing cards that not only look fantastic but also perform brilliantly.\n\n## Core Principles of Great Card Design\n\nWhat really separates a so-so card from a great one? It’s not about flashy animations or cramming in a ton of features. The magic is in how you apply a few simple, powerful principles.\n\nThink of it this way: great card design is about turning a simple rectangle into a smart, intuitive tool that feels good to use. Get these fundamentals right, and your cards won’t just hold information—they’ll create a genuinely seamless experience for your users.\n\n### Embrace Modularity Like Building Blocks\n\nThe first and most important principle is **modularity**. Treat each card like a LEGO brick. It’s a self-contained unit with everything it needs to make sense on its own: an image, a title, a quick description, maybe a button.\n\nThis independence is what makes card UIs so incredibly flexible. Because every card is its own self-sufficient module, you can shuffle them around into different layouts without confusing the user. A three-column grid on a desktop can elegantly reflow into a single, scrollable column on a phone. That’s the kind of responsive design that feels completely natural, no matter the screen size.\n\n### Design for Effortless Scannability\n\nLet's be real: nobody reads web pages word-for-word. We scan. A well-designed card leans into this behavior by creating a rock-solid **visual hierarchy**. The goal is simple: let users grab the most critical info in the blink of an eye.\n\nYou do this by giving different elements different \"weights.\"\n\n- **Lead with an image:** A strong visual is almost always the first thing the eye catches. It sets the scene instantly.\n- **Make the headline pop:** The title should be the biggest, boldest piece of text. It tells the user exactly what the card is about.\n- **Quiet down the details:** Things like dates, categories, or author names should be smaller and lighter. They’re there if you need them, but they don’t fight for attention.\n\nThis clear path guides the user's eye naturally from the big picture to the finer details.\n\n> Good scannability isn't just about making things look tidy. It's a sign of respect for your user's time. You’re acknowledging they’re busy and need to find what they're looking for, fast.\n\n### Maintain Unbreakable Consistency\n\nConsistency is the unsung hero of user experience. When every card in your UI plays by the same rules, users only have to learn how to use them once. This predictability drastically reduces their **cognitive load**, which is just a fancy way of saying they don't have to waste brainpower figuring out your interface.\n\nIf a user understands one card, they should intuitively understand them all. This applies to everything—from where the title sits to what the buttons look like. This consistent design language builds trust and makes the whole app feel more polished and professional.\n\n### Master the Subtle Details\n\nBeyond the big ideas, it's the little things that push a good design into the \"great\" category. These small touches often work on a subconscious level, shaping how users perceive the quality and polish of your interface.\n\nOne of the most powerful—and most often ignored—details is **whitespace**. Giving your content room to breathe is crucial. Good spacing prevents a card from feeling cluttered and overwhelming, and it quietly reinforces the visual hierarchy by separating different bits of information.\n\nAnother key detail is the use of **shadows**. A soft, subtle shadow can lift a card off the background, giving it a sense of depth and making it feel like a real object. This isn't just decoration; it clearly defines the card's edges and signals that it’s a distinct, interactive element. It makes the whole thing feel more tangible and clickable, practically begging to be tapped.\n\n## Common Cards UI Layout Patterns\n\nOnce you've nailed the design of a single card, the next big question is: how do you arrange a whole bunch of them? The layout pattern you pick for your **cards UI design** is a huge deal. It fundamentally shapes how people browse and interact with your content.\n\nThink of it like this: you can have a neatly organized bookshelf or a chaotic pile of books. Both hold the same information, but one is a whole lot easier to navigate.\n\nChoosing the right layout isn't just about making things look pretty—it's a strategic move. Each pattern serves a different purpose, whether it's for rapid scanning, reading in order, or just visual discovery. Getting a handle on these common arrangements is the key to building an interface that just _feels_ right.\n\nThis concept map breaks down the core principles that hold up any good card layout: Modularity, Scannability, and Consistency.\n\n![Infographic about cards ui design](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/adb91985-4cec-49a4-8580-dc345074e63b.jpg)\n\nIt’s a good reminder that no matter which pattern you choose, these three pillars are non-negotiable for a clear and effective user experience.\n\n### The Classic Grid Layout\n\nThe grid is probably the layout you see the most. It arranges cards in a clean, symmetrical pattern of rows and columns, a lot like a photo gallery. This structure is perfect when the visuals are the star of the show.\n\nYou see it on e-commerce sites, portfolio pages, and video streaming services all the time. A grid lets users scan a ton of items quickly, comparing them visually at a glance. Because every card is the same size, the layout feels predictable and orderly, which cuts down on cognitive load and makes browsing feel effortless. The grid is the undisputed champ when discoverability and visual comparison are top priorities.\n\n### The Sequential List Layout\n\nWhere the grid is all about visual browsing, the list layout is built for sequential consumption. This pattern stacks cards vertically, one after another, creating a clear top-to-bottom reading path. It’s the go-to choice for content that has a chronological or narrative flow.\n\nThis pattern is everywhere—from news feeds and email inboxes to your favorite task manager. A list layout naturally encourages users to process one item at a time before moving on to the next. For content that’s mostly text-based or needs to be understood in a specific order, the list provides a focused, linear experience that a grid just can't deliver. If you want to dive deeper into how this works in practice, our guide on the [MUI Card component](https://magicui.design/blog/mui-card) has some great examples.\n\n> The layout isn't just a container for your cards; it tells a story about how your content should be consumed. A grid invites exploration, while a list provides a clear path.\n\n### The Dynamic Masonry Layout\n\nSo, what happens when your cards aren't all the same height? Enter the masonry layout, made famous by Pinterest. It arranges cards in a multi-column grid but staggers them vertically, killing all that awkward empty space and creating a tightly packed, \"brick-like\" wall of content.\n\nThis pattern is fantastic for showcasing a diverse collection of items with different dimensions, without having to crop images or force everything into a uniform box. The result is a dynamic, visually engaging experience that just begs you to keep scrolling and discovering what's next.\n\n- **When to Use Grid:** Perfect for uniform, visually-driven content like product listings or photo galleries.\n- **When to Use List:** Best for sequential content that needs to be read in order, such as articles or notifications.\n- **When to Use Masonry:** Ideal for visually eclectic content of varying heights, promoting discovery and exploration.\n\nBy carefully picking the layout that actually fits your content and what your users are trying to do, you can dramatically improve the usability and overall feel of your interface.\n\n## How to Design Accessible and Inclusive Cards\n\nGreat design is more than just good looks; it's about making sure everyone can actually use what you've built. When it comes to **cards ui design**, accessibility isn't some extra feature you tack on at the end. It's baked into the very foundation of a solid, user-friendly experience.\n\nThinking about inclusivity from the get-go doesn't just check a box for users with disabilities—it almost always leads to a better, more intuitive design for every single person. It’s about making your cards functional for someone using a screen reader, navigating with a keyboard, or dealing with visual impairments. If we nail a few key areas, we can build cards that are truly effective for everyone.\n\n### The Foundation: Semantic HTML\n\nLong before a user ever lays eyes on your card, their browser and assistive tech need to understand what they're looking at. This is where **semantic HTML** becomes your best friend. Using the right tags for the right content gives tools like screen readers a clear map to follow.\n\nDon't just wrap everything in a generic `<div>`. Instead, use meaningful elements like `<article>` for the card container, an `<h2>` for its title, and `<p>` for the description. Think of it as labeling the rooms in a house. Without labels, a screen reader is completely lost. With them, it can confidently announce, \"Here's a heading,\" or \"This is a paragraph,\" giving users the context they need to get around efficiently.\n\n### Visual Clarity and Color Contrast\n\nOne of the quickest ways to lose a user is to make your content hard to read. That's why the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/WAI/standards-guidelines/wcag/) set crystal-clear standards for color contrast, especially for users with low vision.\n\n> According to WCAG 2.1, the contrast ratio between your text and its background needs to be at least **4.5:1** for normal text and **3:1** for large text. This isn't just a friendly suggestion; it's the baseline for creating a legible interface.\n\nYou can easily use an online contrast checker to test your color pairings. Pay close attention to text layered over images and the colors you use for buttons. Getting this right is a simple step that makes a world of difference in usability.\n\n### Making Images Meaningful\n\nImages on your cards often carry important information, but for someone using a screen reader, they might as well be invisible—unless you provide **alternative text (alt text)**. Good alt text describes the content and purpose of an image, making sure nobody misses out on crucial context.\n\nJust follow these simple rules:\n\n- **Be descriptive, but brief:** Say what's in the image without writing a novel. For a product card, \"White running shoe with blue accents\" is way better than just \"shoe.\"\n- **Explain the function:** If an image is also a link, the alt text should tell the user where it goes. Something like, \"Read more about our summer sale.\"\n- **Mark decorative images correctly:** If an image is purely for looks and adds zero new information, use an empty alt attribute (`alt=\"\"`). This tells screen readers they can safely skip it.\n\n### Keyboard-Friendly Navigation\n\nRemember, not everyone uses a mouse. Plenty of people rely on a keyboard or other input devices to get around. This means your cards have to be fully usable without a pointer, and every interactive element needs to be reachable with the Tab key.\n\nMake sure the focus order is logical. As a user hits Tab, the focus should move through the card’s interactive bits—buttons, links, icons—in a way that makes sense. It's also vital to have a clear and visible focus indicator (like a distinct outline) so users always know exactly where they are on the page.\n\n## Learning from the Best in the Business\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/XZf5A0wcruE\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTheory is great, but seeing how the pros put it into practice is where the real learning happens. When you start dissecting how top-tier companies use **card UI**, you can see the principles of scannability, modularity, and consistency come alive to create experiences that just _feel_ right.\n\nLet's take a look under the hood at how giants like Airbnb, Spotify, and Trello have absolutely mastered the art of the card. These platforms couldn't be more different, yet they all lean heavily on cards to make complex information simple and inviting. Each one offers a masterclass in tailoring design to fit specific user goals.\n\n### Airbnb: The Art of the Tease to Drive Bookings\n\nAirbnb's entire business model hinges on getting you to click that \"Book\" button. Their listing cards are precision-engineered for exactly that purpose. They are a brilliant exercise in information hierarchy, boiling down an entire property into a bite-sized, scannable preview.\n\nYour eyes are immediately drawn to a carousel of gorgeous images—the quickest way to communicate the vibe of a place. All the essential info is right there: location, rating, dates, and price, presented with clean typography and just enough breathing room to make comparing listings a breeze. Notice the only secondary action is a simple \"heart\" icon. That's intentional. It keeps the focus squarely on the main prize: clicking through to see more.\n\n> Airbnb’s cards don't overwhelm you with details. They give you just enough to pique your curiosity and earn the click. It’s a powerful lesson that great card design is as much about what you leave out as what you put in.\n\n### Spotify: A Visual Feast for Music Discovery\n\nSpotify wants you to get lost in a world of new music, and their cards are built to be as browsable as a vintage record store. Whether you're looking at an album, a playlist, or a podcast, each card uses striking cover art as the main hook.\n\nThis visual-first approach transforms music discovery from a chore into an engaging, almost tangible experience. The text is kept to a minimum—just a title and artist—because the artwork is doing all the heavy lifting. Spotify's cards are a perfect reminder that when your content is inherently visual, you need to let it be the star of the show.\n\nThis same principle of concise, visual-first content applies to social media cards, too. A well-designed Tweet card, for example, makes content instantly digestible and shareable. You can see how we build one in our guide for the [Tweet Card component](https://magicui.design/docs/components/tweet-card).\n\n### Trello: Pure Function for Peak Productivity\n\nOver at Trello, cards are the very heart of their project management tool. Here, design choices prioritize function over flair, and for good reason. Each card is a task, stripped down to its functional core—a title, labels, and small icons indicating attachments or comments.\n\nThere’s no aspirational imagery like on Airbnb or Spotify. These cards are workhorses. Their genius is in their dead-simple flexibility. You can drag and drop them between lists, giving you a satisfying, tactile way to update a project's status. It makes managing even the most complex workflows feel surprisingly intuitive.\n\nBeing able to design functional, elegant solutions like these is a key skill. If you want to show off your UI design chops, think about [creating a compelling UX portfolio](https://remotefirstjobs.com/blog/good-ux-portfolio) that showcases how you solve these kinds of real-world problems.\n\n## Frequently Asked Questions\n\nWhen you're deep in the weeds of **card UI design**, the same practical questions tend to surface again and again. Getting these right can be the difference between a clunky interface and a smooth, intuitive one.\n\n### How Many Actions Should a Card Have?\n\nThe golden rule here is simple: **less is more**.\n\nIdeally, a card should feature one clear, primary action. At most, you might add one or two secondary actions, but tread carefully. Piling on too many buttons or clickable areas creates decision paralysis for the user, making your interface feel cluttered and confusing.\n\nA great example is a product card. It might have a bold \"View Details\" button as the main call-to-action, with a much smaller \"Save to Wishlist\" icon tucked away. This creates a natural hierarchy, guiding the user to the most important next step without overwhelming them.\n\n> Remember, a card's main job is to be a concise summary—a gateway to more detailed content. Overloading it with interactive elements completely undermines its purpose.\n\n### What Is the Difference Between a Card and a Tile?\n\nIt's easy to mix these up since they're both container-based elements, but their complexity and purpose are quite different.\n\n- **Tiles** are the simpler of the two. Think of them as just an image with maybe a bit of text on top. They're straightforward navigation links, like the movie posters you see on a streaming service's home screen.\n- **Cards**, on the other hand, pack more of a punch. They contain a mix of content like a title, descriptive text, metadata, and often multiple actions. They give you a much richer summary of what's inside.\n\nHere's an easy way to think about it: a tile is a signpost, while a card is a detailed brochure. Both point you somewhere, but a card gives you way more information upfront to help you decide if you even want to go.\n\n### Why Are Cards So Popular in Mobile Design?\n\nThe explosion of card-based layouts goes hand-in-hand with the rise of mobile. There's a good reason for that.\n\nCards are incredibly effective on smaller screens because they break down complex information into digestible, self-contained chunks. This modular approach is a lifesaver for usability, simplifying navigation and perfectly supporting the quick-scan behavior we all adopt on our phones. Extensive UX research backs this up, showing it's one of the most effective patterns out there. If you want to dive deeper, check out these key mobile app design trends.\n\nTheir sheer adaptability and clarity have made them an essential part of any modern designer's toolkit for crafting efficient, user-friendly mobile experiences.\n\n---\n\nReady to build beautiful, animated interfaces without the usual grind? **Magic UI** offers a library of **150+** free, open-source components, plus powerful Pro templates to create stunning landing pages in minutes.\n\n[Get started with Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/carousel-user-interface.mdx",
    "content": "---\ntitle: Build a Modern Carousel User Interface with React\ndescription: >-\n  Learn how to build a responsive and accessible carousel user interface with\n  React and Magic UI. This guide covers setup, customization, and real-world\n  examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/16d1658a-1972-4e12-bb61-7408cf4ee51f/carousel-user-interface-digital-workflow.jpg\nauthor: Dillion Verma\ntags:\n  - carousel user interface\n  - react\n  - magic ui\n  - tailwind css\n  - web development\npublishedOn: \"2025-12-02T08:17:47.646285+00:00\"\nfeatured: true\n---\n\nYou've probably seen a million carousels. They're everywhere, showing off a bunch of content—products, articles, you name it—in a neat, scrollable package. At its core, a **carousel user interface** is just a dynamic way to present a series of items in a compact space.\n\nBut let's be real. Most of them are slow, clunky, and a nightmare for accessibility. They don't have to be that way.\n\n## Why a Modern Carousel Is a Game-Changer\n\n![Four blank white brochures or folded papers arranged neatly on a light pink surface with an eraser.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3b789aa7-0930-4782-8ce8-2d2c611dbba6/carousel-user-interface-folded-papers.jpg)\n\nA well-designed carousel can be a secret weapon for improving content discovery and keeping users hooked, especially on mobile where every pixel counts.\n\nThis guide isn't about those tired, old-school sliders. We're going to build an interface that people actually enjoy using. We'll use [React](https://react.dev/), [TypeScript](https://www.typescriptlang.org/), and the slick animations from [Magic UI](https://magicui.design/) to make it happen.\n\n### It All Started With Mobile\n\nThe modern carousel is a direct result of our phone-obsessed world. With mobile devices driving over **50% of global website traffic** since 2017, designers and developers had to completely rethink how we interact with horizontal content.\n\nThis shift has pushed over **41% of websites** to adapt their layouts to feel more natural with touch-based navigation. You can see more stats that back this up over on [linearity.io](https://www.linearity.io/blog/web-design-statistics/). It just proves the need for components that are fluid and intuitive, no matter the screen size.\n\n### The Real Perks of a Well-Built Carousel\n\nWhen you get it right, a carousel brings some serious advantages to the table for both your users and your development team:\n\n- **Smarter Use of Space:** It bundles related content into a single, interactive block. This is a lifesaver for keeping homepages, product galleries, or featured sections from turning into a cluttered mess.\n- **Boosted Engagement:** Let's face it, motion catches the eye. The dynamic movement and interactive controls naturally encourage people to explore more than a static grid ever could.\n- **Guided Discovery:** It creates a clear path for users to browse through a curated set of items, making it an excellent tool for shining a spotlight on what's most important.\n\n> By focusing on performance, accessibility, and smooth animations, you can turn a frequently misused component into a powerful asset. The goal is to make interaction feel effortless and rewarding.\n\nThinking about the difference between what we're building and the clunky sliders of the past can be helpful. Here’s a quick breakdown:\n\n### Modern Carousel Features vs Traditional Sliders\n\n| Feature             | Traditional Slider                        | Modern Carousel (This Guide)                       |\n| :------------------ | :---------------------------------------- | :------------------------------------------------- |\n| **Performance**     | Often heavy, loads all images at once.    | Lightweight, uses lazy loading for speed.          |\n| **Responsiveness**  | Awkward resizing, poor touch support.     | Fully responsive, designed for touch.              |\n| **Accessibility**   | Lacks ARIA roles, not keyboard-navigable. | Accessible with ARIA, full keyboard support.       |\n| **Animation**       | Jerky, CSS-based transitions.             | Fluid, physics-based animations via Framer Motion. |\n| **User Experience** | Auto-playing, confusing navigation.       | User-controlled, intuitive gestures and controls.  |\n\nAs you can see, the modern approach prioritizes the user experience in ways that older implementations simply didn't.\n\nUltimately, a great carousel is just one piece of the puzzle. To broaden your toolkit, check out our deep dive on other common [user interface design patterns](https://magicui.design/blog/user-interface-design-patterns).\n\n## Getting Your React Development Environment Ready\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/RbZyQWOEmD0\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nBefore we start building the carousel itself, we need to lay down a solid foundation. Trust me, spending a few minutes setting up a clean, modern development environment now will save you from a world of headaches later on. It’s the best way to avoid frustrating bugs and make the whole process smoother.\n\nWe're going with a modern stack that’s all about speed and reliability. First up, we'll scaffold a new React project using [Vite](https://vitejs.dev/). If you haven't used Vite before, you're in for a treat. It's significantly faster than older tools because it uses native ES module support. This means your server starts almost instantly, and hot module replacement feels immediate.\n\nLet's get started. Open up your terminal and run this command:\n\n`npm create vite@latest my-carousel-app --template react-ts`\n\nThis simple command creates a new directory called `my-carousel-app` and populates it with a starter React and TypeScript project. Once it’s done, just hop into your new project folder.\n\n`cd my-carousel-app`\n\n### Weaving in Tailwind CSS for Styling\n\nWith our React project fired up, the next piece of the puzzle is styling. We'll be using [Tailwind CSS](https://tailwindcss.com/), a utility-first framework that makes building responsive, custom designs incredibly fast without having to write a single line of custom CSS.\n\nFirst, let's get Tailwind and its dependencies installed.\n\n`npm install -D tailwindcss postcss autoprefixer`\n`npx tailwindcss init -p`\n\nRunning these commands will add two new files to your project: `tailwind.config.js` and `postcss.config.js`. Now we just need to tell Tailwind where to look for our class names. Open up `tailwind.config.js` and update the `content` array so it looks like this:\n\n```js\n/** @type {import('tailwindcss').Config} */\nexport default {\n  content: [\"./index.html\", \"./src/**/*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThe final setup step is to wire Tailwind into our main CSS file. Open `src/index.css`, delete whatever is in there, and replace it with these three lines:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\n> And that's it. This ensures that all of Tailwind's base styles, component classes, and utility classes are properly injected into your app's build, giving you full access to its styling power.\n\n### Bringing in the Magic UI Carousel Component\n\nAlright, time for the main event—adding the star of the show. We’re going to install the `magicui-react` package, which gives us the exact carousel component we need. It's a fantastic little package, built on top of [Radix UI](https://www.radix-ui.com/) for rock-solid accessibility and [Framer Motion](https://www.framer.com/motion/) for silky-smooth animations.\n\nBack in your terminal, run this command to install the package:\n\n`npm install magicui-react`\n\nWith that final piece in place, your development environment is fully locked and loaded. You now have a speedy React project with TypeScript for type safety, Tailwind CSS for efficient styling, and the powerful Magic UI carousel component ready to go. Now, we can get down to the business of actually building our carousel.\n\n## Building Your First Functional Carousel\n\n![A hand-drawn document titled 'Carousel Corporation' alongside a conceptual diagram with three colored blocks and labels.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e09e1513-226f-4b44-9658-bee2e2ddb8c5/carousel-user-interface-ui-diagram.jpg)\n\nAlright, with our project all set up, it's time for the fun part—actually building something. The goal here is to get a quick win and see our carousel come to life. We're going to dive right in with a complete, working example you can drop straight into your project.\n\nI find this hands-on approach is the best way to see how all the pieces connect. Don't stress about understanding every single line just yet. For now, let's just focus on getting a functional **carousel user interface** up and running. We'll break it all down right after.\n\n### Your First Carousel Component\n\nLet's start by creating a new file in your `src` directory. Name it `CarouselComponent.tsx`. Keeping components in their own files like this is a great habit for organization and makes them much easier to reuse later.\n\nGo ahead and copy the code below and paste it into your new `CarouselComponent.tsx` file.\n\n```tsx\nimport {\n  Carousel,\n  CarouselContent,\n  CarouselItem,\n  CarouselNext,\n  CarouselPrevious,\n} from \"magicui-react\"\n\nimport { Card, CardContent } from \"@/components/ui/card\" // Assuming a basic Card component exists\n\nconst carouselItems = [\n  { id: 1, text: \"Slide 1\" },\n  { id: 2, text: \"Slide 2\" },\n  { id: 3, text: \"Slide 3\" },\n  { id: 4, text: \"Slide 4\" },\n  { id: 5, text: \"Slide 5\" },\n]\n\nexport function CarouselComponent() {\n  return (\n    <div className=\"relative mx-auto w-full max-w-lg p-4\">\n      <Carousel className=\"w-full\">\n        <CarouselContent>\n          {carouselItems.map((item) => (\n            <CarouselItem key={item.id} className=\"basis-1/3\">\n              <div className=\"p-1\">\n                <Card className=\"shadow-md\">\n                  <CardContent className=\"flex aspect-square items-center justify-center rounded-lg bg-gray-100 p-6\">\n                    <span className=\"text-xl font-semibold\">{item.text}</span>\n                  </CardContent>\n                </Card>\n              </div>\n            </CarouselItem>\n          ))}\n        </CarouselContent>\n        <CarouselPrevious className=\"absolute top-1/2 left-[-50px] -translate-y-1/2\" />\n        <CarouselNext className=\"absolute top-1/2 right-[-50px] -translate-y-1/2\" />\n      </Carousel>\n    </div>\n  )\n}\n```\n\n> That's it! This single file has everything you need for a basic, visually appealing carousel. It pulls in the components, sets up some dummy data, and then maps over that data to render each slide.\n\n### Breaking Down the Code\n\nSo, what’s actually happening in that snippet? Let's walk through it. Understanding these core pieces is the key to tweaking the carousel to your liking down the road.\n\n- **Imports from `magicui-react`**: First, we pull in our building blocks. `Carousel` is the main wrapper, `CarouselContent` holds all the slides, and `CarouselItem` is the container for each individual slide. The `CarouselPrevious` and `CarouselNext` components are, you guessed it, the navigation buttons.\n\n- **The Data**: That `carouselItems` array is just some placeholder content to get us started. Each object in the array represents one slide. In a real-world project, you'd likely fetch this data from an API, and we'll definitely touch on that later.\n\n- **Component Structure**: The JSX itself is pretty clean. The `Carousel` component wraps everything and manages the state. Inside it, `CarouselContent` uses a flexbox layout to neatly arrange all the `CarouselItem` children in a row.\n\n- **Mapping and Rendering**: Here, we’re using the standard JavaScript `.map()` function to loop through our `carouselItems`. For each item, we spit out a `CarouselItem`, making sure to pass a unique `key` prop—that’s a React fundamental you can't skip when rendering lists.\n\n- **Styling with Tailwind CSS**: You'll notice all the `className` props. We're leaning on [Tailwind CSS](https://tailwindcss.com/) utility classes for styling. For example, `basis-1/3` on the `CarouselItem` is what tells each slide to take up one-third of the container's width, which results in showing three slides at once.\n\nTo see it in action, just import and render `<CarouselComponent />` inside your main `App.tsx` file. And just like that, you've got a fully functional, responsive carousel ready to be customized. This is the solid foundation we’ll build on in the next sections.\n\n## Customizing Your Carousel with Animations\n\n![Minimalist user interface showing stacked cards, a media playback progress bar, and control options.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5b52b523-2058-404d-8c57-b5d196fd7d2a/carousel-user-interface-ui-controls.jpg)\n\nGetting a functional carousel on the page is a solid first step, but the real fun begins when you start tweaking the details. This is where we go beyond the defaults and shape a **carousel user interface** that feels custom-built for your brand and actually delights people with fluid, thoughtful motion.\n\nWith Magic UI and Tailwind CSS, you can layer in these subtle yet powerful customizations without getting tangled up in complex stylesheets. The whole approach is built around passing props directly to the `<Carousel />` component. Magic UI gives you a clean API to control everything from animation behavior to the layout's orientation. Let's dig into some of the most impactful options you can play with.\n\n### Fine-Tuning Animation and Behavior\n\nThe default slide animation is pretty smooth out of the box. But what if you want something snappier? Or maybe a more deliberate, slower pace? You can even change the interaction entirely. A few key props make this happen.\n\nLet's jump back to our `<Carousel />` tag and add a few new options. Simply adjusting the transition's duration or adding a small delay can completely change the vibe of your interface, making it feel more responsive or more elegant.\n\n```tsx\n<Carousel\n  opts={{\n    align: \"start\",\n    loop: true,\n  }}\n  className=\"w-full\"\n>\n  {/* ... CarouselContent and CarouselItems ... */}\n</Carousel>\n```\n\nSo, what are these options doing for us?\n\n- **`align: \"start\"`**: This little gem ensures the first item in view lines up perfectly with the left edge of its container. It’s a small thing, but it creates a much cleaner, more organized look.\n- **`loop: true\"`**: This is a classic for a reason—users love it. It creates an infinite scrolling experience. When someone gets to the last item, the carousel just seamlessly wraps around to the beginning. No dead ends.\n\n> Just by adding a couple of lines to the `opts` prop, you've already made the carousel feel more dynamic and intentional. These are the kinds of small adjustments that separate a generic, off-the-shelf component from a polished, professional one.\n\n### Switching to a Vertical Layout\n\nWhile horizontal carousels are the standard, sometimes a vertical layout is the perfect fit. Think of a news ticker, a featured items list in a sidebar, or even a vertical product gallery. Magic UI makes this switch surprisingly simple.\n\nAll it takes is adding the `orientation=\"vertical\"` prop to both the `<Carousel />` and `<CarouselContent />` components. Of course, you’ll also need to tweak your Tailwind CSS classes to manage vertical height and spacing instead of horizontal width.\n\n```tsx\n<Carousel orientation=\"vertical\" className=\"w-full max-w-lg\">\n  <CarouselContent className=\"h-[400px]\">\n    {/* ... Your CarouselItems ... */}\n  </CarouselContent>\n  <CarouselPrevious />\n  <CarouselNext />\n</Carousel>\n```\n\nYou'll notice we set a fixed height on `CarouselContent` with `h-[400px]`. This is absolutely crucial for vertical carousels. The container needs a defined boundary to scroll within, otherwise, it won't know where to stop.\n\nIf you’re looking for more inspiration on how to create visually engaging web elements, this guide on [ecommerce website design focusing on slick animations](https://grassrootscreativeagency.com/dubai-ecommerce-website-design/) is a great resource.\n\nThe animations you add to your carousel user interface are just one piece of the puzzle. To really level up, think about how motion can be tied to user actions across your entire site. Our guide on implementing [CSS animation on scroll](https://magicui.design/blog/css-animation-on-scroll) dives into some excellent techniques you can apply everywhere, creating a more cohesive and engaging experience for your users.\n\n## Making Your Carousel Accessible and Performant\n\nA stylish carousel with slick animations is a great start, but it falls flat if it's slow or unusable for a portion of your audience. Performance and accessibility aren't just boxes to tick; they're the very foundation of a truly professional **carousel user interface**.\n\nThese elements directly impact how people perceive your site. Getting them right ensures your component feels fast and is inclusive for everyone. This is a big deal, considering **74% of businesses** see user experience as vital for boosting sales.\n\n![Illustration of a user viewing a slow-loading video in a web browser, with performance issues and a broken speed gauge.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2dd74dd8-505f-4cad-a607-247a9c082f37/carousel-user-interface-web-performance.jpg)\n\n### Weaving in Accessibility Features\n\nAccessibility (often shortened to a11y) is all about designing for everyone, including those who rely on assistive technologies like screen readers. The good news? The Magic UI carousel component, which is built on Radix UI, handles a lot of the heavy lifting for you with built-in ARIA attributes and keyboard navigation.\n\nStill, there's always room to improve. One of the most impactful things you can do is add clear, descriptive labels for your navigation controls.\n\n```tsx\n<CarouselPrevious aria-label=\"Go to previous slide\">\n  <span className=\"sr-only\">Previous Slide</span>\n</CarouselPrevious>\n<CarouselNext aria-label=\"Go to next slide\">\n  <span className=\"sr-only\">Next Slide</span>\n</CarouselNext>\n```\n\nHere's what's happening in that snippet:\n\n- The `aria-label` gives screen reader users a clear, descriptive label, telling them exactly what the button does.\n- That `sr-only` class from Tailwind CSS visually hides the text but keeps it available for screen readers, adding another helpful layer of context.\n\n### Optimizing for Speed and Efficiency\n\nPerformance is the other side of the user experience coin. A carousel packed with high-resolution images can easily become the heaviest element on your page, leading to painful load times and frustrated users. Two key strategies can help you combat this lag.\n\nFirst up: **lazy loading** your images. This simple technique tells the browser to hold off on loading off-screen images until the user actually scrolls them into view. It can dramatically slash your initial page load time, and most modern browsers support it natively with a single attribute.\n\n```jsx\n<img src=\"your-image.jpg\" loading=\"lazy\" alt=\"Descriptive alt text\" />\n```\n\nSecond, you'll want to prevent unnecessary re-renders in React. If your carousel sits inside a larger component that updates frequently, you can wrap it in `React.memo`. This is a memoization technique that tells React to skip re-rendering the carousel unless its props have actually changed, saving valuable processing power.\n\nFor a deeper dive into making sure your carousel is snappy on all devices, especially mobile, it's worth reviewing general strategies for [mobile website optimization](https://www.blockstudio.co/post/mobile-website-optimization).\n\n> By treating accessibility and performance as core features from the start, you create an experience that is not only beautiful but also robust, fast, and welcoming to every single user.\n\nOptimizing a single component is a great start. For a broader look at improving your site's speed, check out our guide on https://magicui.design/blog/how-to-improve-website-loading-speed.\n\nRight, a static carousel is a nice starting point, but let's be honest—it’s not very useful in the real world. The real magic happens when your components can display dynamic, live content. This is where we’ll connect our carousel to an API and turn it into something production-ready.\n\nWe'll be using two of the most fundamental hooks in [React](https://react.dev/): `useState` and `useEffect`. This approach is the bread and butter of React development, letting us build a flexible UI that can show off anything from featured products on an e-commerce site to the latest articles on a blog.\n\n### Setting Up State and Fetching Data\n\nFirst things first, we need a place to store the data once we get it. We also need to keep track of whether the data is still loading and if anything went wrong during the fetch. The `useState` hook is perfect for managing these different states.\n\nWe'll set up three state variables:\n\n- `items`: An array to hold our carousel content.\n- `loading`: A boolean to show a loading message while we wait for the API.\n- `error`: A string to store any error messages if the fetch fails.\n\nNext, we'll use the `useEffect` hook to actually go and grab the data. By giving it an empty dependency array (`[]`), we're telling React to run this code just once, right after the component first renders. It's the standard, clean way to handle side effects like API calls.\n\nHere’s how you can structure the logic inside your `CarouselComponent.tsx` file.\n\n```tsx\nimport React, { useEffect, useState } from \"react\"\nimport { Carousel, CarouselContent, CarouselItem } from \"magicui-react\"\n\n// It's always a good idea to define a type for your data.\n// This gives you TypeScript safety and auto-completion.\ninterface CarouselItemData {\n  id: number\n  title: string\n  imageUrl: string\n}\n\nexport function DynamicCarouselComponent() {\n  const [items, setItems] = useState<CarouselItemData[]>([])\n  const [loading, setLoading] = useState<boolean>(true)\n  const [error, setError] = useState<string | null>(null)\n\n  useEffect(() => {\n    const fetchData = async () => {\n      try {\n        // Replace this with your actual API endpoint\n        const response = await fetch(\"https://api.example.com/posts\")\n        if (!response.ok) {\n          throw new Error(\"Network response was not ok\")\n        }\n        const data = await response.json()\n        setItems(data)\n      } catch (error) {\n        setError(error.message)\n      } finally {\n        setLoading(false)\n      }\n    }\n\n    fetchData()\n  }, []) // The empty array ensures this effect runs only once.\n\n  if (loading) return <p>Loading content...</p>\n  if (error) return <p>Error: {error}</p>\n\n  return (\n    <Carousel className=\"mx-auto w-full max-w-2xl\">\n      <CarouselContent>\n        {items.map((item) => (\n          <CarouselItem key={item.id} className=\"md:basis-1/2 lg:basis-1/3\">\n            {/* ... Render your item content here using item.title, item.imageUrl, etc. ... */}\n          </CarouselItem>\n        ))}\n      </CarouselContent>\n    </Carousel>\n  )\n}\n```\n\n### Real-World Applications\n\nOnce you’ve mastered this data-fetching pattern, you can use it just about anywhere. Carousels are all over content-heavy platforms like streaming services because they’re fantastic for content discovery. In fact, companies invest a lot in A/B testing different carousel designs to see what keeps users clicking. There are even entire [UI studies dedicated to carousel effectiveness](https://www.frontiersin.org/journals/big-data/articles/10.3389/fdata.2022.910030/full) that you can dig into.\n\n> By connecting your carousel to a live data source, you transform it from a static UI element into a powerful tool for showcasing timely and relevant information. This is crucial for keeping your application fresh and engaging for return visitors.\n\nThink about all the places you could use this:\n\n- **E-commerce Product Galleries:** Automatically display \"New Arrivals\" or \"Best Sellers\" pulled straight from your inventory.\n- **Testimonial Sliders:** Fetch the latest glowing customer reviews from a CMS to build social proof on your landing page.\n- **Featured Blog Posts:** Showcase your most recent articles on the homepage to pull readers deeper into your site.\n- **Portfolio Showcase:** Load project details and images dynamically, so your portfolio is always up-to-date without you ever touching the code.\n\nThe beauty of this approach is its reusability. Each of these scenarios uses the exact same component structure we just built. All you have to do is swap out the API endpoint and tweak how the data gets rendered.\n\n---\n\nReady to build stunning, animated user interfaces with production-ready components? Explore the entire library of free and premium components from **Magic UI** and start creating beautiful landing pages in minutes. Check out all the tools at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/chakra-ui-vs-material-ui.mdx",
    "content": "---\ntitle: \"Ultimate Comparison Of Chakra UI Vs Material UI\"\ndescription: \"Chakra UI vs Material UI: Which one is right for you? Explore each to make an informed decision for your UI design needs.\"\nimage: https://cdn.magicui.design/assets/f86ec78f-814b-4218-99b6-48d42dcec775.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-19\"\nfeatured: false\n---\n\nAre you searching for the ideal React UI Framework to enhance your development workflow? The choice between Chakra UI and Material UI can be challenging. Comparing these [UI frameworks](https://magicui.design/blog/ui-frameworks) to find the best fit for your React development projects. Do you want to make your React development more efficient and enjoyable? Let's explore how Chakra UI and Material UI stack up against each other to determine which aligns best with your preferences and requirements for React development.\n\n## What is Chakra UI?\n\n![Chakra UI Vs Material U](https://images.unsplash.com/photo-1586953208448-b95a79798f07?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxjaGFrcmElMjB1aXxlbnwwfHx8fDE3MTkwNjIxMDR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nChakra UI, a relatively newer player in the market, is a React UI library emphasizing simplicity, modularity, and accessibility. It's designed to be simple to use yet offers a high degree of customization. Chakra UI's \\[unique style props approach\\]([https://www.geeksforgeeks.org/react-chakra-ui-common-style-props/#:~:text=Chakra-UI](https://www.geeksforgeeks.org/react-chakra-ui-common-style-props/#:~:text=Chakra-UI) [common style props,shorthand ways to style components.)](<https://www.geeksforgeeks.org/react-chakra-ui-common-style-props/#:~:text=Chakra%2DUI%20common%20style%20props,shorthand%20ways%20to%20style%20components.)>) not only makes the development process highly intuitive and efficient but also opens up a world of possibilities for developers and designers.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## What Is Material UI?\n\nMaterial UI is a popular React UI framework that follows Google’s Material Design guidelines. It provides a robust set of components ready to use and fully customizable, making the development process faster and more efficient. Material UI has everything you need to build [visually appealing and functional applications](https://medium.com/@MakeComputerScienceGreatAgain/unlocking-seamless-user-interfaces-with-material-ui-a-deep-dive-557e7b2d6245), from buttons and dialogs to complex data tables and sliders.\n\n## How Is Chakra Different From Material UI?\n\n![Chakra UI Vs Material U](https://images.unsplash.com/photo-1499914485622-a88fac536970?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkaWZmZXJlbmNlcyUyMGxhcHRvcHxlbnwwfHx8fDE3MTkwNjIxNTZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Material UI vs Chakra UI: A Deep Dive\n\nWhen comparing [Material UI and Chakra UI](https://v2.chakra-ui.com/getting-started/comparison), one core concept to consider is the ease of modification. Material UI adds many classes to individual HTML tags while providing a breadth of pre-styled UI components. This can make it cumbersome for developers to customize their interface, as they often have to fight against base styles when applying custom styles. On the other hand, Chakra UI allows more freedom in manipulating CSS classes of exported components and layouts, often requiring less code to achieve the desired styling.\n\n### Responsive Styling: Material UI vs Chakra UI\n\nRegarding responsive styling, Material UI necessitates the creation of separate codes to control responsive styling based on viewport changes. Conversely, Chakra UI offers built-in support for responsive styling, eliminating the need for additional CSS classes or media queries. This feature can be particularly beneficial when building applications that need to be responsive across various devices and screen sizes.\n\n### Scalability and Custom Design: Material UI vs Chakra UI\n\nIf custom styling is not a major concern for your project, Material UI can be beneficial as it provides a wide array of pre-styled components that can be easily integrated. However, when scalability and custom designs are crucial, Chakra UI shines. Its layout-focused approach allows for creating flexible, composable, and scalable code, which is essential as projects grow over time.\n\n### A Look Ahead: MagicUI React Component Library\n\nLooking for a [React component library](https://magicui.design/) that bridges the gap between design and development? MagicUI is a free and open-source UI library offering over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. With a focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) empowers developers to craft captivating digital experiences.\n\nExplore our free component library today at [https://magicui.design/docs](https://magicui.design/docs) and elevate your web application's user interface with visually appealing and interactive elements.\n\n## Chakra UI Vs Material UI: Detailed Analysis\n\n![Chakra UI Vs Material U](https://images.unsplash.com/photo-1517817748493-49ec54a32465?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8bm90ZXN8ZW58MHx8fHwxNzE5MDYyMTc1fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Ease of Use\n\nThe developer experience is a critical factor in selecting a UI library. Chakra UI excels in providing an intuitive learning and usability experience. It facilitates rapid development through intuitive and reusable components, adherence to principles of simplicity, and flexibility. It streamlines intricate tasks, such as responsive styling based on viewport changes, and simplified manual manipulation of CSS classes for customization.\n\nOn the other hand, Material UI, with its extensive feature set, presents a steeper learning curve. This could be more challenging for developers new to the library or those less experienced in Google’s Material Design principles. However, it’s worth noting that both Chakra UI and Material UI have thorough and user-friendly documentation, which includes clear examples and explanations, providing a strong support system for effective library utilization.\n\n### Customization\n\nMaterial UI lets you change its look through themes, but changing its default styles can get tricky. In contrast, Chakra UI was designed with easy customization, empowering you to change your design easily without messing too much with overriding styles. Chakra UI keeps its class names simple and clean, further enhancing the ease of customization.\n\nChakra UI makes it easier to tweak CSS classes, while Material UI doesn’t make this as straightforward. Material UI has many components ready to go, but it’s not as easy to change their styles.\n\n### Ease of Modification\n\nThe Chakra UI has a clean class name structure. Now, what does that mean? For example, if you see the HTML source code built in both libraries, you will see the material UI adds so many classes to each HTML tag created for the material component, whereas Chakra UI adds comparatively fewer classes. Also, Chakra UI provides easy manual manipulation in CSS classes, whereas Material UI has way more options for many components than Chakra UI. In addition, Material UI components have more features and properties, which make them more flexible.\n\n### Performance\n\nChakra UI uses CSS-in-JS, offering customization at a slight performance cost. This is due to runtime style computations and className generation, which might be noticeable in performance-sensitive, large apps. However, Chakra UI is an excellent option for small to medium applications.\n\nConversely, Material UI showed impressive performance in real-world tests. A significant reduction in blocking time, a slight drop in memory usage, and a notable decrease in CPU usage were observed, contributing to a smoother and faster user experience. Material UI leads in efficiency, making it suitable for sites requiring robust performance, while Chakra UI performs well for small to medium-sized sites.\n\n### Working with Other Frameworks\n\nBoth libraries share compatibility with various JavaScript frameworks. Chakra UI integrates well with Theme UI, Tailwind CSS, and Material UI. It also supports integration with frameworks such as:\n\n- React Bootstrap\n- Semantic UI React\n- Ant Design\n- Blueprint\n\nOn the flip side, Material UI demonstrates compatibility with Node.js for server-side rendering. However, while integrating Chakra UI with other frameworks is generally seamless, certain limitations may apply. For instance, some advanced components, such as a carousel or date picker, may not be included, requiring the use of other frameworks for these components.\n\n### Extensions and Plugins\n\nThe [functionality of UI libraries](https://npmtrends.com/@chakra-ui/react-vs-material-ui) is significantly enhanced by extensions and plugins. Chakra UI offers a range of additional features, including:\n\n- A Figma plugin for converting designs to Chakra UI code\n- A Visual Studio Code extension for documentation access\n- Community-created plugins like Chakra UI Prose for styled HTML content and Supa Palette Plugin for color palette generation.\n\nMaterial UI also offers a range of plugins, including individual HTML tags related to:\n\n- Third-party tools\n- UI kits for design tools\n- Code snippet libraries\n- Additional UI components\n\nThrough its extensive plugin ecosystem, these plugins enhance the library’s features, add reusability, and introduce new features to the components.\n\n### Community and Support\n\nMaterial UI enjoys a large, active community, offering abundant resources, tutorials, and support facilitated by its widespread adoption. Chakra UI, though smaller, has a rapidly growing community known for its supportive environment. Its clear and concise documentation is accessible to newcomers, with the community expected to expand further.\n\nMaterial UI has a larger community, but the Chakra UI community is also growing and welcoming. In terms of NMP downloads, Chakra currently surpasses Material UI downloads.\n\n### Related Reading\n\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Common Issues With Chakra UI And Material UI\n\n![Chakra UI Vs Material U](https://images.unsplash.com/photo-1601119479271-21ca92049c81?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHx0cm91Ymxlc2hvb3RpbmclMjBjb2RlfGVufDB8fHx8MTcxOTA2MjE5NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Steep Learning Curve\n\nMaterial UI and Chakra UI come with extensive feature sets, which can make the learning curve quite steep for some users. However, the vast array of components can be both a blessing and a curse. Each library has its unique approach to component styling and customization, requiring users to learn their respective systems. As a result, developers need to invest time into understanding the ins and outs of the library to make the most out of it. This complexity can be both a challenge and a barrier for beginners looking to start quickly.\n\n### Compatibility Issues\n\nCompatibility issues can arise when integrating third-party libraries or plugins into projects built with either Chakra UI or Material UI. These issues can be time-consuming to troubleshoot and resolve. A plug-and-play experience can become a frustrating debugging exercise when styles begin to clash—consequently, the more extensive the feature set, the higher the chances of encountering compatibility issues. Users should consider the possibility of compatibility issues when exploring the use of third-party tools or plugins with these frameworks.\n\n### Keeping Up with Updates\n\nMaterial UI and Chakra UI are actively maintained frameworks, so regular updates are released. Developers must keep abreast of the updates to ensure their projects remain up-to-date. Updates may introduce breaking changes, forcing developers to modify their codebase to remain compatible with the latest version of the library. While updates are crucial to ensuring the security and efficiency of the framework, developers should be prepared to invest time in updating their libraries.\n\n### Performance Concerns\n\nBoth libraries offer powerful tools for building user interfaces but have additional dependencies that can impact bundle size. Though versatile, these libraries can lead to slow loading times and degraded performance if not managed correctly. Performance optimization is essential to ensure that applications built with Material UI or Chakra UI remain snappy and responsive. Developers should pay attention to performance metrics and be prepared to optimize their codebase to mitigate any potential performance bottlenecks.\n\n## Which One Should You Choose?\n\n![Chakra UI Vs Material U](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkaXNjdXNzfGVufDB8fHx8MTcxOTA2MDMxOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is a better UI framework if the design itself doesn’t need to be highly customized and is not the center of the product you’re building, and as long as you’re okay with your platform looking “Material UI-ish” and not unique. That’s because it comes with many pre-designed components that are not highly customizable.\n\n### High Customization vs. Predefined Styles\n\nChakra UI is the way to go if many components need to be designed individually and highly customizable. Chakra UI is the way to go if many components need to be designed individually and highly customizable. The reason is that this design framework is less “opinionated.” It has fewer predefined style components, so it’s easier to style it according to your own design guidelines.\n\n### Material UI's Edge for Large-Scale Applications\n\nMaterial UI is much better when it comes to performance and reliability. Chakra UI is not bad in performance but can lag a bit on data-heavy, large-enterprise websites.\n\n### A Project-Centric Approach to Selecting a UI Framework\n\nChoosing Chakra UI and Material UI depends on your project's specific needs. Consider factors such as the size of the project, the need for customization, the learning curve, and the performance implications when making your choice. The best tool is the one that best fits your needs.\n\n### Related Reading\n\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### Seamless Branding & Design Integration\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### From Basic Components to Conversion-Optimized Landing Pages\n\nAlong with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates. Use our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n"
  },
  {
    "path": "apps/www/content/blog/color-theory-for-web-design.mdx",
    "content": "---\ntitle: Color Theory for Web Design Made Simple\ndescription: >-\n  Master color theory for web design. Learn how color psychology, harmony, and\n  accessibility create websites that engage and convert users.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-0ab8578c-ffdc-4206-aeb7-7bdecfb731bf.jpg\nauthor: Dillion Verma\ntags:\n  - color theory for web design\n  - ui ux color\n  - web design principles\n  - color psychology\n  - website accessibility\npublishedOn: \"2025-10-28T10:11:50.575772+00:00\"\nfeatured: true\n---\n\nColor theory for web design is much more than just picking a few colors that look nice together. It's the art and science of using color to make a website easier to use, guide people where you want them to go, and make them _feel_ something. This isn't just about aesthetics; it's a strategic choice that shapes **brand perception, user trust, and conversion rates**.\n\n## Why Color Is Your Most Powerful Design Tool\n\n![Colorful abstract shapes on a dark background representing color theory in web design](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/38887285-8fe2-4773-bf0a-f8e80292f301.jpg)\n\nLet's be real—color is the very first thing someone notices when they land on your site. Before they've read a single headline or clicked a button, your color palette has already made a powerful first impression. That initial visual handshake sets the entire tone for their visit.\n\nBut color is so much more than decoration. It's a communication shortcut that works on a subconscious level. A thoughtful color palette can effortlessly guide the eye, spotlight key information, and define your brand's personality, whether that's buttoned-up and professional or high-energy and innovative.\n\n### The Real-World Impact of Color\n\nDon't underestimate the tangible effects of color choices. Research shows that over **90% of snap judgments** about products are based on color alone. That's a massive number, and it underscores just how critical color is in those first few seconds.\n\nThis influence translates directly to your bottom line. Something as simple as optimizing the color of a call-to-action button can boost conversion rates by up to **35%**, depending on the audience and context.\n\n> Color is a silent ambassador for your brand. It speaks a universal language that can build instant connections, establish credibility, and differentiate you from the competition in a crowded digital space.\n\nThis is exactly why getting a handle on **color theory for web design** is a business necessity, not just an artistic one. When you understand these principles, you can stop making random guesses and start building interfaces that are both beautiful _and_ effective. It's a cornerstone of modern [web design best practices](https://magicui.design/blog/web-design-best-practices).\n\nMaking intentional color decisions allows you to craft experiences that guide users, drive action, and leave a lasting, positive impression.\n\n## Understanding the Building Blocks of Color\n\n![An artistic representation of a color wheel with various hues blending into each other.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/03cdcc85-6ef6-47ce-b676-547235c9ae80.jpg)\n\nBefore you can start whipping up incredible color palettes, you have to get familiar with the basic ingredients. Think of it like cooking—every color you see on a screen is just a mix of three core properties. Once you get the hang of these, you'll have total command over your design's visual flavor.\n\nMastering these components is what separates someone who just _picks_ colors from someone who truly _crafts_ them. While the ideas feel modern, they actually stretch back to Sir Isaac Newton's prism experiments in the 17th century. His work laid the groundwork for later systems that organized color by hue, value, and chroma—the direct ancestors of the digital tools we use every day.\n\n### Meet the Big Three: Hue, Saturation, and Value\n\nThese three elements—**Hue, Saturation, and Value (HSV)**—are the trio behind every single color imaginable. You might also hear this called HSL (Hue, Saturation, Lightness), which is a very similar concept.\n\n- **Hue: The Pure Color**\n  Hue is what we all mean when we say \"color\"—it’s the raw red, the pure green, the essential blue. On a color wheel, the hue is simply its location on the circle, with no black or white added to muddy the waters.\n\n- **Saturation: The Intensity**\n  Saturation is all about a color's intensity. Picture a dimmer switch for vibrancy. **100% saturation** is the color at its absolute brightest and most brilliant. Drop it to **0% saturation**, and you’re left with a shade of gray. Dialing back the saturation mutes a color, giving it a more subtle, understated feel.\n\n- **Value: The Brightness**\n  Value, sometimes called lightness, is simply how light or dark a color is. Add white, and you increase the value to create a lighter \"tint.\" Add black, and you decrease the value for a darker \"shade.\" It's how you get from a bright sky blue to a deep navy without ever changing the core blue hue.\n\n> By playing with just these three sliders—Hue, Saturation, and Value—you can unlock a nearly infinite spectrum of colors. This isn't just abstract theory; it's the practical foundation of **color theory for web design**.\n\nGetting these fundamentals down is the key to creating visuals that feel cohesive and intentional. And while we're focused on web design here, this knowledge is crucial for keeping a brand consistent everywhere it appears. For a deeper dive into how these principles translate to physical media, checking out resources on [mastering color management in printing](https://www.sonidesign.co.nz/blogs/news/color-management-in-printing) can be incredibly insightful.\n\n## How to Build Palettes That Actually Work\n\nAlright, let's move beyond picking single colors. The real artistry in **color theory for web design** emerges when you start combining them into a cohesive palette. A great palette doesn't just look pretty; it creates a unified experience and tells a user's eyes exactly where to go. The color wheel is your best friend here—it's the blueprint that helps you build these combinations with confidence, taking all the guesswork out of the equation.\n\nInstead of just grabbing colors that _feel_ right, you can lean on proven relationships, often called **color schemes** or harmonies. These are essentially time-tested recipes for pairing colors in a way that just clicks with the human eye. Each one sets a totally different mood and serves a unique strategic purpose.\n\n### Choosing Your Core Color Scheme\n\nThink of these schemes like starting points. They give you a structure, but you're still the chef—you control the final result by tweaking the brightness, saturation, and shades of the colors you pick. Let's break down the most reliable ones for web design.\n\n- **Complementary Colors**\n  These are colors sitting directly across from each other on the color wheel, like a classic blue and orange. This combo creates the strongest possible contrast, which is perfect for grabbing attention. Need a call-to-action button or a critical link to pop? A complementary accent is your go-to.\n\n- **Analogous Colors**\n  This scheme involves colors that are neighbors on the wheel—think blue, blue-green, and green. Since they're so closely related, they create a beautifully serene and comfortable vibe. Analogous palettes are fantastic for designs that need to feel trustworthy and calm, like a website for a healthcare provider or a financial advisor.\n\n- **Triadic Colors**\n  If you're after something more vibrant but still balanced, a triadic scheme is a great choice. It uses three colors that are evenly spaced around the wheel, forming a triangle. This gives you strong visual contrast that feels less intense than a complementary pair, offering a wonderful variety of hues to assign to your primary, secondary, and accent elements.\n\n### Applying Harmony in Practice\n\nThe secret is to use these schemes with intention. A bold, high-energy startup might rock a triadic or complementary scheme to feel dynamic and exciting. On the other hand, a luxury brand would probably lean into a sophisticated analogous palette to create an atmosphere of elegance and calm.\n\n> A great color palette does more than decorate a page—it tells a story. The harmony you choose reinforces your brand’s personality and sets clear expectations for the user from the moment they arrive.\n\nUnderstanding how different schemes work is at the heart of creating effective [user interface themes](https://magicui.design/blog/user-interface-themes). Once you get the hang of these basic harmonies, you can build palettes that not only look professional but actively push your website's goals forward. It’s a strategic approach that ensures every color choice has a purpose, leading to a better user experience and a much stronger brand identity.\n\nNow that we've covered the core schemes, let's look at a few more and see how they stack up in a real-world context. The table below breaks down the most common harmonies, what they're best for, and the kind of feeling they tend to create.\n\n### Color Harmony Schemes for Web Design\n\n| Harmony Type             | Description                                                         | Best Used For                                                            | Psychological Effect                                      |\n| :----------------------- | :------------------------------------------------------------------ | :----------------------------------------------------------------------- | :-------------------------------------------------------- |\n| **Monochromatic**        | Uses tints, tones, and shades of a single base color.               | Minimalist designs, branding that needs a clean and simple feel.         | Calming, elegant, sophisticated, and focused.             |\n| **Analogous**            | Uses 2-4 colors that are next to each other on the color wheel.     | Creating a sense of unity and calm. Great for nature or wellness brands. | Harmonious, comfortable, serene, and reassuring.          |\n| **Complementary**        | Uses two colors that are directly opposite each other on the wheel. | Drawing attention to key elements like CTAs, logos, or headlines.        | High-energy, dynamic, bold, and attention-grabbing.       |\n| **Split-Complementary**  | A base color plus the two colors adjacent to its complement.        | A less intense but still high-contrast look. Good for beginners.         | Balanced, versatile, and engaging without being jarring.  |\n| **Triadic**              | Uses three colors evenly spaced around the color wheel.             | Vibrant and dynamic UIs, designs that need a balanced energy.            | Playful, stimulating, and diverse.                        |\n| **Tetradic (Rectangle)** | Uses two complementary color pairs.                                 | Complex, multi-faceted designs that require a rich color palette.        | Rich, energetic, and complex; requires careful balancing. |\n\nPicking the right harmony is less about rules and more about matching the color's inherent \"personality\" to your brand's voice. A triadic scheme on a law firm's website might feel chaotic, just as a monochromatic one might make a toy store feel a bit dull. It's all about context.\n\n## Using Color Psychology to Influence Users\n\nColor speaks a language all its own, and your users are listening from the moment they land on your page. Before they even read a single headline, the colors you've chosen are hard at work, setting an emotional tone, shaping their perception of your brand, and subtly guiding their next click. That's the real power of color psychology in web design: using color to spark a feeling and prompt a response.\n\nThis isn't some new fad. The story of **color theory for web design** began back in the early 1990s, when the web was mostly a monochrome world with those classic blue hyperlinks. By 1994, sites like ALIWEB were splashing bright yellow backgrounds on their pages to stand out, and the very first banner ad appeared. That was the beginning of using color as a deliberate marketing tool. You can dive into the [full history of web design on VisualFizz](https://www.visualfizz.com/blog/ultimate-history-of-web-design/) to see just how far we've come.\n\n### Eliciting Specific Emotions with Color\n\nEvery color carries its own psychological baggage. A bright, saturated red screams urgency, making it perfect for \"Buy Now\" buttons or can't-miss sales. But tone it down to a deep, muted red, and it suddenly feels luxurious and sophisticated. It’s these subtle shifts that let you design with real emotion.\n\nThink about some of the common associations we have:\n\n- **Blue:** This is the color of trust, security, and professionalism. It’s no accident that so many banks, tech companies, and healthcare providers build their brands around blue.\n- **Green:** Green immediately brings to mind nature, growth, and a sense of calm. It's a natural fit for brands in wellness, finance, or anything eco-friendly.\n- **Yellow:** This one is all about optimism, warmth, and clarity. It’s a fantastic accent color to grab attention and create a friendly, approachable vibe.\n\n### Strategically Guiding User Behavior\n\nBeyond just setting a mood, color is one of your best tools for directing traffic on your site. The goal is to make the actions you _want_ users to take—like signing up for a newsletter or adding an item to their cart—feel like the most obvious and natural next step. This is where high-contrast colors for your primary call-to-action (CTA) buttons come in; they create a visual magnet that the user's eye can't help but be drawn to.\n\n> Color psychology empowers you to build credibility, reinforce your brand's personality, and prompt users to act, all without them consciously realizing it. It transforms your design from a static page into a persuasive experience.\n\nThis infographic gives you a great visual breakdown of how foundational color harmonies, which are all based on the color wheel, can be used to build these kinds of psychologically powerful palettes.\n\n![Infographic about color theory for web design](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f24fb557-6725-4e58-8faa-1ff6d85be808.jpg)\n\nAs you can see, the map shows how different color relationships—like the punchy, high-contrast complementary scheme or the smooth, harmonious analogous one—are just starting points. By understanding these principles, you can start building a palette that elicits the exact emotional response you're after and ensures every color choice is working towards your website’s goals.\n\n## Designing for Everyone with Accessible Color\n\n![A visual representation of an accessibility checker tool analyzing color contrast on a website layout.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d1a70766-397d-4963-9415-066d4757d411.jpg)\n\nLet’s get one thing straight: a beautiful design that isn't accessible to everyone is, in the end, a failed design. It's easy to get caught up in aesthetics, but the real heart of effective **color theory for web design** is creating an experience that works for _all_ visitors. That includes the roughly **1 in 12 men** and **1 in 200 women** who have some form of color vision deficiency.\n\nAccessible design isn't some extra feature you bolt on at the end—it's a core part of building a great user experience. When you make accessibility a priority, you’re not just checking a box to meet a standard. You're building a website that's more robust, more intuitive, and more welcoming for every single person who lands on it.\n\nIt’s about shifting your mindset from subjective beauty to purposeful clarity. The good news? You don't need to be an accessibility guru to make a massive difference.\n\n### Understanding WCAG Contrast Ratios\n\nThe Web Content Accessibility Guidelines (WCAG) give us a solid roadmap, and one of its most important signposts is the **contrast ratio**. It’s just a fancy term for the measurable difference in perceived lightness between a foreground element (like your text) and its background. Higher ratio, better readability. Simple as that.\n\nWCAG breaks this down into two main levels of compliance:\n\n- **AA (Minimum Compliance):** Think of this as the industry standard. It’s what most websites aim for, requiring a contrast ratio of at least **4.5:1** for normal-sized text.\n- **AAA (Enhanced Compliance):** This is the gold standard. It’s a much stricter level, perfect for sites where readability is absolutely paramount, like those for older audiences. It demands a much higher ratio of at least **7:1**.\n\nYou don't have to break out a calculator and guess. There are fantastic free tools like the [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) or the built-in accessibility features in [Adobe Color](https://color.adobe.com/create/color-contrast-analyzer) that do all the heavy lifting for you. In seconds, you can know exactly where your colors stand.\n\nThe table below breaks down the most common contrast requirements you'll encounter.\n\n### WCAG 2.1 Contrast Ratio Requirements\n\n| Conformance Level  | Normal Text (\\<18pt) | Large Text (≥18pt or 14pt bold) | UI Components & Graphics |\n| :----------------- | :------------------- | :------------------------------ | :----------------------- |\n| **AA (Minimum)**   | **4.5:1**            | **3:1**                         | **3:1**                  |\n| **AAA (Enhanced)** | **7:1**              | **4.5:1**                       | **4.5:1**                |\n\nAs you can see, the requirements are more lenient for larger text and essential graphics, but aiming for the higher AA standard for your body copy is a solid starting point for any project.\n\n> An accessible design benefits everyone, not just users with disabilities. Clear contrast and redundant cues (like icons and text) make an interface less ambiguous and easier to navigate for all users in various lighting conditions.\n\n### Never Rely on Color Alone\n\nThis is one of the golden rules of accessibility. Never, ever use color as the _only_ method for communicating something important. Imagine a user filling out a form, and the only indicator of an error is the input field’s border turning red. For someone with red-green color blindness, that error might as well be invisible.\n\nThe better, more professional approach is to layer your visual cues.\n\n- **Add an icon:** A small warning symbol or a checkmark provides an instant signal that doesn't depend on color.\n- **Use text labels:** Spell it out. A simple message like \"Error: Email is required\" next to the field leaves no room for confusion.\n- **Change text weight:** Making error text **bold** can also help it pop.\n\nWhen you combine color with icons, text, and other visual indicators, you’re making sure your message gets through to the widest possible audience. This kind of thoughtful, multi-layered communication is the hallmark of truly user-centered design.\n\n## A Practical Workflow for Applying Color\n\n<iframe\n  src=\"https://www.youtube.com/embed/bt5vYbcZ6jA\"\n  title=\"YouTube video player\"\n  frameBorder=\"0\"\n  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n  allowFullScreen\n  style={{\n    position: \"relative\",\n    top: 0,\n    left: 0,\n    width: \"100%\",\n    height: \"100%\",\n    aspectRatio: \"16/9\",\n  }}\n/>\n\nTheory is great, but how do you actually put it into practice? Let's bridge the gap between knowing the rules and making them work for you. Bringing all these concepts together into a repeatable process is the key to applying color theory consistently and effectively.\n\nA fantastic starting point for this is the **60-30-10 rule**.\n\nThis simple framework, borrowed from interior design, gives you a clear and balanced structure for your palette. It's a tried-and-true method for making sure your design feels harmonious and professional, preventing any single color from completely overwhelming the user.\n\n> The 60-30-10 rule isn't a strict command but a powerful guideline. It provides a visual hierarchy that naturally guides the user's eye, making your interface more intuitive and easier to process at a glance.\n\nThink of it like a recipe: **60%** of your design will be your primary or dominant color, which is often a neutral. **30%** is your secondary color, used to create contrast and visual interest. The final **10%** is your accent color—a bold, high-contrast hue saved for your most important elements, like calls-to-action.\n\n### Building Your Palette Step-by-Step\n\nLet's walk through a common workflow that uses this rule as its foundation. This process will take you from the big picture of your brand identity down to the fine details of your user interface.\n\n1.  **Establish Your Primary (60%) Color:** This is your foundation. It’s often dictated by your brand identity and should set the overall mood you're going for. Neutrals like light grays, off-whites, or even dark tones work beautifully here because they set the stage without stealing the show.\n\n2.  **Select a Secondary (30%) Color:** Using your chosen color harmony (like analogous or triadic), pick a color that complements your primary choice. This is the color you'll use for secondary elements like subheadings, active states, or informational panels.\n\n3.  **Define Your Accent (10%) Color:** This is your \"action\" color. A complementary or split-complementary choice is often perfect here. You want to reserve it for things like buttons, key links, and notifications to ensure they pop off the screen and grab attention.\n\nAs part of any professional workflow, it's crucial to make sure your monitor is calibrated for color accuracy. This ultimate [guide to monitor calibration and display settings](https://displaybuddy.app/blog/2024-04-14/ultimate-guide-to-displaybuddy) is a really helpful resource for getting that right. After all, you want to be sure the colors you so meticulously choose are what your users actually see.\n\nFinally, modern software can seriously speed up this whole process. You can explore some of the [best web design tools](https://magicui.design/blog/best-web-design-tools) to find palette generators and accessibility checkers that fit right into your workflow.\n\n## Unpacking Common Color Theory Questions\n\nPutting color theory into practice always sparks a few questions. I hear them all the time. Let's walk through some of the most common ones to clear things up and help you design with more confidence.\n\n### \"How Many Colors Should I Actually Use?\"\n\nThis is probably the number one question I get. While there's no single magic number, a great rule of thumb is to stick to **three to five colors** for a clean, professional feel. Any more than that, and things can get chaotic fast.\n\nThis usually breaks down into:\n\n- A primary color (your main brand color)\n- A secondary color (to support the primary)\n- One or two accent colors (for things you want to pop)\n\n### \"What's the Best Color for a CTA Button?\"\n\nEveryone wants to know the secret to the perfect call-to-action button. But the honest answer isn't a specific color like \"red\" or \"green.\" The best color is simply **the one that stands out the most**.\n\nIt all comes down to contrast. Your CTA needs to be the most visually compelling thing on the page, so it should be an accent color that doesn't have to compete with anything else around it. You want it to be an unmissable target.\n\n> The most effective color palette isn't necessarily the most complex one. It's the one that creates a clear visual hierarchy, guides the user's attention, and serves the website's ultimate goals with clarity and purpose.\n\n### \"Where Do I Even Start Choosing a Color?\"\n\nStaring at a blank color wheel can be intimidating. The best strategy is to forget the wheel for a second and start with your brand's core identity.\n\nWhat's the personality? The emotion you want to evoke? Your primary color should flow directly from that. Once you nail that foundational color, you can use the harmony rules we've discussed to build out a supporting palette that feels intentional and truly cohesive.\n\n---\n\nReady to build stunning web interfaces with a professional touch? **Magic UI** offers a library of over 50 customizable blocks and 150+ free animated components built with modern tech. [Create beautiful landing pages in minutes](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/component-libraries.mdx",
    "content": "---\ntitle: \"27 Easy To Use & Amazing React Component Libraries\"\ndescription: \"Looking for user-friendly React component libraries? Look no further! Discover amazing libraries that will take your projects to the next level.\"\nimage: https://cdn.magicui.design/assets/b04495f5-dc87-499f-9893-e06673654511.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you tired of endlessly scrolling through a mountain of UI frameworks for that perfect React component? Picture this: you have a great project idea, the perfect UI Framework in mind, and then comes the daunting task of choosing between dozens of React component libraries. If this dilemma resonates with you. Our upcoming blog will provide a detailed breakdown of React UI component libraries to simplify your search and enhance your development process.\n\nMagic UI, a user-friendly [React component library](https://magicui.design/), offers an array of components and features tailored to meet your demands in the world of [UI frameworks](https://magicui.design/blog/ui-frameworks). By leveraging Magic UI, you can streamline your development process, enhance your project's aesthetic appeal, and achieve your goals of comparing React UI component libraries with ease.\n\n## What Are React UI Component Libraries?\n\n![Component Libraries](https://cdn.magicui.design/assets/118gc5smpafa.png)\n\nReact UI component libraries, also known as React component libraries, are software systems equipped with a range of ready-to-use components. These pre-built components are designed to be easily integrated into React-based applications and websites. By leveraging these libraries, developers can significantly boost the speed and efficiency of software development. The libraries offer many benefits to developers and businesses, enhancing the overall development process and the end-user experience.\n\n### Types of Components in React Component Libraries\n\nThe components included in a React UI component library are diverse, catering to various needs within software development. These components can range from simple elements like buttons and checkboxes to more complex ones such as tables, charts, and maps. The libraries often allow users to customize these components to align with their application's design and style preferences.\n\n### Growing Importance of React Component Libraries\n\nThe adoption of React UI component libraries has been on the rise due to the increased popularity of React-based applications across the web. Being a powerful JavaScript library, React allows developers to create dynamic and responsive user interfaces for web and mobile applications seamlessly. React is currently the second most widely used web framework globally, per the latest data from Statista. The [framework](https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/) empowers developers to build feature-rich, interactive web applications that continuously update their user interfaces with real-time data.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **The Benefits Of Using A React UI Component Library**\n\n![Component Libraries](https://cdn.magicui.design/assets/p2obfuipouq.gif)\n\n### Faster Development and Time-Saving\n\nBy using a React UI component library like [MagicUI](https://magicui.design/), you can accelerate your development process, thanks to the pre-built components available at your disposal. These pre-existing components, including buttons, forms, and menus, are already coded for you and are ready to be utilized in your web development projects.\n\nMagicUI's library, for instance, contains over 20 animated components, designed to help you create visually stunning interfaces without the need to start from scratch. This not only speeds up your development process significantly but also allows you to focus on building the unique, innovative features of your project.\n\n### Enhanced User Experience and Aesthetic Appeal\n\nUI component libraries like MagicUI are renowned for their beautiful, aesthetically pleasing designs. By leveraging these libraries, developers can choose from various visually appealing components and easily integrate them into their projects. These components can be customized to match the desired look and feel of the application, ensuring that it functions well and looks great. The visually stunning and interactive elements offered by [MagicUI](https://magicui.design/) are built using React, TypeScript, Tailwind CSS, and Framer Motion, providing developers with a powerful tool to create engaging user interfaces with minimal effort.\n\n### Cross-Browser Compatibility and Seamless Integration\n\nOne of the biggest challenges in web development is ensuring that your website or application looks and functions the same across all browsers. This is where [UI component libraries](https://dev.to/domysee/benefits-of-a-component-library-2baa) shine. MagicUI, for example, offers components that are cross-browser compatible, allowing you to build applications that work seamlessly on all modern browsers.\n\nUsing a component library ensures that your application provides a consistent user experience, regardless of the browser your visitors are using. MagicUI's focus on bridging the gap between design and development empowers developers to create captivating digital experiences that work flawlessly across different browsers.\n\n### MagicUI React Component Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## **When To Use React Component Libraries**\n\n![Component Libraries](https://cdn.magicui.design/assets/9y8i3ht432k.png)\n\n### Code-first Prototyping\n\nComponent libraries are a game-changer when focusing on functionality over visual design. Rather than converting images into code, developers can easily extract the code component from the ready-made design, making prototyping with code more efficient. This allows developers to design with pre-built components without the need for any advanced design skills.\n\n### When You Lack the Skills or Experience to Build Your Own\n\nCreating a component library from scratch may be unrealistic if your team lacks experience building reusable UI components or if you're working with tight project deadlines. In such cases, integrated component libraries offer all the code components needed for testing functionality, usability, and design before the conversion to digital products.\n\n### For Smaller Teams or Individual Designers\n\nFinancial resources need to be managed carefully for startups and small—to mid-sized companies. Leveraging open-source component libraries can be a cost-effective solution. By gradually scaling up with the help of versatile and effective component libraries, smaller businesses can position themselves for growth.\n\n## **27 Top React Component Libraries**\n\n![Component Libraries](https://cdn.magicui.design/assets/v1r2a4c89zk.png)\n\n### 1\\. Magic UI - React Component Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Material UI\n\nMaterial-UI (MUI) is a fully loaded UI component library offering a comprehensive set of UI tools to create and deploy new features quickly. It is one of the most powerful and popular UI component libraries out there with over 3.2 million downloads on npm a week, 78k stars on GitHub, 17k+ followers on Twitter, and 2.4k+ open-source contributors.\n\nThere are two ways to go about it: use this component library directly or bring your design system to their production-ready components. This platform will enable you to design faster without sacrificing control or flexibility. It will help you deliver excellent designs in order to delight the end-users.\n\n### 3\\. TailwindCSS\n\nTailwindCSS is a utility-first CSS framework designed to build modern and beautiful websites quickly. Here, utility class names define what to do. Each utility class comes with pre-defined CSS properties. To implement a CSS property, you must find the relevant class and assign it to your element. Let's say you want to make a paragraph bold on your website. You have to just assign the class font-bold to the paragraph.\n\nSimilarly, there are lots of other utility classes like underline, text-center, py-4, etc. that cover almost everything you need to do with CSS. Apart from that, Tailwind is highly customizable so if your particular use case is not met with the existing classes, you can easily create your own class to do the work. As of the time of this writing, TailwindCSS has crossed more than 78K stars on GitHub and is ruling over NPM trends with more than 8 million+ weekly downloads.\n\n### 4\\. Chakra UI\n\nChakra UI, created by Segun Adebayo in 2019, emphasizes simplicity, modularity, and accessibility. The React component library Chakra UI provides developers with extensive hooks and components for constructing accessible, responsive web apps.\n\nThe large range of custom hooks that abstract away typical UI logic like animation, disclosure, and more makes Chakra UI powerful. These hooks simplify complex interfaces. Excellent offerings and performance are making Chakra UI popular with 1.3 million monthly downloads and 19,700 GitHub stars.\n\n### 5\\. Ant Design (AntD)\n\nIf you are looking for a react-based UI component library to build enterprise-grade products, Ant Design is an excellent option. It will help you create an enjoyable yet productive work experience. This tool is used by companies like Alibaba, Baidu, Tencent, and many more. Ant Design offers multiple UI components to help enrich your application and software systems.\n\nAnt Design also recommends you use other React-based third-party component libraries like React JSON View, React Hooks Library, and more. It does maintain documentation and supports community discussions through GitHub, Segmentfault, and Stack Overflow.\n\n### 6\\. React Suite\n\nReact Suite is a popular React UI component library focused on building for middle platforms and backend products. It has inbuilt support for Light, Dark, and High Contrast themes that can be switched with a simple configuration.\n\nThere are more than 50 components, such as Buttons, Carousels, Calendars, Pagination, etc., in React Suite to fit your UI needs and support accessibility and i18n.\n\nThey recently did a big update that makes the code easier to understand and improves accessibility for people with different vision needs. They also added some new tools like a calendar component and fancy ways to show data loading screens. On top of that, they fixed a bunch of bugs and made it easier to control some of the components.\n\nReact Suite has amassed over 8K GitHub stars and over 97K weekly downloads on NPM.\n\n### 7\\. Semantic UI\n\nSemantic UI React is the official integration of the popular frontend framework Semantic UI for React. The styling of Semantic UI React is based on the Semantic UI theme and it's also free from jQuery. Apart from that, there are other useful features like augmentation, shorthand props, auto-controlled state, etc.\n\nOn top of this, there are some things you might want to consider.\n\n- Semantic UI can feel a bit heavy for simple websites. It includes plenty of features you might not need, which can slow down your page load times.\n- While customising the look and feel is possible, it can be tricky. The documentation might not always be accurate, and the code itself uses a lot of \"important\" styles, which can make it challenging to override it with your own styles.\n- All things considered, Semantic UI is a solid option for building functional desktop web apps quickly. Just be aware of its weight and potential customization challenges before diving in. If you need a lightweight solution or a highly customized design, you might want to consider other React libraries.\n\nThe total GitHub stars of Semantic UI React are more than 13K and weekly NPM downloads are more than 230K.\n\n### 8\\. React Bootstrap\n\nAnother popular front end framework – React Bootstrap, is rebuilt for React-based applications and systems. It has replaced Bootstrap JavaScript, where each component is developed from scratch as native React components with no need for dependencies such as jQuery. React-Bootstrap, despite being one of the earliest React libraries, has evolved to become an excellent option for building effortless user interfaces. It includes amazing UI elements for your mobile and web applications.\n\n### 9\\. Blueprint UI\n\nBlueprint UI, an open-source project by Palantir Technologies, provides high-quality UI components. Blueprint is a React-based UI toolkit for designing complicated, data-dense desktop interfaces. If you want to build desktop apps, this React component library is ideal. The core Blueprint NPM package includes 30+ familiar and unique React components such as Button, Card, Menu, Form Group, File Input, etc.\n\nBlueprint's other NPM packages include Datetime and Datetime2 for dates, Icons with over 300 vector UI icons, Select and Table for selecting items in a list, and interactive spreadsheet interfaces. Blueprint UI is quite popular with 20,000+ stars on GitHub and 190,000+ weekly downloads on NPM.\n\n### 10\\. Visx\n\nCreated by Airbnb, visa is a collection of multiple low-level, expressive visualization primitives built for React applications. It was developed to unify a complete visualization stack throughout the company, combining the delight of React with the robustness of D3 for calculations.\n\nWith visx by your side, you will get a native experience in any React-based codebase as it has the same patterns and standard APIs. This way, it solves the problems of copying-pasting various React hooks. Instead, it can abstract D3 details and offer utilities and components in standard formats. If you like customizable and performing charts, visx is a great tool.\n\n### 11\\. PrimeReact\n\nPrimeReact is an extensive React component library utilized by global corporations such as Mercedes, eBay, Nvidia, Intel, American Express, and Lufthansa. The app gained popularity between 2022 and 2023 (from 39.5k to 78.7k weekly downloads).\n\nOver 90 React components are ready to use in your app. TreeSelect, Organisation chart, Terminal, and Captcha are unique components it offers. PrimeReact provides customizable templates and 280+ copy-and-paste UI elements to swiftly build any interface. Its design-agnostic infrastructure lets you use the look and feel of popular libraries like Material and Bootstrap or construct your own. The GUI-based Theme Designer includes 500+ variables to customize.\n\nThey offer help and reply to feature or enhancement requests within one business day.\n\n### 12\\. Mantine\n\nMantine is a free and open-source React components library that provides 134 fully responsive React components for 25 categories, such as navbars, error pages, blog cards, comments, sliders, etc., to be produced. It’s becoming a popular choice for developers, especially those familiar with Material UI.\n\n**A Familiar Upgrade Path for Material UI Users**\n\nIf you're transitioning from Material UI v5, Mantine v6 offers a smooth upgrade path thanks to their similar styling syntax (Emotion). Mantine v7 takes a different approach, relying on standard CSS for customization. Devs approve of Mantine's components for their high quality and reduced need for customization compared to Material UI. Features like multi-selects and date pickers are considered more intuitive by default in Mantine.\n\n**Modern Aesthetics and Reduced Customization Needs**\n\nMantine also offers a modern look and feel. Unlike Material UI's distinct style with all-caps buttons and paper shadows, Mantine has a more neutral aesthetic. This allows for easier creation of unique designs without extensive customization. It has got more than 24K stars on GitHub and more than 350K weekly downloads on NPM for its core components library.\n\n### 13\\. Fluent\n\nFluent is a cross-platform, open-source design tool for creating an engaging user experience. It was previously named Fabric React and is an excellent UI library created by Microsoft.\n\nDevelopers and designers can benefit from its useful tools to add design elements to their applications without creating them from scratch. This powerful and intuitive tool is built to adjust according to user intent and behavior. No matter what device you use, working with Fluent feels natural, be it PCs, laptops, or tablets. Fluent is one of the best tools for creating cross-platform applications. It’s also great for other projects.\n\n### 14\\. NextUI\n\nNext UI is a React library that offers a collection of visually appealing pre-built components. While it stands out for its aesthetics, there's a potential downside to consider.\n\nSome users have reported experiencing performance issues, particularly with slow loading times and freezing when changing themes on desktop. This could be a concern if a smooth user experience is critical for your project. It's also worth noting that despite the name, Next UI is not directly affiliated with the popular React framework Next.js.\n\nIt has got 19K GitHub stars and more than 100K weekly downloads on NPM.\n\n### 15\\. Rebass\n\nRebass comes with a basic collection of primitive components that may be “developed” to create a best React UI component library with a standard API and design themes. Primitives for app structure (responsive boxes and flexbox layouts), text (header, text, link, button), photos, cards, and forms are all included in the foundation. Rebass also offers the finest documentation on recipes for common use cases like grids, navbar, and image cards. A ThemeProvider component is used to apply themes in Rebass. For defining theme objects and design tokens for usage with UI components, Rebass supports theme specification. Theme UI and Styled System are both compatible with Rebass. Talking about its documentation, then primitive components, theming, and design systems are some of the finest documentations of Rebass. These are responsible for providing the best React UI framework.\n\n### 16\\. Headless UI\n\nTailwind Labs created headless UI as a collection of unstyled, fully accessible UI components that work seamlessly with Tailwind CSS. Headless UI provides the best React frameworks for your React project. Tailwind CSS is taken a step further with Headless UI, which provides the entire best React UI framework with the best React components.\n\nTailwind CSS, which is offered out-of-the-box to meet your individual needs, can be used to style them.Toggle Switch, Autocomplete, and Modal are all common components in Headless UI. Each element comes with a simple example, styling instructions for each portion, and instructions for customizing it to your needs. It also has a complete API for transitions as well as accessibility information.\n\n### 17\\. Semantic UI React\n\nIntegrating React with Semantic UI can be an excellent strategy to get a customized UI component library for your projects. Semantic UI React helps you build your sites and applications with concise and easy HTML. It has 12k+ stars on GitHub.\n\nWith this tool, you can load any CSS theme you want on the app you are building. It also has human-friendly HTML to develop software products. It’s a declarative API that offers powerful prop validation and features.\n\n### 18\\. React-admin\n\nReact-admin is a good option if you are looking for a React framework to build your B2B applications. It aims to provide the best experiences to developers and enables you to focus more on fulfilling your business needs.\n\nThis is an open-source tool with an MIT license. It is robust, stable, easy to learn, and a joy to work with. This is why 10,000+ companies worldwide have used React-admin on their projects. With React-admin, you can create delightful UIs, whether you are building internal tools, B2B apps, CRMs, or ERPs. It allows developers to design faster, increasing their maintainability and productivity.\n\n### 19\\. Retool\n\nIf you are building internal applications, Retool is an excellent option. It will eliminate the struggle with UI libraries, data sources, and access controls. You will get a streamlined way of handling everything and producing apps that customers love to use.\n\nThis tool has been used by businesses of all sizes, from Fortune 500s to start-ups, to create awesome internal applications.\n\n### 20\\. Grommet\n\nAccording to its official site, Grommet is a React library that prioritizes accessibility, responsiveness, and scalability. It offers a set of pre-built components designed for building web applications that work well across different devices and for users with different needs.\n\nUser experiences with Grommet can be mixed. Some devs praise its focus on usability and theming, but others have complained about bugs and breaking changes between minor versions. While Grommet offers a good range of components, some developers find Material-UI provides a wider selection and more customization options. It has got 8K GitHub stars and more than 26K weekly downloads on NPM.\n\n### 21\\. Evergreen\n\nOffered by Segment, Evergreen is an amazing React UI library that helps you create delightful software products. It’s also a design system that offers flexibility and does not limit you to a particular configuration or require obsolete integration.\n\nEvergreen facilitates building software products that can adapt to changing design needs. It offers many features, components, and benefits to help you create user-friendly and powerful interfaces. If you want to build enterprise-grade web applications, this will be a good option for you.\n\n### 22\\. ThemeUI\n\nTheme UI is a library for designing React user interfaces that may be customized. It mainly follows design concepts that are based on constraints. Developers use theme UI to customize base components, create themes, and create their design systems.\n\nThere are two key steps in designing using Theme UI.\n\n- The first step is to make your theme, which requires choosing fonts and colors.\n- The style of individual components is the next step, which gives you more control over your site.\n\nTheme UI is one of the finest React libraries for web development. It allows you to style MDX content, integrates with existing styled systems and component libraries, and includes dark-mode and mobile-first responsive styles. Theme UI's extensive documentation includes instructions for theming, styling MDX, and custom hooks. Guides and recipes on using and constructing custom components are also available as resources.\n\n### 23\\. Onsen UI\n\nIf your project prioritises a mobile-first experience, Onsen UI is a solid choice. This library helps design interfaces that feel native to mobile devices. It achieves this by offering components and features that mimic the look and feel of native iOS and Android apps. Onsen UI's touch-friendly UI and native-style animations bridge the gap between web and mobile, creating a smooth user journey for mobile users.\n\nNaturally, there are some downsides to consider. The cost of Onsen UI has recently increased noticeably, and some users have reported bugs that take a while to get fixed. While iOS performance is good, Android apps built with Onsen UI can sometimes feel sluggish. Native functionalities like maps require separate plugins.\n\nIt has got 8K GitHub stars and more than 24K weekly downloads on NPM.\n\n### 24\\. React Router\n\nDeveloped and maintained by the Remix team and its contributors, React Router is an impressive React UI component library. Its recent version is v6 which uses the best features from its previous versions and features some improvements as well.\n\nDevelopment teams from reputed companies such as Airbnb, Discord, Microsoft, and Twitter have used this tool in their projects. It’s best to search for a router user interface that can work with a different interface. It can match your app components with corresponding URLs to ensure a better user experience.\n\n### 25\\. Gestalt\n\nGestalt is a UI library that helps you create amazing user interfaces that people love using. It’s also Pinterest’s design tool and comes with many features and components. Its interface is also smooth to allow developers quickly get started with the tool.\n\n### 26\\. Shards React\n\nWeb development professionals get the choice to craft an extensive range of precise dashboards, web portals, and mobile applications for a diversity of industries component libraries. The sleek and straightforward design Framework also makes it one of the best in the minimalist libraries of React components. The React library is fast and efficient on the different platforms because of the optimized code.\n\nShards React can ensure that developers have the perfect mixture of customization options. There are many components, and the base library is free. But if you wish to get more templates, components, and blocks, you can always purchase the pro kit to ensure the addition of tons of additional features.\n\n### 27\\. React Motion\n\nIf you want a solution to animate components in React, you can consider React Motion. It is an excellent React library that will help you create realistic animations. It’s easy to get started with this tool and use it. This tool is even more attractive because you can specify stiffness values. You can also define damping parameters. This way, your components will look more realistic as you can control the stiffness. React Motion can easily animate a simple card component’s scaling. For this, you will need to utilize styled-components.\n\n## **What Makes A Good Component Library?**\n\n![Component Libraries](https://cdn.magicui.design/assets/0o01fpc1tzw.png)\n\n### Consistency and Uniformity\n\nMaintaining consistency across all UI elements is critical. This means consistent design languages, colors, typography, and spacing across all components. Consistency helps create a cohesive user experience and streamlines the design process for designers and developers alike.\n\n### Flexibility and Customizability\n\nA good component library has to offer flexibility. Components should be easily customizable to fit different contexts and needs without breaking the overall design coherence. Providing options for modifying colors, sizes, states, and behaviors allows for adaptability to various scenarios.\n\n### Documentation and Usage Guidelines\n\nA comprehensive and detailed usage guideline is essential. It helps users understand how to implement and adapt components correctly. This ensures that components are used as intended, maintaining the integrity of the design system.\n\n### Accessibility\n\nAccessibility should be a top priority. Components need to be designed and built with accessibility standards, making them usable by people with disabilities. This includes proper ARIA attributes, keyboard navigability, and sufficient color contrast.\n\n### Ease of Integration\n\nA good [component library](https://vueschool.io/articles/vuejs-tutorials/what-makes-a-good-vue-component-library-a-checklist/) should be easily integrated into various projects and tech stacks. This means providing well-structured code, compatibility with different frameworks, and straightforward installation processes.\n\n### Scalability\n\nA scalable component library should accommodate new components and patterns as projects grow. Scalability ensures that the library remains relevant and useful as projects evolve over time.\n\n### Community and Support\n\nA vibrant community and active support channels can significantly enhance a component library. When users can share experiences, provide feedback, and contribute to development, it creates a dynamic and improving resource. Responsive support can help resolve issues quickly.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **How To Get The Best Out Of Using React Component Libraries**\n\n![Component Libraries](https://cdn.magicui.design/assets/fbaa77jpdm6.png)\n\nBefore integrating a library into your project, take the time to understand what it excels at. For instance, Material-UI offers a comprehensive suite of UI components. You can select the best tools to address your application's specific needs by identifying each library's strengths.\n\n### Combining Libraries for Enhanced Functionality\n\nConsider combining two or more React libraries to create a more robust development environment. Combining libraries allows you to take advantage of their collective strengths, streamlining your development process and making it more efficient and effective.\n\n### Enhancing Libraries with Magic UI\n\nIntegrating [Magic UI](https://magicui.design/) alongside your existing libraries can be a game-changer. Magic UI enhances your libraries in several ways:\n\n### Consistency\n\nEnsures a consistent look and feel across your application, irrespective of the libraries used.\n\n### Efficiency\n\nAutomates repetitive tasks and streamlines the integration process, saving you time and effort.\n\n### Customization\n\nOffers advanced customization options to tailor the libraries perfectly to your specific needs.\n\n### Accessibility\n\nImproves accessibility features across your application, providing a better user\n\nexperience for all users.\n\nAdding Magic UI to your library stack enhances the capabilities of each library, leading to a more cohesive and powerful application.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/component-library-examples.mdx",
    "content": "---\ntitle: \"27 Component Library Examples Every Designer Must Know\"\ndescription: \"Looking for design inspiration? Check out these essential component library examples that every designer should know. Elevate your design game now!\"\nimage: https://cdn.magicui.design/assets/id6bz1141l.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you currently struggling to decide which UI component library would be the perfect fit for your project? If so, this blog is just what you need. We will explore component library examples in the context of [UI frameworks](https://magicui.design/blog/ui-frameworks), making the comparison process easier for you.\n\nMagic UI's [React component library](https://magicui.design/) is a fantastic tool that will assist you in making the right choice. Its features and benefits are designed to help you achieve your goal of deciding which UI component library is the most suitable for your project.\n\n# **What Is A Component Library?**\n\n![Component Library Examples](https://cdn.magicui.design/assets/1bcdzgknmat.jpg)\n\nA component library is a wealth of pre-designed and pre-built user interface elements that are used to fashion digital products like websites and applications. These libraries equip a plethora of pre-made UI elements like buttons, forms, navigation menus, and icons, each designed with a consistent look and feel. They essentially serve as a unified guide to maintaining consistency across interfaces in digital products.\n\n## **Why Use a Component Library?**\n\nUI component libraries are incredibly useful in collaborative design and development environments. They help ensure that all team members are working with the same source of truth and that the end product maintains a professional and polished appearance. This level of consistency can make a significant difference in the quality of the final product, which can have a noticeable effect on user engagement and satisfaction.\n\n## **React as a Powerful Web Framework**\n\nReact is currently the second most used web framework in the world. This front-end JavaScript framework allows for the faster and more efficient creation of applications. It can be used to build dynamic web applications, as the data on its user interface keeps updating consistently. React powers the user interfaces of nearly 10 million websites across the globe.\n\nWhile the core React library is robust, there are several component libraries available that contain valuable design elements for React applications or web development projects. React UI component libraries are tailored to simplify the creation of user interfaces by providing developers with building blocks and elements that adhere to the best design practices and accessibility standards.\n\n## **Statistical Insights**\n\nAccording to [statistics](https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/), React will be the second most utilized web framework worldwide in 2022. This front-end library facilitates the swifter and more efficient development of applications. Its use in building dynamic web applications is fueled by the continuous updating of data on the user interface. Presently, React powers the user interfaces of almost 10 million websites globally.\n\nWhile the base [React library](https://trends.builtwith.com/javascript/React) is solid, there are numerous component libraries that offer invaluable design elements for your React app or web development project. React UI component libraries are specifically designed to streamline user interface creation by furnishing developers with building blocks and elements that align with the best design practices and accessibility guidelines.\n\n# **The Benefits Of Using A Component Library**\n\n![Component Library Examples](https://cdn.magicui.design/assets/vqs7p7f9jc.jpg)\n\nUsing any component library can have many benefits that will help you when working on your React project.\n\n## **Beginner-friendly**\n\nUI libraries consist of prebuilt components like buttons, form fields, etc. So, as a beginner, you won’t have to figure out how to create any of the necessary elements from scratch. Instead, you can focus on the implementation and customization with the help of the documentation.\n\n## **Faster prototyping**\n\nWith ready-made React components at your disposal, you can quickly create several functioning prototypes. This means you can prove that the design concept is functioning without having to spend too much time on any of the details.\n\n## **Saves time**\n\nUsing a component library saves time not only when prototyping, but also when already working on your React project. It enables you to write less code, as you won’t have to write all the styles yourself.\n\n## **Recognizable components by users**\n\nInnovation to a certain extent helps your project stand out. But too much innovation in designing UX/UI can put users off. As the UI elements in libraries are designed to be universal, they won’t cause any friction for your users.\n\n## **Customizable components**\n\nDespite being universal, most elements can be customized at least to some extent. Each library gives you a different amount of control over the customization, but you’ll be able to make sure your website doesn’t look to much like many others.\n\n## **Proven compatibility across devices**\n\nMost prebuilt UI components are mobile-responsive by default, which means you won’t have to put a lot of extra effort into ensuring your React project works on different types of devices.\n\n## **Accessible by default**\n\nMost popular UI component libraries have built-in accessibility features or even fully adhere to WCAG or other standards and best practices. Thanks to this, you won’t have to worry about self-coding semantic tags or keyboard navigation.\n\n## **Crowd-sourced**\n\n[UI component libraries](https://dev.to/domysee/benefits-of-a-component-library-2baa) often have their communities centered around GitHub. This means users can raise issues, request features, and also easily become contributors to the libraries.\n\n## **Free and Customizable UI Kit: Build Stunning Web Interfaces with MagicUI**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n# **27 Component Library Examples Every Designer Must Know**\n\n![Component Library Examples](https://cdn.magicui.design/assets/rhfvipxhiah.jpg)\n\n## **1\\. Magic UI**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## **2\\. Material UI**\n\nMaterial-UI (MUI) is a fully loaded UI component library that offers a comprehensive set of UI tools to create and deploy new features at speed. It is one of the most powerful and popular UI component libraries out there with over 3.2 million downloads on npm a week, 78k stars on GitHub, 17k+ followers on Twitter, and 2.4k+ open-source contributors.\n\nThere are two ways to go about it – you can either use this component library directly or bring your design system to their production-ready components. This platform will enable you to design faster without sacrificing control or flexibility. It will help you deliver excellent designs in order to delight the end-users.\n\n## **3\\. Polymer Elements**\n\nGoogle’s Polymer library lets you build encapsulated, reusable Web Components that work like standard HTML elements with an experience as simple as importing and using any other HTML element. Polymer elements is a GitHub organization containing over 100 reusable Polymer components as standalone repositories you can browse and use off-the-shelf.\n\n## **4\\. Angular Material**\n\nAngular Material, formerly known as Material2, is Google’s official Angular UI component library. It is built using TypeScript and focuses on implementing the application based on Google’s Material Design. Most importantly, Angular Material allows developers to create their own customized components. Angular Material has more than 22,000 GitHub stars and 1.1 million weekly NPM downloads.\n\n## **5\\. NG-Bootstrap**\n\nNG-Bootstrap is an open-source library built on top of Bootstrap CSS, providing components and design patterns that many developers are already familiar with. This reduces the learning curve for new projects, making it a reliable choice for building Angular applications quickly and efficiently.\n\nNG-Bootstrap extends the capabilities of Bootstrap components by allowing developers to use them as Angular directives, with two-way data binding and other Angular-specific features. This makes it easy for developers to create responsive, mobile-friendly web applications that work seamlessly with Angular.\n\n## **6\\. Chakra UI**\n\nChakra UI, created by Segun Adebayo in 2019, emphasizes simplicity, modularity, and accessibility. The React component library Chakra UI provides developers with extensive hooks and components for constructing accessible, responsive web apps.\n\nThe large range of custom hooks that abstract away typical UI logic like animation, disclosure, and more makes Chakra UI powerful. These hooks simplify complex interfaces. Excellent offerings and performance are making Chakra UI popular with 1.3 million monthly downloads and 19,700 GitHub stars.\n\n## **7\\. Ant Design (AntD)**\n\nIf you are looking for a react based UI component library to build enterprise-grade products, Ant Design is an excellent option. It will help you create an enjoyable yet productive work experience. This tool is used by companies like Alibaba, Baidu, Tencent, and many more.\n\nAnt Design offers multiple UI components to help enrich your application and software systems. Ant Design also recommends you use other React-based third-party component libraries like React JSON View, React Hooks Library, and more. It does maintain documentation and supports community discussions through GitHub, Segmentfault, and Stack Overflow.\n\n## **8\\. Clarity**\n\nClarity is an open-source library that uses a shared visual language across its components to provide a consistent, intuitive UI. It’s also extensively documented, with numerous guides, tutorials, and API references, making it easy to learn and use. The Clarity design system is based on the concept of “cards,” which are used to group related content. Cards are used to represent individual pieces of content in a structured and organized way.\n\nClarity provides a variety of card components that can present data in a variety of formats. These card components include headers, footers, and content sections, and can be easily customized with different styles and themes. The cards can also be combined with other components — such as modals, dropdowns, and buttons — to create more complex UI designs. The overall goal of the card-based design is to provide a flexible and modular system for creating complex interfaces with ease.\n\n## **9\\. Kendo UI**\n\nKendo UI is a commercial library built with performance in mind, ensuring fast load times and a smooth user experience. It also provides themes and styling options to enhance the look and feel of your application, as well as extensive documentation and a dedicated support team. Kendo UI uses techniques such as virtualization and lazy loading to ensure fast load times and a smooth user experience.\n\nThis means that applications built with Kendo UI are fast and responsive, even when dealing with large datasets. Kendo UI also follows a modular architecture that enables developers to use only the components that they need, reducing the library’s size and improving performance.\n\n## **10\\. Semantic UI**\n\nSemantic UI React is the official integration of the popular frontend framework Semantic UI for React. The styling of Semantic UI React is based on the Semantic UI theme and it's also free from jQuery. Apart from that, there are other useful features like augmentation, shorthand props, auto-controlled state, etc.‍\n\n### Considering the Downsides: Potential Weight and Customization Challenges\n\nOn top of this, there are some things you might want to consider.\n\n- Semantic UI can feel a bit heavy for simple websites. It includes plenty of features you might not need, which can slow down your page load times.\n- While customizing the look and feel is possible, it can be tricky. The documentation might not always be accurate, and the code itself uses a lot of \"important\" styles, which can make it challenging to override it with your own styles.\n\n### Customization Complexity\n\nAll things considered, Semantic UI is a solid option for building functional desktop web apps quickly. Just be aware of its weight and potential customization challenges before diving in. If you need a lightweight solution or a highly customized design, you might want to consider other React libraries. The total GitHub stars of Semantic UI React are more than 13K and weekly NPM downloads are more than 230K.\n\n## **11\\. React Bootstrap**\n\nAnother popular front end framework – React Bootstrap, is rebuilt for React-based applications and systems. It has replaced Bootstrap JavaScript, where each component is developed from scratch as native React components without needing dependencies such as jQuery. React-Bootstrap, despite being one of the earliest React libraries, has evolved to become an excellent option for building effortless user interfaces. It includes amazing UI elements for your mobile and web applications.\n\n## **12\\. Blueprint UI**\n\nBlueprint UI, an open-source project by Palantir Technologies, provides high-quality UI components. Blueprint is a React-based UI toolkit for designing complicated, data-dense desktop interfaces. If you want to build desktop apps, this React component library is ideal. The core Blueprint NPM package includes 30+ familiar and unique React components such as Button, Card, Menu, Form Group, File Input, etc.\n\nDatetime and Datetime2 for dates, Icons with over 300 vector UI icons, Select and Table for items selection in a list, and interactive spreadsheet interfaces building are among Blueprint’s other NPM packages. Blueprint UI is quite popular with 20,000+ stars on GitHub and 190,000+ weekly downloads on NPM.\n\n## **13\\. visx**\n\nCreated by Airbnb, visx is a collection of multiple low-level, expressive visualization primitives built for React applications. It was developed to unify a complete visualization stack throughout the company, bringing together the delight of React with the robustness of D3 for calculations.\n\nWith visx by your side, you will get a native experience in any React-based codebase as it has the same patterns and standard APIs. This way, it solves the problems of copying-pasting various React hooks. Instead, it can abstract D3 details and offer utilities and components in standard formats. If you like customizable and performing charts, visx is a great tool.\n\n## **14\\. PrimeReact**\n\nPrimeReact is an extensive React component library utilized by global corporations such as Mercedes, ebay, Nvidia, Intel, American Express, and Lufthansa, etc. The app gained popularity between 2022 and 2023 (from 39.5k to 78.7k weekly downloads). Over 90 React components are ready to use in your app. TreeSelect, Organisation chart, Terminal, and Captcha are unique components it offers.\n\nPrimeReact provides customizable templates and 280+ copy-and-paste UI elements to build any interface swiftly. Its design-agnostic infrastructure lets you use the look and feel of popular libraries like Material and Bootstrap or construct your own. The GUI-based Theme Designer includes 500+ variables to customize. They offer help and reply to feature or enhancement requests within one business day.\n\n## **15\\. Mantine**\n\nMantine is a free and open-source React components library that provides 134 fully responsive React components for 25 different categories like navbar, error pages, blog card, comments, sliders, etc. to be put into production. It’s becoming a popular choice for developers, especially those familiar with Material UI. If you're transitioning from Material UI v5, Mantine v6 offers a smooth upgrade path thanks to their similar styling syntax (Emotion). Mantine v7 takes a different approach, relying on standard CSS for customization.\n\nDevs approve of Mantine's components for their high quality and reduced need for customization compared to Material UI. Features like multi-selects and date pickers are considered more intuitive by default in Mantine. Mantine also offers a modern look and feel. Unlike Material UI's distinct style with all-caps buttons and paper shadows, Mantine has a more neutral aesthetic. This allows for easier creation of unique designs without extensive customization. It has got more than 24K stars on GitHub and more than 350K weekly downloads on NPM for its core components library.\n\n## **16\\. Headless UI**\n\nTailwind Labs created headless UI as a collection of unstyled, fully accessible UI components that work seamlessly with Tailwind CSS. Headless UI is responsible for providing the best React frameworks for your React project. Tailwind CSS is taken a step further with Headless UI, which provides the entire best React UI framework with the best React components. Tailwind CSS, which is offered out-of-the-box to meet your individual needs, can be used to style them.\n\nToggle Switch, Autocomplete, and Modal are all common components in Headless UI. Each element comes with a simple example, styling instructions for each portion, and instructions for customizing it to your needs. It also has a complete API for transitions and accessibility information.\n\n## **17\\. Semantic UI React**\n\nIntegrating React with Semantic UI can be an excellent strategy to get a customized UI component library for your projects. Semantic UI React helps you build your sites and applications with concise and easy HTML. It has 12k+ stars on GitHub. With this tool, you can load any CSS theme you want on the app you are building. It also has human-friendly HTML to develop software products. It’s a declarative API that offers powerful prop validation and features.\n\n## **18\\. React-admin**\n\nIf you are looking for a React framework to build your B2B applications, React-admin is a good option. It aims to provide the best experiences to developers and enables you to focus more on fulfilling your business needs. This is an open-source tool with an MIT license and is robust, stable, easy to learn, and a joy to work with.\n\nThis is why 10k+ companies across the world have used React-admin on their projects. With React-admin, you can create delightful UIs, whether you are building your internal tools, B2B apps, CRMs, or ERPs. It aims at increasing the maintainability and productivity of developers by allowing them to design faster.\n\n## **19\\. Retool**\n\nIf you are building internal applications, Retool is an excellent option. It will eliminate the struggle with UI libraries, data sources, and access controls. You will get a streamlined way of handling everything and producing apps that customers love to use. This tool has been used by businesses of all sizes, from Fortune 500s to start-ups for creating awesome internal applications.\n\n## **20\\. Grommet**\n\nAccording to its official site, Grommet is a React library that prioritizes accessibility, responsiveness, and scalability. It offers a set of pre-built components designed for building web applications that work well across different devices and for users with different needs. User experiences with Grommet can be mixed. Some devs praise its focus on usability and theming, but others have complained about bugs and breaking changes between minor versions. While Grommet offers a good range of components, some developers find Material-UI provides a wider selection and more customization options. It has got 8K GitHub stars and more than 26K weekly downloads on NPM.\n\n## **21\\. Evergreen**\n\nOffered by Segment, Evergreen is an amazing React UI library that helps you create delightful software products. It’s also a design system that offers you flexibility and does not limit you to a particular configuration or needs obsolete integration.\n\nEvergreen facilitates building software products that can adapt to changing design needs. It offers a lot of features, components, and many benefits to help you create user-friendly and powerful interfaces. If you want to build enterprise-grade web applications, this will be a good option for you.\n\n## **22\\. ThemeUI**\n\nTheme UI is a library for designing React user interfaces that may be customized. It mainly follows design concepts that are based on constraints. Developers use theme UI to customize base components, create themes, and create their design systems. There are two key steps in designing using Theme UI. The first step is to make your theme, which requires choosing fonts and colors. The style of individual components is the next step, which gives you more control over your site. Theme UI is one of the finest React libraries for web development.\n\nTheme UI also allows you to style MDX content, integrates with existing styled systems and component libraries, and includes dark-mode and mobile-first responsive styles. The documentation for Theme UI is extensive, including instructions for theming, styling MDX, and custom hooks. Guides and recipes on using and constructing custom components are also available as resources.\n\n## **23\\. Onsen UI**\n\nIf your project prioritises a mobile-first experience, Onsen UI is a solid choice. This library helps design interfaces that feel native to mobile devices. It achieves this by offering components and features that mimic the look and feel of native iOS and Android apps. Onsen UI's also touch-friendly UI and native-style animations bridge the gap between web and mobile, creating a smooth user journey for mobile users. Naturally, there are some downsides to consider.\n\nThe cost of Onsen UI has recently increased noticeably, and some users have reported bugs that take a while to get fixed. While iOS performance is good, Android apps built with Onsen UI can sometimes feel sluggish.Native functionalities like maps require separate plugins. It has got 8K GitHub stars and more than 24K weekly downloads on NPM.\n\n## **24\\. React Router**\n\nDeveloped and maintained by the Remix team and its contributors, React Router is an impressive React UI component library. Its recent version is v6 which uses the best features from its previous versions and features some improvements as well. Development teams from reputed companies such as Airbnb, Discord, Microsoft, and Twitter have used this tool in their projects. It’s best if you are searching for a router user interface that can work with a different interface. It can match your app components with corresponding URLs to ensure a better user experience.\n\n## **25\\. Gestalt**\n\nGestalt is a UI library that helps you create amazing user interfaces that people love using. It’s Pinterest’s design tool as well and comes with many features and components. Its interface is also smooth to allow developers quickly get started with the tool.\n\n## **26\\. Shards React**\n\nWeb development professionals get the choice to craft an extensive range of precise dashboards, web portals, and mobile applications for a diversity of industries component libraries. The sleek and straightforward design Framework also makes it one of the best in the minimalist libraries of React components.\n\nThe React library is fast and efficient on different platforms because of the optimized code. Shards React can ensure giving the developers the perfect mixture of the customization options. There are many components, and the base library is free. But if you wish to get more templates, components, blocks, then there is always a way of purchasing the pro kit to ensure the addition of tons of the additional features.\n\n## **27\\. React Motion**\n\nIf you are looking for a solution to animate components in React, you can consider React Motion. It is an excellent React library that will help you create realistic animations. It’s easy to get started with this tool and use it. What makes this tool even more attractive is that you can specify stiffness values. You can also define damping parameters. This way, your components will look more realistic as you can control the stiffness. React Motion can easily animate a simple card component’s scaling. For this, you will need to utilize styled-components.\n\n## Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n# **What Makes A Good Component Library For Your Project?**\n\n![Component Library Examples](https://cdn.magicui.design/assets/ue4niqwozg.jpg)\n\n## **1\\. Project needs**\n\nThe first thing I consider when evaluating a component library is whether it meets the needs of my project. A large enterprise application, for instance, would require a library capable of supporting a high level of complexity. This involves looking at not only the scale of the project but also the type and any specific requirements.\n\n## **2\\. Longevity**\n\nI also look at the longevity of the library. This means gauging how frequently it is updated and whether it will likely be supported. It is important to choose a library that is actively maintained to avoid having to switch to a new library in the future.\n\n## **3\\. Learning curve**\n\nAnother important factor is how easy it is for a new developer to pick up and use the library. If you work in a team, choosing a library that's easy for new developers to learn is crucial.\n\n## **4\\. Customizability**\n\nCan the library be tailored to fit your brand's design guidelines? This is a question that must be answered. Some libraries are more customizable than others, so if you have specific design requirements, you must choose a library that can be customized to meet your needs.\n\n## **5\\. Community**\n\nA large and active community is important when choosing a library. This is because a large community can provide support and help you resolve any problems that you encounter.\n\n## **6\\. Documentation**\n\nIs the library well-documented? Good documentation makes learning how to use the library and find solutions to problems is easier.\n\n## **7\\. Performance**\n\nI consider the performance of a library. Some libraries are more performant than others. If you need a highly performant [React component library](https://magicui.design/), you should choose one known for its speed and responsiveness.\n\nChoosing a component library that meets these criteria is essential to the success of your project.\n\n# **How To Get The Best Out Of Using React Component Libraries**\n\n![Component Library Examples](https://cdn.magicui.design/assets/j1v7xl5zbld.jpg)\n\nUsing component libraries effectively can significantly enhance your development workflow and the functionality of your applications. It's essential to understand that not all libraries are created equal. Each has unique features and benefits, and combining multiple libraries can help you get the most out of them. Here's how you can maximize the value of component libraries:\n\n## **Understand the Strengths of Each Library**\n\nEvery library is designed to solve specific problems or add particular functionalities. Before integrating a library into your project, take the time to understand what it excels at. For instance, Material-UI offers a comprehensive suite of UI components. By identifying the strengths of each library, you can select the best tools to address the specific needs of your application.\n\n## **Combining Libraries for Enhanced Functionality**\n\nConsider combining two or more libraries to fully leverage the power of component libraries. This approach allows you to create a more powerful and cohesive development environment. Combining libraries enables you to take advantage of their collective strengths, creating a more efficient and effective development process.\n\n## **Enhancing Libraries with Magic UI**\n\nIntegrating Magic UI is a game-changer to get the best from any library combination. Magic UI can enhance your existing libraries in several ways:\n\n### Consistency\n\nMagic UI ensures a consistent look and feel across your application, regardless of the libraries used.\n\n### Efficiency\n\nIt can automate repetitive tasks and streamline the integration process, saving you time and effort.\n\n### Customization\n\nMagic UI offers advanced customization options, allowing you to tailor the libraries to fit your specific needs perfectly.\n\n### Accessibility\n\nIt can improve accessibility features across your application, ensuring a better user experience for all users.\n\nBy adding [Magic UI](https://magicui.design/) to your library stack, you enhance the capabilities of each library, leading to a more cohesive and powerful application.\n\n## Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n# **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n## **A React Component Library with Over 20 Animated Components**\n\nMagicUI offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These components make it possible to create visually appealing and interactive user interfaces with stunning animations. With MagicUI, developers can easily integrate these components into their web applications to enhance the user experience.\n\n## **Easily Integrate Stunning UI Components into Web Applications**\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. These components can be integrated into web applications with ease, providing developers with the tools needed to create impressive user interfaces. By leveraging the power of MagicUI, developers can save time and effort when designing their applications.\n\n## **Highly Customizable UI Components to Match Your Branding**\n\nWith MagicUI, developers have the flexibility to customize UI components to match their branding and design requirements. This level of customization ensures that the user interfaces created with MagicUI will seamlessly integrate with existing design elements and branding guidelines. MagicUI empowers developers to create captivating digital experiences that resonate with their target audience.\n\n## **Bridging the Gap Between Design and Development**\n\n[MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering developers to craft captivating digital experiences. By providing a design-centric approach and focusing on animation, MagicUI makes it easy for developers to create user interfaces that captivate users. MagicUI components enable developers to create stunning user interfaces while minimizing the effort required.\n\n## **Save Time and Effort with Beautiful Landing Page Templates**\n\nMagicUI Pro offers developers the opportunity to save time and effort by providing beautiful landing page templates. These templates are designed to convert visitors into customers, making them an invaluable resource for developers looking to create engaging web applications. MagicUI Pro empowers developers to create captivating landing pages that drive conversions and deliver results.\n\n## **Start Using Our React Component Library for Free Today!**\n\nWith [MagicUI](https://magicui.design/), developers can start using our React component library for free today. By leveraging the power of MagicUI, developers can save time and effort when designing their web applications. MagicUI empowers developers to create visually appealing and interactive user interfaces that captivate users and deliver outstanding user experiences.\n\n[Start using MagicUI](https://magicui.design/) today and take your web applications to the next level.\n"
  },
  {
    "path": "apps/www/content/blog/cool-css-animations.mdx",
    "content": "---\ntitle: \"12 Cool CSS Animations Your Website Must Have Right Now\"\ndescription: \"Discover 12 cool CSS animations that will add dynamic flair to your website, making it more engaging and visually captivating.\"\nimage: https://cdn.magicui.design/assets/94bcae57-ed02-4f82-a869-a348bed954ea.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nTo stand out in today's crowded digital space, websites must impress users immediately. One of the best ways to do this is to incorporate eye-catching, interactive features that draw users in and keep them engaged. [Web design best practices](https://magicui.design/blog/web-design-best-practices) and Cool CSS animations, in particular, can help you achieve this goal while creating a more polished and professional website. In this guide, we'll explore some of the most astonishing CSS animations that can help your website make a lasting first impression.\n\nMagic UI's startup landing page template has a ton of cool CSS animations that can help your website impress visitors and keep them engaged. Using this resource, you can create a stunning startup website with attractive animations to boost your site's appeal and help you achieve your goals.\n\n## What Are CSS Animations?\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1611647832580-377268dba7cb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8Y3NzfGVufDB8fHx8MTcyNDkyMDE3OXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nDid you know that [websites with well-crafted animations](https://www.b12.io/resource-center/website-design/website-animations-benefits-and-pitfalls/#:~:text=Website%20animations%20usher%20visitors%20through,visitors%20interact%20with%20a%20page) can see a 20% increase in user engagement? Animations are no longer just a visual flourish; they're a powerful tool for grabbing attention, enhancing user experience (UX), and ultimately driving conversions. CSS animations allow you to create dynamic and interactive elements on your website. Using keyframes and animation properties, you can define an element's start and end states and control how it transitions between them.\n\nKeyframes are specific points within an animation sequence where you can set the element's style properties. For example, define a keyframe at 0% to specify the starting state of the component and another [keyframe at 100%](https://stackoverflow.com/questions/70888200/css3-maintain-final-animation-keyframe-if-below-100-progress) to determine its ending state. Animation properties, such as animation-name, animation-duration, animation-timing-function, animation-delay, animation-iteration-count, and animation-fill-mode, allow you to control the timing, speed, and behavior of the animation.\n\n### Why Should I Use CSS Animations on My Site?\n\n#### Improved Engagement\n\nAnimations can capture user attention and keep them interested in exploring your website. By adding movement and visual interest, you can make your site more engaging and enjoyable to use.\n\n#### Enhanced User Experience (UX)\n\nAnimations can provide visual cues, guide users through your website, and create a more interactive experience. They can also indicate loading progress, highlight interactive elements, or provide feedback on user actions.\n\n#### Increased Brand Personality\n\nAnimations can help you to showcase your brand's unique voice and style. By choosing animations that align with your brand's values and aesthetic, you can create a more memorable and consistent user experience.\n\n#### Boosted Conversions\n\nAnimations can be used to encourage users to take action, such as clicking on a call to action button or filling out a form. You can also use animations to highlight important elements on a page or to create a sense of urgency or excitement. Using CSS animations, you can create a more engaging, user-friendly, and effective website.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## 12 Cool CSS Animations\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBsYXB0b3B8ZW58MHx8fHwxNzI0OTIwMTkyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Cool CSS Animations: Fade-in\n\n[Fade-in animations](https://blog.hubspot.com/website/css-fade-in) introduce elements to a web page smoothly and organically. As the name implies, a fade-in animation gradually changes an element's opacity from 0 to 100 percent. This classic animation creates a gentle transition that helps users acclimate to changes on a web page. You can use fade-in animations to make content appear more natural, as they don’t disrupt the user experience with jarring movements. Instead, they create a pleasant visual that can complement almost any website design. You can also use fade-in animations, such as triggering them on hover or activating them automatically as a website loads or a user scrolls down a page.\n\n### 2\\. Cool CSS Animations: Hover Effects\n\nHover effects, also known as hover animations, add interactivity to a website by creating movements or visual changes that activate when users hover their cursor over an element. These animations can be simple, such as changing an element’s background color, or more complex, such as combining multiple animations to create a dynamic visual.\n\nEither way, hover effects make websites more engaging and help users better understand how to navigate a site. For example, you can use hover animations to help users identify the purpose of interactive elements like buttons and links. Instead of a static visual, these elements will change on hover, making them more inviting and pleasant.\n\n### 3\\. Cool CSS Animations: Progress Bars\n\nProgress bars visually represent loading times or progress through a task, providing users with feedback and reducing perceived wait times. CSS animations can create visually appealing progress bars that enhance a website’s design. For example, you can display a simple loading animation while a website or web application fetches data or loads a new page.\n\nThis can help improve user experience by reducing frustration and the likelihood that a user will abandon your site due to slow load times. You can also use CSS progress bars to show how much of a file has downloaded or indicate how far along a user is in completing a task, such as filling out a form.\n\n### 4\\. Cool CSS Animations: Slide-in\n\nSlide-in animations create a dynamic entrance for elements on your website. Instead of simply appearing on the page, elements with slide-in animations will move into view from the page's left, right, top, or bottom. This creates a visually appealing transition that can make your website feel more interactive.\n\nYou can use slide-in animations for various purposes, such as introducing new content to a page, revealing navigation menus or subcategories, or making content panels more accessible. For example, many websites use slide-in animations for elements that activate on scroll, such as sidebars and hidden content sections. These animations can create a more engaging user experience, especially for long scrolling pages.\n\n### 5\\. Cool CSS Animations: Scale\n\nScale animations increase or decrease an element’s size to create a visually appealing effect. For example, you might use a scale animation to emphasize a product image on an eCommerce site or to reveal hidden details on hover. Scale animations can create a sense of depth and help draw attention to important information on your website. They are also simple to implement with CSS and can be combined with other animations for more complex effects.\n\n### 6\\. Cool CSS Animations: Rotate\n\nRotate animations add a playful element to your website. As the name implies, these animations make elements rotate around their axis, creating an engaging transition that can enhance user experience. You can use rotate animations for various purposes, such as creating visually interesting transitions or uniquely revealing hidden content. For example, many websites use a CSS rotate animation to create a fun transition effect for cards that flip over to show additional information. These animations can make your website feel less static and more dynamic.\n\n### 7\\. Cool CSS Animations: Pulsate\n\nPulsate animations create a sense of movement and energy by making an element expand and contract in size. You can use pulsate animations to draw attention to essential elements on your website, such as a notification or a call-to-action button. Alternatively, you can use a pulsating effect to create a more visually exciting design in the background of your website. Pulsate animations are simple with CSS and can be customized to fit your design specifications.\n\n### 8\\. Cool CSS Animations: Bounce\n\nBounce animations add a playful and engaging element to your website. As the name implies, these animations create a bouncing effect where elements move up and down or side to side. You can use bounce animations for various purposes, such as creating a more interactive and fun user experience, especially for children or young adults. Additionally, bounce animations can help draw attention to specific elements on your website, making them ideal for call-to-action buttons or notifications.\n\n### 9\\. Cool CSS Animations: Flip\n\nFlip animations create a unique transition effect where elements transform to reveal a different side or content. You can use flip animations for various purposes, such as revealing hidden information or creating a more interactive user experience. For example, many websites use flip animations for card elements showing additional hover details. These animations can make your website feel more engaging and less static.\n\n### 10\\. Cool CSS Animations: Shake\n\nShake animations create a shaking or trembling effect on elements, often used to indicate an error or create a sense of urgency. For example, many websites use shake animations to provide visual feedback when a form is submitted incorrectly or to highlight essential notifications. You can also use shake animations for decorative purposes to create a more dynamic and engaging user experience.\n\n### 11\\. Cool CSS Animations: Morph\n\n[Morph animations](https://www.adobe.com/creativecloud/animation/discover/morphing-in-animation.html) change an element’s shape or appearance, creating a visually striking and unique effect. You can use morph animations for various purposes, such as transforming elements into different shapes or creating unique transitions between other content. For example, you can create a CSS morph animation that changes a circle into a square to help visually demonstrate a point on your website. These animations can help improve user experience by making transitions more intuitive, especially for complex web applications.\n\n### 12\\. Cool CSS Animations: Parallax Scrolling\n\nParallax scrolling creates a depth effect by making background elements move faster than foreground elements. This creates an immersive and visually engaging experience for users. Many websites use parallax scrolling to create captivating digital experiences, especially for websites with long scrolling content. Parallax scrolling can help break up monotonous content sections to reduce user boredom and improve overall engagement on your website.\n\n## Implementing CSS Animations in Your Project\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1504780361545-d1ce834be3a9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3b3JraW5nJTIwYWxvbmV8ZW58MHx8fHwxNzI0OTIwMjA0fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Choose Your Animation Wisely \n\nSelecting the [proper CSS animation](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animations/Using_CSS_animations) for your project is like picking out an accessory for your outfit. You want to choose something that complements your style without drawing too much attention to itself. The same holds for web design animations. Cool CSS animations can enhance your website’s visual appeal and user experience, but only if used appropriately.\n\nBefore implementing CSS animations, take some time to research different types of animations. Then, choose one that fits your design goals and the element you want to target. For instance, if you’re looking to draw attention to an image of a new product, a subtle zoom-in effect may be your best option. On the other hand, if you want to create a more engaging website transition, a fade animation could help smooth the transition without distracting from the content.\n\n### Define the Animation: Know the Code\n\nOnce you’ve picked the perfect CSS animation for your project, it’s time to define the code. At this stage, you’ll create keyframes to establish the starting and ending points of the animation. This will give the browser a baseline understanding of how the animation should progress. You can adjust the animation’s properties to control its behavior from there. These properties include:\n\n#### Animation-Name\n\nThis property lets you define the name of the keyframes you’ll be using.\n\n#### Animation-Duration\n\nThis property controls how long the animation takes to complete from start to finish.\n\n#### Animation-Timing-Function\n\nThis property lets you control the [speed of the animation](https://brush.ninja/glossary/animation/playback-speed/). Using easing functions, you can create a linear animation or make it progress more quickly at the start, end, or both.\n\n#### Animation-Delay\n\nThis property allows you to set a time that the animation will wait to begin after a page or element loads.\n\n#### Animation-Iteration-Count\n\nThis property controls how many times the animation will run. You can set a specific number or loop indefinitely with the “infinite.” Animation-fill-mode: This property defines the animation’s behavior before it starts after it ends, or both.\n\n### Apply the Animation and Get Moving\n\nAfter you’ve defined your CSS animation, it’s time to apply it to the desired HTML element. This is done using the animation property in your CSS code. To illustrate, let’s look at an example of a simple fade-in animation.\n\n### Use Code With Caution \n\nWhile CSS animations can add flair to your website, using them judiciously is essential. Excessive use of cool CSS animations can lead to a poor user experience and even harm your site’s SEO. Animations that are too flashy or occur too frequently can distract users from your website’s content. Additionally, heavy animations can impact your website’s performance, leading to slow load times that frustrate users.\n\n## Best Practices for Using CSS Animations\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1529339017023-c2f2ce633d0d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyNDkyMDIxNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Performance Optimization\n\n[Performance optimization](https://web.dev/articles/animations-guide) is critical when using CSS animations. Excessively complex animations can slow down your website and drive users away. Here are three tips for improving the performance of your CSS animations.\n\n### Minimize Complex Animations \n\nAvoid using overly complex animations that can strain your website's performance. Keep animations simple and efficient. For example, consider using a simpler fade-in or slide-in effect instead of creating a complex morphing animation.\n\n### Optimize Keyframes \n\nReduce the computational overhead by using fewer keyframes. Try to achieve the desired effect with fewer keyframes.\n\n### Hardware Acceleration \n\nLeverage hardware acceleration using the will-change property to indicate that an element's style properties will change frequently. This can help improve performance by signaling the browser to prepare to render the animation using hardware acceleration.\n\n### Accessibility\n\nCSS animations can cause problems for users with disabilities. Follow these guidelines to make your animations more accessible.\n\n### Alternative Text \n\nProvide alternative text for [animated elements](https://premiumvfx.com/animated-elements/) to ensure accessibility for visually impaired users. The alt attribute for images or the aria-label attribute for other components can be used.\n\n### Pause on Focus \n\nAnimations can be paused when a user focuses on an element to avoid distractions and improve usability. JavaScript can detect when an element receives focus and temporarily pauses the animation.\n\n### Keyboard Navigation \n\nEnsure that animations do not interfere with keyboard navigation. For example, avoid using animations that make it difficult for users to tab through elements or focus on interactive elements.\n\n### Subtlety\n\nCSS animations can be a great way to enhance your website's user experience. However, too many animations can overwhelm users and distract them from your site’s content. Follow these best practices for subtle animations.\n\n### Use Animations Sparingly \n\nAvoid overwhelming users with excessive animations. Use them judiciously to enhance the user experience, not to distract from the content. Too many animations can be visually distracting and make it easier for users to focus on the critical information on your website.\n\n### Consider User Preferences \n\nAllow users to disable animations if they prefer a more straightforward experience. This can be done using a preference setting or a toggle button on your website.\n\n### Clarity \n\nAnimations should serve a clear purpose to enhance your website's user experience. Follow these guidelines for creating clear CSS animations.\n\n### Animations Should Serve a Purpose \n\nAnimations should have a clear purpose and enhance the user experience, not simply be decorative. For example, you could use an animation to indicate loading progress, highlight interactive elements, or provide feedback on user actions.\n\n### Avoid Distractions \n\nEnsure that animations do not interfere with the user's ability to complete their tasks. For example, avoid using animations that obscure important content or make it difficult to read text.\n\n### Additional Tips\n\nHere are some additional tips for creating effective CSS animations.\n\n### Test Across Devices \n\nTest your animations on different devices and browsers to ensure compatibility and optimal performance. This is especially important for websites that target a wide range of users.\n\n### Monitor User Behavior \n\nUse analytics tools to track user behavior and identify any animations-related issues. This can help you determine which animations are working well and which need improvement.\n\n### Iterate and Improve \n\nContinuously evaluate and refine your animations based on user feedback and performance metrics. Feel free to experiment with different animations and adjust as needed.\n\n### Related Reading\n\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## How MagicUI Can Help Your Brand\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1674049405545-beb0b3fbb11b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMGxhcHRvcCUyMGFsb25lfGVufDB8fHx8MTcyNDkyMDIyNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n[MagicUI offers a reliable way](https://pro.magicui.design/docs/templates/startup) to improve your brand’s identity with its pre-built components and customizable animations. When you use MagicUI’s components to create your website, you can ensure a consistent visual experience that reinforces your brand’s unique identity. For instance, you can use MagicUI’s button components to ensure all buttons on your site have the same look and feel, regardless of location or function.\n\nIn addition, [MagicUI’s components](https://pro.magicui.design/docs/templates/startup) are highly customizable, allowing you to tailor them to match your brand’s specific colors, fonts, and styles. This ensures your animations align with your brand’s aesthetic and bolster your unique identity. For example, you can customize the colors and timing of MagicUI’s slide-in animation to match your brand’s color palette and desired level of engagement.\n\n### Improve User Experience with MagicUI\n\nOne of the most significant [advantages of using MagicUI](https://pro.magicui.design/docs/templates/startup) is that it can improve user experience. First, the animations and interactions available in MagicUI can make your website more engaging, keeping visitors interested and encouraging them to explore further.\n\nFor example, you can [use MagicUI’s hover effects](https://pro.magicui.design/docs/templates/startup) to create visually exciting interactions that respond to user input. Animations can also guide users through your website, making finding what they want easier. For instance, MagicUI’s slide-in animation can reveal navigation menus or content panels when users hover over specific elements. By creating a more enjoyable and engaging experience, MagicUI can help reduce bounce rates and increase time spent on your website. When visitors have a positive experience on your website, they are likelier to stay and explore further.\n\n### Drive Conversions with MagicUI\n\nYou can also use [MagicUI to help drive conversions](https://pro.magicui.design/docs/templates/startup) on your website. Animations can draw attention to essential elements on your website, such as calls to action or product features. For example, you can use MagicUI's pulsate animation to highlight a necessary element on your page, encouraging users to take action.\n\nIn addition, by keeping visitors engaged, [MagicUI can increase the likelihood](https://pro.magicui.design/docs/templates/startup) of them taking desired actions, such as making a purchase or signing up for a newsletter. When users are engaged and interested in your website, they are more likely to convert. Studies have shown that websites with animations can have higher conversion rates than those without. By incorporating MagicUI into your website, you can increase the chances of converting visitors into customers.\n\n## Frequently Asked Questions (FAQs) on Cool CSS Animations\n\n![Cool CSS Animations](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyNDkyMDI0OXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### What are the benefits of using CSS animations on a website?\n\n#### CSS Animations Keep Users Engaged\n\nCSS animations can make your site more visually appealing and interactive, capturing user attention and keeping them engaged. This can lead to increased time spent on your site and higher conversion rates.\n\n#### CSS Animations Improve User Experience\n\nAnimations can provide visual cues and feedback, making your website easier to navigate and understand. For example, you can use animations to indicate loading progress, highlight interactive elements, or provide confirmation messages.\n\n#### CSS Animations Boost Conversions\n\n[Animations can draw attention](https://www.linkedin.com/advice/3/how-can-you-use-animation-draw-attention-important-web-m1uxc) to essential elements on your website, such as calls to action or product features. This can increase the likelihood of users taking desired actions, such as purchasing or signing up for a newsletter.\n\n#### MagicUI: A Quick Overview\n\nMagicUI is a [free and open-source UI library](https://pro.magicui.design/docs/templates/startup) that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, [with MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today\n\n### Are CSS animations challenging to implement?\n\n#### CSS Animations: Are They Complicated? \n\nCSS animations are simple enough to implement. They require some coding knowledge, but basic animations can be implemented quickly. More advanced animations may require more effort, but many resources online, including tutorials and documentation, help you learn and implement CSS animations. The complexity of implementing CSS animations depends on the specific animation you want to create. Simple animations like fade-ins and slide-ins can be implemented quickly. However, more complex animations, such as morphing or custom-built effects, may require a deeper understanding of CSS and JavaScript.\n\n### Can I use CSS animations with other CSS frameworks or libraries?\n\n#### Can I Use CSS Animations with Other CSS Frameworks or Libraries?\n\nYes, you can use CSS animations with other CSS frameworks or libraries. However, you may need to modify your code to ensure compatibility with the specific framework or library you are using. For example, if you use Bootstrap, you may need to change your CSS classes or use Bootstrap's built-in animation utilities.\n\nCSS animations are compatible with the most popular [CSS frameworks](https://www.browserstack.com/guide/top-css-frameworks) and libraries. You can use them alongside frameworks like Bootstrap, Foundation, or Tailwind CSS to create beautiful, engaging animations. However, it's essential to consult the documentation of your specific framework or library to understand how to integrate CSS animations effectively.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI library](https://pro.magicui.design/docs/templates/startup) designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. [With MagicUI](https://pro.magicui.design/docs/templates/startup), you get access to visually appealing and interactive elements that can be easily integrated into web applications, allowing you to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match your desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering you to craft captivating digital experiences. Along with our free component library, [with MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/cool-react-components.mdx",
    "content": "---\ntitle: \"19 Really Cool React Components For Your Next Project\"\ndescription: \"Get inspired with these cool React components for your next project. With options like carousels and photo gallery, the possibilities are endless!\"\nimage: https://cdn.magicui.design/assets/496d511f-225e-428c-9aff-9bddae4d2a34.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-11\"\nfeatured: false\n---\n\nAre you tired of spending hours searching for the perfect React components to enhance your [UI Frameworks](https://magicui.design/blog/ui-frameworks)? Imagine having a comprehensive guide showcasing your projects' coolest React components, saving you valuable time and effort. Look no further! Our blog on cool React components is here to provide you with the latest and most exciting component discoveries to elevate your UI frameworks to a whole new level.\n\nIntroducing Magic UI's [React component library](https://magicui.design/) – the ultimate solution designed to help you achieve your goal of discovering cool React components for your projects. With Magic UI, you can explore various innovative components to bring your UI Frameworks to life. Say goodbye to tedious searches and a newfound efficiency in your development process!\n\n## **Recap Of React**\n\n![Cool React Components](https://images.unsplash.com/photo-1633356122544-f134324a6cee?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxyZWFjdHxlbnwwfHx8fDE3MTkwNTgzOTB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact is a popular open-source front-end JavaScript library that can be used to build user interfaces (UIs). Facebook developed it and has gained popularity for its efficient and reusable components.\n\n### Component-Based Architecture\n\nReact allows developers to build complex UIs by breaking them down into smaller, reusable components. These components can be used across different application parts, reducing the amount of code that needs to be written and maintained.\n\n### Declarative Programming\n\nReact uses a declarative approach to programming, meaning developers only need to describe what they want the UI to look like, and React takes care of the underlying logic to make it happen.\n\n### Virtual DOM for Performance\n\nReact also has a virtual DOM, which improves performance by updating only the changed parts of the UI rather than the entire UI.\n\n### Popularity and Usage\n\nAccording to the State of JS Survey 2022, React is the most popular frontend library, with approximately 17.4 million weekly downloads. It is widely used in the industry and has been adopted by many Fortune 500 companies, including Facebook, Instagram, Airbnb, Netflix, and Dropbox.\n\nThe popularity of [React](https://react.dev/) has led to the creation of many UI libraries and component frameworks, each with its advantages and features. With these best CSS frameworks for React, developers can easily include pre-built, tested UI components in their projects by building on top of React’s core functionality. It helps to maintain the project in the long run and saves developers time and effort, allowing them to focus on the unique features of their application.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## **What Are React Component Libraries?**\n\n![Cool React Components](https://images.unsplash.com/photo-1534972195531-d756b9bfa9f2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzE5MDU4NDAyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact component libraries are a game-changer in UI development. These libraries provide an extensive repertoire of ready-to-use components that can be easily integrated into React-based applications. From tables and charts to buttons and maps, these libraries offer various components that can be seamlessly customized to match your application's design and style needs.\n\n### The Rise of React and Component Libraries\n\nIn recent years, [the popularity of React UI](https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/) component libraries has surged due to the growing number of React-based applications in the digital landscape. According to the latest statistics, React is the second most used web framework worldwide and continues to empower developers to easily create dynamic web applications. Its real-time data updates and effortless user interface development capabilities have made it a preferred choice for many.\n\n### Efficiency and User Experience\n\nThe increased adoption of these UI libraries accelerates development speed and enhances the overall user experience of applications. By leveraging the functionalities of React component libraries, developers can focus more on enhancing user engagement, improving performance, and delivering an exceptional user experience. These libraries' modular structure and reusable components simplify the development process, making it easier for developers to create visually appealing and responsive UIs.\n\n### Tailoring UIs with Diverse React Component Libraries\n\nWhen it comes to React component libraries, the possibilities are endless. Whether designing a simple website or a complex web application, these libraries offer a wide range of components that can be tailored to meet your specific requirements. With the right [React component library](https://magicui.design/) at your disposal, elevating your UI game has never been easier.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **19 Really Cool React Components To Take Your Project To The Next Level**\n\n![Cool React Components](https://images.unsplash.com/photo-1511376777868-611b54f68947?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkZXZlbG9wbWVudHxlbnwwfHx8fDE3MTkwNTg0MTV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. MagicUI React Component Library: Revolutionizing UI Design\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### 2\\. React Burger Menu\n\n[React-burger-menu](https://github.com/negomi/react-burger-menu) offers an off-canvas sidebar React component with several effects and styles using CSS transitions. It also supports multiple animations like slide, stack, bubble, push and more. It uses modern CSS3 features, so some animations may not be displayed properly in all browsers.\n\n### 3\\. React Slick\n\nA React component for creating beautiful and responsive carousel sliders. It is the react-based version of [slick carousel](https://github.com/akiran/react-slick). It offers various carousel options that you can customize, including infinite rotation, autoplay, lazy loading, and much more.\n\n### 4\\. React Google Map\n\nThis is a React component based on the [Google Maps API](https://github.com/istarkov/google-map-react). It is fully isomorphic and allows you to render animated react components on the map even if the Google Maps API is not loaded. Thanks to the internal hover algorithm, every object on the map can be hovered.\n\n### 5\\. React Credit Cards\n\nThis React Credit Cards component is easy to use and customizable. [React Credit Cards](https://github.com/amarofashion/react-credit-cards) even displays the credit card company that matches the entered credit number.\n\n### 6\\. React Data Grid\n\nReact Data Grid is a powerful, fast, easy-to-use component that provides an Excel-like experience. It also includes keyboard commands, copy and paste, and many other features you would expect to see in a native spreadsheet. As mentioned earlier, react-data-grid offers a simple API that lets you use it in seconds.\n\n### 7\\. React Photo Gallery\n\nA stateless, responsive, and highly customizable React photo gallery. It maintains the original aspect ratio of your photos and uses actual image elements. Passing your custom image components to add extra functionality, like captions and favorites, is also possible.\n\n### 8\\. React Trend\n\nA React component by the Unsplash team can be used to create beautiful line graphs suitable for displaying trending and activity metrics. This project follows a minimalistic approach and gives you a simple, polished solution to one specific problem, so don't expect a full charting library.\n\n### 9\\. React Tooltip\n\nReact Tooltip is a highly customizable tooltip component that would be a perfect match for any UI design you may have. React Tooltip covers anything you may want to do with a tooltip, such as custom events, delays, “live updates” of the tooltip’s content, and much more.\n\n### 10\\. React Block UI\n\nReact Block UI is a simple-to-use component that disables the user interface while indicating “loading.”\n\n### 11\\. React Markdown\n\nReact Markdown is a quick and easy solution for rendering markdowns (including HTML). Not much can be said about it except it does exactly what it says on the tin, and it does it well.\n\n### 12\\. Coloreact\n\nMany UI libraries offer their own color pickers. Still, Coloreact provides the ultimate balance between simplicity and customizability — giving you great control over how it looks and behaves without demanding too much of your time.\n\n### 13\\. React Big Calendar\n\nIf you’re looking for a calendar equipped with all the frequently used features a “professional” calendar has, then React Big Calendar is the component for you. Resource scheduling, localization, custom time grids, or just the usual drag-and-drop — you’ll find them all there.\n\n### 14\\. React Beautiful DnD\n\nA React library by Atlassian for making drag-and-drop components. It offers a clean and powerful API that is easy to use while offering many customization options and controls. The generated components have smooth GPU-powered animations that naturally reflect when elements are picked up or reordered.\n\n### 15\\. ReactPlayer\n\nA React component for playing videos from different file paths and URLs like YouTube, Facebook, Twitch, and more. It parses the URL and loads in the appropriate markup and external SDKs to play the video. The built-in properties can be used to control the volume, player width, height, and more.\n\n### 16\\. React Notification System\n\nA complete and totally customizable component for notifications in React. You can set its title, message, position, action, and more with the built-in notification properties. This component must be rendered on a top-level HTML element in your application for optimal appearance to avoid position conflicts.\n\n### 17\\. React Vis\n\n[React-vis](https://github.com/uber/react-vis) is a collection of react components to render common data visualization charts. It supports multiple chart types, such as line/area/bar charts, heat maps, pie and donut charts, and more. React-vis is easy to setup and use and provides a set of basic building blocks for different charts that can be customized.\n\n### 18\\. React Avatar Editor\n\nThis is an avatar and profile picture editor for React. It offers you a fast and easy way to resize, crop, and rotate your uploaded images using the user interface. The resulting images have the same resolution as the original ones without losing quality.\n\n### 19\\. React Paginate\n\nA React component for creating paginations. It is easy to use and can be customized with CSS. With the built-in properties, you can set the number of pages to be shown, the range of the displayed pages, add labels for the previous and next buttons and more.\n\n### Building Beautiful UIs with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a range of visually appealing and interactive elements that can be seamlessly integrated into web applications. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page.\n\nUse our [React component library](https://magicui.design/) for free today at [magicui.design/docs](http://magicui.design/docs).\n\n## **6 Reasons Why Use React Component Libraries**\n\n![Cool React Components](https://images.unsplash.com/photo-1586892478025-2b5472316f22?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxzdGlja3l8ZW58MHx8fHwxNzE5MDU4MDk3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Improved User Experience\n\nReact allows developers to build highly interactive and responsive user interfaces, resulting in a smoother and more engaging user experience. The virtual DOM efficiently updates and renders only the changed components, reducing load times and improving performance.\n\n### 2\\. Reusable Components\n\nReact promotes a modular approach with reusable components and self-contained modules that can be used across different parts of an application. Reusable components save development time, improve maintainability, and make adding new features or fixing bugs easier.\n\n### 3\\. Efficient Development Process\n\nReact provides a rich set of tools and libraries that facilitate the development process, such as React Developer Tools, Redux, and React Router. It has a simple and intuitive syntax, making it easy to learn and use, especially for developers familiar with JavaScript.\n\n### 4\\. Performance Optimization\n\nReact utilizes a virtual DOM and a diffing algorithm to efficiently update and render only the necessary parts of the UI, resulting in faster rendering and improved overall performance.\n\n### 5\\. SEO Friendliness\n\nReact applications can be made SEO-friendly by rendering on the server side and returning static HTML, which search engines can easily crawl and index.\n\n### 6\\. Flexibility and Integration\n\nReact seamlessly integrates with other technologies and frameworks, making it a versatile choice for web development. It can be used with popular libraries like Axios for API requests or UI frameworks like Bootstrap for styling components.\n\n## **What Makes A Good Component Library? 7 Factors To Consider**\n\n![Cool React Components](https://images.unsplash.com/photo-1515187029135-18ee286d815b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzaW9ufGVufDB8fHx8MTcxOTA1ODQ0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Consistency and Uniformity\n\nA good component library ensures that all UI elements follow a consistent design language. This means having uniform styles, colors, typography, and spacing across all components. Consistency helps create a cohesive user experience and simplifies the design process because designers and developers can rely on established patterns.\n\n### 2\\. Flexibility and Customizability\n\nWhile consistency is important, a good component library also allows for flexibility. Components should be easily customizable to fit different contexts and needs without breaking the overall design harmony. This includes options for modifying colors, sizes, states, and behaviors to adapt to various scenarios.\n\n### 3\\. Documentation and Usage Guidelines\n\nComprehensive documentation is crucial. A good component library includes detailed usage guidelines, examples, and best practices. This documentation helps designers and developers understand how to implement and adapt components correctly. Clear guidelines ensure that components are used as intended, maintaining the integrity of the design system.\n\n### 4\\. Accessibility\n\nAccessibility should be a top priority. Components need to be designed and built with accessibility standards in mind, ensuring they are usable by people with disabilities. This includes proper ARIA (Accessible Rich Internet Applications) attributes, keyboard navigability, and sufficient color contrast. An accessible component library broadens your audience and complies with legal and ethical standards.\n\n### 5\\. Ease of Integration\n\nA good component library is easy to integrate into various projects and tech stacks. This means providing well-structured code, compatibility with frameworks (like React, Vue, or Angular), and straightforward installation processes. The easier it is to integrate and use the components, the more likely they will be adopted and maintained.\n\n### 6\\. Scalability\n\nAs projects grow, so do their design needs. A component library should be scalable, meaning it can accommodate new components and patterns as they arise without disrupting existing designs. Scalability ensures the library remains relevant and useful as projects evolve over time.\n\n### 7\\. Community and Support\n\nA vibrant community and active support channels can significantly enhance a component library. When users can share their experiences, provide feedback, and contribute to the library’s development, it creates a dynamic and improving resource. Responsive support can help resolve issues quickly, ensuring smooth usage.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## **Check Out Our React Component Library For Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### Highly Customizable Components for a Unique Design Aesthetic\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### MagicUI Pro: An Upgrade for Enhanced Web Development\n\nAlong with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates. Use our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs) to experience the magic of MagicUI and elevate your web development projects.\n"
  },
  {
    "path": "apps/www/content/blog/create-next-js-app.mdx",
    "content": "---\ntitle: \"Create (create next js app) from Scratch: A Practical Guide\"\ndescription: >-\n  Learn how to create next js app from scratch with a complete guide covering\n  TypeScript, Tailwind CSS, animations, and effortless Vercel deployment.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b002b9e2-9555-47aa-a24a-1601a0d16e77/create-next-js-app-digital-workspace.jpg\nauthor: Dillion Verma\ntags:\n  - create next js app\n  - Next.js guide\n  - Tailwind CSS\n  - TypeScript\n  - Vercel Deployment\npublishedOn: \"2025-12-13T08:59:20.641423+00:00\"\nfeatured: true\n---\n\nAlright, let's get you set up with a brand-new Next.js project.\n\nThe journey begins with a single command in your terminal: `npx create-next-app@latest`. This slick interactive script scaffolds out a production-ready project, handling all the complex configurations behind the scenes so you don't have to. Honestly, this ridiculously simple setup is one of the biggest reasons developers flock to [Next.js](https://nextjs.org/) for building modern, high-performance web apps.\n\nBut before we start typing, let’s quickly talk about _why_ `create-next-app` is such a big deal. Next.js isn't just another shiny JavaScript framework; it's a battle-tested platform built to solve the real-world problems you actually run into when building for the web. Kicking off a project this way gives you a massive head start.\n\nThere's a reason this framework has become such a dominant force. According to a recent survey of over **6,000** professionals, Next.js is the top rendering framework in **2025**, with a whopping **52.9% usage rate**. Its popularity comes from a powerful mix of server-side rendering (SSR), static site generation (SSG), and true full-stack capabilities. You can dig into the [full tech stack report](https://monorepo.com/blog/the-2025-state-of-the-web) if you want to see more on those trends.\n\n### Solving Problems You'll Actually Face\n\nWhat really sets Next.js apart is how its features directly map to business needs and user expectations. It’s not just about building pages; it’s about building fast, scalable, and robust applications that work.\n\nThink about these common scenarios:\n\n- **E-commerce Sites:** For any online store, page load speed is money. Next.js uses SSR and SSG to get content in front of users almost instantly, which is a proven way to slash bounce rates and lock in conversions.\n- **Content Platforms:** A blog or a news site has to be fast and SEO-friendly to survive. The framework’s built-in optimizations make your content incredibly easy for search engines to crawl and index, boosting your visibility right out of the box.\n- **SaaS Applications:** These apps are often a hybrid of static marketing pages and complex, dynamic dashboards. Next.js handles both beautifully within a single codebase, which radically simplifies your development workflow.\n\nBefore you even make your first commit, Next.js is already working for you. It automatically handles things like code splitting, image optimization, and prefetching. This means your app is fast and efficient without you having to spend weeks on manual configuration.\n\n> The bottom line is this: choosing Next.js means you're building on a foundation that was designed from the ground up for speed, developer experience, and scalability. You're setting your project up for success from the very first command.\n\nWhen you run the setup script, you'll be asked a few questions. Your answers here will define the core architecture of your new app, so it's worth taking a moment to understand them.\n\nHere's a quick rundown of the most important decisions you'll make and what they mean for your project.\n\n### Key Decisions During Next.js Setup\n\n| Configuration Option   | Recommendation                        | Impact on Your Project                                                                                                           |\n| :--------------------- | :------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------- |\n| **Use TypeScript?**    | **Yes, absolutely.**                  | Adds static typing, which catches errors early and makes your codebase much easier to maintain as it grows.                      |\n| **Use App Router?**    | **Yes, this is the modern standard.** | Unlocks powerful features like nested layouts, server components, and granular caching. This is the future of Next.js.           |\n| **Use Tailwind CSS?**  | **Strongly recommended.**             | A utility-first CSS framework that makes styling fast and consistent. It's a perfect match for a component-based workflow.       |\n| **Use ESLint?**        | **Yes.**                              | Helps you enforce a consistent code style and catch common bugs before they cause problems. A must-have for any serious project. |\n| **Customize aliases?** | **Use the default `@/*`.**            | Provides a clean, absolute path for importing modules (e.g., `@/components/Button`) instead of messy relative paths.             |\n\nThese choices set the stage for everything that comes next. By opting for TypeScript, the App Router, and Tailwind CSS, you're embracing the modern best practices that make the Next.js ecosystem so powerful. Now, let's get that project running.\n\nAlright, let's get our hands dirty and bootstrap a new Next.js project. The best way to kick things off is with `create-next-app`, the official command-line tool that handles all the boilerplate for you. Forget messing around with webpack configs or Babel presets; this tool gets you from zero to a running app in just a few minutes.\n\nIt’s more than just a project generator—it's an interactive guide that sets you up with modern best practices right from the start.\n\nFire up your terminal and run this command:\n\n`npx create-next-app@latest`\n\nThis command starts an interactive setup script. It'll first ask you to name your project and then walk you through a few crucial configuration choices. Think of these prompts as setting the foundation for your entire application.\n\n### Decoding the Interactive Prompts\n\nThe setup script is going to ask for your preferences on some key technologies. While you _can_ change these later, getting them right from the start will save you a ton of headaches down the road.\n\nHere are the most important questions and the answers I strongly recommend:\n\n- **Would you like to use TypeScript?** Your answer here should be a hard **yes**. TypeScript brings static typing to JavaScript, which is a lifesaver for catching bugs early in development instead of when they're live in production. For any serious project, this is a no-brainer.\n\n- **Would you like to use ESLint?** Again, just say **yes**. ESLint is your personal code quality assistant. It enforces consistent style and sniffs out problematic patterns, keeping your codebase clean and readable—something your future self (and your teammates) will thank you for.\n\n- **Would you like to use the App Router?** Absolutely. This is the new, powerful foundation of [Next.js](https://nextjs.org/), unlocking features like React Server Components, nested layouts, and much smarter data fetching. The old Pages Router is now considered legacy, so all new projects should be built with the App Router.\n\nMaking these choices from the beginning sets a professional tone for your project. You're opting into the full power of the modern Next.js ecosystem right out of the gate. For a deeper dive into these core concepts, check out our detailed guide on [building a Next.js App](https://magicui.design/blog/next-js-app).\n\n> Choosing these defaults—TypeScript, ESLint, and the App Router—isn't about chasing trends. It's a strategic move to build a more robust, maintainable, and future-proof application from day one.\n\nThe infographic below shows how these foundational choices directly contribute to a better end product, emphasizing speed, scalability, and full-stack power.\n\n![Infographic showing Next.js benefits: fast loads, scalability, and full-stack development capabilities.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/543c62ba-2301-4e09-b5cc-48b13fad0854/create-next-js-app-next-js-benefits.jpg)\n\nAs you can see, a well-configured Next.js app isn't just about developer convenience; it delivers real benefits like faster load times and a scalable architecture that's ready for growth. Once you've answered all the prompts, the CLI will install all the necessary packages and create a new directory with your project's name. It's now ready for you to jump in and start coding.\n\n## Styling Your App with Tailwind CSS\n\n![A white background displays a UI design concept with abstract forms, color palettes, and various UI elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c4ea1a64-8350-4c74-bf62-e9886d36f30a/create-next-js-app-ui-design.jpg)\n\nAlright, with the project structure sorted, it’s time for the fun part: making it look good. When you said **Yes** to Tailwind CSS during the `create-next-app` setup, you gave yourself a massive head start on UI development.\n\nIf you’re new to it, [Tailwind](https://tailwindcss.com/) is a **utility-first CSS framework**. What that means in practice is you stop writing custom CSS files for every little thing. Instead, you build designs right inside your JSX by applying pre-built utility classes. This approach is a game-changer because it keeps your styles right there with your components, making them self-contained and way easier to manage down the road.\n\nThe installer gets the basics wired up, but the real magic happens in the `tailwind.config.ts` file. This is your command center for your entire design system.\n\n### Customizing Your Design System\n\nTailwind's default theme is fantastic, but let's be real—you need to make it your own. The `tailwind.config.ts` file is where you’ll define your brand's unique colors, fonts, spacing values, and just about anything else you can think of.\n\nLet's say you're building a sleek, modern dashboard. You can easily extend the default theme to include your specific brand colors.\n\n```ts\n// tailwind.config.ts\nimport type { Config } from \"tailwindcss\"\n\nconst config: Config = {\n  content: [\n    \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {\n      colors: {\n        brand: {\n          primary: \"#0A72E4\",\n          secondary: \"#F5A623\",\n        },\n        dark: {\n          900: \"#1a1a1a\",\n          800: \"#2b2b2b\",\n        },\n      },\n    },\n  },\n  plugins: [],\n}\nexport default config\n```\n\nBy nesting your custom colors inside `theme.extend`, you’ve just created new utility classes like `bg-brand-primary` and `text-dark-900` that you can use anywhere. It’s a simple change that enforces brand consistency and makes your markup much more descriptive.\n\nIf you want to dive deeper, we have a complete walkthrough on our blog covering the [Tailwind CSS installation and setup process](https://magicui.design/blog/tailwind-css-install).\n\n### Building Components with Utility Classes\n\nNow, let's put this into practice and build a simple, responsive card component. Instead of hopping over to a separate `.css` file, we'll compose the entire design using Tailwind's utilities directly in the component.\n\nYou'll see just how fast and intuitive this is.\n\n```tsx\n// components/InfoCard.tsx\nimport React from \"react\"\n\nexport const InfoCard = ({\n  title,\n  children,\n}: {\n  title: string\n  children: React.ReactNode\n}) => {\n  return (\n    <div className=\"dark:bg-dark-800 max-w-sm rounded-lg border border-neutral-200 bg-white p-6 shadow-md transition-shadow hover:shadow-lg dark:border-neutral-700\">\n      <h3 className=\"mb-2 text-xl font-bold text-gray-900 dark:text-white\">\n        {title}\n      </h3>\n      <p className=\"font-normal text-gray-700 dark:text-gray-400\">{children}</p>\n    </div>\n  )\n}\n```\n\n> The beauty of this method is its immediacy. You build, style, and see the results without ever leaving your component file. This tight feedback loop is what makes developing with Tailwind and Next.js feel so productive.\n\nWhile we're focused on styling for the web here, Tailwind's utility-first approach is incredibly versatile. For a different perspective, it can be interesting to see how these same principles apply in a mobile context. This [practical guide to Tailwind CSS in React Native](https://theappmarket.io/blog/tailwind-css-react-native) shows just how flexible the framework is, extending its power beyond just web projects.\n\n## Adding Polished Animations with Magic UI\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/ZYvvTehpA5I\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nOkay, your app now has a solid foundation with a clean design system thanks to Tailwind CSS. It's functional, but let's be honest, functional can be a little boring. This is where we take the user experience from merely \"working\" to truly \"delightful.\"\n\nStatic interfaces get the job done, but subtle, well-placed animations make an app feel alive and modern. This is exactly what [**Magic UI**](https://magicui.design/) was built for.\n\nMagic UI is a curated library of gorgeous, ready-to-use components that slot right into your Next.js and Tailwind workflow. Under the hood, it uses the incredibly powerful [**Framer Motion**](https://www.framer.com/motion/) animation library, but it handles all the complexity for you. That means you can drop in stunning effects—shimmering buttons, animated grids, dynamic text—with almost no effort.\n\nThe real win here is speed. You don't have to spend days wrestling with animation timelines. Just pick a component, drop it in, and give your app a professional, polished feel that captivates users.\n\n### Installing Magic UI Dependencies\n\nGetting Magic UI set up is a breeze. Since it’s designed to work with your existing stack, you just need to add a few small dependencies. These packages handle the animation logic (`framer-motion`) and intelligently merge your Tailwind classes (`clsx` and `tailwind-merge`).\n\nPop open your terminal in the project's root directory and run this single command:\n\nnpm i framer-motion clsx tailwind-merge\n\nAnd that's it. With those packages installed, you're ready to bring your first animated component to life. If you ever need more detailed instructions, the official [Magic UI installation documentation](https://magicui.design/docs/installation) is the place to go.\n\n### Implementing Your First Animated Component\n\nLet's start with a classic: swapping a plain old button for something more engaging. The \"Shimmer Button\" from Magic UI is a perfect first choice. It adds a subtle, elegant glow effect on hover that instantly grabs the user's eye.\n\nFirst, you need to bring the component's code into your project. This is the recommended approach because it gives you full control for any future tweaks.\n\n1.  Create a new folder path: `components/magicui/`\n2.  Create a new file inside it named `shimmer-button.tsx`\n3.  Go to the [Shimmer Button page on Magic UI](https://magicui.design/docs/components/shimmer-button), click the \"Code\" tab, and copy the source code into your new file.\n\nNow, you can import and use it in your `app/page.tsx` file (or anywhere else) just like any other React component.\n\n```tsx\nimport ShimmerButton from \"@/components/magicui/shimmer-button\"\n\nexport default function HomePage() {\n  return (\n    <main className=\"flex min-h-screen flex-col items-center justify-center p-24\">\n      <div className=\"z-10 w-full max-w-5xl items-center justify-center font-mono text-sm lg:flex\">\n        <ShimmerButton className=\"shadow-2xl\">\n          <span className=\"text-center text-sm leading-none font-medium tracking-tight whitespace-pre-wrap text-white lg:text-lg dark:from-white dark:to-slate-900/10\">\n            Get Started Now\n          </span>\n        </ShimmerButton>\n      </div>\n    </main>\n  )\n}\n```\n\n> Just like that, you've added a layer of interactivity that makes your UI feel more dynamic and satisfying. This is the core value of Magic UI—achieving maximum visual impact with minimal code.\n\n## From Local Dev to Live Deployment\n\nWith the basic structure and styling locked in, it's time to actually see our app in action. This is a two-part dance: first, we run it on our own machine to build and test, and then we push it live for the world to see.\n\n![A workflow diagram shows a laptop running 'npm run dev' connected to Vercel cloud and database.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/338cd0c9-c5a9-40bf-801f-d0287b1dc23a/create-next-js-app-vercel-workflow.jpg)\n\nThankfully, the local development experience with Next.js is incredibly smooth. All it takes is one command from your project's root directory:\n\n`npm run dev`\n\nThat single line fires up a local development server, which you can usually find humming away at `http://localhost:3000`. This isn't just a static preview, either. It’s a full-blown dynamic environment with **hot-reloading** built right in.\n\nWhat does that mean for you? Any change you save in your code—a tweak to a component, an adjustment to a style—shows up in your browser almost instantly. No more hitting refresh a thousand times a day. This tight feedback loop is a game-changer for building UIs efficiently.\n\n### Going Live with Vercel\n\nOnce you’re happy with how the app is running on your machine, the final step is getting it online. When you **create a Next.js app**, there's really no better place to host it than [Vercel](https://vercel.com). They're the creators of Next.js, so their entire infrastructure is purpose-built to make your application fly.\n\nVercel’s whole deployment process is designed to be ridiculously easy, tying directly into your Git workflow.\n\n1.  **Connect Your Git Account:** First, you’ll need a free Vercel account. The easiest way is to sign up with your GitHub, GitLab, or Bitbucket account. This connection is what makes the magic of automated deployments possible.\n2.  **Import Your Project:** From the Vercel dashboard, just hit \"Add New... Project\" and find the repository you've been working on. Vercel is smart enough to detect it’s a Next.js project and will automatically handle all the build settings for you.\n3.  **Add Environment Variables:** If your app relies on any secret keys or API tokens (like for a database), you can add them in the \"Environment Variables\" section of your project settings. This keeps your secrets secure and out of your public codebase.\n\n> The real superpower here is **Continuous Deployment**. Once you're all set up, every time you `git push` to your main branch, Vercel automatically kicks off a new build and deploys it. Your live site always stays in sync with your latest code, no manual steps required.\n\nWith just a few clicks, Vercel builds your project, pushes it to its global edge network, and gives you a live URL. Just like that, your Next.js application is online. This simple, automated workflow strips away the old complexities of shipping software, freeing you up to focus on what actually matters—building cool stuff.\n\nEven with the best tools, you're bound to hit a few snags. That's just part of development. Building a [Next.js](https://nextjs.org/) app involves a lot of moving parts, and knowing how to squash common bugs is a skill that'll save you countless hours of banging your head against the wall. Think of this as your field guide for the most common issues you'll run into.\n\nSooner or later, it happens to everyone. You save a file, the browser refreshes, and... all your styling is gone. It's a classic rite of passage when you're working with a utility-first framework like [Tailwind CSS](https://tailwindcss.com/).\n\n### Fixing Unapplied Tailwind Classes\n\nThis is probably the number one issue people face: your Tailwind classes just stop working. You add `bg-blue-500` to a `div`, but your background stays stubbornly white. I can tell you from experience that in **99% of cases**, this isn't a bug. It's almost always a simple configuration mix-up.\n\nThe culprit is usually your `tailwind.config.ts` file. Tailwind's magic works by scanning your files for class names and then generating only the CSS you actually use. If you create a new folder for your components—say, `src/layouts`—and forget to tell Tailwind to look there, it won't see your new classes.\n\nThe fix is easy. Just make sure your `content` path in the config file is broad enough to catch everything:\n\n```ts\n// tailwind.config.ts\nconst config = {\n  content: [\n    \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n    // Make sure to add any other directories you're using!\n    \"./src/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  // ... rest of your config\n}\n```\n\nOne crucial detail: after updating the config, you **must** restart your dev server (`npm run dev`). A simple browser refresh won't cut it. Restarting forces Tailwind to re-scan your entire project and build the correct stylesheet.\n\n### Resolving Hydration Mismatches\n\nAnother error that throws a lot of developers for a loop is the infamous hydration mismatch. You'll see a cryptic message in your console that looks something like this: `Warning: Text content did not match. Server: \"...\" Client: \"...\"`.\n\nWhat's going on here? This error pops up when the HTML rendered on the server doesn't perfectly match what React generates on the client during its first pass. It’s a common problem when you're using anything that only exists in the browser, like `window.localStorage`, or something dynamic that's guaranteed to be different, like the current time.\n\nFor instance, if you try to render `new Date().toLocaleTimeString()` directly in a component, the server's time will be a few milliseconds different from the client's time, triggering the mismatch.\n\n> The secret to fixing hydration errors is to make sure any client-side-only logic _only_ runs on the client. Don't even let the server attempt to render it. This completely sidesteps the mismatch.\n\nA reliable pattern for this is to use the `useState` and `useEffect` hooks. This effectively delays the rendering of your client-specific code until _after_ the initial server render has been \"hydrated\" on the client.\n\n```tsx\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\nconst ClientOnlyComponent = () => {\n  const [isClient, setIsClient] = useState(false)\n\n  useEffect(() => {\n    // This runs only on the client, after the initial render\n    setIsClient(true)\n  }, [])\n\n  if (!isClient) {\n    return null // Or you could return a loading skeleton here\n  }\n\n  // Now you're safely on the client and can use browser APIs\n  return (\n    <div>\n      Your current timezone is:{\" \"}\n      {Intl.DateTimeFormat().resolvedOptions().timeZone}\n    </div>\n  )\n}\n```\n\nThis little trick ensures your component handles the server-to-client transition smoothly, getting rid of those frustrating errors and keeping your console nice and clean.\n\n## Answering Your Next.js Questions\n\nAs you get your hands dirty building a Next.js app, a few questions always seem to come up. Let's tackle some of the most common ones head-on so you can build with confidence and sidestep the usual hurdles.\n\n### App Router or Pages Router?\n\nThis one’s easy. For any new project you’re starting today, the **App Router is the only way to go**. It’s the modern foundation of Next.js, unlocking seriously powerful features like React Server Components, nested layouts, and smarter data fetching strategies.\n\nThe Pages Router is still around for older projects, but all the exciting new stuff is happening in the App Router.\n\n> Good news is, `create-next-app` defaults to the App Router, so you're already on the right track from the moment you initialize a new project. Sticking with it makes sure your app is scalable, fast, and ready for whatever comes next.\n\n### Server Components vs. Client Components\n\nThis is a fundamental concept in the App Router that you'll want to grasp early. By default, every single component you create is a **Server Component**. That means it runs only on the server, which is fantastic for performance because it slashes the amount of JavaScript that gets sent to the browser.\n\nNeed some interactivity, like a button that responds to a click or state managed with `useState`? You have to explicitly make it a **Client Component**. Just add the `'use client';` directive right at the top of your component file, and you're good to go.\n\n### Adding Global CSS and Fonts\n\nThe best place to handle your global styles is by importing your main stylesheet directly into the root layout file, usually `app/layout.tsx`. This simple move ensures your styles are applied consistently across every single page in your app.\n\nWhen it comes to fonts, you'll want to use the built-in `next/font` module. It’s a game-changer. It automatically optimizes and self-hosts any font you choose, which dramatically boosts performance and kills any annoying layout shifts. Getting these fundamentals down is crucial. And if you're looking for other ways to streamline your workflow, it's always worth exploring strategies to [improve developer productivity](https://www.shorepod.com/post/how-to-improve-developer-productivity-tips-strategies).\n\n---\n\nReady to build stunning, animated user interfaces without all the heavy lifting? **Magic UI** gives you over 150 free, open-source components that plug right into your Next.js and Tailwind CSS projects.\n\n[Explore Components Now](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/create-nextjs-app.mdx",
    "content": "---\ntitle: \"Create NextJS App: How to create nextjs app from scratch\"\ndescription: >-\n  Learn how to create nextjs app from scratch with TypeScript and Tailwind,\n  build components, set up routing, and deploy to Vercel.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9665c516-6aae-460b-a3ad-0c10cc36648a/create-nextjs-app-coding-launch.jpg\nauthor: Dillion Verma\ntags:\n  - create nextjs app\n  - nextjs tutorial\n  - tailwind css\n  - typescript\n  - vercel deployment\npublishedOn: \"2025-11-28T08:24:46.049998+00:00\"\nfeatured: true\n---\n\nTo kick things off, the quickest way to **create a NextJS app** is by using the `create-next-app` command-line tool. Seriously, a single command scaffolds out an entire production-ready project. All the necessary configurations are handled for you, letting you jump straight into coding in just a few minutes. It’s the official, recommended way to start any new Next.js application for a reason.\n\n## Your Launchpad for Modern Web Apps\n\nStarting a new project can feel a bit overwhelming, like staring up at a mountain. Where do you even begin? This guide is designed to cut through that noise. We’ll show you exactly why developers are flocking to Next.js for everything from sleek portfolio sites to complex enterprise applications.\n\nBefore we get our hands dirty, it helps to have a grasp of some [general web development concepts](https://rebusadvertising.com/web-development/), as frameworks like Next.js build on top of these fundamentals.\n\nWe're going to zero in on the features that make Next.js an absolute powerhouse for building fast, SEO-friendly websites. You'll get a clear picture of its core functionalities, like server-side rendering (SSR) and the App Router. If you want a refresher, you can check out our deep dive on **what is Next.js** right here on our blog: https://magicui.design/blog/what-is-nextjs.\n\nTo give you a quick overview, here’s a look at the essential Next.js features we’ll be touching on in this guide and how they directly benefit your project.\n\n### Core Next.js Features and Their Impact\n\n| Feature                         | Primary Benefit                    | How It Helps Your App                                                          |\n| :------------------------------ | :--------------------------------- | :----------------------------------------------------------------------------- |\n| **App Router**                  | Intuitive file-based routing       | Simplifies creating new pages and organizing your application structure.       |\n| **Server-Side Rendering (SSR)** | Improved SEO & faster initial load | Pages are rendered on the server, delivering fully-formed HTML to the browser. |\n| **Automatic Code Splitting**    | Enhanced performance               | Only the necessary JavaScript is loaded for each page, keeping your app fast.  |\n| **API Routes**                  | Built-in backend functionality     | Easily create serverless API endpoints without needing a separate backend.     |\n\nThese features are precisely why Next.js has become the go-to framework for so many developers.\n\n### Why NextJS is the Go-To Framework\n\nThe proof is in the pudding. Developer preference and the explosive growth of its ecosystem really highlight its dominance. A recent State of JavaScript survey revealed that a staggering **68% of developers** who use React also choose Next.js for their production apps.\n\nIts built-in goodies—like API routes, automatic image optimization, and incremental static regeneration (ISR)—have been the driving force behind its widespread adoption by companies big and small.\n\nThis powerful feature set is the perfect foundation for what we're about to build. We'll be integrating other modern tools to create a professional-grade stack right from the very beginning.\n\n> We're setting the stage to bring in powerful additions like TypeScript for clean, maintainable code and Tailwind CSS for rapid, beautiful UI design. Think of this guide as your complete roadmap.\n\nWe'll take you from a single command-line prompt all the way to a fully deployed, production-ready application on a platform like Vercel. Let's get started.\n\n## Setting Up Your Development Environment\n\nThis is where the magic starts. Before we get into the nitty-gritty of coding, we need to lay a solid foundation for our project. Thankfully, the days of manual, tedious setup are long gone. The best and fastest way to get a Next.js app off the ground is with `create-next-app`.\n\nThis command-line tool is the official workhorse for bootstrapping a complete, production-ready Next.js project. A single command handles all the boilerplate, dependencies, and essential scripts, saving you a ton of time and potential headaches right from the start.\n\n### The Interactive Setup Process\n\nPop open your terminal and run `npx create-next-app@latest`. This kicks off a friendly, interactive process that will ask you a series of questions to tailor the project to your exact needs.\n\nHere's a quick look at the prompts you'll see and my personal recommendations:\n\n- **Project Name:** First things first, give your app a name.\n- **TypeScript:** It'll ask if you want to use TypeScript. My advice? Say yes. Type safety is a lifesaver on larger projects, catching errors before they ever make it to the browser.\n- **ESLint:** This is your code quality guardian. Definitely enable it to keep your code consistent and clean from day one.\n- **Tailwind CSS:** For styling, you get the option to include [Tailwind CSS](https://tailwindcss.com/). It’s a utility-first framework that has completely changed how I build modern UIs. It's incredibly fast and intuitive. For a deeper dive, our guide on how to [install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) is a great next step.\n- **`src/` directory:** This is a classic organizational choice. Using a `src` directory helps keep your app's core logic separate from configuration files. I always go for it.\n- **App Router:** This is a big one. The App Router is the modern, recommended way to handle routing in Next.js. It's built on React Server Components and opens up powerful features like nested layouts and streaming. Stick with this.\n- **Import Alias:** This lets you set up a shortcut, like `@/*`, for your import paths. It’s a small tweak that makes your code so much cleaner and easier to read down the line.\n\nThis simple workflow takes you from a single command to a fully configured project, ready for you to start building.\n\n![A visual guide showing the steps to start a Next.js app: Command, Code, and Deploy, represented by icons.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/58361eed-2c4e-4843-b7ca-ee7051951412/create-nextjs-app-nextjs-workflow.jpg)\n\nThis CLI ensures your starting point is perfectly aligned with your project's goals, without any manual fuss.\n\n### Understanding Your New Project Structure\n\nOnce the setup is finished, you’ll have a new directory filled with files and folders. It might seem like a lot at first, but everything has a specific purpose. This clean organization is one of the biggest strengths of using a framework like Next.js.\n\nThe growth of Next.js has been nothing short of explosive, making it the go-to full-stack React framework for countless developers. It boasts a massive **52.9% adoption rate** among React devs, which speaks volumes about its power and usability. The App Router, introduced in Next.js 13, is a huge part of that success, making routing feel more natural within React's component-based world.\n\nLet's take a quick tour of the most important folders you'll be working with:\n\n> **app/**: This is the heart of your application and where the App Router works its magic. Every folder you create here becomes a new route in your app. To create a page for that route, you just add a `page.tsx` file inside it.\n> **public/**: This is the spot for any static assets that don't need to be processed by the build, like images, fonts, or your `robots.txt` file.\n> **next.config.mjs**: Your main configuration file for Next.js. As you grow, you'll come here to tweak advanced settings and customize the framework's behavior.\n\n## Building Your First Page with Reusable Components\n\n![A sketch-style illustration of interconnected digital windows, data flow, and an AI card on a clean background.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/019a5829-12c9-496e-b0af-f63f8c4de918/create-nextjs-app-digital-interface.jpg)\n\nAlright, with our project structure sorted, it's time for the fun part: actually building something. Sure, we could just throw a \"Hello World\" on the page, but that doesn't mirror how real projects get built. The modern workflow is all about speed and efficiency, which means grabbing pre-built components to get a head start.\n\nThis approach lets you sidestep the tedious work of building every button, card, and grid from scratch. You get to focus on the unique logic and features of your application instead.\n\nTo show you how this works in practice, we're going to pull in some components from **Magic UI**. It’s a fantastic library of beautifully designed, ready-to-use components. These aren't just static HTML and CSS; they're built with React, Tailwind CSS, and Framer Motion, giving you slick, animated elements with a simple copy-paste.\n\n### Integrating Magic UI into Your Project\n\nBefore we can drop in any cool components, we need to add a few dependencies they rely on. Think of this as a one-time setup to give our project the tools for handling animations and slick styling utilities.\n\nPop open your terminal and, from your project's root directory, run this command:\n\n```bash\nnpm i framer-motion lucide-react clsx tailwind-merge\n```\n\nHere's a quick breakdown of what you just installed: `framer-motion` is the powerhouse for animations, `lucide-react` gives us a great set of icons, and `clsx` and `tailwind-merge` are handy utilities for managing your CSS classes without conflicts.\n\nWith those dependencies in place, you can head over to the Magic UI component library and start window shopping. For this guide, we'll grab the Bento Grid—it's a super popular layout for showcasing features in a clean, modern way.\n\n> A huge plus for Magic UI is that its components are designed to be self-contained. You can literally copy the code for a component and drop it directly into your project. No complex configs, no headaches. It's an incredibly fast way to build a polished UI.\n\nJust find the component you want on the Magic UI website, click to view the code, and copy it into a new file. I always recommend creating a `components/ui` directory to keep these third-party elements organized.\n\n### Creating a Component-Driven Homepage\n\nLet's ditch the default Next.js starter content in `app/page.tsx` and replace it with something more dynamic. We’ll import the Bento Grid component we just saved and use it to build out our main page. This is where you really start to see the power of a component-driven approach.\n\nAs you get more into building reusable components, it's worth getting familiar with [what a design system entails](https://bricxlabs.com/blogs/what-is-a-design-system). It’s a key concept that helps keep your application consistent and scalable.\n\nHere’s a quick look at what your `page.tsx` might look like after you've pulled in the new component. Notice how readable it is—you're just telling React what to render, not how.\n\n```tsx\nimport { Calendar, Globe, Zap } from \"lucide-react\"\n\nimport { BentoCard, BentoGrid } from \"@/components/ui/bento-grid\"\n\nconst features = [\n  {\n    Icon: Globe,\n    name: \"Global Reach\",\n    description: \"Connect with users from all over the world.\",\n    href: \"/\",\n    cta: \"Learn More\",\n    className: \"col-span-3 lg:col-span-1\",\n  },\n  {\n    Icon: Calendar,\n    name: \"Automated Scheduling\",\n    description: \"Plan your events and meetings with ease.\",\n    href: \"/\",\n    cta: \"Learn More\",\n    className: \"col-span-3 lg:col-span-2\",\n  },\n  {\n    Icon: Zap,\n    name: \"Lightning Fast\",\n    description: \"Blazing fast performance for a seamless user experience.\",\n    href: \"/\",\n    cta: \"Learn More\",\n    className: \"col-span-3 lg:col-span-2\",\n  },\n]\n\nexport default function HomePage() {\n  return (\n    <BentoGrid className=\"lg:grid-rows-3\">\n      {features.map((feature) => (\n        <BentoCard key={feature.name} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n```\n\nThis code snippet perfectly illustrates a core principle of modern web dev. You define your data in a simple array (`features`), and then you map over it to render your UI components. It makes the page incredibly easy to update—just change the data, and the UI follows.\n\nIf you want to dive deeper into structuring your own components, these [React component best practices](https://magicui.design/blog/react-component-best-practices) are a great read. Just like that, you've transformed a boilerplate project into a visually compelling page in a matter of minutes.\n\n## Getting to Know the App Router and Project Structure\n\n![A complex diagram illustrating interconnected nodes and text labels, possibly a code or project structure.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cb8b6e5a-0d57-4d18-bfe6-6c8943c6566e/create-nextjs-app-flowchart.jpg)\n\nA clean project structure isn't just about being tidy—it's the foundation of an app that's easy to maintain and scale. When you first spin up a [Next.js](https://nextjs.org/) app, the folder layout might look a little overwhelming. But once you get the hang of it, you'll see it’s built on a logical and surprisingly intuitive pattern: the App Router.\n\nAt its core, the App Router is a file-based system. That’s a fancy way of saying your folder structure creates your URL routes.\n\nThe `app/` directory is where the magic happens. Need a new page at `/about`? Just make an `app/about` folder and drop a `page.tsx` file inside. That’s literally it. Next.js connects all the dots for you, handling the routing behind the scenes.\n\nThis simple convention is powerful because your code's physical location directly mirrors your site's navigation. No more hunting for route configurations.\n\n### Building Routes and Layouts\n\nLet's think through a real-world example, like building a blog. You'll want a main page to list all your posts. To do that, you’d create a directory at `app/blog/` and put your `page.tsx` file in there. Easy enough.\n\nBut what about individual blog posts? That's where dynamic routes come in.\n\nBy creating a folder named `app/blog/[slug]/`, you're telling Next.js that the `slug` part is a variable. A `page.tsx` file inside that folder will then render any matching URL, like `/blog/my-first-post` or `/blog/learning-nextjs`.\n\nNext.js also gives you a few special files to create a consistent, robust experience for your users:\n\n- **`layout.tsx`**: This defines a shared UI—think headers, footers, or navigation sidebars—that wraps around its child pages.\n- **`page.tsx`**: This is the main, unique UI for a specific route. It's what people actually see.\n- **`loading.tsx`**: A slick way to show a temporary UI, like a spinner, that automatically appears while a route's content is loading.\n- **`error.tsx`**: Your safety net. This fallback UI renders if something breaks within a specific route segment.\n\n> These special files work together in a nested hierarchy. A layout in your root `app` folder will apply to the _entire application_. But a layout inside `app/blog` will only apply to the blog section. This lets you build powerful, predictable UI structures with minimal effort.\n\n### Server vs. Client Components\n\nOne of the game-changing features of the App Router is how it handles **Server Components** and **Client Components**. Here's the key takeaway: by default, every component you create inside the `app` directory is a **Server Component**.\n\nThis is a huge win for performance. Server Components run only on the server, meaning they send minimal JavaScript to the browser. They're perfect for fetching data, accessing backend resources, or rendering static content.\n\nThe catch? They can't use browser-only features like `useState` or `useEffect` for interactivity. For that, you need a **Client Component**.\n\nMaking one is simple: just add the `\"use client\";` directive at the very top of your file. This signals Next.js to send the necessary JavaScript to the browser to make the component interactive.\n\nThe trick is to be strategic. Use Client Components only where you absolutely need interactivity. This philosophy is central to the framework's legendary performance, which is kept sharp by an incredibly active community. The median review approval time for Next.js pull requests is a blazing-fast **44 minutes**—a testament to a rapid development cycle that constantly refines features like these. You can dig into more data on [Next.js development velocity and community engagement](https://dev.to/pullflow/nextjs-vs-angular-in-2025-how-to-choose-with-real-data-1odm) if you're curious.\n\nBy understanding this fundamental structure, you’re already set up to build a clean, organized, and lightning-fast application from day one.\n\n## Deploying Your NextJS App to Vercel\n\nOkay, so you've built out your pages, dialed in the styles on your components, and your file structure is looking clean. Now for the fun part: showing it to the world. But before we push it live, let's do one final check locally to make sure everything is running as expected. This is a simple but critical habit to get into.\n\nPop open your terminal, make sure you're in your project's root folder, and run `npm run dev`. This will fire up a local development server, which you can usually find at `http://localhost:3000`. One of the slickest features of the Next.js workflow is **Fast Refresh**, which instantly updates your browser with any code changes you make without wiping out your component state. It’s a huge time-saver.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/hAuyNf0Uk-w\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### From Localhost to Live URL\n\nOnce you've confirmed everything looks good locally, deploying with [Vercel](https://vercel.com/) is almost laughably easy. Since Vercel is made by the same team behind Next.js, the two are perfectly integrated. The first thing you'll need to do is push your project to a Git provider. Think [GitHub](https://github.com/), [GitLab](https://about.gitlab.com/), or [Bitbucket](https://bitbucket.org/).\n\nWith your code living on GitHub, you can sign up for a Vercel account using that same profile. This is the magic link that enables Vercel's whole automated deployment system.\n\n> Vercel is all about Git-driven deployment. What that means is every single `git push` can automatically kick off a new build and deploy. This turns updating your live site into a simple code commit, which is a game-changer for solo devs and large teams alike.\n\nAfter linking your accounts, you can import your project repository straight into Vercel. The platform is smart enough to detect that it's a Next.js app and will configure all the necessary build settings for you. Seriously, you usually don't have to touch a thing.\n\n### Configuring and Launching\n\nAs you're importing the project, Vercel will give you a spot to set up **environment variables**. This is the secure place to put all your secrets—API keys, database connection strings, you name it. These variables are kept out of your public code but are injected into the build process when your app is deployed.\n\nOnce those are set, just hit the \"Deploy\" button. From there, Vercel takes over and does all the heavy lifting:\n\n- It pulls the latest code from your main branch.\n- It installs all your project's dependencies.\n- It builds a production-ready version of your Next.js app.\n- Finally, it deploys the optimized assets across its global edge network.\n\nThe whole thing is usually done in just a couple of minutes. When it finishes, Vercel hands you a public URL where your app is live. From this point on, every time you push a new commit to your main branch, Vercel will automatically redeploy the changes. What used to be a complicated, multi-step process is now just a natural part of your workflow.\n\n## Answering Common NextJS Questions\n\nAs you dive into your first Next.js app, you're bound to run into a few questions. This isn't just you; these are the things most developers puzzle over when they're starting out. Think of this as a quick FAQ to get you past those common hurdles so you can get back to building.\n\n### Should I Use the App Router or Pages Router?\n\nFor any new project you’re kicking off, the **App Router is the clear winner**. No contest. It's the modern foundation of Next.js, built from the ground up to support new React features like Server Components and Streaming. The end result is just plain better performance and a more logical way to structure your app.\n\nThe old Pages Router still works, but all the innovation and new features are happening in the App Router. Going with the App Router makes your app future-proof and lets you use all the latest and greatest tools in the ecosystem.\n\n### How Do I Manage Environment Variables?\n\nNext.js has a dead-simple, built-in system for this. You absolutely need it for things like API keys or database connection strings that you can't just hardcode into your app.\n\nHere’s the rundown:\n\n1.  Create a file named `.env.local` right in the root of your project.\n2.  Inside, add your variables. For example: `DATABASE_URL=\"your-super-secret-value\"`.\n3.  Need to use a variable in the browser? You **must** prefix it with `NEXT_PUBLIC_`. Something like `NEXT_PUBLIC_API_KEY=\"this-one-can-be-public\"`.\n4.  Most importantly, add `.env.local` to your `.gitignore` file. This is critical—it stops your secrets from ever getting accidentally pushed to GitHub.\n\nThis setup keeps your server-side secrets safe on the server where they belong, which is a huge win for your app's security.\n\n### What Is the Difference Between Server and Client Components?\n\nThis is probably the biggest mental shift with the App Router. By default, every component you create is a **Server Component**. These guys run only on the server, doing the heavy lifting like fetching data and rendering HTML before anything gets sent to the browser. It's amazing for performance because it means less JavaScript for the user to download.\n\nBut what about interactivity? If you need a button that responds to a click (`useState`) or want to fetch data on the client (`useEffect`), you need a **Client Component**. It's an opt-in system: just add the `'use client'` directive to the very top line of your component file.\n\n> My rule of thumb is this: assume everything is a Server Component. Only convert something to a Client Component when you absolutely need that browser-side interactivity. This keeps your application as fast and lean as possible.\n\n### Can I Host My App Somewhere Besides Vercel?\n\nAbsolutely. Vercel is fantastic—it’s made by the same team behind Next.js, so the deployment experience is incredibly smooth. But it's far from your only option. Next.js apps are just Node.js applications at their core, so they can run almost anywhere.\n\nPlenty of developers host their Next.js projects on platforms like [Netlify](https://www.netlify.com/), [AWS Amplify](https://aws.amazon.com/amplify/), or [Render](https://render.com/). You can even deploy it to your own custom server if you want to. The official [Next.js documentation](https://nextjs.org/docs/deployment) has great guides for all the popular hosting providers, so you have the freedom to pick whatever works best for your project and your budget.\n\n---\n\nReady to build stunning UIs with the same speed and efficiency we've talked about here? **Magic UI** gives you a massive library of **150+** free, open-source animated components and premium templates designed to make your workflow faster. Check out the collection and start building beautiful landing pages in minutes at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/create-react-component-library.mdx",
    "content": "---\ntitle: \"How To Create React Component Library With Typescript & Publish It\"\ndescription: \"Learn how to create React component library using TypeScript with this guide. Plus, discover the process of publishing it for others to use!\"\nimage: https://cdn.magicui.design/assets/rago52ur2l.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-08\"\nfeatured: false\n---\n\nAre you often overwhelmed by the process of creating consistent and tailored UI components in your React projects? The world of [UI Frameworks](https://magicui.design/blog/ui-frameworks) can be daunting, especially when trying to maintain a cohesive look and feel for your web applications. What if there was a way to simplify this process and build your own React component library to ensure a consistent design system across all your projects? This blog will provide valuable insights on achieving just that, offering a step-by-step guide to creating your React component library.\n\nIntroducing Magic UI's simple yet powerful solution—a [React component library](https://magicui.design/) designed to help you streamline the UI development process and create reusable components easily. With this tool, you can effortlessly construct your own React component library, ensuring continuity and efficiency in your projects.\n\n# **What Is A Component Library?**\n\n![Create React Component Library](https://cdn.magicui.design/assets/gxm8tu9tz3s.jpg)\n\nA component library is a collection of pre-designed and pre-built user interface elements used to create user interfaces for digital products, such as websites and applications that have a unified look.\n\nThese libraries include a range of pre-made UI elements, such as buttons, forms, navigation menus, icons, and more, each designed with a consistent look and feel. UI [component libraries](https://dev.to/jacobandrewsky/component-librarires-should-you-use-them-4ff7) are particularly useful in collaborative design and development environments, as they help ensure that all team members are using the same source of truth and that the end product maintains a professional and polished appearance.\n\n## Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n# **6 Reasons Why You Should Build A Component Library**\n\n![Create React Component Library](https://cdn.magicui.design/assets/yc79n6774o.jpg)\n\nBuilding a [component library offers many benefits](https://dev.to/domysee/benefits-of-a-component-library-2baa) that make the design process more efficient and quality-driven. These benefits include the following:\n\n## **1\\. Consistency Across Projects**\n\nWhen you have a component library, you ensure a uniform look and feel across all your projects. This eliminates the need to recreate buttons, forms, and other elements when starting a new project. With pre-designed and pre-tested components at your disposal, you maintain consistent and professional designs.\n\n## **2\\. Efficiency and Speed**\n\nBy utilizing a library of components, you save significant time. Instead of starting from scratch whenever you design a new interface, you can quickly grab pre-made components, make any necessary tweaks, and kickstart your project. This speeds up the development process substantially.\n\n## **3\\. Quality Control**\n\nWhen you build a component once and thoroughly test it, you ensure it functions perfectly. This results in fewer bugs and a more reliable user experience. By reusing vetted components, you enhance the overall quality of your projects.\n\n## **4\\. Scalability**\n\nYour component library can grow as your projects do. Adding new components to your library as needed allows you to meet the evolving needs of your expanding projects without starting from square one.\n\n## **5\\. Collaboration**\n\nA component library becomes a shared resource if you work in a team. This shared resource ensures that all team members use the same components, simplifying collaboration and reducing inconsistencies in project development.\n\n## **6\\. Focus on Creativity**\n\nWith your design basics covered by a component library, you can dedicate more time to the creative aspects of your design work. This enables you to focus on user experience, innovative features, and the overall aesthetics of your projects.\n\nIn essence, a component library serves as a designer's toolkit, containing ready-to-use, reliable, and beautifully crafted components that smoothen, accelerate, and standardize the design process. An investment in efficiency and quality, a component library pays dividends and enhances the outcome of every project.\n\n## **Design-Focused UI Library for Streamlined Development**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n# **Tools Required To Create React Component Library**\n\n![Create React Component Library](https://cdn.magicui.design/assets/9go94txqo5.jpg)\n\n## **React**\n\nReact is a JavaScript library for building user interfaces. It allows developers to create reusable UI components that can be used to build interactive user interfaces. React is the foundation of the component library we will build, so you should have experience working with it.\n\n## **Typescript**\n\nTypescript is a superset of JavaScript that adds static type definitions to the language. It is useful for adding type safety to your codebase, preventing bugs and making your code easier to maintain. We will set up Typescript in our project to add type safety to our React components.\n\n## **Storybook**\n\nStorybook is a tool for developing UI components in isolation. It allows you to build components outside of your application, making the development process faster and more efficient. Storybook is useful for testing components and documenting how they should be used.\n\n## Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n# **How To Create React Component Library**\n\n![Create React Component Library](https://cdn.magicui.design/assets/9wiyxmdazsb.jpg)\n\n## **Setting Up the Project**\n\nWe must create a package.json file using the command `npm init`. Now, let’s proceed with installing the necessary dependencies. Unlike a regular project, here we will differentiate between regular dependencies and dev dependencies and peer dependencies. Regular dependencies are the ones packaged in the bundle that contribute to the size of our library. On the other hand, dev dependencies are only necessary during development. On the other hand, peer dependencies indicate that a certain package needs to be pre-installed to use the library.\n\nFor instance, if a library called “avi-lib” has peer dependencies such as react and react-dom, your project must have react and react-dom pre-installed. Now, let’s install react, react-dom, typescript, @types/react, and @types/react-dom as dev dependencies using the command `yarn i -D react react-dom typescript @types/react @types/react-dom`. Next, we shall add react and react-dom as peer dependencies with appropriate versions:\n\n    ```json\n    peerDependencies: {\n      \"react\": \">=16.0.0\",\n      \"react-dom\": \">=16.0.0\"\n    }\n    ```\n\nAfter this, it’s time to initialize a tsconfig file using the command `npx tsc --init`. Within the tsconfig.json file, enable jsx using `\"jsx\": \"react\"`.\n\n## **Creating the Component**\n\nOnce the setup is complete, create a directory named src to hold all the code. Inside the src directory, create another directory named components. Inside this directory, create a file named Button.tsx. Open the file and add a simple button component:\n\n    ```typescript\n    import React from 'react';\n    export interface ButtonProps {\n    children: React.ReactNode;\n    onClick: () => void;\n    }\n    export const Button = ({ children, onClick }: ButtonProps) => {\n    return <button onClick={onClick}>{children}</button>;\n    };\n    </code></pre><p>Within the src directory, create an index.ts file and add the following:</p><pre><code>typescript\n    export { Button, ButtonProps } from \"./components/Button\"\n    </code></pre><h2><strong>Setting Up Storybook</strong></h2><p>To visualize how our components look in isolation, we’ll <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://storybook.js.org/\"><u>install Storybook</u></a>. It’s a tool that’s almost indispensable for component libraries. Storybook lets you preview your components, add documentation, and even host the components for others to test. Use <code>npx storybook init</code> to set up Storybook. By default, Storybook creates sample stories at /src/stories, but you can remove them as they’re just examples of what you can do with Storybook. Let’s create a simple story for our Button:</p><pre><code>typescript\n    // ./src/components/Button/button.stories.tsx\n    import { Button } from \"./button\";\n    export default {\n    title: \"Button\",\n    component: Button,\n    };\n    export const Default = () => <Button>Click me!</Button>;\n    </code></pre><p>To preview the components, run <code>npm run storybook</code>.</p><h2><strong>Internal Documentation</strong></h2><p>Documenting your components is a good practice for the users of your library. While it’s not covered in this tutorial, you can include documentation in a README file or on a docs website.</p><h2><strong>Bundling the Library</strong></h2><p>Once the components are ready, it’s time to bundle the library. This allows you to pack everything in a single file. Bundling also enables users to drag and drop a single file into their projects or use it on CDNs. To bundle the component, a bundler is required. In this case, we’ll use tsup as it doesn’t need a configuration for this use case. Install tsup using <code>yarn add -D tsup</code>. Add the following script to your package.json file:</p><pre><code>json\n    scripts: {\n    \"build\": \"tsup src/index.ts --dts\"\n    }\n"
  },
  {
    "path": "apps/www/content/blog/creating-next-js-app.mdx",
    "content": "---\ntitle: Creating Next JS App A Practical Guide\ndescription: >-\n  A practical guide to creating Next JS app projects. Learn to build\n  production-ready applications using TypeScript, Tailwind CSS, and Vercel\n  deployment.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e0373420-e27d-49ad-949b-f5f247a2c856/creating-next-js-app-dev-workspace.jpg\nauthor: Dillion Verma\ntags:\n  - creating next js app\n  - nextjs tutorial\n  - typescript guide\n  - tailwind css setup\n  - web development\npublishedOn: \"2025-12-05T08:04:41.996368+00:00\"\nfeatured: true\n---\n\nBuilding a new web app with Next.js has pretty much become the go-to move for anyone serious about performance and SEO. Its secret sauce lies in features like server-side rendering, which helps your projects load lightning-fast and get noticed by search engines. This guide will take you from a blank slate all the way to a live, deployed application.\n\n## So, Why Is Everyone Using Next.js?\n\nBefore we start firing up the terminal, it’s worth taking a moment to understand why developers are flocking to Next.js. It’s not just about the technical buzzwords; the framework's features solve real-world problems and genuinely make it easier to build better products.\n\nThe developer community has definitely taken notice. By 2025, over **17,921 verified companies** are projected to be using Next.js, and that list includes heavy hitters like Amazon, Walmart, and Apple. This isn't just a trend; it's a testament to its reliability for everything from massive e-commerce platforms to intricate SaaS applications. You can even check out more adoption data over at data.landbase.com.\n\n### What’s In It For Your Project?\n\nThe benefits of building with Next.js aren’t just for developers—they make a huge difference for the end-user, too. Here’s how that plays out in the real world:\n\n- **Top-Notch SEO Performance:** Next.js is a beast when it comes to server-side rendering (SSR) and static site generation (SSG). It serves up fully-rendered HTML that search engine crawlers love, giving your site a serious boost in visibility.\n- **Seriously Fast Load Times:** Pages are pre-rendered on the server, so users get content almost instantly. This is huge for keeping people engaged and slashing bounce rates. You can dive deeper into [what is Next.js](https://magicui.design/blog/what-is-nextjs) and how it pulls this off in our detailed article.\n- **A Massive Ecosystem:** You're not just getting a framework; you're getting access to a huge community, fantastic documentation, and a universe of open-source libraries. When you're picking your tech, it's always smart to see what the pros are using by [exploring various company tech stacks](https://landing.underdog.io/blog/inside-alphasights-tech-stack).\n\n> Choosing Next.js isn't just about picking another tool. It's an investment in a skillset that lets you build professional-grade, high-performance web applications that truly meet today's standards.\n\nAlright, with the \"why\" out of the way, let's get our hands dirty and build the foundation for our project.\n\n## Scaffolding Your Project With Create Next App\n\nThe absolute best way to kick off a new [Next.js](https://nextjs.org/) project is with the official command-line tool, `create-next-app`. Seriously, don't try to do this manually. This tool handles all the boilerplate, from build configurations to the essential dependencies, letting you jump straight into coding.\n\nIt's more than just a file generator, though. It's an interactive setup process that guides you through the key architectural decisions you need to make right from the start.\n\n### Launching the Interactive Setup\n\nFire up your terminal and run this command. It’ll kick off the wizard that walks you through the initial configuration.\n\n`npx create-next-app@latest`\n\nYou'll get a series of questions. To build a modern, scalable application, we’re going to be intentional with our choices. We'll enable **TypeScript** for type safety, **ESLint** to keep our code clean, and the **App Router** for its powerful routing capabilities. Making these decisions now sets your project on a path for success from day one.\n\nThe setup we're creating taps into the core strengths of Next.js, leading to some pretty significant benefits.\n\n![Process flow diagram showing SEO boost leading to faster load, resulting in better user experience.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4e0e4da9-11a1-49d1-8d97-9fda7827d99f/creating-next-js-app-process-flow.jpg)\n\nThis modern stack is designed to work together, improving everything from how search engines see your site to how users actually experience it.\n\n### Understanding Your New Project Structure\n\nOnce the installer finishes its magic, you'll have a new directory with your project's name. It's worth taking a minute to get familiar with the file structure inside. Knowing your way around gives you a mental map of where everything lives, which makes development so much smoother.\n\nHere's a quick rundown of the most important bits:\n\n- **`app/`**: This is the heart and soul of your application. The App Router uses the folder structure inside `app/` to define all your routes, pages, and UI components.\n- **`public/`**: This folder is for static assets that don't need any processing. Think images, fonts, or your `robots.txt` file. They get served as-is.\n- **`next.config.mjs`**: Your go-to file for any advanced Next.js configuration. You'll pop in here to manage image optimization, set up redirects, or tweak the build process.\n\n> By choosing TypeScript and the App Router, you aren't just creating another Next.js app. You're adopting a professional standard that prioritizes scalability, maintainability, and a developer experience that you'll be thankful for down the line.\n\nAlright, with a clean Next.js project ready to go, it's time to bring in the styling powerhouse: [Tailwind CSS](https://tailwindcss.com/).\n\nInstead of getting bogged down writing custom CSS files from scratch, Tailwind's utility-first approach lets you build beautiful, complex designs right inside your JSX. This workflow is a game-changer for speed and maintaining a consistent design system.\n\nWe'll get it hooked up using the official Next.js integration. It’s a pretty smooth process, just a couple of commands and a few quick config updates.\n\n![A stylized light blue and white laptop-like device with a screen showing 10:50, and a paper next to it.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d665fc59-8524-45e3-b8e0-f74b71716fd4/creating-next-js-app-laptop-concept.jpg)\n\n### Installing and Configuring Tailwind\n\nFirst thing's first, pop open your terminal in the project directory. We need to install Tailwind itself along with a couple of its essential peer dependencies, PostCSS and Autoprefixer.\n\nThen, we'll initialize Tailwind to generate its config files.\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\nRunning these commands does two key things. It adds the packages as **development dependencies** and, more importantly, it drops two new files into your project's root: `tailwind.config.ts` and `postcss.config.js`. Think of these as the control panel for all your styling.\n\nIf you want a deeper dive into this part of the process, we have another guide that covers the complete [Tailwind CSS installation process](https://magicui.design/blog/tailwind-css-install) in more detail.\n\nNow, we need to tell Tailwind which files to watch. This is how its Just-in-Time (JIT) compiler knows where to look for utility classes, ensuring your final CSS bundle is as small as possible.\n\nOpen up `tailwind.config.ts` and paste these paths into the `content` array.\n\n```ts\n// tailwind.config.ts\nimport type { Config } from \"tailwindcss\"\n\nconst config: Config = {\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\nexport default config\n```\n\nThis glob pattern tells Tailwind to scan every relevant file inside your `app`, `components`, and `pages` directories. It's a critical step, so don't skip it!\n\n### Applying Base Styles\n\nThe last piece of the setup puzzle is to actually import Tailwind's core styles into our application. These styles handle things like browser resets, giving us a consistent and clean slate to build on.\n\nFind the `src/app/globals.css` file. Go ahead and delete everything in there—all that boilerplate CSS—and replace it with these three simple `@tailwind` directives.\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nThese lines are what pull in Tailwind's base styles, component classes, and the massive library of utility classes you'll be using to style everything.\n\n> By setting up Tailwind correctly, you're creating a workflow where you can build and iterate on beautiful, responsive UIs without ever leaving your component files. This is a cornerstone of modern frontend development and something you'll come to appreciate quickly.\n\nNow, let's make sure it's working. Jump over to your `page.tsx` file, clear out the default markup, and try adding a few Tailwind classes. A simple test like centering some text on a dark background is perfect for confirming everything is hooked up right. This quick check builds confidence and gets you ready to start building real components.\n\nAlright, you've got a solid foundation with Next.js, TypeScript, and Tailwind CSS. The boilerplate is done, but now for the fun part: making it look and feel amazing. This is where we move beyond a static shell and start adding the kind of interactive polish that makes an app feel alive.\n\nInstead of building every button, menu, and slick animation from scratch—which can be a huge time sink—we're going to pull in a professional component library.\n\nFor this project, we’ll be using **Magic UI**. It's a fantastic, open-source collection of beautifully designed and animated components. These aren't just your standard UI elements; they're built with Framer Motion and Tailwind CSS, giving you buttery-smooth, production-ready interactions right out of the box. It’s the perfect way to add a professional sheen to our app without reinventing the wheel.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/RPa3_AD/Vs\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### Getting Started with the Magic UI CLI\n\nMagic UI has a command-line interface (CLI) that makes installation dead simple. It takes care of all the dependencies and file scaffolding, letting you get straight to the good stuff: choosing and using components.\n\nPop open your terminal and run this command from your project’s root directory:\n\n`npx magic-ui-cli@latest init`\n\nThe installer will guide you through a couple of quick questions to tailor the setup to your project. This ensures that every component you add is perfectly configured for your file structure and dependencies. If you ever need a refresher, the official [Magic UI installation documentation](https://magicui.design/docs/installation) is a great resource.\n\n> Think of it this way: using a library like Magic UI isn't just about saving time. You're building on the work of design engineers who have already obsessed over the tricky parts of animation and user interaction. This lets you deliver a much more refined experience, faster.\n\n### Adding Your First Animated Component\n\nWith the CLI ready to go, pulling a new component into your project is just a one-line command. Let's start with something fun to see the immediate effect. The \"Dock\" component is a great choice—it gives you a slick, macOS-style navigation menu that's incredibly satisfying to interact with.\n\nJust run this in your terminal:\n\n`npx magic-ui-cli@latest add dock`\n\nThe CLI works its magic, automatically adding the necessary files right into your components directory. Now, you can import and use it in your `page.tsx` file (or any other component) just like you would with any other local component.\n\nHere's how you'd drop it into a page:\n\n```tsx\nimport { Dock, DockIcon } from \"@/components/magicui/dock\"\n\nexport default function HomePage() {\n  return (\n    <div className=\"bg-background relative flex h-screen w-full flex-col items-center justify-center overflow-hidden rounded-lg border md:shadow-xl\">\n      <Dock>\n        <DockIcon>{/* Your Icon Component Here */}</DockIcon>\n        <DockIcon>{/* Your Icon Component Here */}</DockIcon>\n      </Dock>\n    </div>\n  )\n}\n```\n\nJust like that, you've added a genuinely sophisticated and interactive element to your app. This kind of rapid enhancement is a huge reason why Next.js has become so popular. With a **52.9% usage rate** among rendering frameworks as of 2025 and over **132,000 stars** on GitHub, its robust ecosystem is one of its greatest strengths. You can find more details on [Next.js framework advantages on aalpha.net](https://www.aalpha.net/articles/nextjs-advantages-and-disadvantages/).\n\n## Taking Your Next.js App Live With Vercel\n\nYou've built a fantastic UI, and now it's time for the final, most exciting part: sharing your creation with the world. Deployment can sound like a huge headache, but Vercel—the platform from the same team that created Next.js—makes the whole process ridiculously simple. Honestly, it's the path of least resistance from your local machine to a live, production-ready URL.\n\nThe integration is just seamless. You just connect your GitHub, GitLab, or Bitbucket account, pick the project's repository, and Vercel pretty much takes it from there. It instantly recognizes you're deploying a Next.js app and automatically configures all the build settings for peak performance, right down to the global CDN distribution and serverless functions.\n\n![Diagram illustrating a cloud-based application architecture with data flow between components.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/20362e15-2964-45f6-a7e2-82ffe8b98e12/creating-next-js-app-cloud-architecture.jpg)\n\nThis kind of automation is a huge part of modern web development. If you're looking to really dial in your deployment workflow, especially on platforms like Vercel, diving into a [comprehensive guide on CI/CD pipelines](https://group107.com/blog/what-is-ci-cd-pipeline/) can give you some invaluable insights into continuous integration and delivery.\n\n### Connecting and Configuring Your Project\n\nYour first deployment is usually just a few clicks. After you import your repository into a new Vercel project, the platform kicks off the first build automatically. From that moment on, every `git push` to your main branch triggers a fresh deployment. This keeps your live site perfectly in sync with your codebase without you having to lift a finger.\n\nOf course, any real-world app needs to handle secrets like API keys. Vercel has a super straightforward UI for managing environment variables. Just head over to your project’s settings, find the \"Environment Variables\" section, and drop your keys in. They’re securely injected during the build process, so your sensitive data is never exposed in the client-side code.\n\n### A Quick Post-Deployment Checklist\n\nOnce your app is live, it’s always a good idea to run a quick sanity check. Here are a few things I always look over:\n\n- **Server Component Rendering:** Make sure any pages that fetch data or run server-side logic are actually rendering as expected.\n- **API Route Functionality:** If your app has API routes, hit those endpoints to confirm they're up and working correctly.\n- **Environment Variables:** Double-check that your production-specific variables are being loaded and used properly by the application.\n\n> Deploying your app shouldn't be a complex, multi-day task. With Vercel, you can go from a local project to a globally-available application in just a few minutes, allowing you to focus more on building features and less on infrastructure.\n\nThis demand for streamlined development and deployment isn't just a trend; it's a massive market. The JavaScript frameworks market, where Next.js is a major player, is expected to reach **$6.8 billion** by 2025. This growth is all driven by the need for advanced, scalable web solutions. North America alone makes up **44.35%** of this revenue, which really shows how much the region is focused on top-tier digital experiences. Mastering these modern frameworks and their ecosystems is more valuable than ever.\n\n## Hitting a Snag? Here’s How to Get Unstuck\n\nSooner or later, every developer runs into a roadblock. It’s just part of the game, especially when you’re juggling powerful tools like Next.js, TypeScript, and Tailwind CSS. The good news? Most of the issues you’ll face have been seen (and solved) before. This is your go-to guide for squashing those common bugs fast.\n\nOne of the first head-scratchers people run into is their Tailwind CSS classes just not showing up. Before you start ripping your hair out or rewriting components, take a deep breath and pop open your `tailwind.config.ts` file. **Seriously, 9 times out of 10**, the problem is a tiny typo or an incorrect file path in the `content` array. Tailwind needs to know where your component files are to scan them, and if that path is wrong, it won't generate the classes you need.\n\n### Taming TypeScript and Dodging Hydration Errors\n\nTypeScript errors, especially from third-party libraries, are another classic hurdle. You might install a package only to find it doesn’t play nicely with your strict type setup. When this happens, the first thing to check is whether you need a separate `@types/package-name` package. If that doesn't exist, you might have to roll up your sleeves and create a custom type declaration file (`.d.ts`) to tell the compiler what to expect.\n\nThen there's the infamous \"hydration mismatch\" error. It’s a cryptic message, but it usually means the HTML rendered on the server doesn't perfectly match what React is trying to build on the client.\n\n> The usual suspect for a hydration error is using browser-only APIs like `window` or `localStorage` in code that also runs on the server. The fix is to make sure that code only runs on the client-side. You can do this by wrapping it in a `useEffect` hook or using dynamic imports with SSR disabled.\n\n### Your Quick-Fix Cheat Sheet\n\nHere are a few other common tripwires and the quick fixes that’ll get you back to building cool stuff.\n\n- **Slow Local Refresh:** If your dev server is chugging along, you might be importing huge libraries where they aren't needed. Use Next.js's dynamic imports to code-split and load hefty components only when a user actually needs them.\n- **Environment Variables Not Loading:** Don't forget the magic prefix! Any variables you need to access in the browser have to start with `NEXT_PUBLIC_`. If you leave it off, Next.js keeps that variable on the server for security.\n- **Magic UI Component Styling Issues:** If a Magic UI component looks a bit funky, check your `globals.css` file. It's possible you have some broad, global styles that are accidentally overriding Tailwind's more specific utility classes.\n\nGetting familiar with these common pitfalls will save you a ton of debugging time down the road. You’ll spend less time troubleshooting and more time actually bringing your project to life.\n\n## Got Questions? We've Got Answers\n\nAs you dive into a new Next.js project, a few common questions always seem to pop up. Let's tackle some of the ones I hear most often from developers.\n\n### App Router vs. Pages Router: Which One Should I Pick?\n\nFor any new project you're spinning up, the **App Router is the way to go**. It's not even a debate at this point.\n\nThe App Router is where all the innovation in Next.js is happening. You get access to game-changing features like Server Components, nested layouts, and a much cleaner way to handle data fetching. The old Pages Router simply can't compete. Think of it as future-proofing your application from day one.\n\n### How Do I Manage Environment Variables?\n\nNext.js makes handling environment variables pretty straightforward. Just create a `.env.local` file in the root of your project—this is where your secret keys will live.\n\nIf you need a variable to be accessible in the browser (like a public API key for a service like Supabase or Firebase), you have to prefix it with `NEXT_PUBLIC_`. Any variable _without_ that prefix is locked down to the server-side, which is exactly what you want for things like database connection strings or private API keys.\n\n> A quick tip on components: By default, the App Router treats components as Server Components. They render on the server, keeping your client-side bundle size small and fast. If you need interactivity with hooks like `useState` or `useEffect`, you just add the `'use client'` directive at the very top of the file to turn it into a Client Component.\n\n---\n\nReady to build something amazing? **Magic UI** gives you a massive head start with a huge library of free, open-source animated components and premium templates. They're all built with React, TypeScript, and Tailwind CSS, so you can drop them right into your project. Stop building from scratch and start creating. Check out the collection at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/creative-landing-page-design.mdx",
    "content": "---\ntitle: \"45 Examples Of Creative Landing Page Design To Inspire Your Creation\"\ndescription: \"Find the 45 innovative landing page designs for creative inspiration and elevate your projects with proven strategies and eye-catching layouts.\"\nimage: https://cdn.magicui.design/assets/1tmgisjppti.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you looking for inspiration and ideas for designing a captivating landing page? Crafting an engaging and effective page can be challenging amid countless [landing page examples](https://magicui.design/blog/landing-page-examples). In this blog, we will study creative landing page design, which is crucial for capturing attention, encouraging action, and converting visitors into customers. Join us as we brainstorm innovative ways to elevate your design and boost conversions.\n\nEntrepreneurs and marketers exploring innovative solutions for compelling landing pages will find Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) indispensable. Tailored to enhance visitor conversion, this template provides the inspiration and ideas to create a standout landing page.\n\nReady to elevate your design? Let's get started.\n\n## What Is a Landing Page?\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/xj3xsd52aa.jpg)\n\nA landing page is designed to turn site visitors into leads or customers. Most landing pages usually feature personalized content and a clear call-to-action (CTA) to encourage users to take the desired action, such as:\n\n- Filling out a contact form\n- Downloading content\n- Purchasing\n\nIts primary function is to direct visitors towards the call-to-action (CTA).\n\n### Landing Pages for Maximum Impact\n\nA website can have multiple landing pages. For example, you may create different landing pages to test out different messaging or layouts and see which version your visitors respond to the most. You can also create different landing pages to send visitors through a series of choices to land on a tailored CTA (this is known as a click funnel.)\n\n### Landing Pages That Sell\n\nLanding pages educate your visitors and use compelling content to transform them into clients. They also serve as a representation of your website and your business. For example, in most cases, a landing page is the first thing a visitor will see after clicking on an ad. While it may be your audience's first page, a landing page differs from a web page's focus on conversion and lead generation.\n\n### Landing Pages Designed to Convert\n\nA landing page stands alone, often at the forefront of a homepage, and serves a single purpose: getting your visitors to give you their contact information. Landing pages have limited navigation and direct visitors to a call to action. They give your offer or promotion a place to live and act as a gate to your coveted materials.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Why You Need the Element of Creativity in Your Landing Pages\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/xt2qqw7r2a.jpg)\n\nCreativity is a fundamental factor in high-converting landing pages. It inspires users to take action and ensures their needs and preferences are met. While usability is the main element of a good landing page, the user experience truly matters. Two factors that must coexist to bring the best results:\n\n- Creativity\n- User experience\n\n### Why Landing Pages Need Creativity\n\nTake a look at the data to better understand the importance of creativity in crafting landing pages. Studies show that 50% of users won’t recommend a [poorly designed landing page](https://landingi.com/landing-page/creative-examples/#:~:text=According%20to%20KlientBoost%2C%2050%25%20of,can%20affect%20higher%20conversion%20rates.), and 38% will stop engaging with a page they consider unattractive.\n\n### Brand Identity & User Experience\n\nYour landing page’s design can affect higher conversion rates. If your brand visual identity complements well-suited landing page colors and typography, includes visuals that represent high quality and has visible but not flashy CTAs, you are on the right track.\n\n### Beauty & Usability for Modern Landing Pages\n\nToday's internet users don't just appreciate well-designed pages; they expect them. They crave pages that are not only visually appealing but also designed with user experience in mind. Web designers must meet this demand to stay competitive in the digital realm.\n\n### Captivate Users with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://magicui.design/) today and leverage the power of MagicUI to create stunning, conversion-driven digital experiences.\n\n## 6 Elements of a Creative Landing Page Design\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/jlijwhehly.jpg)\n\n### 1\\. Catchy Headlines That Grab Attention\n\nWhen it comes to creative landing page design, one of the most crucial elements is crafting a catchy headline that [grabs the visitor's attention](https://optinmonster.com/700-power-words-that-will-boost-your-conversions/) instantaneously. Your headline should be around ten words short and convey the purpose of your page to the visitor.\n\n#### Crafting Effective HeadlinesUse numbers for impact\n\n- Be specific and clear\n- Choose solid and resonant words\n- Set the tone for the landing page\n\n### 2\\. Eyeflow Design for a Neat and User-Friendly Landing Page\n\nMaintaining an organized and visually appealing layout on your landing page is essential for keeping visitors engaged. Categorize your content logically and complement it with high-quality images or videos that align with your brand aesthetic.\n\n#### Design for Conversions, Not Clutter\n\nAvoid overcrowding the page with too many colors and elements, as this can make it look cluttered and distract visitors from the key message. Instead, focus on using neutral colors, contrast, white space, and directional cues to guide visitors' attention to your call-to-action (CTA) button.\n\n### 3\\. Short and Sweet Writing to Keep Visitors Engaged\n\nWhen writing the content for your landing page, less is more. Keep your text concise, aiming for 250-300 words unless you're dealing with a complex product or service. Shorter text is easier to read and understand, ensuring visitors quickly grasp the value proposition.\n\n#### Why This Matters to You\n\nFocus on explaining why your offer matters to them and how it can benefit their lives or businesses. Being direct and to the point in your writing will help keep visitors engaged and increase the likelihood of conversion.\n\n### 4\\. Craft a Compelling Call to Action (CTA) to Prompt Action\n\nA landing page's success hinges on its ability to encourage visitors to take action, and a [compelling call-to-action (CTA)](https://www.investopedia.com/terms/c/call-action-cta.asp) is the key to achieving this. Make sure to include one or more clear CTA buttons that tell visitors precisely what you want them to do next. Place these buttons strategically on the page, significantly above the fold, so they're immediately visible.\n\n#### Action-Oriented Words to Boost Engagement\n\n- Sign up\n- Get Started\n- Download\n- Register Now\n\n### 5\\. Unique Value Proposition (UVP) to Differentiate Your Offering\n\nYour landing page should communicate your Unique Value Proposition (UVP), which sets your product or service apart from the competition. Craft a concise and clear statement that explains how your offering solves customers' needs and why they should choose you over other options in the market. Your UVP should resonate with your target audience and convince them that your product or service is the best solution to their pain points or challenges.\n\n### 6\\. Ease of Navigation for a Seamless User Experience\n\nIncorporating intuitive navigation on your landing page is essential for providing visitors with a smooth user experience. A clean, straightforward layout with minimal distractions helps visitors focus on the key message and navigate the page effortlessly.\n\n#### Guiding Visitors to Action\n\nEnsure that the design elements are laid out logically, directing visitors' attention toward the CTA button and guiding them through the conversion process smoothly. A well-structured landing page enhances user engagement and increases the likelihood of conversion.\n\n## 45 Examples Of Creative Landing Page Design To Inspire Your Creation\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/tyt6re1jb6.jpg)\n\n### 1\\. Langfuse Landing Page Design Example: Navigating the Animation Realm\n\nLangfuse's landing page uses animated components to bring it to life. It is built with [Magic UI](https://pro.magicui.design/docs/templates/startup), which allows easy access to animated components. The page is clean, with a minimalistic design and a clear call to action, making it easy for visitors to navigate and take their desired action.\n\n### 2\\. DoorDash\n\nFood delivery is big business; companies like DoorDash use landing pages to get more drivers to sign up for their service. This page helps you visualize what delivering food for a living will be like and highlights how much money you could make with your new full-time gig or side hustle.\n\n#### Freedom You Crave, Delivered \n\nWhat’s the most significant advantage of being a food delivery person? It’s not that you’ll learn every traffic shortcut in your city, nor is it the delicious smell of food that permeates your vehicle (10 years later, my car still smells like pepperoni pizza). The most significant advantage is the freedom you get. You can work your hours and be your own boss. And this landing page nails that feeling right in the headline.\n\n### 3.  Muzzle\n\nMuzzle, a Mac app that silences on-screen notifications, fully embraces this show-and-tell mentality on their otherwise minimal landing page. Landing pages help users decide whether or not your product or service is worth their precious time and energy.\n\nWhat better way to communicate your value proposition clearly and straightforwardly than by confronting visitors with the problem your app solves?\n\n### 4\\. AirBnB \n\nThis AirBnB landing page is a one-stop shop for visitors curious about where to book a holiday rental. It features several options, such as:\n\n- Beachfront\n- Cabins\n- Views\n\nOnce a user clicks, they can:\n\n- Easily view the potential home\n- Read testimonials\n- View the pricing\n\nWhat’s even better is that a user can select a date to book on the same page and convert on the spot if the information is convincing.\n\n### 5\\. Netflix\n\nThe streaming giant’s landing page is short, sweet, and straightforward, including only the necessary details. It makes it extremely easy for users to complete the page's goal of entering their email address to get started with a [Netflix membership](https://help.netflix.com/en/node/412).\n\nA single-field form above the page fold makes starting with Netflix seem effortless. The copy is succinct, states the brand’s value proposition, and clarifies that you can cancel anytime. It also includes details on introductory pricing upfront so users don’t have to search for them.\n\n### 6\\. Philosophy\n\nPhilosophy features skincare products and fragrances. Its landing page is arranged so scanning gives two opportunities to shop for skincare products or fragrances. If you are just browsing, you see two more shopping links every time you scroll down.\n\n### 7\\. Slack\n\nSlack landing page example. It is always on top of its game when creating some of the best landing pages. They are constantly optimizing for conversions, which is the best way to find your winning landing page.\n\n#### Beyond Messaging\n\nWhat makes Slack’s landing page stand out is its messaging. The company doesn’t want you to consider Slack a messaging tool. Today, it’s so much more than that — and that’s what this landing page is trying to convey.\n\nA key takeaway from Slack’s landing page is to keep your navigation bar bare. On this landing page, Slack only includes the most important elements in the navigation bar: letting current users log in and prospective users talk to sales.\n\n### 8\\. ExpressVPN\n\nVirtual private networks (VPNs) add a layer of security to WiFi browsing, and [ExpressVPN](https://chromewebstore.google.com/detail/expressvpn-vpn-proxy-for/fgddmllnllkalaagkghckoinaemmogpe) has created a landing page that communicates safety and simplicity. The main headline promises visitors a seamless online experience, and the graphic of someone accessing a variety of digital experiences reinforces that message.\n\n#### Engaging Content & Building Trust\n\nAs visitors scroll down, the text describes the service's chief benefits, accompanied by simple graphics that help make abstract concepts like “global access” more concrete. Given that ExpressVPN is a security tool, establishing credibility is essential.\n\nThis landing page achieves this without alienating visitors with muted graphics and simple language. Prominent TrustPilot and app store reviews further signal that the company is reputable.\n\n### 9\\. Blue Apron\n\nBlue Apron aims to win new customers with a landing page emphasizing the variety of menu options available for Meal planning and ingredient delivery service. High-quality food photography entices visitors to keep scrolling, with content down the page emphasizing the service’s:\n\n- Value\n- Flexibility\n- Convenience\n\n#### Driving Conversions\n\nThe CTA remains consistent throughout, encouraging visitors to view plans and begin designing a subscription to suit their dietary preferences and schedule. Blue Apron could have cluttered this landing page with testimonials, menu examples, and recipe links, but it focused on its core messaging:\n\n- Value\n- Convenience\n\nThe landing page is relatively short (it only has four sections), but it intends to offer many features using cute graphics.\n\n### 10\\. LinkedIn Ads\n\nThis landing page outlines the benefits of advertising on LinkedIn to potential business customers. A fixed header menu with the CTA button “create an ad” stays anchored as visitors scroll through the content, and the button appears twice. In the middle of this landing page, visitors can click through a carousel presentation of the critical benefits of LinkedIn Ads.\n\nThe design allows each concept to shine without devouring too much screen real estate. The page concisely outlines the three-step ad launch process, signaling visitors won’t waste time with a cumbersome backend system.\n\n### 11\\. Hootsuite\n\nHootsuite is a social media management tool that helps marketers create, schedule, and track all their social content in a single dashboard. The landing page aligns with social media as a fun but legitimate marketing tool, with Hootsuite’s trademark cartoon owl sharing center stage with a photo of a youthful-looking customer.\n\n#### Tiered CTA\n\nThe CTA, which is repeated throughout, invites visitors to start a 30-day free trial. Details about product benefits are shared in a space with a testimonial and a section displaying customer brand logos, which signal that the company has a track record of success. Hootsuite’s page starts with minimal text and an immediate CTA button for those who already know they want to get started.\n\nAs visitors scroll, each section of the page includes more detail, prioritizing describing tools for:\n\n- Instagram\n- TikTok, followed by\n- Facebook\n- Twitter\n- Pinterest\n\nGranular information on pricing and product benefits is displayed down the page, followed by a button for scheduling a demo for visitors who seek a deeper dive.\n\n### 12\\. Wondrium\n\nThe landing page for this streaming service uses a tiled background of movie title graphics to showcase the breadth of its offerings. A prominent CTA highlights a 14-day free trial offer. Testimonials from well-known Internet creators prove the service is worth exploring, while an FAQ proactively explains more details.\n\nIn keeping with Wondrium’s educational focus, a prominent FAQ details the service and reveals additional benefits, such as a quarterly magazine and audio-only streaming capabilities.\n\n### 13\\. Uber for Business\n\nThe popular ride-sharing business has expanded to offer a feature set specifically for businesses, such as:\n\n- Ride services for company customers\n- Helping employees track travel expenses\n\nThis squeeze [landing page](https://www.uber.com/newsroom/), reached from a Google search, gives companies a fast track to setting up an Uber account with the headline “Let’s get started.”\n\n#### Brand Consistency with a Twist\n\nThree succinctly-stated benefits on the right persuade visitors to take action, while the logo at the top links to a purpose-built microsite for further information if needed. While the page looks different from the typical Uber app experience, the typeface and black-and-white color scheme make it recognizable as part of the Uber brand.\n\n#### Understanding User Behavior\n\nWeb design research shows that most users skim what’s on screen in a predictable pattern. Their eyes move across the page and down in a zigzag and “Z pattern,” or else straight down and then across to the right in an “F pattern.”\n\n#### F-Pattern for Conversions\n\nUber’s page uses an F-pattern by placing “Uber for Business” in the top left corner. After that, your eye is drawn straight down to the CTA form, with the three horizontal bands to the right providing supplemental material to skim.\n\n### 14\\. Skillshare\n\nThis landing page design for online course provider SkillShare includes a navy blue background with text in high-contrast white and lime green. Tiled photos showcase the various course types available via the service, from cooking to computer skills. Using an F-pattern layout, the page uses the right-hand side to detail three key differentiators.\n\n#### Multiple Login Options\n\nThe signup form requires just a name and email address to get started, and visitors can use existing social media logins integrated with the site.\n\nBy keeping the required fields to a minimum, Skillshare’s page encourages visitors to sign up for the service. Integrating with other login services makes the process even easier, allowing new customers to avoid remembering another username and password.\n\n### 15\\. Snowflake\n\nThis event page for a data service provider demonstrates a commitment to mingling informative content with networking and fun. Detailed descriptions, an agenda, and an interactive event finder give potential attendees all the information they need to find the right event. This straightforward page looks information-heavy, with minimal graphics and plenty of text.\n\n#### A Different Approach for Data Analysts\n\nWhile that’s the opposite of most landing pages, the wonky approach may be just right for a data analytics audience. By stating that events are sold out and inviting viewers to fill out the form to be placed on a waitlist, Snowflake signals that their events are worthwhile and exclusive. This positioning helps ensure that visitors who sign up will rush to register when another event invitation comes their way.\n\n### 16\\. Spatium\n\nDifferent shades of purple and captivating images of outer space make it difficult not to install this Google Chrome extension on your computer. An abundance of blank space accentuates the limited text, creating an attractive and straightforward design.\n\n#### A Winning CTA Combination\n\nThe CTA includes a reminder that the extension is free; for those who need more information, the page goes on to illustrate functionality with lush photos and to list widgets and options included with the download.\n\n#### Frictionless Conversions\n\nIf the CTA can be accomplished quickly with little risk or cost to the visitor, there’s no need to over-elaborate. While you should spell out essential details (such as shipping costs for a product or which devices are compatible for a download), make the action as easy to take as possible, and be sure any checkout or download processes are similarly streamlined to keep visitors on track to completion.\n\n### 17\\. Beats by Dre\n\nLanding pages allow retailers to elaborate on:\n\n- Style elements\n- Technical features\n- Craftsmanship\n- Other product details\n\n#### Educating and Converting Buyers\n\nTo that end, this page dedicated to wireless headphones includes extensive information on sound quality, charging capabilities, and built-in functions. Large visuals and concise text spell out the benefits, while the “buy” button links directly to the shopping cart, shortening the path to purchase.\n\n#### Keeping the CTA in Sight\n\nVisitors can lose track of the initial CTA if a landing page is long. Repeating the button at several points throughout the page is one solution, but it’s more elegant to use a floating header that always anchors the button at the top of the screen, keeping it within reach.\n\n### 18\\. Inbound by Hubspot\n\nThis conference landing page makes it easy to secure tickets with a focused CTA and persuasive content that convinces visitors that the event is worth their time.\n\n#### Showcasing Event Highlights\n\n- Video presentations\n- Event photos\n- Speaker bios featuring expert talent\n\nAt the same time, delineated descriptions of the two available ticket types make it easy for visitors to select the right price point for them.\n\n#### Avoiding Decision Fatigue for Conversions\n\nWhile it can be tempting to show various price points and products to appeal to multiple tastes, having too many options can confuse and overwhelm viewers. By sticking to the two ticket types available to attendees who aren’t also exhibiting as vendors, HubSpot avoids complicating the selection and gives page visitors a binary choice.\n\n### 19\\. Masterclass\n\nOnline course provider Masterclass has set the standard for marquee instructors, and its offering for screenwriting is no exception. Oscar-winner Aaron Sorkin teaches the ins and outs of the trade.\n\n#### Content and Conversion\n\nFor those who search for the class using Sorkin’s name, Masterclass has devised a landing page with his photo front and center and a simple red CTA that makes it straightforward to claim a class spot. Video preview clips and a course outline help visitors decide whether the content will meet their needs.\n\n#### Attracting Celebrity Instructors\n\nIf you’re working with an influencer or have a celebrity connection, highlight their endorsement or credentials. Masterclass appeals to its target audience with this approach, attracting visitors who want to name-drop their instructors at cocktail parties.\n\n#### Showcasing Expertise\n\nThe clean and straightforward design of the rest of the page concentrates attention on the celebrity, while the preview clip demonstrates why they’re worth paying for.\n\n### 20\\. Calm\n\nMost of us could use more tranquility in our lives, and Calm aims to bring us exactly that. It’s a meditation and sleep app with features designed to invite relaxation into our otherwise chaotic lives. This landing page website example is the first thing people see once they visit the app’s site—right away, it encourages visitors to get started and engage more deeply with Calm.\n\n#### Matching Design to Message\n\nCalm practices what they preach through the look of their landing page. The copy is clean and straightforward to avoid overwhelming visitors with too much information. The headline, “Meet Calm,” lends a feeling of harmony and peace to the content.\n\n#### Clear Value Proposition\n\nCalm’s main goal is spelled out. (Better sleep, lower stress, and less anxiety? Sign me up!) The landing page gets straight to the point by inviting the reader to join millions of others around the globe on their path to wellness.\n\n### 21\\. Zola\n\nZola is the latest startup that’s breaking the mold regarding wedding planning. Their philosophy is simple: Make it easy for couples to plan their big day, from the invitations through the honeymoon.\n\nFrom an online wedding registry to a directory of wedding venues and vendors, Zola is a one-stop shop for brides and grooms-to-be. The first word we read on the landing page is free, immediately having a powerful effect on future brides and grooms who want to save on wedding costs but still get a polished-looking product.\n\n### 22\\. CD Baby\n\nCD Baby is a music distributor that gets your tracks to the ears of the masses. The platform aims to help independent musicians get on all the top platforms to get the widest distribution. Not only that, CD Baby wants to make sure that musicians are receiving the royalties they deserve.\n\nThe landing page explains why musicians benefit from CDBaby's service (beyond getting their music out there as much as possible). CDBaby does it all for one price, so musicians know exactly what they get.\n\n### 23\\. Goby\n\nBrushing perfected. That’s what this landing page from Goby promises right at the top, giving visitors the confidence and curiosity to click through. Not only does their award-winning electric toothbrush come with impressive accolades, but it’s also affordable and backed up by a money-back guarantee.\n\nNow that’s worth a smile! Check out the section of the page that breaks down every element of the toothbrush. Rather than just talk about these features in the copy, visitors can see the:\n\n- Soft, Premium Bristles\n- Oscillating Brush Head\n\n### 24\\. Salt & Straw\n\nSalt & Straw Curiously Delicious Ice Cream Delivered Right to Your Door rewards lead capture with a subscription to their monthly newsletter with information about:\n\n- New flavor launches\n- Special offers\n- Coupons for partner shops\n- 10% off the customer's first order\n\nThe visual on their landing page is:\n\n- Simple\n- Memorable\n- Yummy\n\nIt's scoops of ice cream flanked by rows of ripe summer berries.\n\n### 25\\. SEM Rush\n\nIf you’re a digital marketer, you’re probably already familiar with SEM Rush. Their platform offers an [all-in-one toolkit](https://www.semrush.com/company/) for:\n\n- SEO\n- Content marketing\n- PPC\n- Social media\n- Market research\n\nBut rather than try to sell you all of these things simultaneously, this landing page narrows its focus on just one thing: how to use its platform to learn more about your competitors.\n\nThe CTA on this page taps into every marketer’s innate desire to spy on the competition. The one-field form asks you to enter any domain name before prompting you to click the big button and “Get Insights.”\n\n### 26\\. Coco Village\n\nThe marketers at J7 Media, a Facebook Ads agency, did a phenomenal job creating a landing page showcasing a collection of different products while still keeping it focused on a single click-through goal.\n\n#### Bold Discounts Drive Conversions\n\nWhen offering a big sale or discount, you want everyone to know about it. And visitors on this landing page can’t miss that they’re offering “50% Off Beds and Bedding Sets.” Not only is that the main headline, but it’s also repeated under each product on every CTA. They even strikethrough the original prices to illustrate how much money you’ll be saving. Nice!\n\n### 27\\. Grass Roots\n\nThere’s a growing demand for grass-fed meat, which is where this landing page from the Grass Roots Farmers’ Cooperative and the agency MuteSix comes into the mix. As you scroll through the page, you’re taken on the full customer journey—from problem awareness (understanding why grass-fed meat is better), through consideration (seeing why you should choose Grass Roots as your protein provider), to making a purchase (“Claim Your $30 Off”).\n\n#### Building Trust & Urgency for Premium Meat\n\nAt the top of the page is a one-minute video featuring Dave Asprey, the founder and CEO of Bulletproof. The video explains how challenging it can be to source high-quality grass-fed meat and why Dave uses Grass Roots for the meat he can’t find in the grocery store. This sets the tone nicely for the rest of the page and gives you the right mindset to purchase.\n\n### 28\\. Amazon\n\nHere’s a landing page that, on paper, doesn’t seem to work at all. The colors are incredibly disjointed, and there are multiple different art styles. The content seems to be all over the place. The page even has multiple links to other pages and exit points.\n\n#### When Benefits Trump Design Rules\n\nAmazon somehow manages to get away with breaking all of these rules because they know their offer is too good to pass up. Ask people why they signed up for Amazon Prime, and they’ll answer you in the same order these sections appear on the landing page. Free shipping is the main benefit, followed by Prime Video.\n\n#### Click-Through CTAs\n\nThe rest are bonuses, shown as add-ons as you get farther down the page. (With the average scroll depth only about 50%, it’s smart to put the most important stuff in the top half of the page.) Whether you consider this a SaaS page or an ecommerce page, the marketers at Amazon made the right call to use a click-through CTA instead of embedding a form on the page. According to the Unbounce Conversion Benchmark Report, click-through CTAs perform better in both industries.\n\n### 29\\. Branch Furniture\n\nAs someone who had to furnish a home office recently, I know exactly how difficult it can be to find desks, chairs, and tables you like online. Branch Furniture understands this can be a problem for office managers, so their landing page instantly reassures you that you’re in the right place.\n\n#### \"Easy\" Office Furniture\n\nTheir service makes it easy to get your office furniture designed, shipped, and installed. “Office Furniture Made Easy.” In just four words, you understand who this landing page is trying to target and what their unique selling proposition (USP) is. You don’t want to be building 100 desks for your new office Ikea-style, with nothing but a socket wrench and a dream. It seems like a much better idea to let Branch Furniture handle all those details for you.\n\n### 30\\. Western Rise\n\nSometimes when prepping a piece like this one, you end up buying the product. I’m very, very close to pulling the trigger on a pair of Western Rise’s AT Slim Rivet Pants. And why not? This sharp landing page quickly establishes the appeal of the product through visuals and copy that stresses the benefits of these “elevated” pants. It may be time to give up on my ratty jeans altogether.\n\n#### Evoking a Lifestyle\n\nThese pants may be handmade in Los Angeles, but many of the photos here (including the hero shot) scream Brooklyn. It’s easy to imagine wearing the AT Slim Rivet Pants as you peddle your fixie through traffic, balancing a latte on your handlebars on the way to a chic rooftop cocktail party.\n\n### 31\\. Athabasca University\n\nAthabasca University pioneered distance education in Canada in the 1970s. Today, it uses landing pages to boost its online enrolment initiatives, including this example representing its 14 certificate programs. It’s a smart choice since landing pages allow AU to focus a visitor’s attention on a particular slice of its many online program offerings.\n\n#### Hitting the Right Audience\n\nIt might be worth testing out a more direct headline, but the copy here matches the school’s other branding initiatives elsewhere. It’s also very sharp. The target is clear: people who might further their education but don’t feel they have time to pursue it. This landing page says otherwise (in words and in its hero image).\n\n### 32\\. Bariatric Eating\n\nHere’s a page for Bariatric Eating that shows why personality and style are so important to your landing page. You can easily imagine a version of this campaign that looks much more clinical and scientific. Still, the marketers at Sevah Creative have infused it with a colorful and friendly design to make the subject matter much more approachable. The approach is working, too.\n\n#### A Conversion Magnet\n\nThis page has an impressive conversion rate of over 39%. The playful design extends to every element of the page. The font choices, the illustrations, the colors—everything comes together in a way that perfectly matches their brand personality.\n\n### 33\\. blow LTD.\n\nIf you look past the buzzy “Uber for beauty” thing, UK brand blow LTD. solves a genuine problem in a genius way. They offer affordable, professional beauty services that come to you, and—more importantly—you can book an appointment with one of their pros straight from their app. Smartly, landing pages are a big part of their campaign strategy. The example, for instance, promotes in-home eyelash extensions in clever ways.\n\n#### Headline Clarity Wins Conversions\n\nThis landing page doesn’t mess around with cute copy (e.g., “Eyes That Amaze”). Instead, it clearly states the offer and relies on value (and maybe a little bit of novelty) to win over prospective customers. A promise doesn’t get more unambiguous than “Eyelash Extensions At Home,” and that’s precisely why this headline is so effective.\n\n### 34\\. Blue Forest Farms\n\nHemp farmers sometimes have trouble disassociating themselves from cannabis culture. (Tie-dye colors, bong water, and that funky smell coming from your older brother’s van.) But this stellar B2B landing page takes modernized and, dare we say, adult approach to wholesale hemp oil extracts. From its clean design to persuasive copy, it makes a strong case that this is an industry that demands to be taken seriously.\n\n### Targeting Professionals Who Already Know\n\nUnlike B2C landing pages, this page speaks to a professional crowd. By which I mean, people who know what it means when plant extract contains “natural terpenes” and has been “decarboxylated.” We might suggest going with a more impactful headline, but wholesalers are likely very aware of the benefits. Cutting to the chase can’t be a bad thing.\n\n### 35\\. Border Buddy\n\nThe headline starts with the pain and insecurity (“Importing and Exporting Is Hard”) that any visitor who hits this landing page from a PPC campaign is likely to be feeling. Crucially, though, the promise of a solution appears with equal clarity above the fold: “We do the hard part for you,” says Border Buddy. Perfect.\n\n#### Cut Through Customs Complexity\n\nBringing your purchases across the border can get very messy, so keeping this landing page clean is essential. There’s no more information here than what you need to know. No legalese either. You’ll have a customs broker worrying about all those small details for you.\n\n### 36\\. REI Co Op\n\n#### Engaging Call-to-Actions on REI Coop's Landing Page\n\n- Carousel of messages\n- Repeated \"shop now\" prompts\n- Encouragement to \"save 40%\"\n\nThey can shop now or get a $25 gift card for shopping now. The site has a link to the nearest brick-and-mortar store and links to 10 kinds of merchandise. Still, all of the featured links on the page lead to immediate shopping.\n\n### 37\\. Wix\n\nWix has turned its landing page into a creative playground with a captivating digital illustration that follows you down the page. It‘s not overwhelming or distracting — it’s carefully balanced with white space and clear text.\n\n#### Guiding Users with Design\n\nWix uses design to emphasize certain touchpoints on the page. For instance, the mountain's peak in the illustration points to the main CTA, encouraging visitors to get started.\n\n### 38\\. Row House\n\nBesides its sleek design, this landing page gets bonus points for the header, which gives prospects a free first class. The copy speaks to both new and experienced fitness pros. What’s better is that it includes access to a fitness community that can help keep customers accountable for their fitness goals.\n\n#### Streamline Design for Faster Conversions\n\nRow House focused its website design on minimalism and getting people to sign up immediately. When you design your landing page, ditch a fussy design and focus on how to turn prospects into customers more quickly.\n\n### 39\\. Codeacademy\n\nThe page's form is simple and only requires an email address and password.\n\n#### Alternative Login Options \n\n- LinkedIn\n- Facebook\n- GitHub\n- Google Plus\n\nThe landing page also offers real-life success stories, testimonials, and other social proof for visitors needing more information before creating an account. This helps make the potentially intimidating world of coding more approachable for beginners.\n\n### 40\\. Sunbasket\n\nSunbasket’s landing page ticks all the boxes by communicating its audience’s challenge in simple terms. People like me want an easy and convenient process for making meals. I want the best quality organic food. And I want my meals on autopilot. Sunbasket nails all these, and that means my chance of becoming a customer is high.\n\n### 41\\. Curology\n\n#### Effective Top Fold Features of Curology\n\n- Clean\n- Visually appealing\n- To the point\n\n#### Clarity & Connection in Your Landing Page\n\nUsers immediately understand the offer and how it can benefit them. Even if the brand is new to you, its message is loud and clear: Curology has a custom solution for you regardless of your skin issues. Make your landing page reflect how your customers will feel when they use your product. An open and transparent visual of a room with plants and clean tile gives a pleasant impression that your audience may be looking for.\n\n### 42\\. Breather \n\nWhen you visit [Breather.com](http://Breather.com), there’s an instant call to action: indicate where you want to find a space. Plus, it uses location services to determine where you are, providing instant options nearby. Breather uses simple, to-the-point copy to let the visitor know what the company does, followed immediately by the CTA to select a city.\n\nThe negative space and soothing color scheme also align with the product — essentially, room to breathe.\n\n### 43\\. Paramount Plus\n\nThis landing page design has it all. It's visually:\n\n- Appealing\n- Interactive\n- Offers scannable yet descriptive headers\n\nThe background makes each fold look slightly different, creating a captivating scrolling experience. The landing page also features a repeatable CTA (“Sign In…”) and several strategically placed content offers, culminating in multiple touchpoints for visitors to convert.\n\n### 44\\. Herb & Wood\n\nThe landing page for Herb & Wood Private Events uses advertising and off-page SEO to funnel traffic with one goal in mind: TIt seeks people who want to host a private event near its venue, which is in San Diego. A banner on the landing page announces, \"Herb & Wood is a stylish and versatile event space in San Diego.\" The page offers visitors only one possible action: to click on the Private Events link.\n\n### 45\\. St. Jude's Children's Research Hospital\n\nSt. Jude's Children's Research Hospital inspires monthly giving with the stories of the children it helps. Their landing page links to emotive stories of successful childhood cancer treatment.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How To Arrive At A Creative Landing Page Design In 8 Steps\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/ukaq82u0bj9.jpg)\n\n### 1\\. Set your campaign goal\n\nSetting a campaign goal is pivotal to the success of your landing page. Your goal could be to:\n\n- Increase sales\n- Generate leads\n- Boost conversions\n\nIt's crucial to set a realistic and measurable goal that aligns with your business objectives.\n\n### 2: Select a Landing Page Template\n\nChoosing a [pre-made landing page](https://zapier.com/blog/best-landing-page-builders/) template can save you time and effort. MagicUI Pro offers a range of templates to choose from, allowing you to customize the design and content to meet your specific goals. These templates provide a solid foundation for your landing page, making it easier to focus on customization.\n\n### 3: Write your copy\n\nCrafting compelling copy is essential for engaging visitors and driving conversions. Your headline should be attention-grabbing and clear, highlighting the key benefits of your offering. Focus on how your product or service can solve the visitor's problems and keep your copy concise and easy to read.\n\n### 4: Craft your CTA\n\n[Your Call to Action (CTA](https://nuancedmedia.com/why-your-website-needs-calls-to-action/)) is the key element that prompts visitors to take action. Ensure your CTA is clear, specific, and compelling. Avoid generic CTAs like \"Learn More\" and opt for descriptive options like \"Start Your Free Trial\" or \"Book A Demo\" for better results.\n\n### 5: Select your images\n\nVisual elements play a crucial role in capturing visitors' attention. Choose high-quality images that resonate with your target audience. Start with a hero image that showcases your offer and include visuals that highlight the benefits of your product or service.\n\n### 6: Connect your landing page\n\nIntegrating your landing page with your business domain and analytics tools is essential for tracking performance. Customize your URL, add tracking scripts like Google Analytics, and ensure seamless integration with your marketing stack for a complete setup.\n\n### 7: Preview and publish\n\nBefore launching your landing page, review the copy, SEO settings, and form functionality. Ensure there are no typos, optimize for search engines, and test all forms to confirm they work as intended before publishing your page.\n\n### 8: Optimize Your Landing Page\n\nOnce your landing page is live, continue to optimize its performance through A/B testing. Test different elements such as headlines, visuals, and CTAs to maximize conversions. Regular testing and optimization will help you achieve the best results from your landing page.\n\n## Best Practices For Creating A Landing Page\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/kbunhnu1qjs.jpg)\n\nThe first thing you need to remember when creating a landing page is that it needs to be very specific. This is essential for a number of reasons, but the primary one is that it helps significantly [increase your conversion rates](https://www.forbes.com/sites/davelavinsky/2014/03/18/how-to-increase-conversion-rates/). Why? because those who visit your landing page are looking for something specific.\n\nThey have clicked on an ad or followed a link because they want something. It might be a special offer, some information about a product or service, or a free report or webinar. If your landing page doesn't offer them what they are looking for, they'll just hit the back button. Having a single, fixed goal allows you to get better conversion rates. So don’t send out multiple, mixed messages. Instead, stick to a single CTA—both in your ad and your landing page form.\n\n### Choose a Relevant Hero Image\n\nWhen choosing a hero image, you need to think of your target audience and identify the kind of image appeals to them. For example:\n\n- Are they young and looking for the latest tech gadgets?\n- Are they business professionals looking for the most efficient way to get things done?\n- Are they stay-at-home moms looking to have more fun with their families?\n\nThen, pick a photo that not only appeals to visitors but also reinforces your message or value proposition. Now, place it in a spot that leads to your CTA, which is where you want your visitors to look next.\n\nHere are some images that will make for a successful landing page:\n\n- Simple images that evoke emotion\n- Images that feature people\n- A straightforward color palette that matches your landing page\n\n### Treat your CTA with Utmost Care\n\nThe CTA is, without a doubt, the most important part of your landing page. If your CTA isn’t convincing enough, your visitors won’t convert. Studying effective CTAs is the best way to know which ones could work for your specific purpose.\n\nSome characteristics of effective landing page CTAs are:\n\n- Focused on the benefit\n- Straight to the point (five words at most)\n- Action verbs (get, download, click, register, etc.)\n\nApart from great button copy, you also have to highlight your CTA. Here are a few more ways to make your CTA stand out on your landing page:\n\n- Surround your CTA button with negative space, so it won’t compete for attention\n- Look at your page the way your visitor will, follow where their eyes go, and place the CTA there\n- Test everything–your button shape, size, color, font, and copy\n\n### Do A/B testing\n\nAn A/B test, also called split testing, is creating two slightly different variations of a single page to see which one works better. The key thing to note here is the slight variation as you conduct the test by changing one small element at a time.\n\nExamples of A/B testing include testing between a red and green CTA button, two different headlines, or two hero images. You can’t just do A/B Testing at random, so to decide which variable to test, follow the [ICE (Impact, Confidence, Ease) framework](https://blog.growthhackers.com/the-practical-advantage-of-the-ice-score-as-a-test-prioritization-framework-cdd5f0808d64).\n\n## Common Mistakes To Avoid While Designing A Creative Landing Page\n\n![Creative Landing Page Design](https://cdn.magicui.design/assets/z3mltgy5ufk.jpg)\n\n### No Images or Low-Quality Graphics\n\nUsing high-quality images and videos on your landing page is crucial since people process visual content much faster than text. Using generic, pixelated, or outdated images can harm the [credibility of your page](https://codenest.co/knowledge-center/how-to-improve-website-credibility/#:~:text=Credibility%20is%20a%20term%20that,enough%20to%20deliver%20its%20promises.). Stock photography can make your page look less authentic and reduce trustworthiness.\n\n### Page Layouts with Too Much Content and Complexity\n\nWhile creativity is essential, avoid overwhelming your visitors with complex page layouts and too much content. Unclear messaging and elements like auto-playing videos with sound can discourage visitors. Make sure your page is mobile responsive and loads quickly for a better user experience.\n\n### Unscannable Copy\n\nGood copy is key to creating clear and intuitive landing page experiences. It should be:\n\n- Well-written\n- Suggestive\n- Exciting\n\nAvoid using too much text, grammatical errors, long blocks of text, or a dull tone. Visitors will trust you more if they feel the copy is tailored to them and tells a compelling story.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specifically designed for design engineers. It provides a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. This library offers a range of visually appealing and interactive elements that can be seamlessly integrated into web applications, allowing users to create stunning user interfaces with minimal effort.\n\n### Highly Customizable Components\n\nMagicUI components are highly customizable, allowing for seamless adaptation to match desired branding and design requirements. This level of customization empowers users to craft captivating digital experiences that resonate with their target audience and elevate their brand identity.\n\n### Bridge Between Design and Development\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development. This fusion enables users to create dynamic and engaging landing pages that not only capture attention but also drive conversions effectively.\n\n### Save Time and Effort with MagicUI Pro\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) takes the capabilities of the free component library to the next level by offering users the ability to save thousands of hours creating beautiful landing pages. The Pro version includes website templates that are optimized for conversions, enabling users to convert visitors into customers efficiently.\n\n### Launch Your Startup Landing Page with MagicUI's Template\n\nReady to elevate your landing page game with MagicUI? Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today and experience firsthand how MagicUI can transform your digital presence.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/css-animation-on-scroll.mdx",
    "content": "---\ntitle: A Modern Guide to CSS Animation on Scroll\ndescription: >-\n  Create smooth, performant CSS animation on scroll with Intersection Observer\n  and React. Learn modern techniques for engaging user experiences.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-075fcec2-ad6c-455c-8c98-4cc31ee2771e.jpg\nauthor: Dillion Verma\ntags:\n  - css animation on scroll\n  - intersection observer\n  - react animation\n  - frontend development\n  - web animation\npublishedOn: \"2025-10-20T10:08:09.424445+00:00\"\nfeatured: true\n---\n\nWhen you see a **CSS animation on scroll**, you're watching an element come to life right as it enters your screen. The secret sauce behind this magic is usually the browser's Intersection Observer API. It’s a clean, efficient way to watch for an element becoming visible and then slap on a CSS class to kick off the animation. This modern method blows older, script-heavy techniques out of the water in terms of performance.\n\n## Why Scroll Animations Matter\n\nLet's be honest, most web pages are static and, frankly, a bit boring. Dynamic elements aren't just a nice-to-have anymore; they're essential for grabbing and holding a visitor's attention. A flat wall of text just doesn't cut it. This is where you can really make an impact with scroll-triggered animations, turning a simple browse into a more engaging experience.\n\nBy animating elements as someone scrolls, you’re essentially telling a story. You guide their eyes, reveal information piece by piece, and highlight the most important parts of your message. It's about creating a narrative flow that pulls them deeper into your content instead of overwhelming them with everything at once.\n\n### The Modern Approach to Scroll Effects\n\nNot too long ago, the only way to do this was with JavaScript event listeners that were constantly checking where everything was on the page. This was a nightmare for performance, often leading to choppy scrolling and a sluggish feel. Thankfully, things have changed for the better. We now have the **Intersection Observer API**.\n\nThis native browser tool is a game-changer. It's built specifically to trigger events when an element enters or leaves the screen, and it does so with incredible precision and minimal performance cost. When you combine this with a library like Magic UI Pro, which gives you ready-to-go animated components, you can build these experiences in a fraction of the time.\n\n> The real win is combining the performance of the Intersection Observer with the elegance of pure CSS transitions and animations. This pairing creates stunning visual effects without compromising on speed—a critical factor for both user retention and modern SEO standards.\n\nThe numbers back this up, too. Recent data from 2024-2025 shows that sites with smart scroll animations see a **37% boost in user engagement** and **23% longer average session durations** compared to their static counterparts. You can dive deeper into the data and explore modern scroll animation solutions to get the full picture.\n\nThis infographic gives you a great visual of how different elements can animate into view as a user scrolls down a page.\n\n![Infographic about css animation on scroll](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/6dc851d3-5e37-417a-97ef-6f5df8065e50.jpg)\n\nYou can see how staggering animations for text, images, and cards creates a much more dynamic and guided experience for the user. It just feels more intentional.\n\n### Animation Trigger Method Comparison\n\nHere’s a quick look at how the modern Intersection Observer API stacks up against older methods for triggering animations on scroll.\n\n| Method                        | Performance Impact                                                                           | Ease of Use                                                                     | Best For                                                                          |\n| :---------------------------- | :------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------- |\n| **Intersection Observer API** | **Low**. The browser handles all the heavy lifting, firing events only when needed.          | **Moderate**. Requires some JavaScript setup, but the logic is straightforward. | Modern, performant websites where a smooth user experience is critical.           |\n| **`onscroll` Event Listener** | **High**. Fires constantly as the user scrolls, leading to jank and performance issues.      | **Easy**. Simple to implement but comes with major performance drawbacks.       | Simple prototypes or very limited-use cases where performance isn't a concern.    |\n| **`getBoundingClientRect()`** | **High**. When used with a scroll listener, it forces frequent reflows, hurting performance. | **Complex**. Requires manual calculations to track element positions.           | Legacy projects or specific scenarios where you need precise element coordinates. |\n\nAs you can see, the Intersection Observer is the clear winner for any modern web project. It delivers the smooth, high-quality experience users expect without bogging down the browser.\n\n## Building Your React Animation Environment\n\nBefore we dive into making elements fly across the screen, we need to lay a solid foundation. Getting your development environment set up correctly from the start is a non-negotiable step. It not only gets you coding faster but also saves you from major headaches down the road.\n\nWe’ll be using [Vite](https://vitejs.dev/) to get our React app off the ground. If you haven't used it before, you're in for a treat. Its dev server is ridiculously fast because it serves native ES modules, meaning your changes show up in the browser almost instantly. No more waiting for a slow bundler.\n\nPop open your terminal and run this command to scaffold a new project:\n\n```bash\nnpm create vite@latest my-animation-app -- --template react\n```\n\nThis command creates a fresh React project in a new folder called `my-animation-app`. Once that’s finished, jump into the new directory (`cd my-animation-app`) and run `npm install` to get all the initial packages sorted.\n\n### Installing the Right Tools for the Job\n\nWith the basic React boilerplate ready, it's time to bring in the libraries that will handle the animation magic.\n\nWe'll need two key packages:\n\n- **Framer Motion:** This is a fantastic, production-ready library for React. It makes crafting complex animations and gestures feel almost effortless with a clean, declarative API.\n- **Magic UI Pro:** This is our secret weapon. It’s a library packed with beautifully designed, pre-animated components that let us build incredible UIs without having to design every little detail from scratch.\n\nLet's install them both with a single command in your project's terminal:\n\n```bash\nnpm install framer-motion @magiclabs/ui\n```\n\nSelecting the right tools is a critical decision. This combination of Framer Motion and Magic UI Pro gives us the best of both worlds—fine-grained control when we need it and high-level, ready-to-use components to speed things up. If you're curious about other options, we've broken down the pros and cons in our guide to the best **[React animation libraries](https://magicui.design/blog/react-animation-libraries)**.\n\n### Structuring Your Project for Success\n\nA little organization now pays off big time later. Inside your `src` directory, go ahead and create a `components` folder. This is where we’ll keep all our reusable UI pieces. I also like to create a `hooks` folder for custom React hooks—we'll actually build one for scroll detection later in this guide.\n\n> A well-structured project isn't just about being neat; it's a practical necessity for maintainability. Knowing exactly where to find components, styles, and logic makes building, debugging, and scaling so much smoother.\n\nTo wrap up our setup, let's create a simple `Layout.jsx` file inside `src/components`. This component will act as the main container for our pages, giving us a consistent and predictable structure. Think of it as the canvas where we’ll start painting our animated experiences.\n\n## Implementing Your First Scroll-Triggered Animation\n\nAlright, let's move from theory to practice. The best way to really get a feel for how a **CSS animation on scroll** works is to build one from scratch. We’re going to create our own custom React hook that neatly bundles all the logic for figuring out when an element has scrolled into view.\n\n![Code example showing a custom React hook and its application to a component, demonstrating CSS animation on scroll.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/97b0e10b-82a6-415f-94de-edfa5c1a1263.jpg)\n\nThis hook is going to use the browser's native Intersection Observer API, which is a game-changer for performance. The result? A super-efficient, reusable tool for triggering animations anywhere in our app.\n\n### Crafting a Reusable Visibility Hook\n\nThe idea here is simple: write the logic once, use it everywhere. A custom hook is the perfect pattern for this in React. We’ll call our hook `useOnScreen`, and it will take a `ref` pointing to a DOM element and tell us whether that element is currently visible.\n\nTo pull this off, we'll lean on two of React's most fundamental hooks:\n\n- **`useState`**: This will hold our simple boolean state, `isVisible`.\n- **`useEffect`**: This is where we'll set up and tear down the Intersection Observer. It’s the perfect place for side effects like this.\n\nInside the `useEffect` hook, we'll create a new observer and tell it to watch our target element. As soon as the element enters the viewport, the observer's callback fires, and we'll flip our `isVisible` state to `true`. That’s it.\n\n```jsx\n// src/hooks/useOnScreen.js\nimport { useEffect, useRef, useState } from \"react\"\n\nexport const useOnScreen = (options) => {\n  const ref = useRef(null)\n  const [isVisible, setIsVisible] = useState(false)\n\n  useEffect(() => {\n    const observer = new IntersectionObserver(([entry]) => {\n      // Update our state when the element is intersecting\n      if (entry.isIntersecting) {\n        setIsVisible(true)\n        // We can unobserve after it's visible to prevent re-triggering\n        observer.unobserve(entry.target)\n      }\n    }, options)\n\n    const currentElement = ref.current\n    if (currentElement) {\n      observer.observe(currentElement)\n    }\n\n    // Cleanup function to unobserve the element\n    return () => {\n      if (currentElement) {\n        observer.unobserve(currentElement)\n      }\n    }\n  }, [ref, options])\n\n  return [ref, isVisible]\n}\n```\n\nThis little hook is now the powerhouse for every scroll-triggered animation we want to build. It's clean, efficient, and keeps all the tricky observer logic tucked away.\n\n### Defining the Animation with CSS\n\nNow that we have the JavaScript to detect _when_ to animate, we need some CSS to define _how_ it animates. A simple fade-in and slide-up effect is a classic for a reason—it’s subtle but makes a huge difference.\n\nJump into your main CSS file and define the two states for the element: its starting (hidden) state and its final (visible) state.\n\n```css\n.fade-in-section {\n  opacity: 0;\n  transform: translateY(20px);\n  transition:\n    opacity 0.6s ease-out,\n    transform 0.6s ease-out;\n}\n\n.fade-in-section.is-visible {\n  opacity: 1;\n  transform: translateY(0);\n}\n```\n\nThe `fade-in-section` class sets our element to be completely transparent and shifted down by **20 pixels**. When we add the `is-visible` class, the `transition` property kicks in, smoothly animating the element to full opacity and back to its original position.\n\nIf you're looking to create more dynamic effects that respond directly to the speed and direction of the scroll, you might want to explore **[scroll-based velocity animations](https://magicui.design/docs/components/scroll-based-velocity)** for more advanced techniques.\n\n### Putting It All Together\n\nOkay, time to connect the dots. We’ll apply our `useOnScreen` hook and our new CSS classes to a React component. The best way to do this is to create a wrapper component, let's call it `AnimatedSection`, that can house any content we want to animate.\n\n```jsx\n// src/components/AnimatedSection.jsx\nimport React from \"react\"\n\nimport { useOnScreen } from \"../hooks/useOnScreen\"\n\nconst AnimatedSection = ({ children }) => {\n  const [ref, isVisible] = useOnScreen({ threshold: 0.1 })\n\n  return (\n    <section\n      ref={ref}\n      className={`fade-in-section ${isVisible ? \"is-visible\" : \"\"}`}\n    >\n      {children}\n    </section>\n  )\n}\n\nexport default AnimatedSection\n```\n\n> With this reusable component, animating any part of your page becomes incredibly simple. You just wrap it. This approach keeps your code clean by separating the animation logic from a component's main job, which makes your project much easier to work on down the road.\n\nNow, you can take any text, image, or custom component and wrap it in `<AnimatedSection>` to bring it to life as the user scrolls down the page. You’ve just successfully built a performant and reusable **CSS animation on scroll**.\n\n## Speed Up Your Workflow with Magic UI Pro\n\nRolling your own custom animation hook is a great learning experience. You really get under the hood of how **CSS animation on scroll** works. But let's be realistic—on a real-world project, time is money. This is exactly where a good component library like [Magic UI Pro](https://magicui.design/) becomes an absolute game-changer.\n\nInstead of reinventing the wheel and writing animation logic from scratch for every single element, you can pull in pre-built, production-ready components. They already have the animations baked right in, which means you can get back to what matters: building out the actual features of your app.\n\n![A visually stunning feature section built with Magic UI Pro components, showcasing CSS animation on scroll effects.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/bd055afd-f389-4e0d-a462-e5be06783503.jpg)\n\n### Dropping in Pre-Animated Components\n\nMagic UI Pro has a ton of components that you can integrate in minutes. Let's look at a couple of my favorites to see how easy it is to add some visual flair to your project. The best part is that they’re designed to be customized through props, so you get all the control without the headache.\n\n- **AnimatedGridPattern**: This is a killer component for creating dynamic backgrounds that catch the eye. You can tweak the number of squares, how fast they animate, and their size with a few simple props. It’s an instant way to add a layer of polish.\n- **ShimmerButton**: A plain old button is boring. The `ShimmerButton` adds this slick, subtle shimmer effect on hover that naturally draws the user’s eye to your most important calls-to-action without being obnoxious.\n\nWhen you use components like these, you're shifting to a more declarative way of thinking. You just tell the app _what_ you want the UI to do, and the library handles all the messy implementation details, including the Intersection Observer logic.\n\n### Let's Build a Feature Section in Minutes\n\nAlright, let's put this into practice. We're going to pull together a few Magic UI Pro components to create a complex and visually interesting feature section. This little exercise will show you just how fast you can build something that would normally take hours to code and animate by hand.\n\nPicture a typical \"features\" section on a landing page, highlighting three key benefits of a product. Here's how we can structure it:\n\n1.  First, we'll lay down an `AnimatedGridPattern` for the background to give it some subtle, engaging movement.\n2.  Next, we'll grab a `BlurIn` component for the main headline. This will make the text elegantly fade and sharpen into view as it scrolls onto the screen.\n3.  Finally, we'll wrap each of the three feature descriptions in its own `ShinyCard` component. We can even use the built-in delay props to stagger their entrance, creating a slick, choreographed reveal.\n\nHere’s a quick look at what the code might look like. Notice how readable and straightforward it is:\n\n```jsx\nimport AnimatedGridPattern from \"@/components/magicui/animated-grid-pattern\"\nimport BlurIn from \"@/components/magicui/blur-in\"\nimport ShinyCard from \"@/components/magicui/shiny-card\"\n\nconst FeatureSection = () => {\n  return (\n    <div className=\"bg-background relative flex h-full w-full items-center justify-center overflow-hidden rounded-lg border p-20 md:shadow-xl\">\n      <BlurIn\n        word=\"Stunning Features, Effortlessly\"\n        className=\"text-4xl font-bold text-black dark:text-white\"\n      />\n      <div className=\"mt-8 flex gap-4\">\n        <ShinyCard>Feature One</ShinyCard>\n        <ShinyCard>Feature Two</ShinyCard>\n        <ShinyCard>Feature Three</ShinyCard>\n      </div>\n      <AnimatedGridPattern\n        numSquares={30}\n        maxOpacity={0.5}\n        duration={3}\n        repeatDelay={1}\n        className=\"[mask-image:radial-gradient(ellipse_at_center,white,transparent_70%)]\"\n      />\n    </div>\n  )\n}\n```\n\n> The real magic of a component library is its composability. You're not just using individual components; you're combining simple, pre-animated building blocks to construct complex and polished interfaces with a fraction of the effort.\n\nThis approach doesn't just make you a faster developer. It also helps you maintain a consistent, high-quality user experience across your entire application.\n\n## Avoiding Common Performance Pitfalls\n\nA great **CSS animation on scroll** should feel completely fluid, not clunky or slow. Getting that smooth, jank-free experience really comes down to being deliberate about performance from the very start. The single biggest impact you can have is choosing _which_ CSS properties you decide to animate.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/0Xg6r_MKGJ4\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nI always tell developers to stick to animating `transform` and `opacity`. Why? Because these properties are handled by the browser's compositor thread. In simple terms, this means they don't force the browser to do a bunch of heavy lifting by recalculating the page layout. Try to animate things like `width`, `height`, or `margin`, and you'll see the difference—the browser has to repaint and reflow the whole document, which is what causes that stuttering and poor user experience.\n\n### Fine-Tuning Animation Triggers\n\nThe Intersection Observer is incredibly efficient right out of the box, but its default settings aren't always a one-size-fits-all solution. You can really dial in the timing of your animations by tweaking its configuration options.\n\n- **`threshold`**: This is your go-to for controlling _when_ the animation fires. It takes a number between 0 and 1. A value of **0.1** will kick things off when just **10%** of the element is visible. If you want to wait until it's fully in view, you’d use **1.0**. I find that playing with this value is where you find the magic timing for your design.\n\n- **`rootMargin`**: Think of this as an invisible buffer around your viewport. It uses a CSS-like string (e.g., `\"100px 0px -50px 0px\"`) to grow or shrink the area where intersections are detected. For example, a negative bottom margin can trigger an animation _just before_ an element actually scrolls into view, creating a really nice, proactive effect.\n\nAs you're building these experiences, remember that overall site performance is key. It's a huge factor for user experience and search rankings, so it's worth learning how to [improve website speed and boost SEO](https://www.webdesignatny.com/how-to-improve-website-speed/).\n\n### Balancing Aesthetics with User Experience\n\nIt’s tempting to animate everything that moves. I've been there. But over-animating a page often does more harm than good, creating \"animation clutter\" that just overwhelms people. It can also tank performance, especially on less powerful devices.\n\n> One of the most common mistakes I see is developers forgetting to unobserve elements after they've animated. If an element only needs to animate in once, keeping the observer attached is a needless drain on resources. Always build cleanup logic into your Intersection Observer to unobserve the target once its job is done.\n\nAccessibility is another huge piece of the puzzle. Some people have vestibular disorders or sensitivity to motion, making excessive animations disorienting or even nauseating. You should always respect the `prefers-reduced-motion` media query in your CSS to tone down or disable animations for those users.\n\nWhen you get this right, the payoff is huge. Industry data actually shows that well-implemented animations can cut bounce rates by up to **20%** by making complex information easier to digest and keeping users engaged. For a deeper dive into optimization, check out our guide on how to **[improve website performance](https://magicui.design/blog/how-to-improve-website-performance)**.\n\n## Answering Your CSS Animation on Scroll Questions\n\nEven when you have a solid guide, questions are bound to come up. Let's dive into some of the most common things people ask about creating scroll-triggered animations. I'll walk you through the practical answers to help clear up any confusion.\n\n### How Does Intersection Observer Actually Help Performance?\n\nYou might have heard of older methods that used JavaScript's `scroll` event listener. The problem with that approach is that it fires constantly while the user scrolls, triggering your animation logic over and over again. This can really clog up the browser's main thread and lead to that frustrating, choppy scrolling effect we all hate, often called \"jank.\"\n\nThink of it this way: the `scroll` event is like an alarm that blares non-stop, while the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) is a silent, motion-activated sensor. It's a built-in browser feature that only wakes up and runs your code at the exact moment an element enters or leaves the screen. This asynchronous approach means no more constant, expensive calculations, which keeps your site feeling smooth and responsive.\n\n### Are CSS Scroll Animations Bad For SEO?\n\nThis is a big one, and the short answer is no—as long as you do it right. In fact, they can actually _help_ by improving user engagement, which is a signal search engines pay attention to.\n\nThe golden rule here is to make sure all your content exists in the HTML from the very beginning. Even if an element is visually hidden with `opacity: 0` or moved off-screen with a `transform`, search engine crawlers can still read it because they primarily parse the Document Object Model (DOM), not what's visually rendered on the screen.\n\n> SEO issues only crop up when animations are poorly implemented. For example, if they significantly slow down your page load time (hurting Core Web Vitals like Largest Contentful Paint) or if you're loading important content with JavaScript _after_ the initial page render.\n\nStick to performant CSS properties and ensure your content is in the initial markup. You'll get the best of both worlds: a dynamic user experience and a website that search engines can easily understand.\n\n### Can I Use These Animation Techniques Without React?\n\nAbsolutely. The magic behind all of this is the Intersection Observer API, which is a native browser feature. That means it works flawlessly with vanilla JavaScript or any other framework you prefer, whether it's [Vue](https://vuejs.org/), [Svelte](https://svelte.dev/), or [Angular](https://angular.io/).\n\nThe core logic is the same no matter what tools you're using:\n\n- First, you **select the element** you want to animate.\n- Then, you **create an observer** to watch it.\n- Finally, you **write a callback function** that adds a CSS class when the element scrolls into view.\n\nThe custom React hook we built earlier is just a clean way to package this logic for reuse within the React ecosystem. You can easily adapt the same concept to manipulate the DOM directly or build it into the lifecycle hooks of another framework. The fundamental technique is universal.\n\n---\n\nReady to build stunning, high-performance web experiences without the hassle? **Magic UI** offers over **150** free and premium components to help you create beautiful landing pages in minutes. [Explore our components today](https://magicui.design) and see how easy it can be.\n"
  },
  {
    "path": "apps/www/content/blog/css-buttons-hover.mdx",
    "content": "---\ntitle: Mastering CSS Buttons Hover Effects\ndescription: >-\n  Learn to create stunning CSS buttons hover effects. A practical guide covering\n  transitions, transforms, and accessible design for modern web development.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/853e4e30-b4fa-4b03-bf9a-a6f23a4fd7ba/css-buttons-hover-ui-buttons.jpg\nauthor: Dillion Verma\ntags:\n  - css buttons hover\n  - css animation\n  - web design\n  - ui effects\n  - frontend development\npublishedOn: \"2025-12-04T08:44:04.448741+00:00\"\nfeatured: true\n---\n\nDon't mistake CSS button hover effects for simple decoration. They're a core piece of UI design, acting as a crucial signal of interactivity. When a user's cursor glides over an element and it responds, that immediate visual feedback confirms the button is alive and clickable.\n\n## Why Interactive Buttons Matter\n\nFirst impressions count, and in web design, your interactive buttons are the digital handshake. The subtle animations and style changes from **CSS button hover** effects are so much more than eye candy. They are the communication channel that turns a static page into a dynamic, interactive experience.\n\n![A white mouse cursor hovers over a clean, orange rectangular button with a soft glow.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/427adb11-c510-4fb0-be2d-ca84d35e844e/css-buttons-hover-button-hover.jpg)\n\nThese tiny interactions perform a few key jobs that directly shape how people see and use your website. At their heart, hover effects are all about giving clear, instant feedback.\n\n- **Signaling Interactivity:** A quick change in appearance tells the user, \"Hey, you can click this.\" This is vital, especially for custom-styled buttons that might not scream \"I'm a button!\" at first glance.\n- **Guiding User Flow:** By drawing the eye to key actions, hover effects can gently nudge a visitor along a path, encouraging them to hit that sign-up or purchase button you want them to.\n- **Improving User Confidence:** When a button reacts to a user's mouse, it builds trust and kills uncertainty. That tiny bit of confirmation makes the whole interface feel more responsive and dependable.\n\n### The Psychology Behind Hover States\n\nBeyond just feedback, a well-designed hover state taps into a bit of user psychology. The immediate response creates a satisfying micro-interaction that makes the entire experience feel more engaging. A thoughtful hover effect can turn a boring click into a surprisingly pleasant moment, subtly boosting a user's opinion of your brand.\n\n> This isn't just fluffy theory; it has a real, measurable impact on performance. A well-designed hover state can make a call-to-action (CTA) button far more compelling and encourage more clicks.\n\nThe data actually backs this up. Polished button hover animations can bump up click-through rates by around **10-30%**, depending on the specific design and context. These gains are most obvious on big CTA buttons, where something as simple as a smooth color fade over **200-300 milliseconds** can boost user engagement and, ultimately, conversions. You can dig into more insights on the connection between [button design and user experience on sliderrevolution.com](https://www.sliderrevolution.com/resources/css-button-hover-effects/). This link between technical CSS and tangible business results is exactly why mastering these effects is worth your time.\n\n## Creating Smooth Effects with CSS Transitions\n\nIf you want to create polished **CSS buttons hover** effects, the `transition` property is your best friend. Without it, property changes on hover are instant and jarring. With it, you can animate those changes over a specific time, giving your buttons a smooth, professional feel. It's the secret sauce that makes a button feel responsive and alive, not clunky.\n\n![Stylish flat buttons demonstrating UI states: red 'BEFORE', orange 'HAVER', and teal 'AFTER'.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5fd73d23-66c1-4ebd-8d6a-aff2893936e4/css-buttons-hover-button-states.jpg)\n\nThink of the `transition` property as the bridge between a button's default style and its `:hover` state. It gives you precise control over the user experience, turning abrupt shifts into graceful fades, slick movements, and satisfying reveals.\n\n### Mastering the Core Transition Properties\n\nThe `transition` property is really just shorthand for four individual properties that work in tandem. Getting a handle on each one gives you much more granular control over your animations.\n\n- **`transition-property`**: This specifies _which_ CSS property (or properties) you want to animate. You can target just `background-color`, or you can list multiple like `transform, color`. While you _can_ use `all`, it’s better for performance to be explicit about what you're animating.\n- **`transition-duration`**: This sets how long the animation takes. From my experience, a duration somewhere between **0.2s** and **0.4s** (that's 200 to 400 milliseconds) feels the most natural and responsive to the user.\n- **`transition-timing-function`**: This controls the speed curve of the animation. Instead of a boring `linear` speed, options like `ease-in` (starts slow), `ease-out` (ends slow), or `ease-in-out` (starts and ends slow) create much more realistic and organic motion.\n- **`transition-delay`**: This one’s pretty straightforward—it adds a waiting period before the animation kicks off. It's less common for a simple hover, but it’s incredibly useful when you want to create more complex, sequenced animations.\n\n> Here’s a pro tip: always apply the `transition` property to the base selector of your element (e.g., `.btn`), not the `:hover` pseudo-class. This is a common mistake, but doing it right ensures the animation is smooth both when the user hovers _on_ and when they hover _off_ the button.\n\n### Common CSS Transition Properties for Hover Effects\n\nWhen you're building out these effects, you'll find yourself returning to a handful of animatable properties. Here’s a quick rundown of the most useful ones for button hovers.\n\n| Property           | Effect Description                                   | Common Use Case                                        |\n| ------------------ | ---------------------------------------------------- | ------------------------------------------------------ |\n| `background-color` | Changes the button's background color.               | A simple, classic fade from one color to another.      |\n| `color`            | Changes the color of the text inside the button.     | Often paired with `background-color` for contrast.     |\n| `transform`        | Scales, rotates, or moves the button.                | Growing the button slightly or lifting it up on hover. |\n| `box-shadow`       | Animates the shadow around the button.               | Creating a \"glow\" effect or giving the button depth.   |\n| `opacity`          | Fades an element in or out.                          | Revealing an icon or text that's hidden by default.    |\n| `border-color`     | Changes the color of the button's border.            | Swapping border colors for a subtle, clean effect.     |\n| `letter-spacing`   | Increases or decreases the space between characters. | Adding a stylistic touch by expanding text on hover.   |\n\nThese properties are the foundational building blocks for the vast majority of hover animations you'll see on the web.\n\n### Practical Examples of CSS Transitions\n\nLet's put this all together with a classic color fade effect. We'll make the button's background and text color change smoothly when the user hovers over it. This kind of simple, elegant effect is a workhorse in modern UI design for a reason.\n\n<button\n  className=\"btn-fade\"\n  style={{\n    backgroundColor: \"#3498db\",\n    color: \"white\",\n    padding: \"10px 20px\",\n    border: \"none\",\n    borderRadius: \"5px\",\n    cursor: \"pointer\",\n    transition: \"background-color 0.3s ease, color 0.3s ease\",\n  }}\n>\n  Hover Me\n</button>\n\n<style>\n  {`\n    .btn-fade:hover {\n      background-color: #2980b9;\n      color: #ecf0f1;\n    }\n  `}\n</style>\n\nIn this code, we're telling the browser to animate both the `background-color` and `color` properties over **0.3 seconds** using an `ease` timing function. It's clean, simple, and effective.\n\nFor more advanced interactions, you don't always have to build from scratch. Pre-built solutions like Magic UI’s [interactive hover button](https://magicui.design/docs/components/interactive-hover-button) are a great starting point for integrating sophisticated animations into your projects without the headache. Mastering these foundational CSS techniques is the first step to creating truly dynamic and memorable user interactions.\n\n## Building Dynamic Animations with Transforms\n\nWhile smooth transitions are the bedrock of any good UI, the `transform` property is where you can really start having fun and injecting personality into your **CSS buttons hover** effects.\n\nThis is the property that lets you scale, rotate, skew, and move elements around. Think of it as opening up a whole new dimension of interactivity that goes way beyond simple color fades. It's how you make buttons feel physically responsive, almost like they're reacting directly to the user's cursor.\n\n![A white pill with a plus sign transforms into a glowing, energized purple pill with radiating light, against a dark background.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/88366c1e-5261-489c-88fc-8e142c87ac22/css-buttons-hover-pill-transformation.jpg)\n\nWhen you combine `transform` with `transition`, you get animations that are both dynamic and fluid. A button that slightly grows or \"lifts\" on hover, for instance, provides a really satisfying, tactile feedback loop. It's a subtle touch, but it’s a powerful way to make your interface feel more engaging and intuitive.\n\n### Leveraging Pseudo-Elements for Creative Effects\n\nTo take your animations to the next level, you have to get comfortable with pseudo-elements like `::before` and `::after`. These are essentially \"ghost\" elements you can style and animate completely independently of the button itself, all without cluttering your HTML. They are the secret weapon behind many of the most impressive hover effects you see out there.\n\nWith pseudo-elements, you can build all sorts of cool stuff:\n\n- A colorful background that wipes across the button when you hover.\n- An animated border that looks like it's drawing itself around the button.\n- An icon or shape that fades in or slides into view.\n\nBecause `::before` and `::after` are treated like children of the button element, you can position them absolutely inside it and then trigger changes to their properties based on the parent's hover state.\n\n### Creating a Swipe Effect with ::before\n\nLet's walk through a classic: the swipe effect. The idea is to have a new background color slide in from the left on hover. It's a fantastic way to add a splash of color and motion to your CTAs. We’ll use the `::before` pseudo-element as our colored layer and reveal it using `transform: scaleX()`.\n\n<button\n  className=\"btn-swipe\"\n  style={{\n    position: \"relative\",\n    backgroundColor: \"#f1f1f1\",\n    color: \"#333\",\n    padding: \"15px 25px\",\n    border: \"2px solid #333\",\n    borderRadius: \"5px\",\n    cursor: \"pointer\",\n    overflow: \"hidden\",\n    transition: \"color 0.4s ease-in-out\",\n    zIndex: 1,\n  }}\n>\n  <span style={{ position: \"relative\", zIndex: 2 }}>Swipe Me</span>\n</button>\n\n<style>\n  {`\n    .btn-swipe::before {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background-color: #333;\n      transform: scaleX(0);\n      transform-origin: left;\n      transition: transform 0.4s ease-in-out;\n      z-index: 1;\n    }\n    .btn-swipe:hover {\n      color: white;\n    }\n    .btn-swipe:hover::before {\n      transform: scaleX(1);\n    }\n  `}\n</style>\n\nSo what's happening here? The `::before` element starts with `transform: scaleX(0)`, which basically squashes it down to zero width, making it invisible. On hover, we scale it back up to `scaleX(1)`. The key is `transform-origin: left`, which tells the browser to start the scaling animation from the left edge, creating that smooth swipe from left to right.\n\nIt’s a simple, elegant animation that adds a premium feel. For more complex interactions like animated ripples, you might want to check out pre-built solutions like the [Magic UI Ripple Button component](https://magicui.design/docs/components/ripple-button) to save some time.\n\n> The variety of CSS button hover effects has exploded recently. The 'Transform Button Size' effect, which just subtly enlarges a button on hover, is a super popular pattern because it mimics a physical, real-world response. In fact, some industry data suggests that using engaging hover effects like these can reduce bounce rates by up to **15%** on landing pages.\n\n## Using Hover Effects in Modern Frameworks\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/vnZdBCIxyZ0\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTranslating raw CSS into a real-world project usually means working within a modern JavaScript framework. If you’re building with React or Next.js, implementing **css buttons hover** effects is a daily task, but the approach is a little different than with a static HTML file. The core principles are identical, but the syntax and structure adapt to fit the component-based world we live in.\n\nThis shift is actually a huge win. When you encapsulate styles within components, you create UI elements that are self-contained, reusable, and far easier to manage as an application grows. Whether you're a fan of traditional CSS Modules, inline style objects, or a utility-first library like [Tailwind CSS](https://tailwindcss.com/), the end goal is always predictable and maintainable styles.\n\n### Implementing Hover Effects in React\n\nLet's walk through a classic transform effect—making a button grow slightly on hover—and see how to build it in React. You generally have two paths: using a dedicated stylesheet with `className`, or going directly with inline style objects.\n\nThe `className` approach is often preferred because it keeps a clean separation between your styling and your component logic. It feels familiar and organized.\n\n```javascript\n// MyButton.js\nimport React from \"react\"\n\nimport \"./MyButton.css\"\n\nconst MyButton = ({ children }) => {\n  return <button className=\"btn-grow\">{children}</button>\n}\n\nexport default MyButton\n```\n\nAnd here's the corresponding CSS that brings it to life.\n\n```css\n/* MyButton.css */\n.btn-grow {\n  background-color: #5e35b1;\n  color: white;\n  padding: 12px 24px;\n  border: none;\n  border-radius: 8px;\n  cursor: pointer;\n  transition: transform 0.2s ease-out;\n}\n\n.btn-grow:hover {\n  transform: scale(1.05);\n}\n```\n\nThis method is straightforward. The React component is minimal, and all the styling—including the hover state—lives in its own CSS file.\n\n### Refactoring with Tailwind CSS\n\nNow, let's get the exact same result using Tailwind CSS. This utility-first workflow lets you build completely custom designs right inside your JSX, often without writing a single line of your own CSS. It's incredibly fast for prototyping and maintaining a consistent UI.\n\nHere’s how that same button looks with Tailwind's utility classes.\n\n```jsx\nimport React from \"react\"\n\nconst MyButtonTailwind = ({ children }) => {\n  return (\n    <button className=\"cursor-pointer rounded-lg bg-purple-700 px-6 py-3 text-white transition-transform duration-200 ease-out hover:scale-105\">\n      {children}\n    </button>\n  )\n}\n\nexport default MyButtonTailwind\n```\n\nSee that `hover:scale-105` class? That’s the magic of Tailwind. Its state variants, like `hover:`, make it trivial to apply styles for different interactions directly in your markup. This approach co-locates everything related to the button into a single file, which many developers find incredibly efficient.\n\nAs you think about applying these effects in a larger application, it can be helpful to see how they fit into the bigger picture. Reading a guide on [Next.js development services](https://kdpisda.in/your-guide-to-next-js-development-services-for-real-business-growth/) can offer that broader context.\n\n> A major advantage of using frameworks is the ability to adapt these patterns into component libraries. For example, you can use these exact techniques to customize open-source components, like those from Magic UI, to fit your project's unique brand and interactive feel.\n\nIn the end, choosing between CSS Modules and Tailwind often comes down to your team's workflow and the project's needs. Both are fantastic, powerful ways to create dynamic **css buttons hover** effects in any modern web app.\n\n## Designing for Accessibility and Performance\n\nA slick button animation is useless if it tanks the user experience. This is where we need to step back from the cool visuals of **css buttons hover** effects and consider what's happening under the hood. An effect isn't really great unless it's accessible to everyone and runs smoothly on every device.\n\n![Two icons: a red button or sensor and a colorful performance gauge with a checkmark.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cd33dd3f-6e81-4fa8-9469-267f14961f54/css-buttons-hover-ui-elements.jpg)\n\nThis means your interactions can't leave people out. Color contrast, for example, is huge. If your button text fades into a background color that’s too similar, users with visual impairments simply won't be able to read it. Always run your hover state colors through a contrast checker to make sure they meet accessibility guidelines.\n\nAlso, remember not everyone uses a mouse. Keyboard navigation is a must, which means your hover effects should also kick in on focus. It's a surprisingly simple fix: just chain the `:focus` pseudo-class right alongside `:hover`.\n\n```css\n.btn:hover,\n.btn:focus {\n  /* Your hover and focus styles go here */\n  transform: translateY(-2px);\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n```\n\nThat one tiny addition makes your interactive elements work for a much bigger audience.\n\n### Keeping Animations Fast and Smooth\n\nPerformance is the other side of the coin. A choppy, lagging animation can make an otherwise polished site feel cheap and broken. The secret to buttery-smooth effects is knowing which CSS properties the browser can animate without breaking a sweat.\n\nYou should always prioritize animating two properties above all others: **`transform`** and **`opacity`**. Why? Because they can be handed off directly to the GPU in a process called hardware acceleration. This lets them skip the browser’s expensive layout and repaint calculations, which are the main culprits behind janky animations.\n\n> I see this all the time: developers animating properties like `width`, `height`, `margin`, or `top`. This is a classic performance trap. Changing these forces the browser to reflow the entire page, which can cause significant lag, especially on complex pages or less powerful devices. For any movement or scaling, stick to `transform`.\n\nThe arrival of CSS3 back around 2011 was a game-changer for web interactivity, giving us native browser support for these high-performance animations. In fact, some analytics show that websites using modern CSS hover effects saw an average session duration increase of **12.8%** and about **40 seconds** more interaction time per user.\n\nIf you want to be sure your effects are fast, pop open your browser's developer tools and audit the rendering performance. This will help you spot any costly animations and confirm that your **css buttons hover** effects are as performant as they are beautiful. For a much deeper dive into optimization, check out our guide on [how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance).\n\n## Common Questions About CSS Hover Effects\n\nWhen you're deep in the weeds creating **css buttons hover** effects, the same questions and headaches tend to pop up again and again. Nailing the answers to these common issues is the key to taking your animations from just okay to truly polished and professional.\n\nLet's walk through some of the most frequent challenges I see developers run into.\n\n### How Do I Make My Hover Effect Work on Mobile Devices?\n\nThis is a classic \"gotcha\" that trips up a lot of people. The short answer? You don't. The `:hover` pseudo-class is tied directly to a mouse cursor, which simply doesn't exist on touch devices like phones and tablets. Forcing a hover effect on mobile usually just creates a weird, sticky state that feels broken to the user.\n\nA much better approach is to use the `:active` pseudo-class for mobile. This state fires the moment a user taps down on an element. By making your `:active` styles match your `:hover` styles, you create a consistent experience across all devices. Think of hover as a nice little bonus for desktop users, not a core interaction for everyone.\n\n### Why Is My Hover Animation Laggy or Choppy?\n\nNine times out of ten, a choppy animation comes down to a performance issue. If your button hover feels jerky, you're probably animating CSS properties that force the browser to do a ton of heavy lifting—recalculating layouts (reflow) and redrawing the screen (repaint). The usual suspects are properties like `width`, `height`, `margin`, `padding`, `top`, or `left`.\n\nWant to guarantee a silky-smooth **60fps** animation? Stick to animating just two properties: `transform` and `opacity`. These are special because the browser can hand them off to the GPU for hardware acceleration. This simple trick bypasses the main browser thread, resulting in buttery-smooth animations that never slow your page down.\n\n### Can I Trigger an Effect on One Element by Hovering Another?\n\nAbsolutely, but there's a catch: the elements need to have a direct relationship in your HTML. CSS gives us a few selectors to work with here.\n\n- **Adjacent Sibling (`+`):** Use `.trigger:hover + .target` to style an element that comes _immediately after_ the trigger.\n- **General Sibling (`~`):** Use `.trigger:hover ~ .target` to style _any_ sibling element that comes after the trigger.\n- **Child (` `):** Use `.parent:hover .child` to style a child element when its parent is hovered. This is probably the most common one you'll use.\n\nIf the two elements are completely unrelated in the DOM—say, in different sections of your page—then CSS can't connect them. In that case, you'll need to reach for a little bit of JavaScript to add and remove a class on the target element.\n\n> For most standard button hover effects, `transition` is the simpler and more appropriate choice. It's designed for straightforward state changes. Use `animation` with `@keyframes` only when you need complex, multi-step sequences like pulsing or shaking.\n\n### What Is the Difference Between Transition and Animation?\n\nThis is a great question. While both `transition` and `animation` create movement over time, they're built for different jobs.\n\nThe `transition` property is your go-to for simple state changes. It’s perfect for defining that smooth shift from a button's default style to its `:hover` style and then back again. It's clean, efficient, and does exactly what you need for most UI interactions.\n\nOn the other hand, the `animation` property (used with `@keyframes`) is a much more powerful tool. It's designed for creating complex, multi-step sequences. You'd pull this out if you wanted a button to pulse repeatedly, shake on hover, or follow some other intricate sequence. For the vast majority of **css buttons hover** effects, `transition` is the right tool for the job.\n\n---\n\nReady to stop building from scratch and start creating stunning UIs faster? **Magic UI** offers a massive library of over **150** free, open-source animated components and premium templates built with React, Typescript, and Tailwind CSS. Explore our components and build beautiful landing pages in minutes at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/css-loader-animation.mdx",
    "content": "---\ntitle: Crafting the Perfect CSS Loader Animation\ndescription: >-\n  A practical guide to creating beautiful and performant CSS loader animation.\n  Learn to build spinners, skeleton loaders, and more with real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/82857d2f-01b9-4b1f-933c-f28bc2f56242/css-loader-animation-web-development.jpg\nauthor: Dillion Verma\ntags:\n  - css loader animation\n  - css animation\n  - react loaders\n  - web performance\n  - frontend development\npublishedOn: \"2025-11-25T08:51:45.833138+00:00\"\nfeatured: true\n---\n\nA well-designed **CSS loader animation** is much more than a simple visual placeholder. Think of it as a critical tool for managing a user's perception of time and keeping them engaged. By giving people immediate visual feedback, these animations make those unavoidable wait times feel shorter and reassure them that your application is, in fact, working hard in the background.\n\n## Why Better Loaders Mean a Better User Experience\n\n![Two silhouettes presenting oversized smartphones with minimalist interface designs on beige background](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5caaaff5-dd17-4895-a6ff-b005b7e312b5/css-loader-animation-mobile-presentation.jpg)\n\nWhen someone clicks a button or tries to load a new page, a blank white screen is a recipe for uncertainty. That momentary gap can easily lead to frustration, causing them to click again (and again) or just leave your site entirely. A simple, smooth loader elegantly bridges this gap, turning what could have been a negative moment into a seamless one.\n\nThe psychology at play here is pretty straightforward: occupied time feels shorter than unoccupied time. A CSS loader animation gives the user's brain something to focus on, which makes the wait feel less passive. This small detail can have a surprisingly big impact on your business by slashing bounce rates and keeping people on your site longer.\n\n### The True Cost of Slow Load Times\n\nIn a world of instant gratification and high-speed internet, user patience is thinner than ever. The data doesn't lie: a staggering **53% of mobile visitors will abandon a page** if it takes longer than three seconds to load. This stat alone shows why a CSS loader animation isn't just a \"nice-to-have\" anymore—it's an essential piece of your UI.\n\nSlow performance is a direct threat to user retention and can send potential customers running to your competitors. Improving the user journey with thoughtfully crafted loaders is a key part of building a user-friendly site. You can see how these same principles apply in [effective WordPress and Shopify website design](https://alphaomegadigital.com.au/blog/wordpress-website-design-melbourne), where every second counts.\n\n> By managing user expectations during data fetching or page transitions, you maintain a professional and trustworthy impression. It shows you've considered every part of their journey, even the moments in between actions.\n\nThere's a technical advantage, too. Sticking with pure CSS for these animations offers a real performance boost. Unlike JavaScript-heavy solutions, CSS animations can be hardware-accelerated, which means they run on the GPU instead of the main thread. The result is smoother, more fluid motion that doesn't bog down the browser, ensuring your loader actually _helps_—rather than hurts—your site's performance.\n\nAlright, let's ditch the theory and get our hands dirty building a few essential loader animations from scratch. We can create some surprisingly slick and performant loaders using just HTML and CSS, no heavy libraries needed.\n\nFirst up, the most iconic loading animation of them all: the simple spinner.\n\nThis classic is the perfect starting point for anyone new to CSS animations. It’s a fantastic example of how a few fundamental properties can work together to create something elegant. You only need a single HTML element and a handful of CSS rules to bring it to life, which is why it's such a lightweight and powerful solution for any project.\n\n### The Classic Spinner Animation\n\nSo, how does it work? The secret is to create a circle with a transparent background but give it a colored border. Then, you just hide parts of that border to create the illusion of a spinning arc. We'll use `border-radius: 50%` on a `div` to shape it into a perfect circle, then set one of its borders to a transparent color to create the \"gap.\"\n\nThe real magic, though, is in the `@keyframes`. We define an animation that rotates the element a full **360 degrees**. By setting the animation to loop `infinite`-ly, the element spins forever, giving us that classic loader effect.\n\nHere’s what that looks like in a CodePen.\n\nThis shows just how much you can do with a simple HTML `div`. Some targeted CSS for the `border` and `animation` properties is all it takes to produce a clean, effective spinner. The key is keeping the effect isolated to a single, lightweight element.\n\nLet's break down the code. It’s surprisingly simple.\n\n```jsx\n<div className=\"spinner\"></div>\n```\n\n```css\n.spinner {\n  width: 48px;\n  height: 48px;\n  border: 5px solid #fff;\n  border-bottom-color: #ff3d00;\n  border-radius: 50%;\n  display: inline-block;\n  box-sizing: border-box;\n  animation: rotation 1s linear infinite;\n}\n\n@keyframes rotation {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n```\n\n### Creating Pulsating Dots\n\nNext, let’s build a pulsating dot loader. This one feels a bit more active and is perfect for signaling that a process is chugging away in the background. The core technique here is using `animation-delay` to offset the animation for each dot, which creates a slick, wave-like effect.\n\nWe’ll start with three simple `div` elements for our dots. The animation itself will just scale each dot up and down using `transform: scale()`. The trick is applying a slightly different `animation-delay` to the second and third dots. This creates a staggered, pulsating rhythm that’s way more engaging than a single, repetitive animation.\n\n> This staggered timing is such a simple but powerful technique. It turns a basic animation into a more complex and visually interesting sequence without adding any real performance overhead.\n\n### Simulating Progress with a Linear Bar\n\nA linear progress bar is another foundational loader. You'll often see these for tasks that have a more predictable duration, like file uploads. While a _real_ progress bar needs JavaScript to track actual progress, we can create a very convincing \"indeterminate\" version with pure CSS that smoothly fills from left to right.\n\nTo pull this off, we'll use a container `div` with a child `div` inside it that acts as the \"fill.\" The animation will use `transform: scaleX()` to expand the fill element horizontally from **0% to 100%** of the container's width. This creates a clean, modern loading effect that clearly communicates forward momentum. When you start combining this with other effects, you can create some truly [cool CSS animations](https://magicui.design/blog/cool-css-animations) that will seriously elevate your UI.\n\nThese three examples—the spinner, pulsating dots, and progress bar—are the building blocks for just about any `css loader animation` you'll ever need. Once you get a good handle on how `@keyframes`, `transform`, and `animation-delay` work together, you'll be ready to start customizing these patterns or even cooking up your own unique loaders.\n\n## Making Your Loaders Dynamic and Reusable\n\nA static loader gets the job done, but modern development demands components that are flexible and reusable. If you hardcode values like colors and sizes directly in your CSS, you're setting yourself up for a maintenance headache. The moment a designer asks for a theme change, you'll be stuck hunting down hex codes across a dozen files.\n\nA much smarter approach is to build your **CSS loader animation** to be dynamic from the very beginning. This doesn't just simplify future updates; it lets you adapt a single loader for different contexts—a tiny one for a button, a larger one for a full-page overlay—all without writing redundant code.\n\nThe types of loaders we've been building each serve a different perceptual purpose, from simple spinners to more deterministic progress bars.\n\n![Three types of CSS loading animations: spinner, pulsing dot, and progress bar indicators](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/166fe09d-dc3a-443e-88bb-13f432b1fc39/css-loader-animation-types.jpg)\n\nUltimately, whether it's a rotational spinner or a linear bar, the goal is always the same: manage the user's perception of waiting and keep them engaged.\n\n### Powering Loaders With CSS Custom Properties\n\nCSS Custom Properties (you probably know them as CSS variables) are the key to unlocking this kind of flexibility. They let you define a value once and reuse it all over your stylesheet. Let's refactor our earlier examples to use variables for things like color, size, and animation speed. This will make them instantly configurable.\n\nThink about our spinner. Instead of hardcoding `width: 48px`, we can define a variable like `--loader-size: 48px` and then use `var(--loader-size)` in our CSS rule. It's a small change, but it means you can now override that size directly from a parent element or even with inline styles, making the component far more modular.\n\nHere are a few properties you should definitely turn into variables:\n\n- **`--loader-color-primary`**: This will control the main, active color of the loader.\n- **`--loader-color-secondary`**: Perfect for background or track colors, like in a progress bar.\n- **`--loader-size`**: Sets the overall width and height of the component.\n- **`--loader-speed`**: Adjusts the `animation-duration` to create faster or slower effects.\n\n> By abstracting these core properties, you create a robust and themeable component. A single loader can now easily adapt to light mode, dark mode, or different brand palettes with just a few variable overrides.\n\nTo give you a clearer picture, here’s a quick breakdown of the core CSS animation properties we've been using to bring these loaders to life.\n\n### CSS Animation Property Comparison\n\nThis table is a handy reference for the CSS properties that are the backbone of any loader animation.\n\n| Property                        | Purpose                                                                                                   | Example Usage                                                                             |\n| :------------------------------ | :-------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |\n| **`@keyframes`**                | Defines the animation's sequence, specifying styles at various points (e.g., `from`/`to` or `0%`/`100%`). | `@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }` |\n| **`animation-name`**            | Binds the `@keyframes` rule to the element you want to animate.                                           | `animation-name: spin;`                                                                   |\n| **`animation-duration`**        | Sets the total time it takes for one animation cycle to complete.                                         | `animation-duration: 1s;`                                                                 |\n| **`animation-iteration-count`** | Specifies how many times the animation should repeat. `infinite` is common for loaders.                   | `animation-iteration-count: infinite;`                                                    |\n| **`animation-timing-function`** | Controls the speed curve of the animation, like `linear`, `ease-in`, or `ease-out`.                       | `animation-timing-function: linear;`                                                      |\n| **`animation`**                 | A shorthand property to combine all the animation properties into a single declaration.                   | `animation: spin 1s linear infinite;`                                                     |\n\nUnderstanding these properties is crucial for both creating animations from scratch and for customizing existing ones effectively.\n\n### Integrating With Tailwind CSS\n\nIf you're working in a project that uses Tailwind CSS, this variable-driven approach fits in perfectly. You can use Tailwind's utility classes to set the CSS variables on your loader's container, which means you can style the component without writing a single line of custom CSS.\n\nImagine you have a loader component. You could modify its color and size on the fly with simple utility classes like `text-blue-500` (if you map your variables to `currentColor`) or by setting the variables directly.\n\nFor more complex or illustrative animations, you might want to look beyond pure CSS. Libraries offering [Lottie animations for dynamic loaders](https://www.derrick.dk/webflow-integration/lottiefiles) can provide incredibly rich, JSON-based animations that integrate smoothly into modern frameworks.\n\n### Creating a Reusable React Component\n\nTaking this a step further, we can wrap our loader in a reusable React component. This component can accept props like `color`, `size`, and `speed`, and then use those props to set our CSS variables via inline styles. This pattern gives you a clean, predictable, and even type-safe API for using loaders anywhere in your React application.\n\nThis approach truly gives you the best of both worlds: the raw performance of pure CSS animations combined with the dynamic, prop-driven nature of React components. Your loaders become true \"plug-and-play\" elements in your design system, completely decoupled from the specific context they're used in. That kind of modularity is a cornerstone of building efficient and scalable front-end applications.\n\n## Implementing Modern Skeleton Screens\n\n![Light gray gradient background with subtle texture, minimalist design for web content](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/94e90682-a33e-47a6-82d8-52f4050efbaf/css-loader-animation-gray-background.jpg)\n\nWhile spinners and bars are classic choices for showing background activity, they don't really tell the user what's coming next. This is where skeleton screens completely change the game. Instead of an abstract animation, you present a low-fidelity placeholder of the UI, which massively improves the _perceived_ load time. The experience feels more progressive and less jarring.\n\nA good skeleton screen essentially mimics the final layout using simple, grayed-out shapes. Imagine a user profile card: you might show a gray circle for the avatar, a couple of gray rectangles for the name and bio, and another for a button. This approach just _feels_ faster because it eases the user into the interface, rather than making them stare at a spinner before the content suddenly pops into existence.\n\nIt’s a powerful technique for managing user expectations and providing a clear visual outline of the page long before the actual content has rendered.\n\n### Crafting the Shimmering Effect\n\nThe signature detail of any modern skeleton screen is that subtle, shimmering animation that sweeps across the placeholders. It’s a small touch, but it’s crucial—it visually confirms that the application is actively loading data in the background.\n\nBelieve it or not, creating this effect is surprisingly simple using a CSS `linear-gradient` paired with a `@keyframes` animation.\n\nThe core idea is to create a wide gradient on a pseudo-element (like `::before`) that sits on top of your skeleton layout. This gradient usually goes from a transparent color, to a slightly lighter \"shimmer\" color, and back to transparent. We then just animate its position, sliding it from left to right across the element.\n\nTo get this working, you'll need a few key pieces:\n\n- A container with `position: relative` and `overflow: hidden`.\n- A `::before` pseudo-element set to `position: absolute` that covers the entire container.\n- A `linear-gradient` defined with your shimmering color stop.\n- A `@keyframes` rule that animates the `transform: translateX()` property of the pseudo-element.\n\n> By sticking to the `transform` property for animation, you're tapping into hardware acceleration. This guarantees a buttery-smooth effect that won't cause jank or bog down the browser's main thread—a performance-first approach that's essential for any great CSS loader.\n\n### Building a Skeleton Card Layout\n\nLet's put this into practice with a real-world example: a user profile card. We’ll start with some basic HTML that maps out the shapes of our final UI. Each element gets a base background color to serve as the placeholder content.\n\n```jsx\n<div className=\"card\">\n  <div className=\"skeleton-avatar\"></div>\n  <div className=\"skeleton-text-container\">\n    <div className=\"skeleton-text\"></div>\n    <div className=\"skeleton-text short\"></div>\n  </div>\n</div>\n```\n\nNext, the CSS will define the shapes and, most importantly, apply the shimmering animation to the parent `.card` element. The animation will then gracefully sweep across all the child placeholder elements nested inside. You can see a similar effect in our guide on creating a [shimmer button component](https://magicui.design/docs/components/shimmer-button), which can be adapted for all sorts of UI elements.\n\nThis pattern is incredibly flexible. You can apply it to just about any component in your app, from simple cards to complex dashboards, delivering a loading experience that feels far more sophisticated and user-friendly than a traditional spinner ever could.\n\n## Fine-Tuning for Performance and Accessibility\n\n![Laptop screen displaying accessibility settings with sliders for GPU transfer and reduce motion options](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/015efed6-ab83-45bd-9531-09342ed12c13/css-loader-animation-accessibility-settings.jpg)\n\nCreating a slick **CSS loader animation** is only half the job. A truly professional loader has to be fast, fluid, and work for everyone—including people who use assistive technologies. If you ignore performance and accessibility, even the most beautiful animation can end up degrading the very user experience it was meant to improve.\n\nThe secret to a smooth, jank-free animation lies in understanding how browsers render changes on the screen. Some CSS properties are just \"cheaper\" for a browser to animate than others. When you animate properties like `width`, `height`, or `margin`, you force the browser to recalculate the layout of the page, a process called reflow. This can be incredibly slow and resource-intensive, often leading to choppy, stuttering animations, especially on less powerful devices.\n\n### Keeping Animations on the GPU\n\nFor silky-smooth performance, you should almost exclusively stick to animating two properties: `transform` and `opacity`. The browser can hand these off directly to the computer's Graphics Processing Unit (GPU), a technique called hardware acceleration. This simple move offloads the heavy lifting from the browser's main thread, which is already busy handling things like JavaScript and user input.\n\nAnimating on the GPU stops your loader from fighting for resources, giving you consistently fluid motion that won’t bog down the rest of your app. It’s a simple trick, but it's absolutely critical for building high-performance animations.\n\n### Making Loaders Work for Everyone\n\nAn animation visually tells a user that something is loading. But what about users who can't see it? That same state needs to be communicated audibly for screen reader users. Without the right accessibility attributes, a person using a screen reader might have no idea that content is being fetched, leaving them confused and frustrated.\n\nTo fix this, we can use a couple of specific ARIA (Accessible Rich Internet Applications) attributes:\n\n- **`role=\"status\"`**: This tells assistive tech that the element contains status information that’s important, but not urgent enough to interrupt the user.\n- **`aria-live=\"polite\"`**: This attribute instructs a screen reader to announce changes to the element's content when the user is idle, so it doesn't break their focus.\n\nJust by adding these two attributes to your loader's container, you ensure that screen readers will announce that content is loading, providing that crucial piece of context.\n\n> A truly inclusive design considers all users from the very beginning. Implementing ARIA roles isn't just a box to check at the end; it's a fundamental part of building a user-friendly interface that works for everyone.\n\nFinally, we need to respect our users' motion preferences. Many people enable a \"reduce motion\" setting in their operating system to avoid dizziness or distractions caused by animations. The `prefers-reduced-motion` media query lets us detect this setting and adjust our loaders. For these users, a simple, subtle fade is almost always a better choice than a fast-spinning or pulsating animation.\n\n## Using Loader Libraries in a React Project\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/aCbQUa7AmII\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nBuilding your own CSS loader from scratch offers total creative freedom, but let's be honest—it’s not always the most practical route. When you're deep in a fast-moving project, leaning on a dedicated library can be a massive time-saver. You get instant access to dozens of battle-tested animations right out of the box.\n\nKnowing when to build and when to borrow is a key skill for any developer. If your project demands a highly specific or brand-aligned animation, rolling your own is the way to go. But for most standard use cases? A library is usually the smarter, more efficient path. These packages offer a huge variety of loaders that are already optimized for performance and accessibility, letting you drop in a solution and get back to the bigger picture.\n\n### Picking Your Way Through the Loader Ecosystem\n\nThe world of CSS loader libraries has absolutely exploded. We've seen collections grow to offer hundreds of options, with some creators building around **580 different loaders** using just a single HTML element.\n\nThis boom led to specialized libraries for every need, from [Animista](https://animista.net/) for quick prototyping to LDRS for data-heavy React apps. For a deeper look at the options out there, you can check out some of the best [React animation libraries](https://magicui.design/blog/react-animation-libraries) available today.\n\nWith a massive selection of over **600 unique designs** available, it's clear the CSS loader has evolved from a minor detail into a core part of professional web development. If you're curious, you can learn more about [this vast collection of loading animations on dev.to](https://dev.to/afif/css-loaderscom-the-biggest-collection-of-loading-animations-more-than-500--23jg).\n\n### How to Use a Library in a React and TypeScript Project\n\nLet's walk through a real-world scenario. Say you've picked a library like `react-spinners` for its simplicity and variety. The first thing you'll do is add it to your project.\n\n```bash\nnpm install react-spinners\n```\n\nWith that installed, you can import the specific loader component you want to use. For this example, we’ll grab the `ClipLoader`.\n\n```jsx\nimport { ClipLoader } from \"react-spinners\"\n```\n\nThe most common way to use this is to show the loader conditionally based on your application's state. You’ll typically have a boolean state variable, maybe called `isLoading`, that tracks whether you're fetching data. When `isLoading` is true, you render the loader. When it's false, you show your content.\n\nHere’s what a basic implementation looks like inside a React component:\n\n```jsx\nimport React, { useEffect, useState } from \"react\"\nimport { ClipLoader } from \"react-spinners\"\n\nconst DataComponent = () => {\n  const [loading, setLoading] = useState(true)\n  const [data, setData] = useState(null)\n\n  useEffect(() => {\n    // Simulating a network request to fetch data\n    setTimeout(() => {\n      setData(\"Your fetched data is here!\")\n      setLoading(false)\n    }, 2000)\n  }, [])\n\n  if (loading) {\n    return <ClipLoader color={\"#36D7B7\"} loading={loading} size={50} />\n  }\n\n  return <div>{data}</div>\n}\n```\n\n> This pattern—conditionally rendering based on a loading state—is a fundamental practice in modern React development. It keeps your logic clean and gives users a clear, predictable experience during any asynchronous operation.\n\nThis simple approach gives you a production-ready blueprint for integrating just about any third-party loader library into your projects quickly and efficiently.\n\n---\n\nReady to build stunning, animated user interfaces with minimal effort? **Magic UI** offers a massive collection of 150+ free, open-source animated components built with React, TypeScript, and Tailwind CSS. [Browse components and start building today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/css-loading-animation.mdx",
    "content": "---\ntitle: \"css loading animation: Master Smooth CSS Spinners in Minutes\"\ndescription: >-\n  Learn to craft a captivating css loading animation from scratch, from simple\n  spinners to performance tips that boost user experience.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-819d9094-63bd-4de3-98ad-c5a6b3299598.jpg\nauthor: Dillion Verma\ntags:\n  - css loading animation\n  - css spinner\n  - web performance\n  - front end dev\n  - user experience\npublishedOn: \"2025-11-05T09:29:26.522329+00:00\"\nfeatured: true\n---\n\nA **CSS loading animation** is a simple visual cue that lets your users know that content is on its way. It stops them from thinking the page is broken or frozen, turning a potential moment of frustration into a smooth part of the user experience. Best of all, they're built with pure CSS, which means they are incredibly lightweight and fast.\n\n## Why CSS Loading Animations Are Not Just Decoration\n\nLet's be honest, nobody likes waiting. When a page needs a moment to load, that blank white screen can feel like an eternity. A simple CSS loading animation, however, transforms that wait from a frustrating pause into a seamless, professional experience. These small visual cues are a game-changer for user experience.\n\nThey work by tapping into the psychology of _perceived performance_. By providing immediate visual feedback, you reassure the user that the system is working. This simple act of communication keeps them engaged and dramatically reduces the chance they'll get impatient and bounce.\n\n### The Impact Of Visual Feedback\n\nUser expectations for website speed have skyrocketed. We all know it from our own experience, but the data backs it up: **53% of mobile users** will abandon a site if it takes longer than three seconds to load. This makes visual feedback during those unavoidable delays absolutely critical.\n\nIn fact, websites that use CSS loaders can see a **20-30% reduction in bounce rates** compared to those that just show a blank screen.\n\nThis bar chart visualizes the stark reality of user patience during loading times.\n\n![An infographic bar chart showing user patience, with 53% abandoning a site and 47% choosing to wait.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/95aa7363-4f5b-4b7d-ba98-c15c617df032.jpg)\n\nThe data is pretty clear. Over half your potential audience might leave before your content even appears if you don't give them a reason to stick around. A simple spinner can be that reason.\n\n### How Loading Animations Impact User Behavior\n\nHere's a quick look at key metrics showing how CSS loading animations positively affect user behavior and website performance.\n\n| Metric              | Without Animation                          | With CSS Animation                        |\n| :------------------ | :----------------------------------------- | :---------------------------------------- |\n| **User Patience**   | Low; users often assume the site is broken | High; users understand content is loading |\n| **Bounce Rate**     | Significantly higher (up to 53% on mobile) | Reduced by an average of 20-30%           |\n| **Perceived Speed** | Site feels slow and unresponsive           | Site feels faster and more professional   |\n| **Engagement**      | Low; high abandonment rate                 | Higher; users are more likely to wait     |\n\nAs you can see, the simple addition of a CSS loader does more than just fill dead air—it actively improves core website metrics and user perception.\n\n### Why Pure CSS Is The Smart Choice\n\nSo, why not just use a JavaScript library or a GIF? The answer comes down to one thing: **performance**. You don't want your loading solution to become a performance problem itself, and pure CSS is the most lightweight option available.\n\nHere’s why it stands out:\n\n- **No External Dependencies:** Pure CSS animations are completely self-contained. You don’t need to fetch heavy JavaScript libraries that can slow down the initial page render.\n- **Hardware Acceleration:** Modern browsers are smart. They can offload animation calculations for properties like `transform` and `opacity` directly to the GPU. This gives you incredibly smooth, jank-free motion that doesn’t tax the main CPU thread.\n- **Easy Customization:** Need to tweak colors, speed, or size? It’s as simple as changing a few CSS variables. This makes them ridiculously easy to adapt to any brand aesthetic.\n\n> Think of a CSS animation as the first handshake your website offers. It sets the tone, communicates competence, and assures the user they’re in the right place. A blank screen, in contrast, is like an unanswered doorbell.\n\nTo truly grasp the value beyond mere aesthetics, considering [the essential role of motion graphics in business](https://studioliddell.com/bits-bobs/motion-graphics-are-essential-for-businesses) can provide a wider perspective on how dynamic visuals drive engagement. Ultimately, implementing a CSS loader is the first practical step toward building a user-centric and performant site.\n\nAlright, let's roll up our sleeves and build the most classic **CSS loading animation** out there: the spinner. This is a foundational skill you'll come back to time and time again, and the best part is it only takes a single `<div>` and a bit of clever CSS.\n\nWe're going to break down the entire process, piece by piece. The goal isn't just to hand you some code to copy. It's to help you really understand _why_ each line works—from turning a square div into a perfect circle to making it spin with a smooth, infinite loop. Once you nail these concepts, you'll be able to cook up all sorts of variations on your own.\n\n![A sleek, minimalist CSS loading spinner animation on a dark background.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f8664bae-7067-45be-8d76-42f5523a37a2.jpg)\n\n### Setting the Stage with HTML\n\nThe beauty of this spinner is its simplicity. Seriously, all you need is one `div` element in your component. We'll pop a `className` on it so we can hook into it with our styles.\n\nThat's it. This is all the markup you need:\n\n<div className=\"spinner\"></div>\n\nKeeping the HTML this lean is great practice. It keeps your DOM clean and lets the CSS do all the heavy lifting.\n\n### Crafting the Spinner with CSS\n\nNow for the fun part—let's make this thing look like a spinner. First up, we need to create the basic shape. We’ll give it a fixed width and height, then use `border-radius` to curve it into a perfect circle.\n\nThe real trick, though, lies in how we use the `border` properties. We'll set a thick, light-gray border around the entire circle, but then override the color of just the top border. This creates that iconic \"gap\" that actually makes the spinning motion visible.\n\n```css\n.spinner {\n  width: 50px;\n  height: 50px;\n  border: 8px solid #f3f3f3; /* Light grey */\n  border-top: 8px solid #3498db; /* Blue */\n  border-radius: 50%;\n  animation: spin 1s linear infinite;\n}\n```\n\n> **Pro Tip:** Want to get creative? Try using `transparent` for the `border-top-color` to get a cool \"pac-man\" effect. You can even color multiple border sides for a multi-toned spinner. The core technique is exactly the same.\n\nWith this CSS in place, you should see a static circle with a blue chunk at the top. Next, we'll make it move.\n\n### Animating the Rotation with Keyframes\n\nThe final piece of the puzzle is the `@keyframes` rule. This is where we define the animation itself. We'll create a simple animation named `spin` that rotates our element from **0** degrees to a full **360** degrees.\n\n- At **`0%`** (or `from`), the animation starts with the element at its original position.\n- At **`100%`** (or `to`), the animation ends after the element has completed a full 360-degree turn.\n\n```css\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n```\n\nTo bring it all together, we apply this animation to our `.spinner` class with the `animation` shorthand property: `animation: spin 1s linear infinite;`.\n\nThis one line tells the browser everything it needs to know:\n\n- **`spin`**: Use the `@keyframes` animation we just defined.\n- **`1s`**: The animation should take **one second** to complete a full rotation.\n- **`linear`**: The animation should have a constant, steady speed with no acceleration or deceleration.\n- **`infinite`**: Lather, rinse, repeat. The animation should loop forever.\n\nThis spinner is a fantastic starting point for any project. But if you find yourself needing something more advanced for visualizing data, you might want to explore pre-built components like a fully [animated circular progress bar](https://magicui.design/docs/components/animated-circular-progress-bar).\n\nOnce you've nailed the basic spinner, a whole world of creative possibilities opens up. Let's be honest, a simple **CSS loading animation** doesn't _have_ to be a spinning circle. With a few clever tricks, you can create loaders that are more engaging, feel on-brand, and just give your users a more polished experience.\n\nWe're going to dive in and build three distinct and practical examples together: the classic bouncing dots, a smooth pulsating circle, and a clean linear progress bar. Each one introduces a new animation technique, giving you a versatile toolkit of patterns you can adapt for pretty much any project that comes your way.\n\n![A collage of creative CSS loading animations, including bouncing dots, a pulsating circle, and a progress bar.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/1b87f835-d664-4489-acd8-2d9963723cfd.jpg)\n\n### Classic Bouncing Dots\n\nBouncing dots are a playful and super common alternative to the standard spinner. The real magic here isn't some complex animation; it's the strategic use of `animation-delay` that creates that staggered, wave-like motion. We'll set up three simple dot elements and apply the exact same animation to each, but we'll kick them off at slightly different times.\n\nFirst up, the HTML is about as simple as it gets. We just need a container and three `div` elements to act as our dots.\n\n<div className=\"bouncing-loader\">\n  <div></div>\n  <div></div>\n  <div></div>\n</div>\n\nNext, the CSS handles the styling for the dots and the core `bouncing` keyframe animation. This animation uses `transform: translateY()` to move the dots up and down. The real workhorse here is the `:nth-child` selector, which lets us target each dot individually and give it a unique `animation-delay`.\n\n```css\n.bouncing-loader {\n  display: flex;\n  justify-content: center;\n}\n\n.bouncing-loader > div {\n  width: 1rem;\n  height: 1rem;\n  margin: 3rem 0.2rem;\n  background: #8385aa;\n  border-radius: 50%;\n  animation: bouncing 0.6s infinite alternate;\n}\n\n.bouncing-loader > div:nth-child(2) {\n  animation-delay: 0.2s;\n}\n\n.bouncing-loader > div:nth-child(3) {\n  animation-delay: 0.4s;\n}\n\n@keyframes bouncing {\n  to {\n    opacity: 0.1;\n    transform: translateY(-1rem);\n  }\n}\n```\n\nThis staggered effect creates a much more dynamic and fluid visual than if all three dots were just bouncing in perfect sync. It's a small detail that makes a big difference.\n\n### Smooth Pulsating Circle\n\nIf you're going for a more subtle and modern feel, a pulsating circle is an excellent choice. This effect is all about animating the `transform: scale()` property, which smoothly grows and shrinks the element. It’s incredibly lightweight and gives a calm, almost \"breathing\" feel to the loading state.\n\nThe HTML couldn't be simpler—just a single `div`.\n\n<div className=\"pulsating-circle\"></div>\n\nThe CSS defines the circle's appearance and the `pulsate` animation. We'll animate its scale and opacity at the same time to create a soft, fading pulse effect.\n\n```css\n.pulsating-circle {\n  width: 40px;\n  height: 40px;\n  background-color: #007bff;\n  border-radius: 50%;\n  animation: pulsate 1.5s ease-in-out infinite;\n}\n\n@keyframes pulsate {\n  0% {\n    transform: scale(0.8);\n    opacity: 0.5;\n  }\n  50% {\n    transform: scale(1.2);\n    opacity: 1;\n  }\n  100% {\n    transform: scale(0.8);\n    opacity: 0.5;\n  }\n}\n```\n\n> This technique of animating `transform` and `opacity` is fantastic for performance. Both properties can be offloaded to the browser's GPU, which results in buttery-smooth animations that won't cause your page to stutter or lag.\n\n### Clean Linear Progress Bar\n\nSometimes, you need to show loading progress more directly. A linear progress bar that fills up from left to right is the perfect tool for the job. This effect works by animating the `width` of a child element inside a container.\n\nHere’s the HTML structure: a container and an inner bar that will do the actual growing.\n\n<div className=\"progress-bar-container\">\n  <div className=\"progress-bar\"></div>\n</div>\n\nNow for the CSS. We'll style the container and then set up the `fill-progress` animation for the inner bar. This keyframe simply transitions the bar's width from **0%** to **100%**, simulating a loading process.\n\n```css\n.progress-bar-container {\n  width: 100%;\n  height: 10px;\n  background-color: #e0e0e0;\n  border-radius: 5px;\n  overflow: hidden;\n}\n\n.progress-bar {\n  width: 0%;\n  height: 100%;\n  background-color: #76c7c0;\n  animation: fill-progress 2s linear infinite;\n}\n\n@keyframes fill-progress {\n  from {\n    width: 0%;\n  }\n  to {\n    width: 100%;\n  }\n}\n```\n\nOf course, these examples are just scratching the surface. Once you start combining techniques like `animation-delay`, `transform`, and animating properties like `width`, you can create an endless variety of unique loaders. If you're looking for more inspiration on what's possible, check out this great collection of [cool CSS animations](https://magicui.design/blog/cool-css-animations) to spark some new ideas for your own projects.\n\n## Advanced Animation and Performance Tuning\n\nOnce you get past the basics, the real fun begins. This is where you level up your animations, making them both more powerful and way more performant. It's the difference between a decent **CSS loading animation** and a truly great one, and it all comes down to maintainability, smoothness, and accessibility.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/4PStxeSIL9I\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nOne of the slickest pro-level tricks I've learned is using CSS variables (or custom properties) to make animations super themeable. Instead of hardcoding colors, sizes, or speeds directly in your keyframes, you define them as variables. This is a game-changer. It means you can completely change the look and feel of your loader on the fly—say, for a dark mode or different brand themes—without having to touch a single keyframe.\n\n### Optimizing for Buttery Smooth Performance\n\nHere's a secret that will change how you approach CSS animation: not all properties are created equal. If you want buttery-smooth motion, your secret weapons are `transform` and `opacity`. Animate these two properties almost exclusively.\n\nWhy? Because modern browsers can offload the heavy lifting for `transform` and `opacity` changes to the Graphics Processing Unit (GPU). This is a process called **hardware acceleration**, and it's your best friend for performance.\n\nWhen you try to animate properties like `width`, `height`, or `margin`, you're asking the browser to recalculate the entire page layout and repaint pixels on every single frame. This is incredibly expensive and leads to that janky, stuttering motion we all hate. It's often called \"layout thrashing\" for a reason.\n\n> By sticking to `transform` and `opacity`, you're working _with_ the browser's rendering engine, not against it. You keep the animation off the main thread, which is how you hit that silky smooth **60 frames per second (FPS)** that just _feels_ right to the user.\n\nFor really complex animations, you can give the browser an extra heads-up with the `will-change` property. Something like `will-change: transform;` tells the browser, \"Hey, get ready, I'm about to animate the transform property,\" allowing it to make optimizations ahead of time. Just be careful with this one—use it sparingly, because overdoing it can hog memory and actually hurt performance.\n\n### Designing for Accessibility\n\nA truly great animation is one that everyone can appreciate, even users who are sensitive to motion. This is where the `prefers-reduced-motion` media query comes in. It's an essential tool that lets you respect a user's system-level preference for less movement.\n\nYou can wrap your more intense animations in this media query to offer a simpler, more subtle alternative.\n\n- **For motion-sensitive users:** Instead of a fast-spinning loader, you could swap it for a gentle fade-in/fade-out effect.\n- **Implementation:** The code is refreshingly simple and shows a real commitment to an inclusive user experience.\n\n```css\n/* Default animation */\n.loader {\n  animation: spin 1s linear infinite;\n}\n\n/* Reduced motion alternative */\n@media (prefers-reduced-motion: reduce) {\n  .loader {\n    /* Replace spin with a gentle fade */\n    animation: fade 1.5s linear infinite;\n  }\n}\n\n@keyframes fade {\n  0%,\n  100% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0.5;\n  }\n}\n```\n\nThis approach doesn't get rid of the loading feedback; it just makes the experience more comfortable for everyone.\n\nOf course, the best experience is a site that loads fast in the first place. Optimizing your animations is just one piece of that puzzle. To really dig in, check out our complete guide on [how to improve website loading speed](https://magicui.design/blog/how-to-improve-website-loading-speed).\n\n## Putting Your CSS Animation to Work\n\nOkay, so you’ve built a slick-looking animation. Now what? An animation is just a pretty snippet of code until it’s actually doing something in your project. Let's bridge that gap and bring your **CSS loading animation** to life when your app is fetching data or crunching numbers.\n\nThe most common way to handle this is by simply toggling a CSS class with a bit of JavaScript. Imagine you have a class called `.is-loading`. When your app is busy, you add that class to a container element to show the loader. Once the work is done, you remove it. Simple and effective.\n\n![A developer's code editor showing React code for managing loading state with CSS animations.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9544ff5b-1531-4901-816b-492652f32648.jpg)\n\n### Integrating with a React Component\n\nThis class-toggling approach fits beautifully into the modern component lifecycle. If you’re working in a [React](https://react.dev/) application, for instance, you can manage this with a basic `useState` hook.\n\nPicture a component that needs to fetch some data. You’d kick things off with the loading state set to `true`.\n\n`const [isLoading, setIsLoading] = useState(true);`\n\nAs soon as your data comes back, you just flip the state to `false` with `setIsLoading(false)`. From there, your JSX can conditionally apply the `.is-loading` class or even render the entire loader component based on that `isLoading` flag.\n\nIt’s this dynamic control that transforms your CSS animation from a static decoration into a genuinely useful piece of your UI.\n\n### Custom Build vs. Pre-Built Libraries\n\nSooner or later, you'll hit that classic developer crossroads: do I build this from scratch or grab a library? There’s no single right answer here—it really boils down to what your project needs.\n\n- **When to Build Custom:** A custom CSS animation is your best bet when you need something simple, lightweight, and perfectly on-brand. If you're creating a unique spinner or a basic progress bar, writing the CSS yourself gives you total control without bloating your project with dependencies.\n- **When to Use a Library:** On the flip side, if you need complex animations or you’re up against a tight deadline, a pre-built library can be an absolute lifesaver. These packages offer a huge variety of tested, optimized animations right out of the box, saving you a ton of development time.\n\n> The focus on user experience has made CSS loading animations more popular than ever. Consider this: [Animate.css](https://animate.style/)—a framework often used for these kinds of effects—is used by **42.5% of all websites** that declare a CSS framework. That accounts for **8.8% of all websites globally**, which just goes to show how critical these little animations are for keeping users engaged during wait times. You can [read more about these CSS framework statistics here](https://w3techs.com/technologies/details/cs-animate).\n\nChoosing wisely between a custom build and a library ensures your loading state isn't just a pretty face—it's a practical and efficient part of your application.\n\nOf course, even with the best instructions, you're bound to hit a few snags. It’s all part of the process. Let’s walk through some of the most common questions and roadblocks that pop up when you're wrestling with a **CSS loading animation**.\n\n### Why Is My Animation Jerky or Laggy?\n\nThis one almost always comes down to performance. If your animation is stuttering, you're probably animating properties that force the browser to do a ton of heavy lifting—think expensive repaints triggered by changes to `width`, `height`, `margin`, or `top`.\n\nThe fix? Rework your animation to lean on `transform` and `opacity`. These properties are special because the browser can hand them off to the GPU for hardware acceleration. The result is buttery-smooth motion that doesn't bog down the main browser thread.\n\n> A quick audit of your `@keyframes` is the best place to start. See anything other than `transform` or `opacity`? That’s your prime suspect. Something as simple as swapping `margin-left` for `transform: translateX()` can make a night-and-day difference.\n\n### How Can I Get My Loader Centered on the Screen?\n\nAh, the classic centering conundrum. Thankfully, modern CSS has made this a lot less painful than it used to be. The most reliable tool for the job is Flexbox.\n\nJust apply `display: flex`, `justify-content: center`, and `align-items: center` to the parent container holding your loader. That's it. This combo will perfectly center your loader both horizontally and vertically inside its container, no matter how big or small the loader is.\n\n### Are There Any Pre-Made CSS Loaders I Can Use?\n\nAbsolutely, and you've got more options now than ever before. The world of pre-built CSS loading animations has really exploded. For instance, sites like css-loaders.com have a massive library of over **580 unique CSS-only loading animations**, and each one is built with just a single HTML element.\n\nUsing a library like this means you can find and plug in a slick, engaging effect in minutes without having to build it from the ground up. If you're curious, you can [discover more about this extensive collection of CSS loaders](https://dev.to/afif/css-loaderscom-the-biggest-collection-of-loading-animations-more-than-500--23jg) and see what’s possible.\n\n---\n\nReady to build stunning, animated web interfaces without the hassle? **Magic UI** offers a massive library of 150+ free, open-source animated components built with React, Typescript, and Tailwind CSS. [Get started for free at https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/cta-design.mdx",
    "content": "---\ntitle: \"21 Best Practices For A Compelling CTA Design & Why They Work\"\ndescription: \"Learn 21 best practices for creating compelling CTAs and understand why they effectively drive engagement and conversions.\"\nimage: https://cdn.magicui.design/assets/qpwmdds5u7.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre your landing page call-to-action (CTA) designs not driving conversions as expected? Many face challenges making their CTAs stand out and compel users to take action. We've all been to a number of [landing page examples](https://magicui.design/blog/landing-page-examples), visiting a landing page and leaving without taking action. The issue might be your CTA design. This article will guide you through improving your CTA design for better conversions.\n\nDo you need help to create compelling CTAs that get visitors to click and convert? Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) can help. Designed to improve CTA design and boost conversions, this tool will transform your landing pages into conversion machines.\n\n## What Is CTA Button?\n\n![CTA Design](https://cdn.magicui.design/assets/hupkq5rir84.jpg)\n\nA call-to-action (CTA) button is an interactive UI element on both the web and mobile. Its major aim is to induce people to take specific actions that present a conversion for a particular page or screen, for example:\n\n- Purchase\n- Contact\n- Subscribe, etc.\n\n### The Purpose of a CTA\n\nLead generation and purchase rise are the primary business goals for which calls to action can be created. When a button design is compelling enough to attract the attention of potential clients immediately, it can entice them to click and proceed to the next stage, such as filling out a short contact form or pre-ordering a product.\n\n### Crafting Effective CTAs\n\nThere are many factors to consider when you are writing and designing CTAs. Consider the level of buy-in you are asking for from your visitors and tailor it to the page the CTA appears on. For instance, it might be appropriate to put “Request a Quote” on a page about a specific service, but when writing a CTA for your homepage, you may choose something softer like “Learn More.”\n\n## Importance of Effective CTA Design in Conversion Rate\n\n![CTA Design](https://cdn.magicui.design/assets/8v247kfhs4v.jpg)\n\nYour [CTA is the fundamental step](https://www.investopedia.com/terms/c/call-action-cta.asp) that turns visitors into customers; it’s the gatekeeper to the success of your brand. As such, they demand their own design rules. Minor changes have the potential to make a huge impact on conversions, so you must get this one right.\n\nHere are some reasons to have a compelling CTA design:\n\n### Drive More Sales\n\nThe primary goal of CTA is to drive more sales and fuel business growth. By compelling users to take action and move further down the sales funnel, CTA can help generate:\n\n- Sales\n- Leads\n- Other valuable conversions\n\nThis can drive business success.\n\n### Conversion Optimization\n\nDesigning a visually appealing call to action button can capture the audience's attention and guide users to a specific action. This can:\n\n- Help improve click rates and conversion rates\n- Grab users’ attention\n- Enhance your marketing effectiveness\n\n### Increase Engagement\n\nCTA can increase engagement on:\n\n- Web page\n- Landing page\n- Other platforms\n\nThey do this by presenting enticing offers, promotions, or incentives. Whether a limited-time offer, a free trial, or exclusive access, a well-designed CTA can encourage users to take action and engage with your brand, thereby increasing conversion rates.\n\n### Improve User Experience\n\nCTA directs and provides clear pathways by navigating users to the next step. A well-designed CTA makes it easier for the users to find relevant information with clear content or gives them a sense of urgency to complete the desired actions, resulting in a more positive overall experience.\n\n#### Designing for Conversion\n\nAn effective CTA design is essential for maximizing conversion rates and achieving marketing goals. Craft a design that grabs visitors’ attention and improves their overall experience.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## 7 Crucial Elements of a Compelling CTA Button Design\n\n![CTA Design](https://cdn.magicui.design/assets/m3hp7q9fkl.jpg)\n\n### 1\\. Making Them Stand Out\n\nPlacing CTAs in a prominent spot on your webpage is crucial. The CTA should be the first thing viewers see upon entering the webpage. For example, CTAs are commonly placed at the bottom of a popup to catch the user's attention immediately.\n\n### 2\\. Usage of Action Keywords\n\nThe language in the CTA should direct viewers towards the desired action. By using action keywords like \"Sign up now,\" \"Shop now,\" or \"Get Quote,\" you can guide users to take the necessary steps.\n\n### 3\\. Usage of Text in First-person\n\n[Crafting the CTA text in the first person](https://verticalresponse.com/blog/3-reasons-why-you-should-write-ctas-from-the-readers-point-of-view/) can make it sound more personal and informal. For instance, the CTA button for an online reservation app can be designed as \"Make my reservation\" rather than \"Make your reservation.\"\n\n### 4\\. Creation of a Sense of Urgency\n\nIntroducing a sense of urgency in your CTA can prompt viewers to act quickly. You can achieve this by including incentives or discounts for a limited time. This sense of urgency can prevent users from procrastinating or forgetting the task.\n\n### 5\\. Elimination of Roadblocks\n\nMake the desired action as easy as possible for viewers to complete. Adding another CTA that encourages users to act without friction can be beneficial. For example, if you want viewers to share information with their friends, provide a CTA that streamlines this process.\n\n### 6\\. A/B Testing\n\n[Conduct A/B testing regularly](https://blog.hubspot.com/marketing/how-to-do-a-b-testing) to enhance the effectiveness of CTAs. You can fine-tune your design by comparing different CTA variations and analyzing their impact on conversion rates. Utilize data and analytical tools to refine your CTAs and achieve better results.\n\n### 7\\. Placement\n\nIt is vital to strategically position the CTA where users are most likely to see and interact with it. Consider placing the CTA above the fold or experimenting with different locations on your web or landing pages to ensure maximum visibility without requiring excessive scrolling.\n\n### Accelerate Your Design Process with MagicUI\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers. It provides over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nTry using our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today for visually appealing and interactive elements that can be easily integrated into web applications.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 21 Best Practices for Designing a Compelling CTA\n\n![CTA Design](https://cdn.magicui.design/assets/gp6ctvlqo65.jpg)\n\n### 1\\. Pick a Primary Call-to-Action\n\nThink about how much we’re able to do on the web:\n\n- Read articles\n- Connect to friends\n- Buy stuff\n- Subscribe\n- Watch videos\n- Check emails, and so on\n\nThis is why so many people suffer from decision fatigue today. It doesn’t just make the decision-maker feel poorly; it can negatively impact the decision-making process.\n\nAccording to Medical News Today, the psychological effects of decision fatigue can vary, potentially leading to:\n\n- Difficulty making the right decisions\n- Impulse buying\n- Other avoidance behaviors\n\nAs such, a call to action is most effective when it’s the only decision or one of maybe a small handful of decisions you’re asking visitors to make. While each page on your site can offer other links and buttons, you should only have one primary CTA.\n\n### 2\\. Keep User Flow in Mind\n\nBig size and bright colors are effective tools for catching users’ attention, but smart placement can increase the chances of CTAs being noticed even more. User flow, also known as user journey, is a path users follow in a digital product to complete a certain task, such as an online purchase. User flow helps to create UX so that people can go step-by-step to their goal and receive the data gradually.\n\n#### Strategic CTA Placement for Maximum Impact\n\nKeeping the user journey in mind, you can choose efficient placement for CTA buttons. For example, when creating a landing page design, you need to ensure users will find the “Sign up” CTA button after reading the information about the offer or services. This way, users will understand what they are signing up for and whether they need it. If people see such a CTA button before reading the information, they will likely ignore it.\n\n### 3\\. Use a Strong, Memorable Color\n\nThere was a time when the most significant debate surrounding CTA button design was whether to make them red or green. While color psychology can be useful when designing buttons, it’s not an exact science—especially since the Internet allows even the tiniest of businesses to go global. Colors mean different things to different people and in different cultures, so color psychology isn’t always the best path. Color theory is a more valuable tool.\n\n### 4\\. Choose a Simple Serif or Sans Serif Font\n\nYou won’t have much room for creativity regarding font choice for buttons. You need visitors to be able to quickly read what’s on them so they can feel confident taking action. As for which web fonts are the most legible, stick to plain-looking serifs and sans serifs with distinctive characters.\n\n### 5\\. The Text Should Be Slightly Bigger Than the Surrounding Body Text\n\nYour button design should draw visitors’ eyes to it, not its obnoxiously large size. You still have to consider the size hierarchy when designing CTA buttons. You can use a combination of font size and weight to help direct visitors’ eyes through your content and get them to the CTA much more quickly. It’s up to you how much emphasis you place on your CTA button.\n\n#### CTA Size and Hierarchy\n\nPrimary CTAs should be closer in size to your H1 and H2 than to the body text. Secondary and tertiary CTAs can be smaller if they remain legible and clickable.\n\n### 6\\. Increase Button Size for Visibility\n\nThe button size can significantly impact the effectiveness of driving user engagement and conversions. By enlarging the size of the call to action button, you make it prominent and easier for users to notice. In addition, it makes it easier for users to interact and creates a bold visual impact.\n\n### 7\\. Emphasize Contrast\n\nEmphasizing contrast is important because it helps your buttons stand out from the rest of your website design and content. Your readers won’t click a button they don’t notice.\n\n#### Making CTAs Stand Out\n\nUse contrasting colors, shapes, sizes, and fonts that differ from your background and other elements on your page. This will naturally draw your visitors’ attention to your buttons and increase conversions.\n\n### 8\\. Use Negative Space\n\nCreating [negative space](https://www.interaction-design.org/literature/topics/negative-space?srsltid=AfmBOooM3h3jD5UuDtoFv7B5YMb_1g6MvSuO8RR9z1LniyDhv4wxkwn9) (also called white space) around your CTA buttons is important because it helps make them more visible and attractive. Negative space contrasts your buttons and the rest of your page elements, making the buttons stand out and catch your visitors’ eyes.\n\n### 9\\. Make Your Vocabulary Dead Clear\n\nEnsure your CTA’s vocabulary is clear and actionable. User attention is precious, so use the momentum to quickly get to the main point with a short but striking copy.\n\n### 10\\. Choose Solid Over Outline Button Designs\n\nGiving buttons a transparent outline design becomes trendy every few years or so. These types of buttons are also referred to as “ghost” buttons. The biggest problem with this trend is that research has proven time and time again that outline buttons have lower click-through rates and higher error rates than solid buttons. While they may look more minimal or elegant, they’re not as user-friendly.\n\n#### Button Styles for Visual Hierarchy\n\nSo, when you design your primary CTA buttons, always go for a solid (filled) button design. Then, if you need to add secondary or tertiary buttons to the page, make them ghost buttons to de-emphasize them.\n\n### 11\\. Make It Clickable\n\nVisitors must click a button when they see it. So, it has to look clickable when surrounded by non-clickable elements. The simplest way to do this is to give it the rectangular or ovular shape that people have come to associate with buttons. If it fits your branding, you should do more to make your buttons stand out.\n\n### 12\\. Add Hover Effects\n\nAdding hover effects can further enhance interaction and draw your audience's attention. To ensure an engaging and interactive user experience:\n\n- Add shadows\n- Change the button’s background color\n- Increase the size of the buttons\n- Add text animation\n- Add icons or images.\n\n### 13\\. Use Size Differences To Create More Contrast\n\nUsing size is an effective way to create a visual hierarchy on the webpage. Make your call to action button design more prominent than other elements on your page. The trick is to use a bigger (or smaller for softer CTAs) button to convey a stark contrast to the rest of the page’s visual elements. That breaks any monotony, which draws attention.\n\nThat said, be careful not to make your button too big, as it will become obnoxious. Too small, on the other hand, will make it hard to see or click. Always remember that the goal is to make the CTA button the page's focal point.\n\n### 14\\. Use Fewer Words\n\nLess is more for CTA button text. The words “Just Do It” are iconic for a reason. They aren't just simple, powerful, and memorable; they have a visual impact that conveys confidence and authority.\n\nBesides, making users read too much text only adds to their cognitive load as they interact with your webpage. Remember, you have your website visitors’ attention only for a limited time. Don’t ramble, but use action phrases like:\n\n- Buy now\n- Book now\n- Shop now\n\n### 15\\. Add Some Extra Information\n\nIt’s essential to keep the CTA message short to catch the attention quickly. However, when the audience notices the call-to-action, it may be helpful to provide additional data. It can be a small piece of information explaining the following stages.\n\nFor example, you can clarify that the sign-up process will take less than 15 seconds or remind users that registration is free. A small remark can increase users’ interest and encourage them to take action.\n\n### 16\\. Add a Value Proposition\n\nIn addition to compelling your readers into a specific action, your text should convey the benefits they’ll receive when they click through. If it isn’t clear what’s in it for them, they have little reason to follow your instructions.\n\n### 17.  Create a Button Design Specifically for Mobile Users\n\nWhat works well for desktop and laptop users isn’t always the case for smartphone users. And we’re not just talking about the size or color of the CTA button.\n\n### 18\\. Mind Your CTA Button Placement\n\nPlacement affects how visible and accessible your CTA button is. If the Brafton case study is any indication, placing your CTA button in a prominent and logical position can increase your blog post’s revenue by 83%. Putting your CTA button above the fold (immediately visible without scrolling down the web page) is generally considered the best practice.\n\n#### CTA Placement\n\nPlacement also affects how appealing and persuasive your CTA button is. For example, you’ll never see newsletter sign-up buttons at the top of a blog post. Instead, they’ll be placed at the bottom, so readers get an idea of what kind of content they’ll be signing up for.\n\n#### Strategic Placement of CTA Buttons on Landing Pages\n\nCTA buttons on most landing pages should come sooner rather than later. Since the point of an effective landing page is for visitors to take action, you don’t want them to waste time searching for the button.\n\n### 19\\. Don’t Make Your Buttons Compete for Attention\n\nThis best practice has to do with distractions. Or, rather, a lack thereof so that visitors can’t help but be drawn to your CTAs.\n\n### 20\\. Use Animations\n\nAnimations are trending and a great way to keep a visitor's attention focused on your CTA. For instance, Magic UI's shimmer CTA button is a great way to keep your readers attention on your CTA. Your CTA can easily stand out without competing for attention with the rest of the page copy.\n\n### 21\\. Test, Test, Test\n\nOnce you’ve created your CTA and implemented all these helpful tips, your job is not over! You need to check that your CTA is having the desired effect. [Carry out A/B testing](https://blog.hubspot.com/marketing/how-to-do-a-b-testing) to see how color, message, offer, design, and placement changes affect your conversion rates.\n\nPlay around until you’ve found the right combination—sometimes tiny, easy-to-make changes can make a huge difference. And don’t forget to periodically check in to see that the CTA continues to be effective.\n\n## Examples of Compelling CTA Design\n\n![CTA Design](https://cdn.magicui.design/assets/8a2tci1imhl.jpg)\n\n### Infiscal\n\nThe CTAs on Infiscal's landing page use simplicity to encourage visitors to take a particular action — a clear and practical approach that can lead to higher conversion rates. Notice the hover effect that makes the CTAs more engaging when visitors hover over the button? You can effortlessly create that and more using Magic UI animated component library.\n\n### Contently\n\nThese CTAs on Contently’s landing page encourage the audience to \"Sign up and request a demo\" or \"Read a case study,\" which will be an extended version of the critical numbers mentioned on the landing page. These [CTAs are designed with distinct colors](https://www.browserstack.com/guide/cta-design-examples-to-boost-conversions#:~:text=When%20it%20comes%20to%20CTAs,relaxing%2C%20natural%2C%20and%20calming.) to attract customers’ attention.\n\n### Jobseeker\n\nThis Jobseeker CTA encourages viewers to sign up and create a professional resume. The text showcases a brief outlook on how the resume will be curated using their service. The CTA’s color matches the brand’s and stands out, as everything else is in black.\n\n### Spotify\n\nThe CTA on Spotify’s app is aimed at audiences who want to sign up and use the app for free. The color green not only stands out in the app but also acts as a motivator and encourages users to sign up.\n\n### Dropbox \n\nDropbox is an online data storage platform for work or personal use. The first CTA encourages the professional audience to sign up for their web app and try it for free. The other asks the user to start their storage facility with Dropbox if they plan to use it for personal use. The CTA is a simple button; the text above gives the visitors relevant details.\n\n### Wordstream \n\nThis Wordstream CTA persuades viewers to receive a free assessment report to discover how their digital marketing tools suite can help them realize your business objectives. The [contrasting color of the CTA](https://optinmonster.com/which-color-button-converts-best/#:~:text=To%20make%20your%20call%2Dto,worked%20better%20than%20green%20buttons.) makes it stand out from the other elements in the popup.\n\n## Common CTA Design Mistakes To Avoid\n\n![CTA Design](https://cdn.magicui.design/assets/wpi11ksq9xp.jpg)\n\n### Overloading Pages With Too Many CTAs\n\nOverloading your landing page with too many CTAs can overwhelm visitors and lead to decision fatigue. Instead, [focus on one primary call-to-action button](https://medium.com/@MaxTraffic/what-are-primary-and-secondary-calls-to-action-89ea0627ab4) that stands out and guides visitors to the desired action. Keep secondary CTAs to a minimum, providing additional options without distracting from the main objective.\n\n### Poor Placement\n\n- Strategically position your CTA to ensure it is easily visible within the layout.\n- Avoid burying it in cluttered areas or using the same color scheme and background, as this can make it difficult for visitors to find and engage with.\n- Ensure that the CTA pops out and draws attention, prompting visitors to act swiftly.\n\n### Neglecting the CTA Copy\n\nCrafting compelling CTA copy is crucial for driving action on your landing page. [Avoid generic CTA phrases](https://bdow.com/stories/call-to-action-mistakes/) that don't convey the benefits or urgency of the offer. Tailor your call-to-action content to the customer's sales stage, offering relevant information that entices them to click through. Remember that the CTA copy is the final nudge that convinces visitors to convert—make it count.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in UI libraries, offering over 20 animated components to make your landing pages pop. With MagicUI, you can easily create visually stunning and interactive elements seamlessly integrating into your web applications. The best part? It's free and open-source, allowing you to craft captivating digital experiences effortlessly.\n\n### Bridging the Gap Between Design and Development\n\nOne of the challenges in creating landing pages is ensuring they are visually appealing and technically sound. [MagicUI](https://magicui.design/) bridges the gap between design and development by offering highly customizable components that can be adapted to seamlessly match your branding and design requirements. This means you can focus on creating beautiful landing pages without dealing with the technical complexities.\n\n### MagicUI Pro: Elevate Your Landing Page Game\n\nWith [MagicUI Pro](https://pro.magicui.design/), you can take your landing page design to the next level. Using our website templates, you can save thousands of hours and create a beautiful landing page that converts visitors into customers. MagicUI Pro equips you with everything you need to make a stunning startup landing page that captures attention and drives results.\n\n### Design Made Easy With MagicUI\n\nThe call-to-action (CTA) is one of the most crucial elements of a landing page. With MagicUI, you can effortlessly design compelling CTAs that drive conversions. Our [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the perfect starting point for creating a CTA that resonates with your target audience and compels them to act.\n\n[Get MagicUI today](https://magicui.design/) and see the difference it can make in your landing page design.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/dashboard-design-ui.mdx",
    "content": "---\ntitle: Top Dashboard Design UI Tips for Engaging Data Visuals\ndescription: >-\n  Master dashboard design UI with expert tips. Create intuitive, effective\n  dashboards that turn data into actionable insights. Learn more now!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-d222f318-59d1-453d-be59-01e6025fa9d0.jpg\nauthor: Dillion Verma\ntags:\n  - dashboard design ui\n  - data visualization\n  - ui design principles\n  - user experience\n  - dashboard layout\npublishedOn: \"2025-10-15T09:38:57.642352+00:00\"\nfeatured: true\n---\n\nA dashboard UI is all about taking a mountain of complex data and making it understandable, scannable, and—most importantly—actionable. A great design cuts through the noise, turning raw numbers into **meaningful insights** that help people make smart decisions, fast.\n\n## Building the Foundation of Your Dashboard\n\nBefore you even think about picking a chart type or a color scheme, you need to lay the groundwork. This is where the real work happens. A beautiful dashboard that doesn't answer the right questions is just a pretty picture; it's a failure. The planning stage isn't just a box to tick—it's the most critical phase of the entire project.\n\nThis is where you stop talking in hypotheticals and start defining concrete goals. You have to get into the heads of the people who will actually be using this thing every day. What do they _really_ need to accomplish?\n\nA dashboard for a CEO should offer a high-level, at-a-glance summary of the company's health. But a marketing analyst needs to get their hands dirty with granular data they can slice and dice. Miss that distinction, and you're on the fast track to a cluttered, useless interface. It’s a classic mistake.\n\n### Know Your Audience and What They Need\n\nThe first, and most important, question you have to ask is: \"Who is this for?\" The answer to that single question will shape every decision that follows. To get to the bottom of it, you'll want to create user personas—basically, fictional profiles of your key users.\n\nLet's imagine a couple of scenarios. A sales manager is probably focused on:\n\n- How their team is tracking against monthly quotas.\n- Which reps have the best lead conversion rates.\n- The total value of the current sales pipeline.\n\nNow, contrast that with an operations manager. Their world revolves around:\n\n- System uptime and performance metrics.\n- Average time to resolve support tickets.\n- How resources are being allocated and used.\n\nBy mapping out these distinct needs, you make sure the dashboard surfaces only the most relevant information. This is how you avoid the data overload that makes so many dashboards feel overwhelming. The whole point is to give each user a view that speaks directly to their role and goals. For instance, the specific data visualizations required for something like [stock market analysis software](https://blog.publicview.ai/stock-market-analysis-software) are completely different from those for a social media dashboard.\n\n> A user-centric approach isn't just a nice-to-have; it's the only way to build a dashboard that actually gets used. If people have to hunt for the information they need, they'll just go back to their trusty old spreadsheets.\n\nTo ensure your planning phase is rock-solid, focus on these foundational principles.\n\n### Key Principles for User-Centric Dashboard Planning\n\nThis table outlines the core ideas that should guide your strategy from the very beginning.\n\n| Principle                 | Key Action                                                                                                                 | Impact on Dashboard UI                                                                                                  |\n| :------------------------ | :------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- |\n| **Audience First**        | Create detailed user personas and conduct interviews to understand their daily tasks and pain points.                      | The UI will feature data and visualizations directly relevant to each user group, eliminating clutter.                  |\n| **Goal-Oriented**         | Define the primary business question the dashboard must answer for each user persona.                                      | Every element on the dashboard has a clear purpose, guiding the user toward a specific action or decision.              |\n| **Context is King**       | Understand the environment where the dashboard will be used (e.g., on a large screen in an office vs. a tablet on the go). | The layout, font sizes, and interactivity will be optimized for the user's actual viewing context.                      |\n| **Prioritize Ruthlessly** | Work with stakeholders to identify the top 3-5 most critical metrics (KPIs) and relegate others to secondary views.        | The main view of the dashboard will be clean and focused, highlighting the most important information \"above the fold.\" |\n\nFollowing these principles sets you up for a design that is not only functional but also intuitive and valuable to its users.\n\n### Identify and Prioritize Key Metrics\n\nOnce you know exactly who you're building for, it's time to figure out which Key Performance Indicators (KPIs) actually matter to them. This isn't about throwing every available metric onto the screen. It's about being ruthless with your choices. A dashboard that tries to show everything ultimately communicates nothing.\n\nHere’s a great exercise: ask your stakeholders, \"If you could only see five metrics to understand the health of your department, what would they be?\" This question forces everyone to get laser-focused. It helps you separate the \"nice-to-know\" data from the \"must-know\" information that drives real action. For a deeper look at building user-focused digital tools, check out our guide on [web application design](https://magicui.design/blog/web-application-design).\n\nThis simple visualization shows how these foundational steps connect.\n\n![Infographic about dashboard design ui](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5db65730-fc51-442c-aee9-b3ec96d87e60.jpg)\n\nStarting with the user, then defining their needs, and finally prioritizing the metrics ensures your dashboard UI is built on a solid, strategic footing. If you skip this structured approach, you're just guessing. You might end up with a dashboard that's rich in data but completely poor in insights.\n\n## Mastering Visual Hierarchy and Layout\n\nA great dashboard doesn’t make you hunt for insights. It guides your eye directly to the most critical information, turning complex data into something you can understand at a glance. It's less of a puzzle and more of an intuitive path.\n\nThis isn't about just making things look pretty; it's a strategic use of visual cues—like size, color, and placement—to create a clear hierarchy. The most important metrics should literally be the biggest and boldest things on the screen. It's a functional choice that puts the focus exactly where it needs to be.\n\n![Dashboard with a clear visual hierarchy and layout](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2d899202-5c99-4e25-b4e2-99629b4fcaeb.jpg)\n\n### Guiding the User’s Eye with Layout Patterns\n\nLet's be honest, people don't read dashboards; they scan them. If you understand how people scan, you can build a much more effective layout. For most users in Western cultures, the eyes naturally follow a **Z-pattern**: top-left to top-right, down to the bottom-left, and then across to the bottom-right.\n\nYou can use this natural behavior to your advantage.\n\n- **Top-Left (Point 1):** This is prime real estate. Put your most critical, high-level KPI right here, as it's the very first place a user will look.\n- **Top-Right (Point 2):** Perfect for secondary information or key actions like date range filters. It's important, but not the absolute first thing they need to see.\n- **Bottom-Left (Point 3):** A great spot for supporting charts or breakdowns that add context to your main KPI.\n- **Bottom-Right (Point 4):** This is the end of the line. Reserve this space for less critical data or \"nice-to-have\" details that users can dig into if they want.\n\nWhen you align your layout with this pattern, the whole experience feels more natural. You reduce the user's cognitive load, which means they can absorb information much, much faster. It's a subtle trick, but it's incredibly powerful.\n\n### Whitespace Is an Active Design Element\n\nWhitespace is probably the most underrated tool in a designer’s toolkit. It’s not just “empty” space—it’s an active element that defines relationships, kills clutter, and makes everything easier to read. A crowded dashboard is an overwhelming one.\n\nThink of whitespace as breathing room for your data. When you put plenty of space between charts and metrics, you’re helping the user’s brain group related information together. It’s a visual cue that says, \"Hey, these things belong together and tell a specific part of the story.\"\n\n> A common mistake is trying to cram something into every last pixel. The goal isn't to show _everything_ at once, but to show the _right things_ clearly. Strategic whitespace is what separates a clean, professional dashboard from a cluttered, amateurish one.\n\nUsing whitespace effectively makes your entire design feel more organized and far less intimidating. If you're looking for inspiration on creating clean interfaces, exploring different [user interface themes](https://magicui.design/blog/user-interface-themes) can give you some great ideas for managing space and color.\n\n### Building a Responsive Grid System\n\nIn a world full of different devices, your dashboard isn't just going to live on a big desktop monitor. It has to look just as good and be just as functional on a tablet or a laptop. A responsive grid system isn't a nice-to-have; it's non-negotiable.\n\nA grid gives your layout a solid foundation, ensuring everything stays consistent and aligned. Using something like a **12-column grid** lets you define exactly how your components should reflow and resize on different screens.\n\nHere’s why that’s so helpful in the real world:\n\n- **Consistency:** It locks in your margins, padding, and alignment, giving your dashboard that polished, professional feel.\n- **Responsiveness:** You can set rules, like telling a four-column row of KPIs on a desktop to stack into a two-by-two grid on a tablet and a single column on a phone.\n- **Efficiency:** It just makes the design process faster. You have a clear structure to work with instead of just placing elements randomly.\n\nWithout a solid grid, your layout can completely fall apart on different devices. That would make your carefully designed dashboard unusable for a huge chunk of your audience. Getting these layout principles right is the first step to creating a dashboard that not only looks fantastic but works brilliantly.\n\n## Telling a Story with the Right Data Charts\n\nA dashboard isn't just a jumble of metrics; it's a storytelling tool. The charts you pick are the main characters in that story, and choosing the wrong one can send your users down a completely wrong path, leading to bad conclusions. A truly powerful **dashboard design UI** hinges on picking visualizations that tell the truth with absolute clarity.\n\nThe real goal here is to move beyond just knowing what a line chart is. You have to understand the _why_ behind each choice. What specific question is a user trying to answer, and which visual is best equipped to give them that answer instantly? When does a line chart reveal a trend better than a bar chart? And why are pie charts, so often requested, usually a terrible choice for detailed comparisons?\n\nGet these answers right, and users can digest complex information in seconds, not minutes. That efficiency is the hallmark of a dashboard that actually works.\n\n![A dashboard showing various data charts and visualizations](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/043876fe-ef75-4ced-b826-d399040c650f.jpg)\n\n### Matching Chart Types to Data Stories\n\nEvery chart type has a job. Your role as a designer is to be a matchmaker, pairing the right data story with its perfect visualization. Trying to cram a dataset into the wrong chart is like trying to hammer a screw—it’s messy, and it just doesn't work.\n\nThink about these common scenarios I see all the time:\n\n- **Showing Change Over Time:** If you want to show a trend—like website traffic over the last quarter or monthly recurring revenue—the **line chart** is your best friend. Its continuous line naturally draws the eye along the timeline, making peaks, valleys, and patterns immediately obvious.\n- **Comparing Categories:** Need to stack up distinct categories against each other? Think sales performance across different regions or user counts in various subscription tiers. A **bar chart** is the undisputed champ here. The length of each bar provides an instant, easy-to-process visual comparison.\n- **Illustrating Parts of a Whole:** The often-abused **pie chart** (and its cousin, the donut chart) really only has one job: showing composition. It’s only effective when you have a tiny number of categories (ideally **fewer than five**) that neatly add up to 100%. Any more than that, and the slices become impossible to compare, making the chart worse than useless.\n\n### Building a Visual Narrative\n\nOnce you’ve picked your charts, you need to arrange them to tell a compelling story. A well-designed dashboard doesn't just throw data at the user; it guides them logically from a high-level overview right down to the nitty-gritty details.\n\nAlways start with the most critical, summary-level KPIs at the very top. These are your \"headline\" numbers that give an instant pulse check on what's happening. From there, you can place charts that add context and break down those headline figures. For instance, a big KPI showing \"Total Sales\" could be followed by a bar chart breaking down sales by region and a line chart showing the sales trend over the past six months.\n\nThis top-down structure creates a natural flow. Users get the big picture in a glance, and if something sparks their curiosity, they can seamlessly scroll down to investigate further. This guided exploration stops them from feeling lost in a sea of data.\n\n> The best dashboard UIs don't just present data; they curate it. They build a story that starts with a powerful summary, offers supporting details, and allows the user to explore the 'why' behind the numbers without getting overwhelmed.\n\nThis user-first approach has become non-negotiable. The whole field of dashboard design has shifted in recent years, with a huge new emphasis on user experience and ethical UX. Users don't just expect data to be clear; they demand transparency about where it comes from and what it means. This is driven partly by the need to reduce churn—a confusing chart or a widget that doesn't work will now directly lead to user dissatisfaction. Good design means making data sources obvious, often through tooltips that add context and build trust. You can dig deeper into these evolving standards and [see how top dashboard design trends are shaping user experience on uitop.design](https://uitop.design/blog/design/top-dashboard-design-trends/).\n\n### The Details That Make a Difference\n\nThe final layer of polish comes from the small details that turn a good chart into a great one. These are the things that often get overlooked but are absolutely critical for clarity.\n\n- **Clear Labeling:** Every single chart and axis needs a clear, concise title. Don't make people guess what \"Metric A\" or \"Dataset 2\" means. Use plain English to describe exactly what they're looking at, like \"Monthly New Subscribers\" instead of just \"MNS.\"\n- **Strategic Color Use:** Color is a tool, not decoration. Use a neutral palette for the base of your charts and save your bright, attention-grabbing colors to highlight key data points, outliers, or important alerts. And please, make sure your color choices are accessible and have enough contrast for everyone.\n- **Minimalist Interactivity:** A little interactivity goes a long way. The key is to add just enough to empower users without overwhelming them. Hover-over tooltips that show precise data points are fantastic. Drill-downs can be powerful, but use them sparingly and make it obvious that an element is clickable.\n\nBy focusing on these principles, you can elevate your charts from simple data displays into powerful storytelling tools that actually drive understanding and action.\n\n## Improving UX with Smart Interactivity\n\nA dashboard that just throws data at you is only doing half its job. The really great ones invite you to touch, explore, and question what you’re seeing. This is where smart interactivity comes in—it transforms a static report into a dynamic, hands-on tool that makes the whole user experience so much better.\n\nWhen you give users interactive elements, you empower them. They go from being passive observers to active participants, and that engagement is crucial for uncovering deeper insights. The moment a user can instantly filter a massive dataset or click on a chart segment to see the details behind it, they start building a more intuitive feel for the information.\n\n![A dashboard UI with interactive elements like filters and drill-downs](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/13ba3d49-8dc5-4b52-9c18-f2b131412de8.jpg)\n\n### Making Data Exploration Intuitive\n\nThe whole point of interactivity is to make digging into data feel natural, not like a chore. I've seen dashboards with poorly designed filters or confusing navigation that just frustrate people until they give up. This is where thoughtful, intuitive choices for your **dashboard design ui** are absolutely essential.\n\nThink about something as simple as a date picker. A clean, calendar-based selector is almost always a better experience than forcing someone to manually type `YYYY-MM-DD`. Same goes for dropdowns—they should be clearly labeled and ordered in a way that makes sense, whether that’s alphabetical or by importance.\n\nBut the real game-changer is implementing drill-downs. Imagine a user sees a huge sales spike on a summary chart. With a drill-down, they can click that spike and instantly see a breakdown by region, product, or sales rep. This immediate access to the \"why\" behind the numbers is what turns a good dashboard into an indispensable business tool.\n\n### Providing Clear User Feedback\n\nEvery single action a user takes needs an immediate and obvious reaction from the interface. It's this feedback loop that makes a dashboard feel responsive and trustworthy. Without it, users are left clicking and wondering, \"Did that work? Is this thing broken?\"\n\nHere are a few small but powerful ways to give feedback:\n\n- **Hover States:** When a user's mouse passes over a chart element, it should subtly change color or grow slightly. A tooltip should pop up with the precise data point. Simple. Effective.\n- **Loading Animations:** If fetching new data takes a second, show a spinner or a pulsing animation. That little visual cue tells the user, \"Hang on, I'm working on it,\" which is infinitely better than a frozen screen.\n- **Confirmation Messages:** After a user saves a new setting or applies a complex filter, a quick \"Settings saved\" message provides that crucial confirmation and peace of mind.\n\n> A dashboard without feedback is like having a conversation where the other person just stares back silently. It creates uncertainty and kills trust. Clear, immediate feedback makes the entire experience feel polished and professional.\n\nAnd when you're dealing with huge amounts of data, you'll want to ensure everything stays snappy. A great way to do that is with [flawless data pagination](https://blog.dreamspace.xyz/post/how-to-use-cursor).\n\nThe core idea is to make the dashboard work _for_ the user, not the other way around. You want to anticipate their questions and make the path to the answers as short and painless as possible. As you build out your **dashboard design ui**, think through every click, hover, and filter.\n\nFor more on this, check out our guide on [how to make an interactive website](https://magicui.design/blog/how-to-make-an-interactive-website). By putting smart interactivity at the top of your priority list, you're not just creating a tool people _use_—you're building something they genuinely rely on to make better decisions.\n\n## Exploring Advanced UI Techniques\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/9jp_1gHhieA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nOnce you’ve got a solid foundation built, it’s time to start pushing the creative boundaries of your **dashboard design ui**. This is the fun part, where you move from a merely functional interface to something exceptional. We're talking about exploring techniques that add polish, intelligence, and a little bit of magic to elevate the user experience from useful to genuinely memorable.\n\nYou’ve probably noticed emerging trends constantly reshaping what's possible in dashboard design. One of the biggest shifts I’m seeing is the integration of AI to surface personalized insights. Imagine a dashboard that learns a user's habits and proactively highlights the data it _knows_ they'll care about, even before they start clicking around. That changes the game from reactive data exploration to a more proactive, guided discovery.\n\n### Weaving in Subtle Animations\n\nLet's be clear: when I say animation, I don't mean flashy, distracting effects. Thoughtful, subtle animation can transform a static dashboard into a fluid and responsive experience. The goal is to use motion to guide the user's eye and provide context.\n\nEven the simplest, most purposeful animations make a huge difference. Think about when a user applies a filter. Instead of the charts abruptly reloading, what if they smoothly transitioned to their new state? This visual continuity helps the user instantly understand what just changed. A gentle fade-in for newly loaded data can also give the whole interface a much more polished and professional feel.\n\nHere are a few practical ways to apply this:\n\n- **Loading Indicators:** Instead of a generic spinner, use subtle pulsing animations during data refreshes. It assures users the system is working without being obnoxious.\n- **Hover Effects:** Have chart segments slightly grow or brighten on hover. It’s a simple cue that makes it obvious which element is being interacted with.\n- **Bar Chart Transitions:** When data updates, make the bars animate their growth from the baseline. This small detail makes trends and changes feel more dynamic and alive.\n\n### Drawing Inspiration from Unconventional Design\n\nWhile usability will always be my top priority, there's tremendous value in looking outside the box. I always encourage designers to check out unconventional layouts and bold typography for inspiration. These avant-garde designs are often where new ideas are born, ideas that can be toned down and adapted for more practical use. They force you to think beyond the standard grid.\n\nThe evolution of dashboard design is heavily influenced by this kind of creative exploration. Designers are finally being encouraged to break away from traditional UIs by using unique color palettes, layouts, and interactive elements.\n\nRealistically, many of these forward-thinking designs aren't practical for direct implementation—in fact, around **90%** might not fit a real-world business scenario. But they are absolutely essential for sparking new ideas. If you want to see what I mean, you can [explore top dashboard design examples for 2025 on muz.li](https://muz.li/blog/top-dashboard-design-examples-inspirations-for-2025/).\n\n> The goal isn't to copy these unconventional designs directly. Instead, use them as creative fuel. Ask yourself: \"What's the core idea here, and how could I adapt a small piece of it to make my functional dashboard more engaging?\"\n\nMaybe it means using a bolder, more expressive font for a single, critical KPI to give it more visual weight. Or perhaps it involves breaking your grid slightly for one specific module to draw special attention to it.\n\nIt’s all about finding that perfect balance where innovative design choices support and enhance usability, rather than compete with it. By carefully integrating these advanced techniques, you can create a dashboard that's not only effective but is also a genuine pleasure to use.\n\n## Common Dashboard Design UI Questions\n\nEven the best plan hits a few bumps. That's just part of the creative process. When you're deep in a dashboard UI design, certain questions and challenges seem to pop up for everyone. Getting a straight answer on these can save you a ton of rework and help you build something better from the get-go.\n\nLet's walk through some of the most common hurdles I see designers face and break down how to clear them with confidence.\n\n### How Do I Make My Dashboard UI Design Mobile-Friendly?\n\nFirst thing's first: making a dashboard mobile-friendly isn't about shrinking it down. You have to completely rethink the experience. It’s an exercise in ruthless prioritization because mobile screen real estate is incredibly precious.\n\nYou'll want to start with a responsive grid system—that's non-negotiable. It’s the skeleton that lets your layout adapt gracefully. From there, your main job is to identify the **one or two** most critical KPIs. I mean the numbers a user absolutely _needs_ to see while they're on the move. Make those the heroes of the mobile view. Everything else is secondary.\n\nSo what do you do with the rest of the information? You tuck it away neatly using space-saving patterns.\n\n- **Collapsible Menus:** The classic hamburger menu is your friend. Use it for navigation and filters that aren't mission-critical.\n- **Accordions:** Got a few related charts or data sets? Group them under expandable accordion sections so they don't create a wall of scroll.\n- **Tap-Friendly Targets:** Make sure every single button, link, and interactive element is big enough for a thumb to hit easily. It sounds obvious, but it’s a classic rookie mistake.\n\nYour goal here is a focused, glanceable experience, not a miniature clone of the desktop version.\n\n### What Is the Biggest Mistake to Avoid in Dashboard Design?\n\nThis one's easy: **information overload**. It’s the single most destructive mistake you can make. It's that \"kitchen sink\" approach where stakeholders—usually with the best intentions—ask you to cram every possible metric onto one screen. This is the fastest way to make a dashboard completely useless.\n\nWhen every chart and number is screaming for attention, nothing actually gets heard. The user is left staring at a visual puzzle box that takes real mental effort to piece together. This completely defeats the whole point of a dashboard, which is to deliver clear, quick insights.\n\n> If everything is presented as important, then nothing is important. A great dashboard is curated. It’s an opinionated view of what matters most, designed to answer specific questions in seconds.\n\nYour job is to create clarity, not a data dump. You have to prioritize. When someone asks you to add \"just one more chart,\" gently push back and ask, \"What specific decision will this chart help someone make?\" That question alone can work wonders.\n\n### How Can I Choose the Right Color Palette for My Dashboard?\n\nColor is an incredibly powerful tool in your dashboard design UI kit, but it’s got to have a purpose beyond just looking nice. A smart color strategy should make data easier to understand and guide the user's eye to what matters.\n\nYour organization's brand guidelines are a good starting point, but don't be afraid to adapt them for data viz. That vibrant brand orange might be perfect for a button, but it's probably way too overpowering for a background. I almost always start with a neutral palette—think light grays, off-whites, or even muted dark tones—for the main UI containers and backgrounds.\n\nThis lets you reserve your bright, saturated colors for the important stuff:\n\n- Drawing the eye to your most critical KPIs.\n- Signaling alerts or negative trends (red is the universal go-to for a reason).\n- Emphasizing a specific data series in a busy line chart.\n\nFor the charts themselves, don't reinvent the wheel. Stick to established best practices. Use sequential palettes (light to dark of one hue) for ordered data, and diverging palettes (like a blue-to-red scale) when you need to show a range with a clear midpoint. And please, _always_ run your final palette through an accessibility checker. You need to ensure there's enough contrast for everyone to read it clearly.\n\n### Should I Include Data Tables in My Dashboard UI?\n\nAbsolutely, but they should play a supporting role, not the lead. Think of it this way: charts are fantastic for showing trends, patterns, and high-level comparisons at a glance. But they are terrible when you need precision. When a user needs to find an exact value or compare a few specific line items, nothing beats a good old-fashioned table.\n\nThe trick is integrating them without cluttering the main visual overview. You never want to drop a massive, sprawling table front and center. That just brings back the information overload problem. Instead, use tables as a tool for deeper exploration.\n\nA great way to do this is by making tables accessible through a drill-down action. For example, a user clicks on a big slice of a pie chart, and a modal window pops up with a clean table showing the raw data for just that segment. Another solid option is to put detailed tables in a separate tab or section labeled \"Detailed View\" or \"Raw Data.\" This keeps your primary dashboard clean and focused on insights while still giving your power users the granular detail they crave.\n\n---\n\nReady to build dashboards that are not just functional but also visually stunning? **Magic UI** provides a library of over **150** free and open-source animated components built with React, Typescript, and Tailwind CSS. Stop building from scratch and start creating beautiful, responsive interfaces in minutes. Explore the components and accelerate your design process today at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/disable-textarea-resize.mdx",
    "content": "---\ntitle: A Developer Guide to Disable Textarea Resize\ndescription: >-\n  Learn how to disable textarea resize with CSS and JavaScript. This practical\n  guide offers cross-browser examples for perfect UI control.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-b5e0effa-1dee-4605-a144-6459f4c078be.jpg\nauthor: Dillion Verma\ntags:\n  - disable textarea resize\n  - css resize none\n  - textarea styling\n  - ui form design\n  - web development\npublishedOn: \"2025-09-30\"\nfeatured: true\n---\n\nThe quickest way to stop users from resizing a textarea is with a single, simple CSS property: **`resize: none;`**. Just one line of code gives you back control over your layout, preventing users from dragging the corner of a text area and messing up your design.\n\n## Why and When You Should Disable Textarea Resizing\n\nThat little drag handle on a textarea is a default browser feature that seems helpful, but it can quickly become a design nightmare. When a user stretches a textarea, it can shove other elements out of the way, break a carefully planned grid, and generally create a chaotic user experience. Disabling it is all about maintaining layout integrity and giving users a predictable interface.\n\nThis is especially critical in a few common situations:\n\n- **Complex Forms:** Think about registration pages or detailed settings panels. An oversized textarea can completely disrupt the visual flow and make the form a pain to navigate.\n- **Comment Sections:** In a public comment thread, you don't want one user's stretched-out text box to ruin the page layout for everyone else.\n- **Mobile Designs:** On smaller screens, a resizable textarea is often just impractical. It can easily cover up other important buttons or text.\n\n### Keeping the User Experience Stable\n\nGood UI/UX is built on predictability. When elements on a page behave in unexpected ways, it’s frustrating and can even cause people to abandon a form. A 2021 developer survey actually found that **68%** of developers see uncontrolled resizing as a major UX problem.\n\nIt's not just about looks. Over **55%** of those surveyed said that applying `resize: none` directly led to better layout stability, a huge win for forms in industries like finance and healthcare where precision is everything.\n\n> By setting fixed dimensions for a textarea, you’re creating a more stable, professional-looking interface. It subtly communicates that every element is placed with intention, which helps build user trust and improves overall usability.\n\nThe image below breaks down some key data on browser support and how often developers are choosing to turn this feature off.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/6f13f4b6-fa3a-4470-aea0-a1b469fdd4ca.jpg)\n\nAs you can see, while the `resize` property is supported almost everywhere, a huge chunk of websites actively disable it to avoid common user complaints. When you're designing input fields, like those for user feedback, it's always a good idea to check out [best practices for feedback boxes](https://formbricks.com/best-practices/feedback-box) to nail the experience. This idea fits right in with broader https://magicui.design/blog/web-design-best-practices that emphasize consistency and intentional design.\n\n### Textarea Resizing Scenarios Pros and Cons\n\nDeciding whether to allow resizing isn't always a simple \"yes\" or \"no.\" It really depends on the context of your design and what you want the user to be able to do. Here’s a quick breakdown to help you decide.\n\n| Scenario             | Default Resizing (Enabled)                                                                    | Resizing Disabled                                                                                 |\n| :------------------- | :-------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ |\n| **User Flexibility** | **Pro:** Gives users control to expand the input area for long-form text.                     | **Con:** Limits input to a fixed area, which might be frustrating for some users.                 |\n| **Layout Integrity** | **Con:** High risk of breaking the design, pushing elements, and creating visual clutter.     | **Pro:** Ensures the layout remains stable, consistent, and predictable across all devices.       |\n| **Mobile UX**        | **Con:** Can be awkward and difficult to use on small screens, often obscuring other content. | **Pro:** Provides a controlled, predictable experience that works well within mobile constraints. |\n| **Form Complexity**  | **Con:** Can disrupt the flow and visual hierarchy of dense, multi-field forms.               | **Pro:** Maintains the intended structure and makes complex forms easier to navigate.             |\n\nUltimately, disabling resizing is often the safer, more professional choice for most structured web applications. It prioritizes design consistency over a feature that, while occasionally useful, can cause more problems than it solves.\n\n## How to Disable Resizing with the CSS Resize Property\n\nThe most straightforward way to stop users from resizing a textarea is with the CSS `resize` property. It’s a simple but incredibly useful tool that gives you complete control over whether an element can be resized, making it essential for keeping your layout intact.\n\nFor more than a decade, browsers have let users resize textareas by default. While the intention was good—better user experience—it frequently leads to broken or awkward-looking designs. You’ve probably seen it yourself: a user drags a comment box so wide it pushes the sidebar off the page.\n\nWhile **95%** of sites with forms still have this feature enabled by default, my experience shows that a good **30-40%** of developers eventually step in with CSS to either disable it completely or limit it. Just look at major platforms like Twitter and LinkedIn; they almost always set `resize: none` to maintain a consistent, clean user interface.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/6be7c23e-d1f7-4634-b328-5a78799d420a.jpg)\n\n### Locking the Dimensions with Resize None\n\nThe value you’ll reach for most often is `none`. Applying `resize: none;` gets rid of that little drag handle in the bottom-right corner and locks the textarea’s dimensions for good.\n\nYou can add this style in a couple of ways, depending on how your project is set up. If you want to disable resizing on every single textarea across your site, you can just add a global rule to your stylesheet.\n\n```css\ntextarea {\n  resize: none;\n}\n```\n\nHonestly, this one rule is often all you need. But for more fine-grained control, using a class is the smarter way to go.\n\n```jsx\n<textarea className=\"no-resize-textarea\" placeholder=\"I cannot be resized.\" />\n```\n\nThen, in your CSS, you just target that class.\n\n```css\n.no-resize-textarea {\n  resize: none;\n}\n```\n\n### Offering Controlled Resizing Options\n\nSometimes, turning off resizing completely feels a bit too heavy-handed. The good news is that the `resize` property offers a nice middle ground with a few other values:\n\n- **`vertical`**: This lets the user resize the textarea up and down, but not sideways. It’s perfect for things like comment boxes where users might want more room for a long message, but you don’t want them wrecking your horizontal layout.\n- **`horizontal`**: This allows side-to-side resizing but keeps the height fixed. I’ve found this one is much less common, but it can have its uses in certain multi-column designs.\n\n> **Pro Tip:** I almost always recommend `resize: vertical`. It’s the best of both worlds—it gives users the freedom to see more of their text without creating the risk of them completely disrupting the page's flow.\n\nApplying these is just as simple. For instance, if you're building a React component, you could use inline styles right in your JSX.\n\n```jsx\n<textarea\n  style={{ resize: \"vertical\" }}\n  placeholder=\"You can only resize me vertically.\"\n/>\n```\n\nThis kind of component-level styling is incredibly common in modern frameworks. The underlying principle is the same whether you're writing custom CSS, tweaking [global styling settings in WordPress](https://recapio.com/digest/how-to-change-fonts-and-colors-in-wordpress-with-elementor-global-settings-by-mmx), or prototyping with a framework. And if you're a fan of Tailwind, our guide on using the [Tailwind CDN in your HTML](https://magicui.design/blog/tailwind-cdn-html) can show you how to get these styles working in seconds.\n\n## Making Sure It Works Everywhere: Cross-Browser Compatibility\n\nWhile the CSS `resize` property is pretty standard across modern browsers, you can't just set it and forget it. I've seen enough weird visual bugs in my time to know that what works perfectly in Chrome might look slightly off in an older version of Safari or Firefox. The goal is always to write defensive CSS—code that anticipates these quirks and ensures your textareas behave consistently for every single user.\n\nThe most common snag you'll hit comes from the days before `resize` was a web standard. Back then, browsers experimented with their own versions, leading to vendor prefixes like `-moz-resize` for Firefox and `-webkit-resize` for older Chrome and Safari. They're mostly a relic of the past, but including them is a super simple insurance policy for maximum compatibility.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0b1beb0b-915e-4ab9-b455-b8d9346bdfef.jpg)\n\n### Creating a Bulletproof CSS Rule\n\nSo, how do you **disable textarea resizing** reliably? You just need a CSS snippet that covers all your bases—the standard property for today's browsers and the prefixed versions for the stragglers.\n\nHere’s the approach I always use:\n\n```css\n.no-resize-textarea {\n  /* Standard property for modern browsers */\n  resize: none;\n\n  /* Fallback for older Firefox versions */\n  -moz-resize: none;\n\n  /* Fallback for older Chrome and Safari versions */\n  -webkit-resize: none;\n}\n```\n\nBy tossing in the `-moz-` and `-webkit-` prefixes, you’re essentially creating a safety net. Modern browsers will read `resize: none;` and ignore the rest, while older ones will skip the properties they don't understand until they find the one that works. Simple and effective.\n\n> Think of it as providing translations for your code. The standard `resize: none;` is the universal language, but the prefixes ensure that older dialects of CSS are still understood, preventing your layout from breaking.\n\nEven with this fix, it’s always a good idea to test your work. Fire up a few different browsers, or use a tool like [BrowserStack](https://www.browserstack.com/) to simulate various environments. Sometimes a border or padding might render just a little differently, and catching those small inconsistencies is what separates a good user experience from a great one.\n\n### Gaining Advanced Control with JavaScript\n\nWhile CSS is great for setting a static \"no resize\" rule, sometimes you need more finesse. JavaScript is your go-to when you need to **disable textarea resizing** dynamically, based on what a user is doing or the state of your application.\n\nThink about a comment form. You might want to let the user resize the textarea while they're typing, but lock it down once they hit \"Submit.\" This is a perfect use case for JavaScript.\n\nThe trick is to modify the element's style directly. With plain old JavaScript, you can grab the textarea by its ID or class and simply set its `style.resize` property to `\"none\"`. It’s the same CSS rule, just applied on the fly.\n\nHere’s a quick vanilla JS example:\n\n```javascript\n// Find the textarea element in the document\nconst myTextarea = document.getElementById(\"comment-box\")\n\n// Programmatically disable its resize handle\nif (myTextarea) {\n  myTextarea.style.resize = \"none\"\n}\n```\n\n### Implementing in a React Environment\n\nIf you're working in a modern framework like [React](https://react.dev/), you'll approach this a bit differently. Direct DOM manipulation is generally frowned upon. Instead, you'll want to control the textarea's style through state.\n\nThis is where hooks like `useState` and `useEffect` come into play. By tying the `resize` property to a piece of state, the component will automatically re-render with the correct style when that state changes. It’s a much cleaner, more declarative way of building UIs.\n\nHere's how that might look in a simple comment form component:\n\n```jsx\nimport React, { useState } from \"react\"\n\nconst CommentForm = () => {\n  const [isSubmitted, setIsSubmitted] = useState(false)\n\n  const handleSubmit = (e) => {\n    e.preventDefault()\n    // Logic to submit form data...\n    setIsSubmitted(true)\n  }\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <textarea\n        placeholder=\"Add your comment...\"\n        style={{ resize: isSubmitted ? \"none\" : \"vertical\" }}\n        disabled={isSubmitted}\n      />\n      <button type=\"submit\" disabled={isSubmitted}>\n        Submit\n      </button>\n    </form>\n  )\n}\n```\n\nIn this snippet, the `resize` style is conditional. Before the form is submitted, `isSubmitted` is `false`, and the textarea defaults to `'vertical'` resizing. As soon as the user submits, we set `isSubmitted` to `true`, and the style flips to `'none'`, locking it in place.\n\nThis state-driven approach is fundamental to building robust React applications. If you want to get a better handle on these kinds of patterns, our guide on [React best practices](https://magicui.design/blog/react-best-practices) is a great place to dive deeper into managing component state and props effectively.\n\nInstead of just locking users into a fixed-size box, a much more elegant solution is the auto-growing textarea. It's one of my favorite UX patterns because it sidesteps the whole **disable textarea resize** debate. The component simply adapts to the user's input in real time.\n\nIt’s a win-win. You get to maintain control over your layout, and the user gets a seamless, intuitive experience that just _works_.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/34ebd034-9009-4261-b28b-850f00e37ef3.jpg)\n\nThis approach gives you the perfect middle ground between a rigid, fixed element and one that's fully resizable. The textarea starts at a minimal height but expands vertically as the user types more lines. Then, it shrinks right back down when they delete text. This dynamic behavior prevents both layout chaos and the claustrophobic feeling of a tiny input field.\n\n> The core idea here is simple but incredibly effective: match the element's height to its content. This anticipates what the user needs, creating a fluid interface that feels responsive instead of restrictive.\n\n### Crafting the JavaScript Logic\n\nPulling this off just takes a tiny bit of JavaScript to watch what’s happening inside the textarea. The key is to listen for the `input` event. Every time the user types, we'll adjust the element's `height` to match its `scrollHeight`, which is the total height of all its content (even the hidden parts).\n\nThe trick is to first reset the height to `auto`, which lets the browser calculate the natural height, and _then_ immediately set it to the `scrollHeight`. This little two-step ensures the box grows and shrinks perfectly with the text.\n\nHere’s a complete example. We’ll combine some initial CSS with a JavaScript function to handle the dynamic resizing.\n\n```css\n// Your CSS for the textarea\n.auto-grow-textarea {\n  resize: none;\n  overflow-y: hidden;\n  min-height: 50px;\n  box-sizing: border-box;\n}\n```\n\n```jsx\n// React component example\nimport React from \"react\"\n\nconst AutoGrowTextarea = () => {\n  const handleInput = (e) => {\n    const textarea = e.target\n    textarea.style.height = \"auto\"\n    textarea.style.height = `${textarea.scrollHeight}px`\n  }\n\n  return (\n    <textarea\n      className=\"auto-grow-textarea\"\n      placeholder=\"Type here and I'll grow with you...\"\n      onInput={handleInput}\n    />\n  )\n}\n```\n\n## Got Questions? We've Got Answers\n\nEven with the CSS and JavaScript sorted, some practical questions always pop up when you start messing with default browser behavior. Let's tackle a few common ones I hear from other developers.\n\n### Is It Bad for Accessibility?\n\nDisabling resize isn't automatically bad for accessibility, but you have to be smart about it. If you lock a textarea's size completely, you absolutely must make sure its default dimensions are big enough for typical user input. A tiny, fixed box is a huge roadblock for users, especially anyone with visual impairments.\n\nA solid compromise is setting `resize: 'vertical'`. This is my go-to. It stops users from breaking your horizontal layout but still gives them the power to expand the field downwards. That way, they can see everything they've typed without any weird side-scrolling.\n\n> The goal is to balance a clean, predictable design with user comfort. A fixed-size box is fine if it’s generous; a vertically-resizable one is even better for keeping everyone happy.\n\n### Can You Create a Custom Resize Handle?\n\nYou sure can. This is getting into more advanced territory, but it gives you complete control over the look and feel. The first step is to hide the browser's default drag handle by setting `resize: 'none'` in your CSS.\n\nFrom there, you'd add a custom HTML element—maybe a `div` or `span` styled to look like a handle. Then, you'll need JavaScript to bring it to life. By attaching event listeners for `mousedown`, `mousemove`, and `mouseup`, you can write the logic to dynamically adjust the textarea's height and width. This approach lets you define your own rules, like min/max dimensions, and style the handle to perfectly match your app's UI.\n\n### How Do I Restrict Resizing to Just One Direction?\n\nThis is one of the most practical and useful features of the CSS `resize` property. It's super simple to lock resizing to a single axis.\n\n- **`resize: 'vertical'`**: Lets users drag the textarea up and down but not side-to-side. This is the one you'll use **99%** of the time. It’s the perfect middle ground.\n- **`resize: 'horizontal'`**: Locks the height but allows the width to change. It's much less common, but I've seen it used in specific multi-column layouts where vertical space is tight.\n\nUsing these values gives you the best of both worlds: you maintain the stability of your layout while still offering users a bit of helpful flexibility.\n\n---\n\nReady to build UIs that are both beautiful and functional? **Magic UI** offers a library of **150+** free, open-source components to help you create stunning web interfaces in minutes. [Explore our components and templates at Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/drop-down-menu-in-js.mdx",
    "content": "---\ntitle: Build a Modern Drop Down Menu in JS\ndescription: >-\n  Learn to build a responsive and accessible drop down menu in JS. This guide\n  covers HTML, CSS, and modern JavaScript with practical, real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-5debbd37-01c5-4b12-a88f-f9fec532f521.jpg\nauthor: Dillion Verma\ntags:\n  - drop down menu in js\n  - javascript dropdown\n  - web development\n  - ui components\n  - frontend tutorial\npublishedOn: \"2025-11-16T10:29:43.076474+00:00\"\nfeatured: true\n---\n\nCreating a `drop down menu in js` is simpler than you might think. At its core, you're using HTML for the structure, CSS for the looks, and a bit of JavaScript to toggle a class that shows or hides the menu when someone clicks a button. This simple event listener is the magic that handles the menu's visibility.\n\n## Building Your First Drop Down Menu in JS\n\nGetting a custom dropdown menu off the ground starts with a solid foundation in HTML, CSS, and, of course, JavaScript. We'll kick things off by creating the basic structure first, then layer on the interactivity that actually brings it to life. This approach keeps your component clean, reusable, and built with best practices from the get-go.\n\nThe first real step is writing semantic HTML. This isn't just about throwing elements on a page; it’s about building a logical structure that browsers and assistive technologies can actually understand. A standard dropdown usually has a button to trigger the action and a container that holds all the menu links.\n\n### The Core Structural Components\n\nTo get our menu working, we need three key pieces working in harmony. I've found that truly understanding their individual roles makes a huge difference when it comes to troubleshooting and customizing things down the road.\n\nBefore we dive into the code, let's break down the essential elements you'll be working with. Each language plays a distinct, critical role in making the dropdown functional and visually appealing.\n\n| Component              | Language   | Purpose                                                                                       |\n| :--------------------- | :--------- | :-------------------------------------------------------------------------------------------- |\n| **Trigger Element**    | HTML       | Usually a `<button>`, this is what the user clicks to open or close the menu.                 |\n| **Menu Container**     | HTML       | A `<div>` or `<ul>` that holds the list of links or options.                                  |\n| **Visibility Control** | CSS        | Manages the menu's appearance, including its initial hidden state and styling when visible.   |\n| **Event Listener**     | JavaScript | The \"brains\" of the operation; it waits for a user's click and then executes the logic.       |\n| **Class Toggle**       | JavaScript | The action itself—adding or removing a CSS class (e.g., `.is-open`) to show or hide the menu. |\n\nThis table illustrates the separation of concerns—a principle that makes your code much easier to manage and scale. It's the standard for modern web development for a reason.\n\nThis foundational logic is powered by the language that drives the interactive web. In fact, JavaScript is used by **approximately 98.9% of all websites**, making it absolutely essential for creating dynamic features like a responsive `drop down menu in js`. You can explore the data on JavaScript's dominance to see why it remains the undisputed king for client-side functionality.\n\n## Making Your Dropdown Interactive\n\nAlright, with the HTML structure in place, it's time for the fun part: bringing it to life with JavaScript. This is where we go from a static layout to a component that actually _does_ something. The magic here is all about listening for a user's click and then smartly toggling the menu's visibility.\n\n![JavaScript code for a dropdown menu being highlighted in a code editor.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e9f6a7cc-adfd-4b96-9c12-bf93ff1d3da7.jpg)\n\nWe'll start by attaching an **event listener** to the dropdown button. Think of this listener as a guard, constantly waiting for one specific event: a `click`. When that click happens, it triggers a function. This function's only job is to add or remove a CSS class—something simple like `.is-active`—from the menu itself. That little class toggle is the secret sauce for showing and hiding the menu using clean CSS transitions.\n\nBut what happens if the user clicks _away_ from the menu? A dropdown that stubbornly stays open until you click the button again feels awkward and unprofessional. To fix this, we'll add another event listener to the entire document. This lets us check if a click happened outside our dropdown, and if it did, we simply close the menu.\n\n> This small addition makes a huge difference in usability. An intuitive UI anticipates what the user wants to do, and closing a dropdown on an outside click is a perfect example of that. It's one of those subtle touches that makes your work feel polished.\n\n### Managing States and User Intent\n\nEffectively managing the open and closed states of your `drop down menu in js` is what separates a decent script from a really solid one. It's about more than just flipping a class on and off; it's about making the interaction feel predictable and smooth.\n\nHere’s a quick rundown of what the JavaScript needs to do:\n\n- **Select the DOM Elements:** First, you need to grab the button and the menu container from the HTML. A quick `document.querySelector()` for each is all it takes.\n- **Create the Toggle:** Attach a `click` event listener to the button. When clicked, it should toggle an \"active\" class on the menu container.\n- **Detect Outside Clicks:** Add a `click` event listener to the `window`. This one checks if the click's target is outside the menu. If it is, it removes the \"active\" class to close it.\n\nThis approach keeps your JavaScript clean and easy to follow. If you're looking for more tips on creating these kinds of engaging user interfaces, check out our guide on [how to make an interactive website](https://magicui.design/blog/how-to-make-an-interactive-website).\n\n## Making Your Dropdown Accessible to Everyone\n\nGetting a dropdown to work is one thing. Making it accessible is what separates the good from the great. When you focus on accessibility (often called **a11y**), you’re not just ticking a compliance box—you're building a better, more intuitive experience for every single person who visits your site.\n\nIt's easy to overlook these details in the rush to ship, but they're absolutely essential for a professional, solid final product. We'll walk through adding the key attributes and keyboard functionality that ensure your `drop down menu in js` is usable by all.\n\n### Adding ARIA Attributes for Screen Readers\n\nSo, how do you make your dropdown understandable to assistive technologies like screen readers? That's where **Accessible Rich Internet Applications (ARIA)** attributes come in. Think of them as signposts for screen readers, giving context that standard HTML can't on its own. They explain what an element does and what its current state is.\n\nHere are the must-haves for your dropdown:\n\n- **`aria-haspopup=\"true\"`**: Pop this on your dropdown button. It tells screen readers, \"Hey, this button opens up an interactive menu.\"\n- **`aria-expanded=\"false\"`**: This also goes on the button. You'll need to toggle its value with JavaScript—it should be `\"false\"` when the menu is closed and flip to `\"true\"` when it's open.\n- **`aria-controls=\"menu-id\"`**: This attribute connects the button to the menu it controls. Just make sure its value matches the `id` of your menu container.\n\nThese simple additions make a world of difference. It's this kind of dynamic attribute manipulation that helps explain why **63.61% of developers stick with JavaScript** for their front-end work. If you're curious about the numbers, you can [dig into more developer language preferences](https://mycodelesswebsite.com/developer-statistics/) yourself.\n\n> An accessible component is a usable component. When you build with screen readers and keyboard navigation in mind, you inherently create a more predictable and intuitive interface for all users.\n\n### Implementing Keyboard Navigation\n\nBeyond ARIA, full keyboard support is non-negotiable. Many users rely on their keyboard to navigate, so they should be able to operate your menu without ever touching a mouse. This just means listening for a few specific key presses.\n\nYou'll want to set up JavaScript event listeners to handle this. The `Enter` or `Space` keys should open and close the menu, while the `Escape` key should always close it. To move between menu items, the up and down arrow keys should shift the focus. Nail this, and your dropdown won't just be visible—it'll be fully functional for everyone.\n\n## Adding Polished CSS Styles and Animations\n\nA working dropdown is one thing, but a _polished_ one is what truly elevates the user experience. Now that you have the JavaScript logic locked in, it's time for the fun part: making it look good. We'll use CSS to style the menu and add some subtle animations that make every click feel responsive and intentional.\n\nLet's start with the basics: the open and closed states. A clean way to handle this is by using `opacity: 0` and `visibility: hidden` to hide the menu by default. When your JavaScript adds an \"active\" class, we can switch those to `opacity: 1` and `visibility: visible`. This alone creates a simple but effective fade-in effect.\n\n### Crafting Smooth Transitions\n\nBut we can do better than a simple fade. This is where CSS transitions come into play. By transitioning properties like `transform` and `opacity` together, you can create some really slick animations.\n\nFor example, combining a `translateY` transform with an opacity transition gives you a subtle slide-down effect as the menu fades in. This little touch does a great job of guiding the user's eye right where it needs to go.\n\nThis infographic walks through the key stages of building a truly user-centric component, starting with foundational ARIA roles and moving all the way to full interactive support.\n\n![Infographic detailing the process of creating an accessible dropdown menu, showing steps for ARIA, Keyboard, and Screen Reader support.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2c701838-a7cc-479f-bfb7-9af0c1c4a8dc.jpg)\n\nIt’s a great reminder that a polished design is nothing without accessibility. If you're looking for more ideas to bring your components to life, check out this collection of [cool CSS animations](https://magicui.design/blog/cool-css-animations) you can adapt for your own projects.\n\n> A well-crafted animation isn't just decoration; it's a form of communication. It provides feedback, guides focus, and makes the interface feel more responsive and alive.\n\nFinally, don't forget about responsive design. You have to make sure your dropdown looks and works perfectly on any screen. Use media queries to adjust its behavior. Maybe on mobile, it should span the full width of the screen, while on a desktop, it’s a more compact box. This kind of attention to detail is what separates a good component from a great one.\n\nSo you’ve got your dropdown working in vanilla JavaScript, but what happens when you need to bring it into a modern framework like React? This is where things get really interesting. Moving your dropdown logic into a React component isn't just a syntax swap; it’s a complete mindset shift away from direct DOM manipulation.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/IF6k0uZuypA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWith React, you stop telling the browser _how_ to change the UI step-by-step. Instead, you declare what the UI _should_ look like based on its current state. React takes care of the rest, making complex interfaces way easier to manage and debug.\n\nThis component-based approach is why **millions of websites** have been built with [React.js](https://react.dev/). It’s perfect for creating a reusable, stateful dropdown menu that can respond to user actions on the fly. You can [see just how popular React has become on citrusbug.com](https://citrusbug.com/blog/react-statistics/).\n\n### From DOM Manipulation to State Management\n\nThe biggest difference you'll notice is how you handle the dropdown's visibility. Forget about manually adding or removing CSS classes. In React, we'll use the `useState` hook to create a simple boolean variable, like `isOpen`. This single piece of state will be the one and only thing that determines if the menu is visible.\n\nHandling clicks changes, too. Instead of an `addEventListener`, you'll use JSX's built-in `onClick` prop directly on your button. This prop will call a function that does one thing: it toggles our `isOpen` state. It's clean, declarative, and works seamlessly across browsers thanks to React's synthetic event system.\n\n> In React, state is the single source of truth. When the `isOpen` state changes from `false` to `true`, React automatically re-renders the component to show the menu. This removes the need for manual DOM queries and updates.\n\nThis method of encapsulating logic and presentation makes it incredibly simple to build out more complex UIs, like a full navigation bar. If you want to go deeper, check out our guide on [building a navbar in React JS](https://magicui.design/blog/navbar-in-react-js). By building your dropdown as a self-contained component, you create a reusable block you can drop into any project—a far more scalable approach than the vanilla JS equivalent, especially as your application grows.\n\n## Navigating Common JS Dropdown Hurdles\n\nAs you get your hands dirty building JavaScript dropdowns, you'll inevitably run into a few classic \"gotchas.\" I've seen them trip up developers time and time again. Getting ahead of these common issues will save you hours of head-scratching and help you build much more solid components from the get-go.\n\nOne of the first walls people hit is dealing with nested menus. You know, a dropdown within a dropdown. The trick here is all about managing **event propagation**. You have to make sure that clicking a parent item to open a submenu doesn't also fire that \"click outside\" listener that's supposed to close everything. It’s a delicate dance, but getting it right is key for complex navigation.\n\n### Performance and Sneaky Pitfalls\n\nPerformance is another big one, especially if your page is already loaded with interactive bits and pieces. A single dropdown? No big deal. But start scattering dozens of them across your UI without thinking, and you can really bog things down. You've got to be smart about how many event listeners you're attaching to the document.\n\nA rookie mistake I see all the time is adding a _new_ \"click outside\" listener every single time a dropdown opens, but never removing the old one. This is a fast track to memory leaks and all sorts of bizarre, unpredictable behavior.\n\n> Always clean up your event listeners. When a component is no longer needed or gets destroyed, unbind its events. This is just good housekeeping and it’s critical for keeping your UI snappy and responsive.\n\nFinally, let's run through a few quick-fire problems that pop up constantly:\n\n- **The Z-Index Battle:** Your menu is hiding behind another element? Nine times out of ten, the culprit is the `z-index` CSS property. Just give your dropdown container a higher `z-index` value than whatever is overlapping it.\n- **Mobile Mishaps:** Remember, there's no \"hover\" on a touch screen. Your dropdown has to work flawlessly with taps and clicks. While you're at it, make sure the menu items are big enough for fingers, not just mouse cursors.\n- **Forgetting Accessibility:** It's so easy to skip ARIA attributes or proper keyboard navigation, but it's a huge mistake. An inaccessible dropdown doesn't just exclude users; it creates a clunky, frustrating experience for everyone.\n\nKeep these pointers in your back pocket. They'll help you sidestep the most common frustrations and build dropdowns that are not just functional, but truly reliable and user-friendly.\n\n---\n\nReady to build stunning, production-ready UIs without the headache? Explore **Magic UI** and access over **50** customizable components to create beautiful landing pages in minutes. [Start building for free at magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/dropdown-in-react-js.mdx",
    "content": "---\ntitle: Build a Dropdown in React JS From Scratch\ndescription: >-\n  Learn to build a dropdown in React JS with this guide. Covers state, custom\n  hooks, styling with Tailwind CSS, and crucial accessibility (a11y) patterns.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/11e4c787-9233-4172-8161-49cba802eb2c/dropdown-in-react-js-development-illustration.jpg\nauthor: Dillion Verma\ntags:\n  - dropdown in react js\n  - react custom hooks\n  - react accessibility\n  - tailwind css react\n  - react state management\npublishedOn: \"2025-11-22T10:03:15.470048+00:00\"\nfeatured: true\n---\n\nWhen you need to add a **dropdown in react js**, you’re really facing two choices: stick with the native `<select>` element or build a completely custom component from the ground up. The native element gets the job done quickly, but a custom dropdown unlocks total control over styling, behavior, and user experience—something that’s non-negotiable for modern web apps.\n\n## Why Building a Custom React Dropdown Matters\n\n![Developer working on laptop screen showing styling, accessibility, and control options for web interface](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/216bfd2a-d577-43aa-907e-bdd22de136e4/dropdown-in-react-js-web-development-interface.jpg)\n\nDropdowns are everywhere. They guide users through forms, power navigation menus, and make data filtering possible. While just dropping in a browser's default `<select>` tag is tempting for its simplicity, it almost always falls short. Its look and feel are jarringly inconsistent across different browsers and operating systems, and trying to wrestle it into shape with CSS is a notoriously frustrating experience.\n\nThis is exactly why learning to build a custom dropdown in React is such a powerful skill. React’s component-based architecture is the perfect tool for creating UI elements that are reusable, predictable, and entirely under your command.\n\n### The Power of Full Control\n\nWhen you build your own dropdown, you're in the driver's seat for every single detail. This opens the door to features that are simply impossible with a native element. Think about adding icons next to options, creating searchable inputs, or even fetching data from an API as the user types. That level of control lets you craft an experience that truly fits your application's design and functional needs.\n\nPlus, building from scratch forces you to get your hands dirty with core concepts like state management (`useState`), event handling, and accessibility (ARIA attributes), which sharpens your overall React skills in the process.\n\n> By mastering a single, versatile component like a dropdown, you establish a pattern for building other complex UI elements. The principles of state management, event propagation, and accessibility are transferable to modals, tooltips, and more.\n\n### React's Dominance in UI Development\n\nThe demand for this kind of custom work is fueled by React's incredible adoption across the industry. What started as a Facebook project in 2013 now powers over **10.8 million websites**. Its component model has become the de facto standard for building interactive user interfaces for a reason: it enables developers to create the exact sophisticated, bespoke components your users expect—like the dropdown we're about to build.\n\nOf course, starting from a blank slate isn't always necessary. For larger projects, looking into the **[best react component library](https://magicui.design/blog/best-react-component-library)** can save a ton of development time by providing pre-built, accessible components ready for customization. This guide, however, is all about giving you the foundational knowledge to build one yourself.\n\n### Native `<select>` vs Custom React Dropdown\n\nHere's a quick look at the pros and cons of using the browser's default select element compared to a custom React component for your dropdowns.\n\n| Aspect                   | Native `<select>` Element                                                          | Custom React Component                                                          |\n| :----------------------- | :--------------------------------------------------------------------------------- | :------------------------------------------------------------------------------ |\n| **Styling & Branding**   | Extremely limited. Styling is inconsistent across browsers and OS.                 | Complete control. Can be styled to match any brand or design system perfectly.  |\n| **User Experience (UX)** | Basic functionality. No advanced features like search, icons, or multi-select.     | Highly customizable. Can include search, icons, custom animations, and more.    |\n| **Accessibility**        | Accessible by default with built-in keyboard navigation and screen reader support. | Requires manual implementation of ARIA attributes and keyboard navigation.      |\n| **Implementation Speed** | Very fast. Just a few lines of HTML.                                               | Slower to build from scratch. Requires managing state, events, and styling.     |\n| **Dependencies**         | None. It's a standard HTML element.                                                | May require additional libraries for styling (e.g., Tailwind CSS) or animation. |\n\nWhile the native `<select>` element is great for rapid prototyping or simple internal tools, a custom component is almost always the right choice for a polished, production-ready application where user experience and brand consistency are key.\n\nAlright, let's roll up our sleeves and build the core of our custom dropdown. The idea here is to create a smart, reusable component that handles its own state. This makes it a self-contained, predictable piece of your UI that you can drop in anywhere.\n\nWe'll start with the basics: some JSX for the structure and the `useState` hook to bring it to life.\n\n![React dropdown component interface showing result panel with collapsible menu items and navigation icons](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f8d85b06-4305-4e9f-9a57-15cbeb66e263/dropdown-in-react-js-component-interface.jpg)\n\nIn React, state is everything. For our dropdown, we really only need to keep track of two things: is the menu open right now, and what option (if any) has the user picked? This is the perfect job for the `useState` hook.\n\nBy keeping this logic inside the component, we're building what's known as a **controlled component**. This is a core React pattern. It just means our UI will always be a perfect mirror of our state, which saves us from a whole class of bugs and makes the component's behavior much easier to predict.\n\n### Setting Up State with `useState`\n\nFirst things first, let's get our state variables on the board. We need one to manage the open/closed status (we'll call it `isOpen`) and another to hold the currently selected option (`selectedOption`).\n\n```jsx\nimport React, { useState } from \"react\"\n\nconst Dropdown = ({ options, placeholder = \"Select an option\" }) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [selectedOption, setSelectedOption] = useState(null)\n\n  // We'll add our event handlers here in a bit.\n\n  // And the JSX will go right here.\n}\n```\n\nWe'll initialize `isOpen` to `false` because, naturally, the dropdown should start off closed. And `selectedOption` begins as `null` since nothing has been selected yet. Simple enough.\n\n### Building the JSX Structure\n\nWith state ready to go, we can sketch out the visual parts. A typical dropdown has two main pieces: a trigger button that the user clicks and the list of options that pops up.\n\nWe can lean on conditional rendering to show the option list only when `isOpen` is `true`. It's a clean, declarative way to handle UIs that change.\n\n```jsx\n// ... inside the Dropdown component\n\nreturn (\n  <div className=\"dropdown-container\">\n    <button className=\"dropdown-trigger\" onClick={() => setIsOpen(!isOpen)}>\n      {selectedOption ? selectedOption.label : placeholder}\n    </button>\n    {isOpen && (\n      <ul className=\"dropdown-menu\">\n        {options.map((option) => (\n          <li key={option.value} className=\"dropdown-item\">\n            {option.label}\n          </li>\n        ))}\n      </ul>\n    )}\n  </div>\n)\n```\n\nThis gives us a button that shows either the selected option's label or the placeholder text. A click on it simply flips the `isOpen` state.\n\n### Making It Interactive\n\nThe final piece of this initial puzzle is making the options actually do something when you click them. Each list item (`<li>`) needs an `onClick` handler. When a user clicks an item, a couple of things need to happen:\n\n1.  The `selectedOption` state has to update to the one they just chose.\n2.  The menu should close, so we'll set `isOpen` back to `false`.\n\nHere’s how that looks in code:\n\n```jsx\n// ... inside the Dropdown component\nconst handleOptionClick = (option) => {\n  setSelectedOption(option)\n  setIsOpen(false)\n}\n\n// ... and here's the updated list item in the JSX\n;<li\n  key={option.value}\n  className=\"dropdown-item\"\n  onClick={() => handleOptionClick(option)}\n>\n  {option.label}\n</li>\n```\n\nAnd just like that, we have a functional core for our **dropdown in React JS**. It's a solid foundation that manages its state and responds to clicks.\n\nFor a deeper dive into menu components, you might want to check out our guide on **[how to create a drop-down menu](https://magicui.design/blog/how-to-create-drop-down-menu)**, which gets into some other patterns. Up next, we'll make this even better by adding a way to close the menu when the user clicks _outside_ of it.\n\nA dropdown that stays open when you click away from it is a classic sign of a rushed implementation. It's a small detail, but it quickly becomes a huge annoyance, cluttering the screen and creating a messy, frustrating experience for anyone trying to use your app.\n\nThis is where we need to think beyond a simple `isOpen` state. Our component needs to be aware of the world outside itself. The most elegant way to solve this in React is by creating a custom hook. We'll build a neat little hook called `useOnClickOutside` that listens for clicks _anywhere_ on the page and checks if they happened outside our dropdown.\n\nThe beauty of this pattern is its reusability. Once you have this hook, you can drop it into modals, popovers, sidebars—basically any UI element that should gracefully disappear when the user's focus shifts.\n\n### Building a Custom `useOnClickOutside` Hook\n\nSo, how does this work? The core idea is to leverage `useEffect` to attach a global event listener to the browser's `document` when our component mounts. Critically, we'll also remove that listener when the component unmounts to prevent any nasty memory leaks.\n\nInside our event handler, we need a way to know _what_ the user clicked. Was it inside our dropdown or somewhere else? This is the perfect job for the `useRef` hook. We'll attach a ref to our dropdown's main container element, giving us a direct line to that specific piece of the DOM.\n\nHere’s what a practical `useOnClickOutside` hook looks like:\n\n```jsx\nimport { useEffect } from \"react\"\n\nfunction useOnClickOutside(ref, handler) {\n  useEffect(() => {\n    const listener = (event) => {\n      // If the click is inside the ref's element, do nothing\n      if (!ref.current || ref.current.contains(event.target)) {\n        return\n      }\n      // Otherwise, call the handler function\n      handler(event)\n    }\n\n    document.addEventListener(\"mousedown\", listener)\n    document.addEventListener(\"touchstart\", listener)\n\n    return () => {\n      // Clean up the event listeners on unmount\n      document.removeEventListener(\"mousedown\", listener)\n      document.removeEventListener(\"touchstart\", listener)\n    }\n  }, [ref, handler]) // Re-run if ref or handler changes\n}\n```\n\nThe hook is simple: it accepts a `ref` pointing to the element we're watching and a `handler` function to execute when an outside click happens. That cleanup function returned by `useEffect` is absolutely essential for keeping your app performant and bug-free.\n\n### Integrating the Hook into Our Dropdown\n\nNow for the fun part: wiring it all up. Back in our `Dropdown` component, we'll create a ref using `useRef` and attach it directly to the dropdown's container `div`. Then, we just call our new hook, passing it the ref and a simple function to close the menu.\n\n```jsx\nimport React, { useRef, useState } from \"react\"\n\n// Assuming useOnClickOutside is in a separate hooks file\nimport { useOnClickOutside } from \"./hooks/useOnClickOutside\"\n\nconst Dropdown = ({ options, placeholder }) => {\n  const [isOpen, setIsOpen] = useState(false)\n  const [selectedOption, setSelectedOption] = useState(null)\n\n  // 1. Create a ref for the dropdown container\n  const dropdownRef = useRef(null)\n\n  // 2. Call the hook, passing the ref and the closing function\n  useOnClickOutside(dropdownRef, () => setIsOpen(false))\n\n  // ... (rest of the component logic)\n\n  return (\n    // 3. Attach the ref to the main div\n    <div className=\"dropdown-container\" ref={dropdownRef}>\n      {/* ... trigger button and menu ... */}\n    </div>\n  )\n}\n```\n\nAnd that's it! With just a few lines, our **dropdown in React JS** is now way more intuitive and behaves exactly how a user would expect.\n\n> This pattern of combining `useState`, `useEffect`, and `useRef` to build self-contained, intelligent components is a cornerstone of modern frontend development. It lets us encapsulate complex behaviors like outside-click detection into clean, reusable hooks—a huge leap forward from older, more tangled approaches. If you're curious about the history, you can **read about the evolution of dynamic React components**.\n\n## Making It Accessible and Styling It Up\n\nGetting a dropdown to work is one thing, but making it production-ready is another beast entirely. A truly solid component needs to be accessible for _all_ users and look like it belongs in a modern app. This is where we go from a functional prototype to something you'd be proud to ship.\n\nFirst, let's talk accessibility. This isn't just a \"nice-to-have\" feature; it's a core requirement for professional development. We're talking about making your component usable for people who rely on screen readers or can only use a keyboard to navigate. With over **1 billion people** worldwide living with some form of disability, building accessible UI isn't an edge case—it's essential.\n\nThe basic open/close logic of a dropdown is pretty simple, but it's helpful to visualize the flow.\n\n![Flowchart showing dropdown interaction sequence from user click to dropdown opening and closing in React](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e2495743-82d8-4009-bf06-1f6fa539d091/dropdown-in-react-js-user-interaction-flow.jpg)\n\nMapping this out helps clarify the state changes our component needs to handle as a user interacts with it.\n\n### WAI-ARIA for Screen Reader Support\n\nOur custom dropdown is built with generic `div` and `button` elements, which don't mean much to a screen reader on their own. We need to give them semantic context using **WAI-ARIA** (Web Accessibility Initiative – Accessible Rich Internet Applications) attributes.\n\nThese attributes are simple props you add to your JSX, but they make a massive difference:\n\n- **`aria-haspopup=\"listbox\"`**: Put this on the trigger button. It tells assistive tech, \"Hey, this button opens a list of options.\"\n- **`aria-expanded={isOpen}`**: Also on the button. This one dynamically announces whether the menu is currently visible (`true`) or hidden (`false`).\n- **`role=\"listbox\"`**: Add this to the `<ul>` that wraps your options. It clearly defines the container's purpose.\n- **`role=\"option\"`**: Each `<li>` item gets this role, identifying it as a selectable choice within the listbox.\n\nJust a few lines of code, but they completely change the experience for users navigating with assistive tools.\n\n### Getting Keyboard Navigation Right\n\nNext up: keyboard support. A user should be able to do everything with their keyboard that they can with a mouse. This means adding an `onKeyDown` event handler to manage the interactions.\n\nHere’s the standard behavior you’ll want to implement:\n\n1.  **Enter** or **Space** on the button should toggle the dropdown.\n2.  **ArrowDown** and **ArrowUp** should cycle focus through the list items.\n3.  **Escape** should immediately close the menu, no questions asked.\n\nTo pull this off, you'll likely need another piece of state to keep track of the currently highlighted option index. This lets you apply a specific \"active\" style and manage focus as the user presses the arrow keys.\n\n> By combining proper ARIA attributes with full keyboard support, you're not just ticking a box. You're building a component that meets WCAG (Web Content Accessibility Guidelines) standards and creates a better, more inclusive experience for everyone.\n\n### Modern Styling with Tailwind CSS\n\nWith the accessibility foundation in place, we can make it look great. [Tailwind CSS](https://tailwindcss.com/) is perfect for this, letting you build clean, modern designs right inside your component's JSX without writing a separate CSS file. If you're new to it or need a setup guide, we have a post on **[how to install Tailwind CSS](https://magicui.design/blog/tailwind-css-install)** that will get you going fast.\n\nThe real power here comes from applying Tailwind's utility classes based on your component's state. For example, you can easily change the trigger's border color when `isOpen` is `true`, or add a subtle background hover effect to the currently highlighted list item.\n\nLittle details like these add up. In fact, developer communities have shown that well-designed dropdowns can speed up data selection by up to **40%** in complex apps like dashboards. A clean, responsive UI isn't just about looks—it's about making the user's job easier.\n\nOnce you've nailed down the basics of a solid dropdown, it's time to layer in the more advanced features you'll find in production-level applications. These are the patterns that take a simple selector and turn it into a genuinely useful, dynamic tool that actually improves the user experience.\n\nLet's dig into a few techniques I've used to push my own dropdown components to the next level.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/IF6k0uZuypA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### Building an Asynchronous Search Dropdown\n\nPicture a dropdown for picking a user from a database with thousands—or even millions—of entries. Loading all of them upfront would be a performance nightmare, plain and simple.\n\nA much smarter approach is an asynchronous dropdown that fetches data on the fly as the user types. This usually involves placing an input field right inside your dropdown. As the user types, a `useEffect` hook kicks off an API call with their search term.\n\nThe real key here is to **debounce** that API call. You don't want to hammer your server with a new request for every single keystroke. By debouncing, you wait until the user has paused typing for a brief moment—say, **300ms**—before firing the request. This keeps your app feeling snappy and your backend from falling over.\n\n### Implementing Multi-Select Functionality\n\nSo many real-world scenarios require users to select more than one option. Turning your single-select component into a multi-select one fundamentally changes how you handle state. Instead of storing a single selected object, you’ll be managing an array of selected items.\n\nThis means your `handleOptionClick` logic needs a rewrite. When a user clicks an option, your function will need to:\n\n- Check if the item is _already_ in the selected items array.\n- If it is, you remove it from the array (deselecting it).\n- If it isn't, you add it to the array.\n\nThe UI then needs to reflect this state, often by showing the selected items as little \"tags\" in the trigger area or by displaying persistent checkmarks next to the selected options in the list.\n\n### Adding Polished Animations\n\nGood UI is felt as much as it is seen. Subtle animations can make your components feel incredibly polished and intuitive, and dropdowns are a perfect place for them.\n\nIntegrating a library like [**Framer Motion**](https://www.framer.com/motion/) is my go-to for adding smooth open and close transitions. Just wrap your dropdown menu in a `motion` component and define a few states for `initial`, `animate`, and `exit`.\n\n> A simple fade-in paired with a subtle vertical expansion on open gives the user instant, clear feedback. It makes the whole interaction feel less jarring and more connected to the application's flow.\n\n### Optimizing for Performance\n\nFinally, let's talk about performance, especially when your dropdown is packed with options. Every time a parent component re-renders, your dropdown might re-render too, even if its own props haven't changed. This is a classic performance drain.\n\nThe fix? **`React.memo`**.\n\nBy wrapping your `Dropdown` component export with `React.memo`, you're telling React to do a quick props check. If the props (`options`, `placeholder`, `value`, etc.) haven't changed since the last render, React will just skip re-rendering the entire component and its children. This simple one-liner is a huge performance win, ensuring your **dropdown in React JS** stays lightning-fast.\n\n## Common Questions About React Dropdowns\n\nAs you get deeper into building dropdowns, you’ll inevitably run into the same handful of tricky situations that trip up most developers. It’s just part of the process. Getting a handle on these common problems early will save you a ton of debugging headaches down the road and really solidify your understanding.\n\nHere are some of the most frequent questions I see, along with practical, no-nonsense solutions.\n\n### How Do I Close a Dropdown When Clicking Outside?\n\nThis is probably the number one question. You’ve got your beautiful dropdown open, but clicking anywhere else on the page does nothing, and it just hangs there. Annoying, right?\n\nThe cleanest, most reusable way to solve this is with a custom hook—let’s call it `useOnClickOutside`. The idea is pretty simple: inside a `useEffect`, you attach a global `mousedown` event listener to the `document` itself.\n\nThen, you give your dropdown component a `ref` using `useRef`. In the event handler, you just check if the element that was clicked is _outside_ of your dropdown's container (the one with the `ref`). If it is, you trigger the function to close your dropdown. The last crucial piece is to remember the cleanup function in your `useEffect` to remove that event listener when the component unmounts. This prevents memory leaks, which are never fun to track down.\n\n### What's the Best Way to Handle Accessibility?\n\nIf you’re building a custom dropdown from `div`s and `span`s, you are now responsible for making it accessible. This isn't just a \"nice-to-have\"—it's a requirement for any real-world application. The good news is that the strategy boils down to two main things: ARIA attributes and keyboard support.\n\n- **ARIA Attributes**: Think of these as signposts for screen readers. Add `aria-haspopup=\"listbox\"` to the button that opens the dropdown. Use `aria-expanded` to tell assistive tech whether the menu is open (`true`) or closed (`false`). The list container (your `<ul>`) gets a `role=\"listbox\"`, and every single item inside (`<li>`) needs a `role=\"option\"`.\n- **Keyboard Navigation**: Start with a native `<button>` element for your trigger. This gives you focus and basic keyboard events for free. From there, you'll need to handle key presses: `Enter` and `Space` should toggle the menu, `Escape` should close it, and the `ArrowUp`/`ArrowDown` keys should let users move between options.\n\n> By taking the time to implement these features, you’re making sure that users with screen readers or those who can't use a mouse can use your dropdown just as easily as anyone else. It makes a world of difference.\n\n### Should I Use a Library or Build My Own?\n\nAh, the classic build vs. buy dilemma. The answer here really depends on your project's needs and how much time you have.\n\nBuilding your own **dropdown in react js** is an amazing learning exercise. You get total control over the markup, styling, and behavior, which is perfect if you need something simple and highly specific to your design system.\n\nBut let's be realistic. If your dropdown needs advanced features like async search, virtualization to handle thousands of options, or a complex multi-select UI, reaching for a library is often the smarter move. Headless UI libraries like [Radix UI](https://www.radix-ui.com/) are a fantastic middle ground—they give you all the tricky logic and accessibility hooks, but you still get to own the styling completely. On the other end, full-featured libraries like [React Select](https://react-select.com/) provide a complete, out-of-the-box solution that can get you up and running in minutes.\n\n---\n\nReady to build stunning, high-performance web interfaces without starting from scratch? **Magic UI** offers over **150** free, open-source animated components and premium templates built with React, TypeScript, and Tailwind CSS. Create beautiful landing pages in minutes and accelerate your development workflow.\n\nExplore the components at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/faq-template.mdx",
    "content": "---\ntitle: \"10 Best Practices To Create An FAQ Template & Examples For Inspiration\"\ndescription: \"Level up your FAQs! Use these 10 easy tips and inspiring examples to build a user-friendly FAQ template.\"\nimage: https://cdn.magicui.design/assets/592f9fa9-92a3-4317-8b6f-ba28a9a21998.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you challenged by creating an engaging FAQ template or landing page for your project? Crafting an effective, informative, and visually appealing FAQ template can be overwhelming. This article will explore into the best practices for creating an FAQ template as a developer and provide inspiring examples to help you navigate the complexities of a successful FAQ template creation journey.\n\nMagicUI is a [startup landing page template](https://pro.magicui.design/docs/templates/startup) that will help you understand the best practices for creating an FAQ template or page as a developer and find [landing page examples](https://magicui.design/blog/landing-page-examples) for inspiration.\n\n## What Is An FAQ Page?\n\n![FAQ Template](https://images.unsplash.com/photo-1633613286848-e6f43bbafb8d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxxdWVzdGlvbnxlbnwwfHx8fDE3MjA1ODg5MTF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAn FAQ page is a dedicated section on a website that [organizes common questions](https://www.web.com/blog/faq-pages/) and provides quick and simple answers. It is an important tool in customer service, streamlining processes and saving time for both customers and businesses.\n\n### The Value Of A Strong FAQ Page\n\nAn FAQ page is a crucial resource for visitors seeking answers to common questions without having to reach out through live chat or the contact page. It helps businesses build rapport with site visitors and provides a convenient, efficient way to address common client questions.\n\nFAQ Pages can improve SEO rankings by targeting long-tail keywords and attracting organic traffic. This also boosts user experience, letting them feel confident in the company’s services and processes.\n\n### Crafting A User-Friendly FAQ Page: Organization, Updates, And Design\n\nAn effective FAQ page is structured using categories or topics to group similar questions together. Businesses should anticipate and answer questions important to customers to address concerns and provide clarity. Maintaining and updating your FAQ page regularly ensures it stays relevant and accurate. Proper design and easy navigation also ensure users can find answers quickly.\n\n## What Is The Purpose Of An FAQ Page?\n\n![FAQ Template](https://images.unsplash.com/photo-1612832021455-245704c6755a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjA1ODkyOTh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nThe FAQ, or the Frequently Asked Questions landing page, is step one in a customer’s self-service journey and can set the tone for a consumer experience. The FAQ format is important—more than just a Q&A page, your FAQs allow you to demonstrate your brand voice, show off your expertise and creativity, and deepen your relationship with your buyers.\n\nAn excellent FAQ page can increase your website’s organic traffic. Visiting your FAQ landing page could be a critical touchpoint in the conversion funnel because when visitors land on the FAQ page, they want to learn more about your product or service.\n\n### Related Reading\n\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## The Benefits Of FAQ Pages For Self-Service\n\n![FAQ Template](https://images.unsplash.com/photo-1523240795612-9a054b0db644?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxoYXBweSUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMDU4OTMxM3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Self-Service Power Of FAQs\n\nFAQ pages are essential for self-service for several reasons. They contribute to the overall user experience by providing a centralized location where users can easily find answers to their most frequently asked questions. By doing so, FAQ pages can save users time and reduce frustration while helping them learn more about your product or service.\n\n### Deflecting Inquiries With FAQs\n\nOne of the most significant benefits of FAQ pages is that they can help reduce the load on your customer support team. You can limit the number of support tickets and phone calls your team receives by providing answers to common questions on your FAQ page. This, in turn, frees up your team to focus on more complex issues.\n\n### FAQs As A Credibility Booster\n\nA well-crafted FAQ page can establish you in your field. It demonstrates a comprehensive understanding of your product or service, which can help build trust with potential customers and clients.\n\n### FAQs For Strategic Communication\n\nFAQ pages can be used to achieve specific goals, such as promoting new products or services, addressing customer concerns, and providing technical support. For instance, if you know customers' common concerns about your product or service, you can use your FAQ page to address these directly. This can help reassure customers and build trust.\n\n## Free, Open-Source UI Library For Animated Web Experiences\n\n![FAQ Template](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkZXZlbG9wZXIlMjBvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjA1ODkzNDN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI, you can easily create visually appealing and interactive elements that can be seamlessly integrated into web applications.\n\n### Tailor MagicUI Components To Your Brand\n\n[MagicUI](https://magicui.design/) components are highly customizable, allowing you to adapt them effortlessly to match your desired branding and design requirements. MagicUI bridges the gap between design and development, empowering you to craft captivating digital experiences.\n\nWith MagicUI Pro, you can save thousands of hours and create a beautiful landing page to convert your visitors into customers. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 10 Best Practices To Create An FAQ Template\n\n![FAQ Template](https://images.unsplash.com/photo-1633180888652-c561b86040f1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyMDU4OTM1NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Structuring The FAQ Page\n\n#### Organizing Your FAQ Page By Topic\n\nWhen setting up an FAQ page, it's crucial to consider how to structure it to ensure optimal user experience. Organize the FAQ page by topic instead of presenting all the questions and answers in a long, heavy list. This way, users can easily find the information they're looking for.\n\n#### Separate FAQ Pages For Varied Audiences\n\nIf your business has a wide array of services or products, create separate FAQ pages for different audiences or use cases. By structuring your FAQ page around the most commonly asked questions, you can adopt the language patterns of your audience, making the content more scannable and enhancing the overall customer experience.\n\n### 2\\. Format And Layout Selection\n\nChoosing the right format and layout for your FAQ page is essential to keeping it visually appealing and easy to navigate. Several formats can be used depending on your business's size and complexity.\n\nA simple webpage displaying FAQs in normal text might suffice for smaller brands or those just starting. If you have a more elaborate FAQ section, using accordions or tabs can help present a wealth of information in an organized manner. These features also keep users engaged on a single page, enhancing the overall experience.\n\n### 3\\. Using A Logical URL Structure\n\nMaintaining a consistent and straightforward URL structure can help keep your FAQ pages [organized for users and search engines](https://developers.google.com/search/blog/2023/08/howto-faq-changes). Depending on your business size, you may have only one FAQ page or separate category pages with child pages dedicated to specific FAQ topics. Ensuring a logical URL structure makes it easier for users to find the necessary information and helps search engines index and rank your pages efficiently.\n\n### 4\\. Leveraging Internal Linking\n\nIntegrating internal links within your FAQ pages can significantly enhance user navigation and improve search engine rankings. Internal links allow users to navigate between different sections of your website easily. Using descriptive anchor text when creating internal links is crucial, as it helps users understand the content they will find on the linked page. Internal linking enhances search engine bots' ability to effectively discover and index your pages.\n\n### 5\\. Including Contact Information\n\nAdding your contact information to the FAQ section can be immensely beneficial in helping users get answers to their questions. Easy access to your contact details increases the chances of users becoming customers. This approach streamlines the communication process and builds trust and credibility with your audience.\n\n### 6\\. Keeping FAQs Updated\n\nMaintaining updated information within your FAQ section is crucial for building user trust. Outdated information can lead to frustration and deter potential customers from engaging with your business. Regularly updating your FAQs ensures users receive accurate and relevant information, enhancing their overall experience and perception of your brand.\n\n### 7\\. Using FAQ Schema\n\nUtilizing schema markup, such as FAQ schema, can help search engines better understand and display your FAQ content in search results. Although Google has recently limited FAQ-rich results to specific authoritative websites, adding schema to your FAQs can improve search engine visibility. By implementing FAQ schema, you can enhance the appearance of your content on search engine results pages and provide users with valuable information upfront.\n\n### 8\\. Incorporating A Search Bar\n\nIncluding a search bar on your FAQ page allows users to find answers to their questions quickly. Instead of scrolling through a long list of FAQs, users can conveniently search for keywords or phrases related to their queries. A search bar enhances user experience by saving time and providing direct access to the information they seek.\n\n### 9\\. Organizing Questions By Category\n\nStreamline the user experience by dividing FAQs into categories based on overarching topics like:\n\n- Products\n- Security\n- Billing\n\nCategorizing questions makes it easier for users to navigate related inquiries and efficiently find the information they need. By organizing questions based on categories, you enhance the usability of your FAQ page and cater to diverse user needs.\n\n### 10\\. Linking Top Questions\n\nHighlighting popular or frequently asked questions at the top of your FAQ page can further enhance user experience. By categorizing top questions separately and providing quick access links to their answers, you streamline the navigation process for users. This approach ensures that users can easily find answers to commonly asked questions without having to search extensively, improving overall user satisfaction and engagement.\n\n## Examples Of Great FAQ Pages To Inspire Your FAQ Template\n\n![FAQ Template](https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxvbiUyMHdlYnNpdGV8ZW58MHx8fHwxNzIwNTg5MzY4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Zoom's FAQ Page\n\nZoom offers a [well-organized FAQ page](https://support.zoom.us/hc/en-us/articles/206175806-Frequently-Asked-Questions-FAQ-) structured into categories to help customers find answers quickly and efficiently. The page includes categories like:\n\n- Getting Started\n- Meetings and Webinars\n- Account Management\n\nEach question is accompanied by a clear answer and additional resources, making it easy for users to resolve their issues. Zoom offers a search function to streamline further the process of finding information on their FAQ page.\n\n### 2\\. Dropbox's FAQ Page\n\nDropbox's FAQ page is designed with simplicity and clarity in mind. The questions are logically categorized, and the answers are concise, providing users with helpful details. In addition to text-based answers, Dropbox includes multimedia elements like videos and screenshots to enhance user understanding. The step-by-step instructions and links to relevant articles enhance the user experience on Dropbox's FAQ page.\n\n### 3\\. Shopify's FAQ Page\n\nShopify's FAQ page doesn't require a search bar due to its concise nature, with only 14 questions. Users can browse the page by clicking on one of the four topics on the left-hand side or by scrolling down to view all questions and answers on a single page. This simple yet effective design allows users to [find the necessary information](https://www.shopify.com/faq) without extensive searching quickly.\n\n### 4\\. Wikipedia's FAQ Index\n\nWikipedia's FAQ index [mirrors the formatting](https://en.wikipedia.org/wiki/Wikipedia:FAQ/Index) of its articles, providing users with a familiar layout. Users can search through all the FAQs at the top of the page or browse overarching topics within the categories of \"General\" and \"Specific.\" Each topic redirects users to a separate page listing all questions and their corresponding answers, ensuring a seamless browsing experience.\n\n### 5\\. Adobe Creative Cloud's FAQ Page\n\nAdobe Creative Cloud's FAQ page features a search bar at the top and specifies that the content applies to the 2018 version of Creative Cloud. Users can [easily search between topics](https://helpx.adobe.com/creative-cloud/faq.html) at the top of the page, with each topic linking to questions and answers within the section. The straightforward layout of Adobe Creative Cloud's FAQ page allows users to access the information they need without disruptions quickly.\n\n### 6\\. Etsy's FAQ Page\n\nTo achieve a [smooth browsing experience](https://help.etsy.com/hc/en-us), Etsy's FAQ page incorporates the following elements:\n\n- Informative\n- Straightforward\n- Aesthetically pleasing\n\nPopular articles are listed with overarching topic names, and users can access further articles within each topic by clicking on individual articles. The page is neatly organized, with topics divided into easy-to-understand parent categories, making it effortless for users to find relevant information.\n\n### 7\\. Twitter's FAQ Page\n\nTo simplify user browsing, Twitter's FAQ page is organized into four main categories:\n\n- Using Twitter\n- Managing your account\n- Safety and Security\n- Rules and Policies\n\nEach category is further segmented into specific sections, guiding users to relevant articles covering various topics. Twitter's FAQ page [offers a comprehensive resource](https://help.twitter.com/en) while maintaining a user-friendly design.\n\n### 8\\. Airbnb's FAQ Page\n\nAirbnb's support page features a clean, minimalist design that is [visually appealing](https://www.airbnb.com/help/home) and well-thought-out. Users can use a search bar at the top of the page for faster access to help articles or log in for personalized support. Popular articles are prominently displayed for users, with illustrations highlighting other topics like booking and traveling. The last section of the page covers technical and general information, ensuring users can easily find the information they need on Airbnb's FAQ page.\n\n### 9\\. Netflix's FAQ Page\n\nNetflix's FAQ section features a user-friendly design that encourages users to utilize the search bar at the top of the page. By emphasizing the search feature, Netflix simplifies finding information for users. The page also offers personalized support through sign-in and highlights popular topics for convenience, enhancing the overall user experience on Netflix's FAQ page.\n\n### 10\\. Microsoft's FAQ Page\n\nMicrosoft's FAQ page utilizes an accordion template that expands when users choose a specific category to access information promptly. Users can select between two product categories to find relevant articles without unnecessary scrolling:\n\n- Windows\n- Office\n\nThe layout is particularly convenient for mobile users, allowing them to access information efficiently. Microsoft's straightforward Q&A style ensures users can quickly find answers to their questions without unnecessary complexities.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library For Design Engineers\n\n[MagicUI](https://magicui.design/) is a revolutionary free and open-source UI library designed for design engineers. It offers an impressive collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese components provide visually appealing and interactive elements that can be integrated into web applications, making it easier to create stunning user interfaces with minimal effort.\n\nMagicUI's highly customizable components allow easy adaptation to match desired branding and design requirements.\n\n### Bridging Design and Development\n\nWith a strong focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### MagicUI Pro's Time-Saving Features\n\nIn addition to the free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) offers a premium service that can save users thousands of hours and help create beautiful landing pages that convert visitors into customers. By leveraging MagicUI Pro's website templates, users can easily enhance their online presence and drive engagement.\n\n### Level Up Your UI Design\n\nIf you're ready to take your UI design to the next level and boost your website's performance, try MagicUI today using our [startup landing page template](https://pro.magicui.design/docs/templates/startup). Start creating stunning digital experiences with ease and efficiency!\n"
  },
  {
    "path": "apps/www/content/blog/framer-motion-react.mdx",
    "content": "---\ntitle: A Guide to Framer Motion React Animation\ndescription: >-\n  Create stunning web animations with this complete Framer Motion React guide.\n  Learn setup, variants, transitions, and advanced gesture-based animations.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-ff3c3e5c-d60f-41e3-a2eb-9106b51c3fe7.jpg\nauthor: Dillion Verma\ntags:\n  - framer motion react\n  - react animation\n  - web animation\n  - motion components\n  - react ui\npublishedOn: \"2025-11-11T09:44:19.173075+00:00\"\nfeatured: true\n---\n\nIf you've spent any time building with React, you know that a static interface just doesn't cut it anymore. Users expect fluid, responsive feedback—interactions that feel alive. This is where Framer Motion comes in, and frankly, it's a game-changer for bringing those dynamic experiences to life without pulling your hair out.\n\nFramer Motion is a production-ready animation library that gives you a simple, declarative way to create incredibly fluid and complex animations. It’s designed by developers, for developers, turning static UI elements into something truly interactive with surprisingly little code. The beauty of it is that it handles the complex animation logic for you, letting you **build gorgeous UIs fast.**\n\n## So, Why Framer Motion for React Animation?\n\n![A vibrant abstract graphic representing motion and animation concepts in web development.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/915e8387-5314-4f30-b8fa-d4a84b2d12ae.jpg)\n\nIn modern web development, user experience is everything. A great animation library isn't just a nice-to-have; it's a core part of your toolkit. For anyone working on **framer motion react** projects, this library is a standout because of its unique blend of simplicity and raw power.\n\nIts declarative API means you describe _what_ you want to animate, not get tangled up in the _how_. Forget manually wrestling with animation states using `useEffect` hooks and messy CSS classes. With Framer Motion, you just define the target state, and it smoothly handles the transition. This approach keeps your code incredibly clean, readable, and much easier to manage as your app scales.\n\n### Built for a Great Developer Experience and Peak Performance\n\nWhat really makes Framer Motion feel different is its dedication to animations that feel natural. It's not just about simple CSS transitions. The library incorporates physics-based animations, like springs, that mimic how things move in the real world. This results in interactions that feel more responsive, intuitive, and just plain better.\n\nPerformance is also front and center. Framer Motion is heavily optimized to use hardware acceleration, ensuring your animations stay buttery smooth and jank-free, even on less powerful devices. This combination of robust features and stellar performance is exactly why it has become the go-to animation library in the React world, boasting over **10 million monthly npm downloads**.\n\n> Framer Motion’s real magic is how it simplifies complex UI animations into clean, reusable code. It gives you the fundamental building blocks for everything from a simple button hover to sophisticated, orchestrated page transitions.\n\nThis mix of a dead-simple API and powerful capabilities makes it a top contender. If you're curious how it stacks up against the competition, take a look at our breakdown of the best [React animation libraries available today](https://magicui.design/blog/react-animation-libraries).\n\n## Getting Your Hands Dirty: Your First Motion Component\n\nDiving into [Framer Motion](https://www.framer.com/motion/) within a [React](https://react.dev/) project is surprisingly painless. The library is built to feel like a natural extension of React, letting you turn any regular HTML or SVG element into an animatable powerhouse with a single prefix: `motion`. This simple concept is your ticket to everything else the library can do.\n\nThink of the `motion` factory as a superpower for your JSX. Just by swapping `<div />` for `<motion.div />`, you've instantly unlocked a whole new set of animation props for that element. This tiny change is huge—it lets you define states, transitions, and gesture-based interactions right on the component itself. Your animation logic lives exactly where it should: with the element it affects.\n\n### The Core Animation Props\n\nTo make an element move, you'll mostly be working with a handful of key props that describe its different animated states. You simply declare _what_ the animation should look like at various points, and Framer Motion handles all the complex math to create a smooth animation between those states. It feels almost like magic.\n\nHere are the main players you'll use constantly:\n\n- **`initial`**: This defines the component's state the moment it first renders. It's your starting line. For example, an element could start with an opacity of **0** or be positioned just off-screen.\n- **`animate`**: This is where you want the component to animate _to_ after it mounts. It's the end state of your initial animation.\n- **`whileHover`**: A super handy prop that specifies an animation state active _only_ when the user's cursor is over the element. It automatically animates to this state on hover and then gracefully returns to the `animate` state when the cursor leaves.\n- **`transition`**: This prop gives you deep control over the _how_ of the animation. Want to change the duration? The easing? Want to use a physics-based spring instead of a timer? This is the prop for you.\n\n### Let's Build an Interactive Button\n\nOkay, let's put this theory into practice with a classic example: an interactive button that scales up when you hover over it. It's a small detail, but this kind of user feedback makes an interface feel alive and responsive.\n\nFirst things first, make sure Framer Motion is added to your project. If you haven't already, run this in your terminal:\n`npm install framer-motion`\n\nNow, let's create the component. Peep how we import `motion` and then immediately use `motion.button` to create our special, animatable button. The props we add describe the exact behavior we want, no messy setup required.\n\n```jsx\nimport { motion } from \"framer-motion\"\n\nconst AnimatedButton = () => {\n  return (\n    <motion.button\n      className=\"rounded-lg bg-blue-600 px-6 py-3 font-semibold text-white shadow-lg\"\n      whileHover={{ scale: 1.1 }}\n      transition={{ type: \"spring\", stiffness: 400, damping: 10 }}\n    >\n      Click Me\n    </motion.button>\n  )\n}\n\nexport default AnimatedButton\n```\n\n> Just look at that. With only two props, `whileHover` and `transition`, we've created a physically-based, interactive animation. This is the absolute beauty of Framer Motion: achieving seriously impressive results with minimal, easy-to-read code.\n\nIn this example, the button will smoothly scale to **110% of its original size** on hover. Better yet, it's driven by a spring animation that feels bouncy and natural, not robotic. And just like that, you've built your first motion component. This fundamental pattern is the same one you'll use to build much, much more complex animations down the road.\n\n## Orchestrating Animations With Variants\n\nWhile plugging props like `initial` and `animate` directly onto a component works great for simple effects, things can get out of hand quickly. Imagine trying to manage an element with five different animation states. Shoving all that logic directly into your JSX would be an absolute nightmare to read and maintain.\n\nThis is exactly where [Framer Motion](https://www.framer.com/motion/)'s `variants` API comes in and saves the day.\n\nVariants let you define your animation states ahead of time in a clean, reusable object. You just give each state a name—like `visible`, `hidden`, or `expanded`—and then tell your `motion` component which one to use by name. This pulls all the messy animation logic out of your component tree, making your code infinitely cleaner and easier to scale.\n\nThe basic idea is simple: install, code, animate. Variants just make that \"code\" step much more organized.\n\n![Infographic showing a three-step process for Framer Motion: Install, Code, and Animate, represented by icons.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/97824ba2-367b-4042-ae84-86fa47dc0274.jpg)\n\nThis workflow is straightforward for a single component, but variants truly shine when you need to coordinate these states across multiple elements, keeping everything consistent and manageable.\n\n### Refactoring to Variants\n\nLet's revisit our earlier button example and refactor it to use variants. Instead of defining the animation states with inline objects, we'll create a dedicated `buttonVariants` object. This small change immediately makes our component's intent clearer and sets us up for adding more complex states down the road without making a mess.\n\n```jsx\nimport { motion } from \"framer-motion\"\n\n// Define our animation states in a variants object\nconst buttonVariants = {\n  initial: {\n    scale: 1,\n    boxShadow: \"0px 0px 0px rgba(0, 0, 0, 0.2)\",\n  },\n  hover: {\n    scale: 1.1,\n    boxShadow: \"0px 8px 15px rgba(0, 0, 0, 0.3)\",\n    transition: {\n      type: \"spring\",\n      stiffness: 400,\n      damping: 10,\n    },\n  },\n}\n\nconst AnimatedButton = () => {\n  return (\n    <motion.button\n      className=\"rounded-lg bg-blue-600 px-6 py-3 font-semibold text-white\"\n      variants={buttonVariants}\n      initial=\"initial\"\n      whileHover=\"hover\"\n    >\n      Hover Me\n    </motion.button>\n  )\n}\n\nexport default AnimatedButton\n```\n\nLook how much cleaner that `motion.button` component is now! We just pass our `buttonVariants` object to the `variants` prop, and then reference the state names (`initial`, `hover`) as simple strings. This approach scales beautifully.\n\n> By decoupling animation definitions from the component’s JSX, variants make your code more declarative and easier to debug. You can export, import, and reuse these variant objects across your entire application.\n\nSometimes, seeing the difference laid out helps clarify why one approach is better than the other.\n\n### Animation Props vs Variants\n\n| Feature           | Direct Props (e.g., animate=\\{\\{...\\}\\}})     | Variants (e.g., variants=\\{\\{...\\}\\})       |\n| :---------------- | :-------------------------------------------- | :------------------------------------------ |\n| **Readability**   | Poor for complex states. JSX gets cluttered.  | Excellent. Separates logic from markup.     |\n| **Reusability**   | Low. Logic is tied directly to the component. | High. Can be imported and used anywhere.    |\n| **Scalability**   | Difficult. Adding new states is cumbersome.   | Simple. Just add another key to the object. |\n| **Orchestration** | Manual and complex.                           | Built-in via parent-child propagation.      |\n\nUltimately, while direct props are fine for one-off animations, variants provide a far more robust and maintainable system for any real-world application.\n\n### Creating Cascading Effects With StaggerChildren\n\nThe real magic of variants happens when you start orchestrating animations between parent and child components. A classic UI pattern is a list where each item animates in one after another, creating a slick cascading or \"stagger\" effect. Framer Motion makes this incredibly simple with the **`staggerChildren`** property.\n\nHere’s how it works: you define variants for both a container element and its children. The parent's `transition` prop can then include `staggerChildren`, which is just a number that specifies the delay (in seconds) between each child's animation starting.\n\nImagine a list of items you want to animate in:\n\n- **The Container (`motion.ul`):** This will have a `visible` variant that includes a `transition` with the `staggerChildren` property.\n- **The Items (`motion.li`):** Each list item will have its own `hidden` and `visible` variants.\n\nWhen the parent's `animate` prop switches to `\"visible\"`, it automatically triggers the same animation on all its `motion` children. But thanks to `staggerChildren`, it applies the specified delay between each one. This creates a sophisticated, sequential animation without you having to write any complex timers or manual state-juggling logic.\n\nThis one feature unlocks some of the most professional-feeling UI animations you can build, and it's a perfect example of why variants are so powerful.\n\n## Fine-Tuning Motion With Custom Transitions\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/bOgUXDibygM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nThe true character of an animation isn’t just about where it starts and ends. It’s in the _feel_—that subtle timing, bounce, and flow that makes it come alive. While the `initial` and `animate` props in **framer motion react** set the stage, the `transition` prop is where you get to play the director and inject some real personality.\n\nThink of it as the bridge between states. Mastering the `transition` prop is what separates a generic, robotic movement from one that feels intentional and unique to your app.\n\nBy default, Framer Motion often uses a gentle `spring` animation, which is great for many situations. But sticking to the defaults can make your UI feel like a template. The `transition` prop opens up the animation engine, giving you the controls to craft motion that perfectly matches your brand's style, whether that's quick and energetic or smooth and sophisticated.\n\n### Choosing the Right Transition Type\n\nFramer Motion comes with several animation types out of the box, and each one is suited for different kinds of interactions. Once you get a feel for their distinct characteristics, you can pick the perfect tool for any job.\n\n- **`spring`**: This is the default, physics-based animator. Instead of setting a rigid duration, you control its behavior with properties like **`stiffness`** and **`damping`**. It's perfect for creating lively, natural-feeling movements that respond realistically to what the user is doing.\n- **`tween`**: This is your classic, duration-based animation. You define a specific **`duration`** and an **`ease`** curve, which gives you predictable and consistent timing. Tweens are ideal for UI elements that need to get from point A to point B in a set amount of time, like a sidebar sliding into view.\n- **`inertia`**: This one is specially designed for animations that need to gradually slow down after a user gesture, like when you \"flick\" a draggable element. It cleverly calculates the velocity of the gesture and continues the motion, decelerating smoothly until it comes to a stop.\n\n> The choice between `spring` and `tween` really comes down to purpose. I use `spring` for interactive, user-driven animations that need to feel responsive. For programmatic, state-driven animations where precise timing is non-negotiable, I always reach for `tween`.\n\n### Crafting Custom Animation Curves\n\nLet's walk through a practical example. Imagine we have a modal backdrop that needs to fade in smoothly when the modal appears. A `tween` is the perfect fit here because we want a controlled, predictable fade over a specific timeframe.\n\nHere’s how you’d set that up:\n\n```jsx\nimport { motion } from \"framer-motion\"\n\nconst backdropVariants = {\n  hidden: { opacity: 0 },\n  visible: {\n    opacity: 1,\n    transition: {\n      type: \"tween\",\n      duration: 0.3,\n      ease: \"easeInOut\",\n    },\n  },\n}\n\nconst ModalBackdrop = () => (\n  <motion.div\n    className=\"bg-opacity-50 fixed top-0 left-0 h-full w-full bg-black\"\n    variants={backdropVariants}\n    initial=\"hidden\"\n    animate=\"visible\"\n  />\n)\n```\n\nIn this snippet, we’ve specified a `tween` with a duration of **0.3 seconds** and an `easeInOut` curve. This ensures the fade feels gradual and polished, not abrupt. Even tiny tweaks to these values can dramatically change how the interaction feels to the user.\n\nAs you get deeper into animation, the ability to be [defining custom actions](https://mutedeck.com/blog/custom-actions-for-everything-mutedeck-v21/) becomes critical for creating truly unique and responsive transitions. This same level of control over timing and easing can be applied to animations triggered by scrolling, a technique you can dive into with our guide on [CSS animation on scroll](https://magicui.design/blog/css-animation-on-scroll). Fine-tuning these little details is ultimately what separates a good UI from a great one.\n\n## Advanced Animation With Gestures and Layouts\n\n![Abstract visual representation of interactive gesture and layout animations in a user interface.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d36762f0-c934-4d2d-9c18-e880f144f8b6.jpg)\n\nOnce you’ve nailed down states and transitions, it’s time to level up by making your UI respond directly to user input. This is where the real magic of **Framer Motion in React** comes into play. We're moving beyond animations that just _look_ nice and into experiences that feel genuinely interactive.\n\nGesture animations are your ticket to building interfaces that feel tactile and alive. While helpers like `whileTap` and `whileHover` are great for quick feedback, the real fun begins when you let users physically manipulate elements on the screen.\n\n### Making Elements Interactive With Gestures\n\nThe `drag` prop is easily one of the coolest features in the library. Just add `drag` to any motion component, and it's instantly draggable. You can even lock it to an axis by setting it to `drag=\"x\"` or `drag=\"y\"`. It's that simple.\n\nLet's put this into practice with a draggable card that can only be moved within a specific area. This is a super common pattern you see in customizable dashboards or interactive onboarding flows.\n\n```jsx\nimport { useRef } from \"react\"\nimport { motion, useMotionValue, useTransform } from \"framer-motion\"\n\nconst DraggableCard = () => {\n  const constraintsRef = useRef(null)\n\n  return (\n    <motion.div\n      ref={constraintsRef}\n      className=\"flex h-64 w-64 items-center justify-center rounded-lg bg-gray-200\"\n    >\n      <motion.div\n        className=\"h-32 w-32 cursor-grab rounded-xl bg-purple-600\"\n        drag\n        dragConstraints={constraintsRef}\n        whileTap={{ cursor: \"grabbing\", scale: 1.1 }}\n      />\n    </motion.div>\n  )\n}\n\nexport default DraggableCard\n```\n\nIn this snippet, the purple `div` is draggable, but the `dragConstraints` prop keeps it from leaving its gray parent container. We also tossed in a `whileTap` prop to give the user some instant feedback—the cursor changes and the card scales up the moment you click down.\n\n### Creating Seamless Layout Animations\n\nOne of the most impressive effects in modern UI is the \"magic move,\" where an element smoothly animates between different positions and sizes as the layout shifts. Framer Motion makes this incredibly complex task feel almost trivial with its layout animations.\n\nAll you have to do is add the `layout` prop to a motion component. That’s it. You're telling Framer Motion to automatically handle the animation whenever its position in the DOM changes. This is a game-changer for things like reordering lists, expanding accordions, or switching between tabs.\n\n> When you have a bunch of components that need to animate their layouts together, wrap them in a `<LayoutGroup>` component. This tells Framer Motion they're all part of the same choreographed move, resulting in perfectly synchronized and seamless transitions.\n\n### Graceful Exits With AnimatePresence\n\nSo what happens when you remove a component from the DOM? React just yanks it out, which can feel abrupt and jarring to the user. `AnimatePresence` is Framer Motion's elegant answer to this problem, allowing components to animate _out_ before they're unmounted.\n\nIt works like this:\n\n- Wrap your dynamic components in `<AnimatePresence>`.\n- Make sure every child has a unique `key` prop so Framer Motion can track it properly.\n- Add an `exit` animation to the child component that defines how it should disappear.\n\nThis little touch is what separates a good UI from a great one. Think about a to-do list where items fade out gently when you delete them, or a modal that gracefully slides off-screen when closed. It makes your app feel polished and complete. For more ideas on this front, check out some of these other powerful [React animation examples](https://magicui.design/blog/react-animation-examples) that use similar principles.\n\n## Common Questions About Framer Motion\n\nAs you start weaving **framer motion react** into your projects, you'll probably bump into a few common questions. Let's tackle them head-on, because figuring this stuff out early will save you a ton of headaches later and help you build much slicker, faster apps.\n\n### Is Framer Motion Bad for Performance?\n\nThis is usually the first thing on everyone's mind. Does all this slick animation come with a performance penalty? The short answer is: not really. Framer Motion is seriously optimized. It's smart enough to offload animations to the GPU whenever possible by sticking to hardware-accelerated properties like `transform` and `opacity`.\n\nBut, you can still shoot yourself in the foot. If you start animating layout properties like `width`, `height`, or `backgroundColor`, the browser has to do a lot more work—recalculating layouts and repainting the screen. That’s what leads to that dreaded janky, stuttering feeling. For the smoothest ride, stick to transforms and opacity.\n\n### How Does It Work with SSR and Production Builds?\n\nThe next big question is usually about Server-Side Rendering (SSR). Can you use Framer Motion in a framework like [Next.js](https://nextjs.org/)? Absolutely, but there's a tiny catch. Animations are a client-side thing, so sometimes they don't play perfectly with the initial server-generated HTML.\n\nLuckily, there are a few solid strategies to get around this:\n\n- **Lazy Loading:** Use `next/dynamic` to pull in your animation-heavy components only after the page has loaded on the client's browser.\n- **The `LazyMotion` Component:** This is a gem. Wrap parts of your app with `<LazyMotion>` to code-split Framer Motion itself. This keeps your initial bundle tiny by only loading animation features when they're actually needed.\n- **The `initial` Prop:** A simple fix is to set `initial={false}` on a motion component. This tells it to skip the very first animation on page load, completely avoiding any mismatch between the server and client render.\n\nCode-splitting the library is a huge win. It shrinks the initial payload your user has to download, which directly impacts load times. In fact, on complex pages, this can improve First Contentful Paint by up to **30%**.\n\n### Should I Stop Using CSS Animations Altogether?\n\nFinally, people often wonder if Framer Motion makes CSS animations and transitions obsolete. While it's incredibly powerful, it's not a complete replacement. CSS is still king for simple, non-interactive animations. Think of a button's background color changing on hover—CSS handles that perfectly and efficiently.\n\n> The real pro move is to use both tools for what they do best. Lean on CSS for your simple, static transitions. When you need complex, state-driven, or interactive animations that demand the full power of JavaScript, that's when you bring in Framer Motion.\n\nThis hybrid approach gives you the best of both worlds. You get the raw performance of CSS for the simple stuff and the dynamic, physics-based magic of Framer Motion for crafting truly memorable user experiences in React.\n\n---\n\nReady to build stunning, animated landing pages in minutes? Check out **Magic UI** for a library of over 50 customizable blocks and 150+ free animated components built with the best of React and Framer Motion. Start creating at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/free-react-components.mdx",
    "content": "---\ntitle: \"21 Best Free React Components Libraries To Kickstart Projects\"\ndescription: \"Boost your productivity and create dynamic UIs with these 21 free React components libraries. Find the perfect tools for your development process.\"\nimage: https://cdn.magicui.design/assets/7eh77tzj8om.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-23\"\nfeatured: true\n---\n\nAre you struggling to find the best free React UI component libraries and kits? The complexities of [UI Frameworks](https://magicui.design/blog/ui-frameworks) can be overwhelming, especially with the various options available. Let's know the free React components to find the perfect solution for your needs. MagicUI's [React component library](https://magicui.design/) offers a collection of free components that can help you easily achieve your UI framework goals.\n\n## What Is React?\n\n![ Free React Components](https://cdn.magicui.design/assets/2f0o05fl2f5.jpg)\n\nReact is a revolutionary JavaScript-based UI development library for web development. What makes React stand out from other libraries is its ability to use a Virtual DOM to keep track of the actual DOM. This allows React to update the real DOM efficiently, resulting in better performance and rendering speed than traditional libraries.\n\n### Popularity Driven by Ease of Use, Performance, and Component-Based Architecture\n\nReact was first released in May 2013 and quickly became one of web developers' most popular front-end libraries. The library's popularity can be attributed to its numerous benefits, including ease of use, high performance, and component-based architecture. With React, developers can break down complex user interfaces into manageable, easily reused and composed components.\n\n### Beyond UI\n\nBut React is not just about building user interfaces. It also provides various extensions to support entire application architectures. Examples include Flux, which introduces the concept of unidirectional data flow, and React Native, which allows developers to build high-performance mobile applications using React.\n\n### Versatility for Scalable Projects\n\nReact also empowers developers to build dynamic, single-page applications and websites. These applications don't require a page reload when the user interacts with them, providing a seamless and fluid user experience. On top of that, React is renowned for its flexibility and scalability, making it ideal for projects of any size, from small personal websites to large-scale enterprise applications.\n\nReact is an essential tool in a [web developer's toolkit](https://legacy.reactjs.org/), and its wide community and ecosystem ensure that resources, tools, and components are always available to streamline the development process.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## What Are React Component Libraries?\n\n![ Free React Components](https://cdn.magicui.design/assets/wl3nhhjj1fg.jpg)\n\nReact UI component libraries are collections of ready-to-use or pre-coded user interface elements that help accelerate software development. These pre-designed elements range from buttons, modals, and cards to complex components like data tables and charts. React UI component libraries are created to simplify the creation of user interfaces by providing developers with building blocks and elements that follow best practices in design and accessibility.\n\nThe nice thing about components is that they’re modular without many app-specific dependencies. This means that you can reuse the components to build awesome apps and interfaces super fast.\n\n### Design-Centric with Customization\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## The Benefits Of Using A React Component Library\n\n![ Free React Components](https://cdn.magicui.design/assets/exdo4fmwkw7.jpg)\n\n### Speed\n\nWhen starting a React project using a [UI component library](https://www.simplilearn.com/tutorials/reactjs-tutorial/what-is-reactjs), you can save time and energy by having predefined components ready for use without having to write code from scratch. This gives you a significant speed boost and the opportunity to focus on other critical aspects of your project.\n\n### Easy to use\n\nFor beginners, styling and designing complex UIs can be a steep hill to climb, but with a React UI library, it becomes really easy to import and use elements without worrying much about CSS designs. This makes it a great starting point for beginners.\n\n### Consistency\n\nOne great feature of React UI libraries is the enforcement of a consistent look and feel across your application. This is because these libraries are created with a style guide that ensures uniformity in the user interface.\n\n### Productivity\n\nIt's always a plus when you can develop applications faster without losing quality. React UI libraries offer developers the chance to accelerate development time by cutting down the need to build components from scratch. This, in turn, allows developers to focus on more complex functionalities.\n\n### Customization\n\nWhile React UI libraries offer you a wide array of ready-to-use components, they are highly customizable, allowing you to tweak them to match the specific requirements of your project. This level of flexibility is crucial in ensuring that your application stands out.\n\n### Community Support\n\nThe advantage of working with popular React UI libraries is the large community support that comes with it. This support ensures continuous development, bug fixes, and a plethora of documentation, which are all crucial for your project's success.\n\n### Accessibility\n\nAccessibility is crucial to application development, and many React UI libraries prioritize this aspect. This makes it easier for developers to create applications that everyone uses, irrespective of their physical abilities.\n\n## 21 Best Free React Components Libraries To Kickstart React Projects\n\n![ Free React Components](https://cdn.magicui.design/assets/osujlaczn1.jpg)\n\n### 1\\. MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Ant Design\n\nAnt Design is a free React UI library tailored for enterprise-level products.\n\n- This UI kit is based on the Ant Design project and has almost every Ant Design facility.\n- This kit has high-quality components and demos for developing solid and interactive UIs.\n- All of those components cover the internationalization guide for dozens of languages.\n- You will get the facility to customize the components according to your design blueprints.\n- This kit applies Less.js for its style language.\n\n### 3\\. Material-UI\n\nMaterial-UI Kit is a free React UI design system based on Google’s Material Design.\n\n- This popular kit produces React components made with Material Design.\n- Material-UI provides beautiful premium themes and templates to jump-start your upcoming project.\n- The components of this kit are motivated by the physical world and textures while keeping the actual UI elements to a minimum.\n- The Material UI Kit has helpful components, such as app bars, auto-complete, badges, buttons, cards, dialog boxes, icons, menus, sliders, and more.\n- This beautiful kit also has a customization facility for your React app.\n\n### 4\\. React Bootstrap\n\nReact Bootstrap is a UI kit that retains its Bootstrap Core.\n\n- This kit gives you more control over the form and function of each component by replacing Bootstrap’s JavaScript with React.\n- This kit’s components are built with Bootstrap, the world’s most popular CSS framework.\n- Each component is easy to access and essential for building a front-end framework.\n- Developers can choose from thousands of ready-to-use Bootstrap themes. On GitHub, React Bootstrap has earned 22K+ stars.\n\n### 5\\. BluePrint\n\nBlueprint is an open-source React UI kit developed by Palantir, a prominent US tech company specializing in big data analytics. Originally designed for desktop applications, Blueprint offers a comprehensive set of React components tailored for creating sophisticated and data-rich interfaces.\n\n- One notable feature is the inclusion of code snippets for seamlessly generating and displaying icons from the component library. You can use these icons to interact with dates and times, pick time zones, and more.\n- Beyond icons, the component library contains many UI elements, such as breadcrumbs, buttons, callouts, cards, dividers, navbars, tabs, tags, and more.\n- The library ensures compatibility with popular browsers, including Chrome, Firefox, Safari, IE 11, and Microsoft Edge, making it a versatile and reliable choice for React developers.\n\n### 6\\. Chakra UI\n\nChakra UI is one of the most impeccable React UI kits. It has simple but composable APIs and excellent accessibility.\n\n- This kit presents an elegant and clean UI library, providing developers with foundational elements for easily crafting their UIs.\n- Its library is easy to use and gives all kinds of UI elements.\n- This UI kit supports different color modes.\n- Component styling allows much better control over customization and results in visually appealing and cohesive user interfaces.\n\n### 7\\. Semantic UI\n\nSemantic UI emerges as a jQuery-free, user-friendly HTML development framework.\n\n- It seamlessly integrates with React, Angular, Meteor, Ember, and other frameworks.\n- This versatile kit enables the effortless loading of any Semantic UI CSS theme onto the Semantic UI React app.\n- A standout feature of Semantic UI is its flexibility in customizing components, which allows developers complete access to the markup.\n- With over 50 components, including segments, progress bars, transitions, pagination, and more, Semantic UI ensures a rich and dynamic user interface.\n\nOn GitHub, Semantic UI has over 13,000 stars, indicating its widespread adoption and ongoing growth within the developer community. This reflects its reputation as a reliable and robust choice for UI development.\n\n### 8\\. React Toolbox\n\nReact Toolbox is built upon crucial proposals like CSS Modules (authored in SASS), Webpack, and ES6, creating a robust toolkit for React developers.\n\n- This toolbox provides essential components like buttons, cards, date pickers, dialogues, and other frequently used elements.\n- Each component comes pre-packaged with all necessary dependencies and injected themes for seamless integration into your projects.\n- This toolbox’s library cohesively follows the workflow of the Web pack and is completely configurable and very handy.\n- The library comes equipped with extensive documentation, ensuring developers have comprehensive guidance on implementation.\n\n### 9\\. Onsen UI\n\nOnsen UI is a cross-platform mobile app development framework that utilizes HTML5 and JavaScript while seamlessly integrating with popular frameworks like Angular, Vue.js, and React. Its interesting components library dynamically styles based on the platform, ensuring a native look and feel and setting Onsen UI apart.\n\nIts UI kit goes beyond mere aesthetics, offering support for both iOS and Android and adapting to each's specific source code requirements. It further enhances its versatility and compatibility across popular React frameworks. With an impressive 8,800 stars on GitHub and continuing to gain popularity, mobile app developers favor Onsen UI. This significant recognition highlights its reliability and growing popularity within the developer community.\n\n### 10\\. Reactstrap\n\nReactstrap simplifies React development with its feature-rich React Bootstrap 4 library, offering many components to enhance your projects. This bootstrap UI kit has two primary distribution versions to cater to varying project needs.\n\n- The basic version strips away optional dependencies and ensures flexibility in configuring expected dependencies, making it ideal for projects with specific requirements.\n- The full version encompasses all optional dependencies, catering to larger applications with comprehensive needs.\n\n### 11\\. Rebass\n\nRebass presents a free React UI Kit featuring a minimalist component library built with a styled system by Brent Jackson. In this UI kit, simplicity is crucial, offering just eight foundational components in a compact file. Specifically crafted for responsive web design, these components are designed to be both extensible and themeable. Rebass is committed to providing a swift design and development system with an incredibly small footprint- just 4KB.\n\nRebass has over 7,9000 stars on GitHub, showcasing its popularity and achieving credit for its first-class support in the React community. This significant recognition highlights Rebass as a go-to choice for developers seeking a lightweight and effective React UI solution.\n\n### 12\\. Monday\n\nMonday is a free open source (MIT-licensed) rich components library for React. It includes all the basic UI components, such as:\n\n- Buttons\n- Button groups\n- Colors\n- Form elements\n- Accordions\n- Dialogs\n- Tooltips and more\n\nMonday also supports Motion animation by default and external fonts.\n\n### 13\\. Fluent UI\n\nFluent UI web represents a collection of utilities, React components, and web components for building web applications. It is free to use, open-source, and licensed under the MIT license.\n\n### 14.  Next UI\n\nNext UI is a React library that offers a collection of visually appealing pre-built components. While it stands out for its aesthetics, there's a potential downside to consider. Some users have reported experiencing performance issues, particularly with slow loading times and freezing when changing themes on the desktop. This could be a concern if a smooth user experience is critical for your project. It's also worth noting that despite the name, Next UI is not directly affiliated with the popular React framework Next.js.\n\n### 15\\. Grommet\n\nAccording to its official site, Grommet is a React library that prioritizes accessibility, responsiveness, and scalability. It offers a set of pre-built components designed for building web applications that work well across different devices and for users with different needs.\n\nUser experiences with Grommet can be mixed. Some devs praise its focus on usability and theming, but others have complained about bugs and breaking changes between minor versions. While Grommet offers a good range of components, some developers find Material-UI provides a wider selection and more customization options.\n\n### 16\\. Gestalt\n\nGestalt is Pinterest’s design system. The system includes:\n\n- A React component library with comprehensive guidelines\n- Best practices\n- Tools\n- Resources to support designers and engineers in delivering high-quality products\n\n### 17\\. Shadcn UI\n\nShadcn UI is a free, accessible, and customizable component for Next.js apps set that you can copy and paste into your apps. It uses Radix  UI, Tailwind CSS, and dark theme support that is compatible with Next themes.\n\n### 18\\. UI Box\n\nUI Box is a low-level CSS-in-JS solution that focuses on being simple, fast, and extensible. All CSS properties are set using simple React props, which allows you to easily create reusable components that can be enhanced with additional CSS properties. This is very useful for adding things like margins to components, which would normally require adding non-reusable wrapper elements/classes.\n\n### 19\\. Carbon Components React\n\nCarbon Components React is the React implementation of IBM’s Carbon Design System. It offers a collection of components that follow IBM’s design guidelines. Carbon Components React is ideal for enterprise-level applications requiring a professional and consistent look.\n\n### 20\\. Bulma\n\nBulma is a modern CSS framework, and React Bulma Components is its React adaptation. While it primarily focuses on styling and layout, it simplifies the integration of Bulma’s styles into React applications.\n\n### 21\\. Daisy UI\n\nDaisy UI is a powerful open-source library of Tailwind components featuring 29 themes. It supports Vue, React, Meteor, and Angular, providing developers with more options. Customizing your web applications is easy with Daisy UI's Tailwind configuration file. The library has a variety of stunning and professional themes for different niches and areas of expertise.\n\nUtilizing Daisy UI can help you create beautiful and responsive web applications in less time and effort, making it an invaluable tool for both experienced professionals and beginners in web development.\n\n### Related Reading\n\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Choosing The Ideal Free React Component Library\n\n![ Free React Components](https://cdn.magicui.design/assets/ux4miqyfzkd.jpg)\n\nWhen selecting a free React component library for your project, the initial step is to:\n\n- Recognize your unique needs and challenges and explore the available libraries and frameworks.\n- Before diving into choosing a UI library, it's essential to take a moment to consider your project's specific requirements.\n\nAsk yourself a few questions to ensure you are on the right track.\n\n- Are you building an internal enterprise application, or is it a public website?\n- Does the library offer all the necessary building blocks you require for your app, such as buttons, forms, and other components?\n- Can you easily customize the library's styles to align with your design vision?\n- Is there an active and helpful community surrounding the library to assist you with questions and concerns?\n\nOnce you have a clear understanding of your challenges and know which libraries address them, you will be better equipped to determine the most suitable UI tech stack for your project. By following these simple steps, you can ensure that you select the ideal [React component library](https://magicui.design/) that suits your project's specific requirements.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a revolutionary free [React component library](https://magicui.design/) designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion, providing a range of visually appealing and interactive elements. MagicUI allows you to easily integrate stunning user interfaces into web applications with minimal effort, bridging the gap between design and development.\n\n[MagicUI](https://magicui.design/) components are:\n\n- Highly customizable\n- Enabling seamless adaptation to match your desired branding and design requirements.\n- Focusing on animation and a design-centric approach\n- Empowers you to craft captivating digital experiences\n\nWith MagicUI Pro, you can save thousands of hours and create a beautiful landing page, converting your visitors into customers with our website templates.\n\nHave you tried [MagicUI](https://magicui.design/) yet? With our free component library, you can enhance your web applications with beautiful, interactive elements. Save time and effort with MagicUI Pro, allowing you to create stunning landing pages effortlessly.\n\nReady to elevate your web design skills? [Check out MagicUI](https://magicui.design/docs) today.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/hero-section-design.mdx",
    "content": "---\ntitle: \"Hero Section Design Best Practices & Best Examples For Inspiration\"\ndescription: \"Learn the best practices for hero section design and get inspired by top examples to enhance your website's visual appeal.\"\nimage: https://cdn.magicui.design/assets/cfcc3a7c-adec-4e7b-a367-99a1a6528d43.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you ready to make a striking first impression with your website? The hero section is the visitors' first element, making it prime real estate for engaging your audience. In this blog, we will explore into Hero Section Design and showcase some stunning [landing page examples](https://magicui.design/blog/landing-page-examples) to inspire you.\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a must-have toolkit for crafting compelling hero sections that captivate your audience from the moment they arrive.\n\n## What Is a Hero Section?\n\n![Hero Section Design](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBsYXB0b3B8ZW58MHx8fHwxNzIyNDA2NDQwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nThe hero component of a website is typically a large, prominent section at the top of the homepage. It often includes a compelling image or video and concise, impactful text communicating the website's core message or value proposition. The hero component, usually represented by the company's logo, is designed to:\n\n- Immediately capture visitors' attention\n- Create a solid first impression\n- [Encourage them to explore the site](https://www.theseedmill.co.uk/how-can-you-encourage-more-of-the-right-clients-to-visit-your-website/)\n\nIt serves as a visual anchor and sets the tone for the rest of the website's content and design, making it a crucial element with great impact and functionality.\n\n## Why Is It Called a Hero Section?\n\n![Hero Section Design](https://images.unsplash.com/photo-1518644730709-0835105d9daa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHx0aGlua2luZ3xlbnwwfHx8fDE3MjI0MDY3OTh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nA website's hero section is called a hero section because, just like a hero in a story or movie, it plays the most critical role in capturing visitors' attention and drawing them into the content below.\n\n### Different Types of Hero Sections\n\nThe hero section of a website usually has a similar look across different websites or apps. Designers can customize it based on the site's objectives. Some common types include:\n\n- [Image hero](https://blog.hubspot.com/marketing/hero-image)\n- Video hero\n- [Carousel hero](https://usability.yale.edu/usability-best-practices/hero-imagescarousels)\n- Product showcase hero\n- Minimalist hero\n\nWhile images are often used, some SaaS brands opt for text as long as it effectively grabs and retains attention.\n\n### Importance of Optimizing the Hero Section\n\nOptimizing the hero area for better performance and user engagement is crucial. It should answer the question: “Why am I here? What’s this about, and what can I gain?” The hero section is the first impression users get, so it plays a significant role in whether they continue exploring the site.\n\n## Why Does Your Hero Section Design Matter?\n\n![Hero Section Design](https://images.unsplash.com/photo-1476357471311-43c0db9fb2b4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxkZXNpZ258ZW58MHx8fHwxNzIyNDA2ODEwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCreating a compelling hero section design is essential for the following:\n\n- Driving user engagement\n- Boosting conversion rates\n- Enhancing brand awareness\n- Improving SEO\n- Establishing credibility and trust with your audience\n\nThe hero section of a website is the first impression people have when they land on your site, so it's crucial to make it visually appealing and informative to encourage visitors to explore further.\n\n### The AIDA Framework: Driving Customer Action\n\n- Attract users' attention\n- Spark their interest\n- Guide them towards taking the desired action, such as signing up for your services or purchasing.\n\n### Benefits of a Well-Designed Hero Section\n\n#### Increased User Engagement\n\nThe hero section [captures users' attention](https://www.webfx.com/blog/web-design/5-ways-web-design-impacts-customer-experience/) and entices them to explore further, making them more likely to delve deeper into your website or product.\n\n#### Improved Conversion Rates\n\nClear and persuasive content and strategic calls to action can lead to higher conversion rates as visitors are guided toward taking desired actions.\n\n#### Enhanced Brand Awareness\n\nImpactful visual elements and clear messaging in the hero section can help your brand stand out, become more memorable, and leave a lasting impression on your audience.\n\n#### Boosted SEO\n\nWell-optimized hero sections can improve your website's visibility in search engine results, helping it rank higher and attract more visitors.\n\n#### Credibility and Trust\n\nA well-crafted hero section can build trust and make visitors perceive your brand as professional, leading to increased confidence in engaging with your business.\n\n### Accelerate Landing Page Design with MagicUI\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers.\n\n#### Features of MagicUI\n\n- Designed specifically for design engineers\n- Collection of over 20 animated components\n- Built with React, TypeScript, Tailwind CSS, and Framer Motion\n- MagicUI Pro offers beautifully designed templates\n- Saves time and effort in creating stunning landing pages\n\nTry using our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today for visually appealing and interactive elements that can be easily integrated into web applications.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## The Anatomy of a Hero Section\n\n![Hero Section Design](https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3b3JraW5nJTIwd2l0aCUyMHRlYW0lMjBtYXRlfGVufDB8fHx8MTcyMjQwNjgyN3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Hero Image/Graphic\n\nTypes of Hero Images:\n\n- Image\n- Illustration\n- Graphic\n- Video\n\nIt is used to communicate the website’s key message at a glance. The [hero image should inform visitors](https://conversionxl.com/blog/hero-image/) about the website’s purpose. According to Conversion Xl, it only takes 50 milliseconds for users to form an opinion about a website. Using a hero image is an excellent way to ensure users can identify with and relate to your site. That’s why you must ensure your site is:\n\n- Easy to read\n- Clear\n- Delightful\n\n### The Power of Human Connection in Hero Images\n\nLarge, oversized images grab the user’s attention when they land on a page. They also help users identify the brand’s unique selling point (USP) and form an opinion about it as soon as the page loads. Many web designers create hero images using photos of real human faces. According to Webflow, this helps designers personify users and enable users to relate to the brand.\n\n### Powerful Headline\n\nA tagline is an incredible tool for your website. A statement or headline is the first text a user sees when clicking on your website. It should grab people's interest and encourage them to keep exploring instead of clicking back. The headline should be bold, eye-catching, and stand out. With a maximum of 8 words, you should quickly sum up the information of your:\n\n- Business\n- Blog\n- Services\n\n### Great Sub-headline\n\nA subheadline is an extra space to expand the message made previously in the headline. Here, you can add brief information about your products and services and insist on trust. It [helps users define your store](https://www.zendesk.com/blog/unique-selling-proposition/) or company so they’ll know exactly what’s going on.\n\n### Call to Action (CTA)\n\nA strong CTA is essential in a hero section. Many websites forget about this part and confuse their customers. Adding a CTA leads to conversion. People are always unsure of what to do on the internet, so the more guidance you give, the more people will stick with you.\n\n### Social Proof\n\nAdding social proof in the hero section is a wise choice to gain instant trust and make people eager to explore more. Here are what you can add:\n\n- Mention the number of customers who have used your product\n- Display your product rating & review\n- Name-drop your partners or influencers who have used your products\n- Add a testimonial slide to maximize your space\n\n### Logo\n\nThe company or brand logo is typically placed at the top left of the page. In addition to communicating the brand, it also serves as a navigation tool, allowing users to return to the homepage from anywhere on the website.\n\n### Navigation Menu\n\nThe navigation menu lets users jump to other website sections from the homepage. Having the contact.\n\n## 11 Best Practices for a Website Hero Section Design\n\n![Hero Section Design](https://images.unsplash.com/photo-1529119651565-dc15bd8c75fd?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyMjQwNjUwMHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Choose High-Quality Images\n\nThe hero image is the first thing visitors see, so it needs to make a great impression. Use high-resolution images that are crisp and clear. The ideal hero image captures the user’s attention and supports your value proposition.\n\n#### Understanding Your Audience and Crafting Your Message\n\nThe most practiced designers perform exhaustive user research to understand their target audience and carefully consider how their images relate to their product or service. Your goal can be to evoke an emotion, promote a product, or enhance your brand identity.\n\n### 2\\. Choose Your Words Carefully\n\nHighlighting what would benefit your target audience is a great way to hold your users’ attention. Remember that prospects are coming to your website because they have a problem. By putting your value proposition front and center, you can offer them a solution to that problem in just a few words. This will keep them wanting to know more.\n\n### 3\\. The Call-to-Action Button Should Be Visually Prominent\n\nThe CTA button clearly indicates which action to take. Therefore, it should be visually prominent and easy to locate, limiting distractions as best as possible. Stick to clear, easily understood verbs for the labels, such as:\n\n- Join\n- Create\n- Sign up, etc.\n\n### 4\\. Don’t Overuse Call-to-Action Buttons\n\nIdeally, you should have just one CTA button in the hero section connected to the main action you want users to take. If you have two potential actions, prioritize the more important action as the primary button and designate the other as secondary. Both buttons should have distinct visual weights to help users identify the key action.\n\n### 5\\. Use Legible Fonts\n\nUse clear, legible fonts that complement your brand. Keep your use of font styles and weights to a minimum to avoid visual clutter.\n\n### 6\\. Be Mindful of Space\n\nMaintain ample spacing between elements in your design. You don’t need to fill every space in the hero section. Organize information in a way that’s approachable, logical, and easy to understand to reduce your user's cognitive load.\n\n### 7\\. Mobile Friendliness\n\nEnsure your hero section is visually appealing and functions smoothly on all devices, prioritizing mobile compatibility for a seamless user experience.\n\n### 8\\. Accessibility\n\nMake your website easy to use for everyone by describing images with text, choosing clear fonts, and using well-contrast colors.\n\n### 9\\. Brand Alignment\n\nThe hero section should use the same:\n\n- Colors\n- Fonts\n- Pictures\n\nUsing these elements helps create a consistent look that people can easily remember and recognize.\n\n### 10\\. Maintain Consistency\n\nKeep your website looking the same throughout using the same fonts, colors, and images representing your brand. This helps build trust, makes your brand more memorable, and gives users a cohesive experience.\n\n### 11\\. Test Your Design Decisions\n\nTesting different versions of your hero section design using A/B testing will help you:\n\n- Determine what resonates with your audience\n- Refine your design\n- Create a hero section that captures and retains your users’ attention\n\n## 9 Best Examples of Hero Section Design\n\n![Hero Section Design](https://images.unsplash.com/photo-1609372697655-65d874e3fe60?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxpZGVhdGlvbnxlbnwwfHx8fDE3MjI0MDY4NTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI\n\n[Magic UI](https://magicui.design/) offers an exceptional example of hero section design for SaaS brands. At the top, a prominent button announces new features and components visitors must see. The bold headline and supporting subheading tell visitors what the site is about, targeting the audience directly.\n\n### 2\\. Cognosys\n\nThe Cognosys website hero section, designed with Magic UI, stands out even without images. It relies on a bold headline and supporting headline to highlight the software's benefits, effectively communicating with the reader.\n\n### 3\\. Notion\n\nNotion's project management page conveys simplicity and clarity through a clutter-free hero section. The promise of AI-powered technology to simplify project management instantly reassures visitors that managing projects doesn't have to be chaotic.\n\n### 4\\. Jasper\n\nJasper's hero section features a bold headline highlighting the AI-powered writing assistant's primary superpower: generating cohesive content wherever needed. This resonates with individuals who need help creating seamless marketing campaigns.\n\n### 5\\. Testimonial\n\nTestimonial's hero section [communicates its value proposition](https://testimonial.to/) in seconds, providing businesses with a system to gather testimonials quickly. The simple design effectively conveys the platform's promise concisely yet compellingly.\n\n### 6\\. Webflow\n\nWebflow's hero section offers a popup to match users with a certified Webflow expert. The striking hero section invites users to build with code's power without writing any code, encouraging them to explore the platform further.\n\n### 7\\. Stripe Checkout\n\nStripe Checkout's hero section is attention-grabbing, compelling users to get started or book a demo to learn more about the [payment processor](https://stripe.com/payments/checkout). The clear copy and bold visual elements effectively communicate the platform's value proposition.\n\n### 8\\. Ahrefs\n\nAhrefs' hero section combines bold blue and bright white, establishing an emotional connection with visitors keen on [growing search traffic](https://ahrefs.com/). The clear messaging and prominent call-to-action prompt users to view a demo, effectively showcasing the platform's features and benefits.\n\n### 9\\. Glide\n\nGlide's dark-themed hero section features a concise and compelling headline reinforcing the app builder's value proposition: building business software users genuinely desire. The conversion-oriented design effectively communicates the platform's core offer.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Making Your Hero Section Pop Even More\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers. It provides over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nTry using our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today for visually appealing and interactive elements that can be easily integrated into web applications.\n\n## Importance of Animation in the Hero Section\n\n![Hero Section Design](https://images.unsplash.com/photo-1524666643752-b381eb00effb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxhbmltYXRpb258ZW58MHx8fHwxNzIyNDA2ODc5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Engaging Visitors With Animated Elements\n\nUsing animations in the hero section is particularly impactful, as it serves as the first point of interaction for users visiting a website. Designers can create a more immersive experience that encourages users to explore further by:\n\n- Incorporating smooth transitions\n- Engaging hover effects\n- Animated text or imagery\n\n### Creating a Memorable First Impression\n\nBy incorporating animated components from Magic UI, you can ensure your hero section stands out visually and delivers a memorable and compelling first impression, aligning with contemporary design trends that prioritize movement and responsiveness.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library created for design engineers to integrate visually appealing and interactive elements into web applications easily.\n\n### Key Features of MagicUI\n\n- Over 20 animated components\n- Built with React, TypeScript, Tailwind CSS, and Framer Motion\n- Extensive customization options for branding and design\n- Focus on animation and design-centric approach\n- Bridges the gap between design and development\n- Enables the creation of captivating digital experiences\n\n### Benefits of MagicUI Pro\n\n- Enhances the free component library with advanced features\n- Provides website templates to save time and effort\n- Helps create beautiful landing pages that convert visitors into customers\n- Offers a startup landing page template to boost online presence\n- Delivers engaging and practical designs that drive conversions\n\nStart using the [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to experience the power of MagicUI Pro firsthand and elevate your landing page design effortlessly.\n"
  },
  {
    "path": "apps/www/content/blog/how-to-add-animation-to-website.mdx",
    "content": "---\ntitle: \"How To Add Animation To Website Without Slowing Down Performance (2024)\"\ndescription: \"Learn how to add animation to website without slowing it down. Boost engagement & conversions with expert tips. Try our startup landing page template now!\"\nimage: https://cdn.magicui.design/assets/n40xo3gqfd9.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nWebsites can be rather dull. They present static content to users, which users see when they land on a site. It doesn’t have to be this way. Animating a website's visual elements can help create a more dynamic experience for users while adding a layer of interactivity to the design. This approach can help capture users' attention, keep them engaged, and prompt them to take action. That said, adding animation to a website the right way is critical. Too much animation or significant animated elements can slow down a site’s performance and create a poor user experience, hurting SEO, conversions, and more. Instead, it’s best to optimize animation for speed and use them to improve the performance of your website. In this blog, we’ll review how to add animation to your website without slowing down performance.\n\nThis blog features some examples of animated landing pages to inspire your design. [Landing page examples](https://magicui.design/blog/landing-page-examples) with animation can help visualize your options and illustrate how these elements can create a more engaging user experience. MagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a valuable tool to help readers achieve their objectives, such as knowing how to add animation to a website without slowing down performance.\n\n## Overview of the Importance of Animation in Modern Web Design\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/qc8krngq82f.jpg)\n\nAnimation provides immediate visual feedback to user actions, such as:\n\n- Clicking buttons\n- Submitting forms\n\nThis feedback helps users understand the system's response, making interactions more intuitive. When clicked, a button that smoothly transitions from an unpressed state to a pressed state can indicate that the action has been registered.\n\n### How Animation Can Help User Navigate Your Website\n\n[Animations can direct user attention](https://acclaim.agency/blog/the-role-of-animation-in-ux-enhancing-user-engagement) and guide them through complex interfaces by highlighting essential elements or transitions. A subtle animation that draws attention to a newly appeared notification or change in content can help users notice updates without interrupting their experience.\n\n### How Animation Improves Your Website’s Aesthetic Appeal\n\nWell-designed animations can make a website look more polished and engaging, improving the following:\n\n- Overall visual appeal\n- Brand perception\n\nSmooth transitions between sections or loading animations enhance the perception of quality and attention to detail.\n\n### How Animation Increases User Engagement\n\nInteractive animations encourage users to explore and interact with content, leading to the following:\n\n- Longer session durations\n- Higher engagement rates\n\nInteractive infographics or animated charts can make data visualization:\n\n- More compelling\n- Easier to understand\n\n### Potential Drawbacks of Using Animation on Your Website\n\nComplex or excessive [animations can impact performance](https://www.rippleanimation.com/blog/pros-and-cons-of-using-animations-for-websites/), causing slowdowns and stuttering, especially on lower-end devices. Heavy animations that are not optimized can lead to reduced frame rates, affecting the smoothness of the user experience.\n\n### Animation Can Increase Loading Times\n\nLarge animation files or inefficient code can increase page load times, leading to:\n\n- A poor user experience\n- Higher bounce rates\n\nUnoptimized image or video animations may delay the initial rendering of a page, frustrating users and causing them to leave.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Why Is Optimizing Animation for Performance Essential?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/6ug9ertt0x.jpg)\n\n### Unoptimized Animations Can Hurt Page Load Times\n\nAnimations that could be optimized can contribute to larger file sizes and slower page load times, negatively impacting the user experience. A website with multiple [high-resolution animated graphics](https://bootcamp.uxdesign.cc/the-role-of-animation-in-enhancing-user-experience-cfa11fa9efb4) might take longer to load, causing users to wait and potentially abandon the site.\n\n### Poorly Optimized Animations Can Reduce Responsiveness\n\nPoorly optimized animations can cause delays in user interactions:\n\n- Making the website feel less responsive\n- Reducing user satisfaction\n\nAnimations that lag or freeze can disrupt the user flow, leading to:\n\n- Frustration\n- Decreased usability\n\n### Slow-Loading Animations Increase Bounce Rates\n\nSlow-loading or stuttering animations can cause users to leave the site before it fully loads, increasing bounce rates. If an animation on the homepage causes significant delays, users might navigate away before experiencing the full content.\n\n### Performance Issues Can Decrease Conversions\n\nPerformance issues caused by animations can lead to lower [conversion rates](https://www.hotjar.com/conversion-rate-optimization/), as users may abandon forms or other interactive elements that could be faster or more responsive. For example, a slow-loading animation in a checkout process can discourage users from completing their purchase.\n\n## What Are the Best Practices for Implementing Website Animations?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/crwq22w069q.jpg)\n\n### Prioritize Performance: Optimize Animation to Enhance Page Speed\n\nAnimations can be resource-intensive, which can negatively impact site performance. To ensure animations don’t adversely affect user experience, optimize animations to improve:\n\n- Performance\n- Loading times\n\nFocus on using lightweight animation libraries and optimizing media files so they don’t slow down your site.\n\n### Use CSS Over JavaScript for Simple Animations: CSS vs JavaScript Animations\n\nCSS [animations are generally more performant](https://bootcamp.uxdesign.cc/the-role-of-animation-in-enhancing-user-experience-cfa11fa9efb4) than JavaScript animations for simple transitions. When adding animations to your website, utilize CSS for basic animations like:\n\n- Fades\n- Slides\n- Transformations\n\nReserve JavaScript for more complex animations that can’t be achieved with CSS alone.\n\n### Leverage Hardware Acceleration: Take Animation to the Next Level\n\nUse hardware acceleration to offload animation tasks to the GPU, improving performance. To enable hardware acceleration, apply CSS properties like transform and opacity instead of top and left for smoother animations.\n\n### Optimize Media Assets: Reduce File Sizes to Improve Loading Times\n\nAnimations often include images, videos, and other media to create engaging experiences. Ensure that all media used in animations are compressed and optimized for the web. Use modern image formats like WebP and compress video files to reduce their size.\n\n### Minimize Animation Duration: Short and Sweet Wins the Race\n\nShorter animations generally perform better and reduce the risk of performance issues. Aim to keep animation durations brief and avoid prolonged or continuous animations. Instead, create smooth transitions that improve user experience without drawing attention to themselves.\n\n### Implement Progressive Enhancement: Create Functional Experiences for All Users\n\nWhile animations can enhance the user experience, they should always be optional for basic functionality. Ensure that your animations follow progressive enhancement principles. This means providing functional fallbacks for users with reduced animation preferences or slower devices.\n\n### Test Across Devices and Browsers: Ensure Consistent Performance\n\nAnimations can perform differently depending on the following:\n\n- Device\n- Operating system\n- Browser\n\nTest your animations on various devices and browsers to ensure consistent performance and appearance. Use tools and emulators to verify that animations work smoothly on different platforms.\n\n### Avoid Excessive Animations: Less is More\n\nAnimations are a great way to create engaging web experiences but can overwhelm users if overused. Excessive animations can also negatively impact performance, so limit the number of animations on a page. Instead, use animations sparingly and focus on:\n\n- Key interactions\n- Transitions\n\n### Optimize Animation Code: Write Efficient Animation Code\n\nLike any other code on your website, [animation code](https://www.freecodecamp.org/news/web-animation-css-vs-javascript/) can affect performance. Writing efficient animation code:\n\n- It helps avoid unnecessary computations\n- Improves performance\n\nTo optimize your animation code, minify and bundle JavaScript and CSS files to reduce their:\n\n- Size\n- Loading times\n\n### Monitor Performance Regularly: Continuous Monitoring Is Key\n\nOnce animations are added to your website, performance monitoring shouldn’t stop. Continuously monitor and analyze animation performance to:\n\n- Identify\n- Address issues\n\nUse performance monitoring tools to track metrics and make adjustments as needed.\n\n## How to Implement Animations Without Affecting Load Times?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/xl7bzdlh7w.jpg)\n\n### Asynchronous Loading of Animation Assets: Boost Your Website Performance\n\nLoad animation assets asynchronously to prevent them from blocking the rendering of the main content. Use [JavaScript](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript) async and defer attributes to control how and when scripts are loaded, ensuring they do not interfere with the page's initial render.\n\n### Lazy Loading for Offscreen Animations: Make Animation Work for You\n\nImplement lazy loading techniques to load animations only when they become visible to the user. Use the Intersection Observer API to detect when elements enter the viewport and trigger animations only at that point.\n\n### Efficient CSS and JavaScript Management: Get Your Code in Order\n\nMinify CSS and JavaScript files to reduce their size and improve load times. Use tools like UglifyJS for JavaScript and [CSSNano](https://cssnano.github.io/cssnano/) for CSS to compress and combine files.\n\nImplement code splitting to load only the necessary scripts for animations rather than including all animation code in the initial page load. Use dynamic imports in JavaScript to load animation components on demand.\n\n## What are the Common Pitfalls and How to Avoid Them?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/z0u00sxr85.jpg)\n\n### Overusing Animations: The Risk of Overwhelming Users\n\nWhen integrated into a website correctly, animations can enhance the user experience. Excessive animations can distract or overwhelm users, diminishing user experience. The key to using animations effectively is to balance them with the website’s content.\n\nThe goal is to create a user-friendly interface; animations can help achieve that. However, it’s crucial to ensure that the animations enhance the user experience instead of detracting from usability.\n\n### Ignoring Mobile Performance: The Need for Mobile Optimization\n\nAnimations must be optimized for mobile devices to [ensure smooth performance](https://www.netguru.com/blog/mobile-app-performance-testing) across different screen sizes. There are various reasons for this. A significant portion of users access websites via mobile devices. If these users encounter sluggish or malfunctioning animations, they will likely leave the site for a competitor.\n\nMobile devices have less powerful processors than desktops, so that they may need help with complex animations. The best way to avoid this issue is to test animations on various mobile devices and adjust their performance settings to accommodate different capabilities.\n\n### Failure to Test Performance: Tools for Testing Animation Issues\n\nAnimations can impact website performance, so testing their impact before publishing a site is crucial. Performance testing tools can identify and resolve animation-related issues to ensure a smooth user experience. Tools like [Google Lighthouse](https://www.elegantthemes.com/blog/wordpress/what-is-google-lighthouse-and-how-to-use-it), WebPageTest, and browser developer tools can help analyze animation performance.\n\n#### Regular Monitoring\n\nEven if animations pass performance tests before a site goes live, monitoring their performance over time is still essential. Set up regular performance monitoring to detect and address animation issues before they impact users. Implement performance monitoring and alert systems to track animation performance and respond to problems proactively.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## What Are Some Examples of High-Performance Animated Websites?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/8z2hnkr30n7.jpg)\n\nWebsites can use animations to improve:\n\n- User experience\n- [Website aesthetics](https://webflow.com/blog/aesthetic-websites)\n\nMany animations or large animation files can cause performance issues that negatively affect:\n\n- Users\n- [SEO](https://developers.google.com/search/docs/fundamentals/seo-starter-guide)\n\n### Performance & Appeal\n\nSome websites have mastered the art of using animations without compromising performance. [Awwwards.com](http://Awwwards.com) features a variety of innovative animations that enhance the user experience while maintaining fast load times.\n\n[Stripe.com](http://Stripe.com) utilizes animations to improve user interactions and visual appeal without compromising performance. Even [Apple.com](http://Apple.com) incorporates smooth and engaging animations while maintaining the following:\n\n- Top-notch performance\n- Responsiveness\n\n### MagicUI: A UI Library Designed with Performance in Mind\n\nIf you're looking for animated components that won't hurt your website's performance, [MagicUI](https://magicui.design/) is an excellent option. MagicUI is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. [MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our:\n\n- Desired branding\n- Design requirements\n\n#### Bridging the Gap\n\nWith our focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nWith our free component library, MagicUI Pro can save thousands of hours, create a beautiful landing page, and convert visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## How Can You Measure the Impact of Your Animations on Performance?\n\n![How To Add Animation To Website](https://cdn.magicui.design/assets/2iu323ax7hz.jpg)\n\nAnimations can impact a website's performance, which can ultimately affect a site's user experience and search engine rankings. Measuring their impact on performance before adding animations to your site is a good idea to determine whether they are beneficial or detrimental. You can do this in several ways:\n\n- Performance metrics\n- User feedback\n\n### Performance Metrics: Track Animation Performance with Metrics\n\nTo assess [how animations impact performance](https://developer.mozilla.org/en-US/docs/Web/Performance/Animation_performance_and_frame_rate), track metrics like:\n\n- Page load times\n- Frame rates\n- Responsiveness\n\nAssess how animations affect your site’s load times:\n\n- How quickly do the animations start when a user lands on your page?\n- Do they cause the page to load slower?\n\n#### Performance Metrics\n\nTrack the animations' frame rates:\n\n- Lower frame rates can cause choppy animations that negatively affect user experience.\n- Aim for at least 30 frames per second for smooth animations.\n\nMonitor responsiveness:\n\n- Animations should not hinder a user’s ability to interact with a webpage.\n- Users who cannot click on an element because an animation is still running might get frustrated and leave your site.\n\n### Tools: Use Performance Analysis Tools to Measure Impact\n\nSeveral tools can help you measure how animations impact your site’s performance. Use [performance analysis tools](https://expertinsights.com/insights/the-top-performance-analysis-tools/) like Google Lighthouse, WebPageTest, and browser developer tools to get detailed metrics on your site’s performance before and after adding animations.\n\n### User Feedback: Gather User Insights on Animation Performance\n\nGathering user feedback is another effective way to measure how animations affect performance.\n\n- Start by conducting user surveys to get direct insights from visitors on their experiences with animations.\n- Ask specific questions to understand how animations impact user satisfaction and performance.\n- Inquire about their experiences with loading times and responsiveness. Also, analyze any data you can collect on user behavior.\n\nIf you add animations to a page and notice that users spend less time on it before exiting, this could indicate that the animations are hindering performance and negatively affecting user experience.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications. This allows us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n### Design & Development\n\nWith our focus on animation and a design-centric approach, [MagicUI](https://pro.magicui.design/docs/templates/startup) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library and MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page templat](https://pro.magicui.design/docs/templates/startup)e today.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/how-to-build-a-landing-page.mdx",
    "content": "---\ntitle: How to Build a Landing Page That Converts\ndescription: >-\n  Learn how to build a landing page that drives results. This guide covers\n  strategy, design, modern development tools, and optimization for high\n  conversions.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-34a9546c-c8b3-40dc-9dc2-e1362038295d.jpg\nauthor: Dillion Verma\ntags:\n  - how to build a landing page\n  - landing page design\n  - conversion optimization\n  - web development\n  - Magic UI Pro\npublishedOn: \"2025-11-07T08:36:13.055351+00:00\"\nfeatured: true\n---\n\nBuilding an effective landing page isn't just about flashy design or clever code; it all comes down to a focused strategy. You need to **define a single goal**, get inside your audience's head, and then build a clear, friction-free path to conversion. This initial planning is what separates a page that just looks good from one that actually turns visitors into customers.\n\n## Laying the Groundwork for a High-Converting Landing Page\n\nBefore you even think about picking a color palette or writing a line of code, you need to lay the groundwork. Honestly, the most beautiful page in the world will fall flat if it’s not built on a solid strategic foundation. This is where you ask the tough questions to make sure every single element—from the headline to the button—serves one unified purpose.\n\nYour first job? Settle on one single, solitary objective. A landing page that tries to do everything will accomplish nothing. Are you trying to get email signups? Drive direct sales? Fill webinar seats? Pick one. That goal becomes your North Star, guiding every single decision from here on out.\n\n### Defining Your Core Strategy\n\nWith a clear objective in place, it’s time to get to know the people you’re trying to reach. And I mean _really_ know them. Who are they? What keeps them up at night? Good audience research goes way beyond basic demographics to uncover the real motivations and pain points that drive their decisions. This is the secret to crafting a message that truly connects.\n\nThis foundational process is all about three things: defining your goal, understanding your audience, and seeing what the competition is up to.\n\n![Infographic about how to build a landing page](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fc83eefd-3a53-4b45-a051-db58873d0c38.jpg)\n\nThis flow shows that the real work on a great landing page starts long before you open a design tool. It begins with a clear goal and a deep understanding of your market. Without that, you’re just guessing.\n\nA crucial part of your strategy is a little competitive recon. Check out your competitors' landing pages and ask yourself:\n\n- What's their main value proposition?\n- What kind of social proof are they using (testimonials, case studies, etc.)?\n- Where did they place their calls-to-action, and how are they worded?\n\nThe point here isn't to copy them. It's about understanding the lay of the land and finding gaps where your offer can truly stand out. If you're looking for more guidance on this, there are great resources available that show you how to [build high-converting landing pages](https://www.cometogether.media/single-post/build-high-converting-landing-pages-that-win) by mastering these fundamentals.\n\n### Understanding Key Conversion Metrics\n\nKnowing the industry benchmarks gives you a realistic target to aim for. As of 2025, the average landing page conversion rate sits around **6.6%** globally. That means for every 15 visitors, you might get one conversion.\n\nBut that number swings wildly depending on the industry. B2B pages often see higher rates around **13.3%**, while SaaS might be closer to **3.8%**. These numbers give you a much-needed reality check for setting your own goals.\n\nBefore we dive into the nitty-gritty of building, let's break down the core components you'll be working with. Think of these as the essential building blocks for any landing page that's designed to persuade and convert.\n\n### Key Landing Page Components and Their Purpose\n\nThis table is a quick cheat sheet for the essential elements of an effective landing page and the specific job each one has.\n\n| Component                   | Primary Goal                                                      | Best Practice Example                                           |\n| :-------------------------- | :---------------------------------------------------------------- | :-------------------------------------------------------------- |\n| **Headline & Sub-headline** | Grab attention and clearly state the value proposition.           | \"The All-In-One Toolkit for Remote Teams.\"                      |\n| **Hero Image/Video**        | Create an emotional connection and show the product in action.    | A short video of a happy customer using the software.           |\n| **Social Proof**            | Build trust and credibility with potential customers.             | Customer testimonials with photos, logos of well-known clients. |\n| **Benefits & Features**     | Explain what the offer does and how it solves the user's problem. | Bullet points focusing on outcomes, not just technical specs.   |\n| **Call-to-Action (CTA)**    | Guide the user to take the single desired action.                 | A clear, action-oriented button like \"Start Your Free Trial.\"   |\n\nGetting these core elements right is more than half the battle. Each one plays a distinct role in moving your visitor from curiosity to commitment.\n\n> A landing page is a focused conversation with a potential customer. If you try to talk about too many things at once, your message gets lost, and so does the conversion.\n\nUltimately, you can't skip this planning phase. It determines the entire structure, copy, and design of your page. Nailing your strategy ensures your message is sharp, persuasive, and effective. For a deeper look into writing words that sell, check out our complete guide on [effective landing page copywriting](https://magicui.design/blog/landing-page-copywriting). After all, powerful copy built on a solid strategy is the true engine of a high-converting page.\n\n## Designing and Prototyping Your User Experience\n\nAlright, with your strategy locked in, it’s time to bring those ideas to life. This is where we shift from abstract goals to a tangible user experience (UX) that actually guides people toward your call-to-action. Design isn't just about making things look pretty—it's about building a frictionless journey for every visitor.\n\nA great landing page always starts with a clear **visual hierarchy**. This is just a fancy way of saying you arrange things so people naturally look at the most important stuff first. Your headline should scream for attention. Your sub-headline should back it up. And your call-to-action button should be impossible to ignore. Everything needs to flow.\n\nThink of it like telling a story. You wouldn't jump straight to the ending, right? Your hero section is the opening chapter—it has to grab attention and instantly tell visitors what's in it for them. A solid hero combines a killer headline, a helpful sub-headline, and an engaging visual to answer that one crucial question on every visitor's mind: \"What do I get out of this?\"\n\n### Crafting a Clean and Trustworthy Aesthetic\n\nYour design choices have a direct line to a visitor's trust. A cluttered, chaotic page will send people running for the \"back\" button because it makes your offer feel unprofessional. One of the most powerful tools you have here is whitespace. Seriously. Giving your content room to breathe helps users focus on what actually matters.\n\nColor psychology is another huge piece of the puzzle. The right colors can spark specific emotions and pull the eye toward key elements, especially your CTA buttons. A bright, contrasting color for your main CTA makes it pop off the page. Pair that with clean typography and high-quality images, and you've got an aesthetic that feels both modern and reliable. For anyone just starting out, [designing stunning visuals with accessible tools](https://www.bettermockups.com/blogs/resources/phone-case-mockup-canva) can be a total game-changer for producing professional-looking assets without a massive budget.\n\n> Your landing page design should be invisible. A good user experience feels so natural and intuitive that the visitor doesn't even notice the design—they just effortlessly follow the path you've laid out for them.\n\n### Mapping the User Journey with Wireframes\n\nBefore you even think about opening a high-fidelity design tool, start with a simple wireframe. A wireframe is basically a low-fi, black-and-white sketch of your page layout. It forces you to focus purely on structure and flow without getting sidetracked by fonts and colors.\n\nThis is the step where you map out every interaction and make sure the user's journey is logical from the second they land on the page.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f3f5781a-6c13-4305-a17d-532c214bfdb6.jpg)\n\n- **Hero Section:** Where does the eye go first? Is the CTA immediately visible?\n- **Features/Benefits:** How are you going to present this info? Icons? Bullet points? Short paragraphs?\n- **Social Proof:** Where will you place testimonials or logos for maximum impact and trust?\n- **Final CTA:** Is there a clear, final call-to-action right before the footer?\n\nThis process is all about organizing the essential [landing page sections](https://magicui.design/blog/landing-page-sections) into a story that makes sense. By prototyping the flow first, you can spot potential friction points early on. This ensures every element works together to drive conversions and makes the final coding process _so_ much smoother.\n\n## Bringing Your Design to Life with Magic UI Pro\n\nAlright, you’ve got your design and UX mapped out. Now for the fun part: turning those static blueprints into a living, breathing webpage. This is where we move from theory to reality, and tools like Magic UI Pro can seriously accelerate the process without cutting corners on quality or performance.\n\nMagic UI Pro is a component library built on some of my favorite tech: **React**, **TypeScript**, and **Tailwind CSS**. Instead of hand-coding every single button, card, and animation, you get to pull from a massive collection of pre-built, beautifully designed components. For developers and startups needing to ship fast, this is an absolute game-changer.\n\nThe whole idea is to assemble your page using these tested, responsive blocks. You’re still getting the flexibility and control of custom code, but you skip the tedious part of building everything from the ground up. It lets you focus your energy on the big picture—the user experience—instead of getting bogged down in CSS nuances.\n\n### Getting Started with Components\n\nFirst things first, you'll install Magic UI into your project. From there, you can start digging through its library of components to find ones that match up with your wireframe. It’s packed with everything you'd need for a landing page, like hero sections, feature grids, social proof carousels, and pricing tables—many with slick animations already baked in.\n\nThis screenshot from the Magic UI website gives you a feel for the clean, modern aesthetic you can expect.\n\n![Screenshot from https://magicui.design/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4c53f036-d446-438c-9116-a8d0a9f85b3b.jpg)\n\nAs you can see, animated, interactive elements aren't an afterthought; they're a core part of the library. This helps you build a dynamic, engaging experience right out of the box.\n\nLet's walk through a quick example. Say you're building the hero section. You find a component that looks right, copy the code snippet, and paste it into your React app. The code itself is refreshingly clean and easy to follow, even if you’re still getting your sea legs with React.\n\n```jsx\nimport { Dock, DockIcon } from \"@/components/magicui/dock\"\n\nexport function HeroSection() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border md:shadow-xl\">\n      <h1 className=\"text-4xl font-bold\">Your Awesome Product</h1>\n      <p className=\"mt-2 text-lg\">A tagline that grabs attention instantly.</p>\n      <Dock direction=\"middle\">\n        <DockIcon>\n          <span>Home</span>\n        </DockIcon>\n        <DockIcon>\n          <span>About</span>\n        </DockIcon>\n      </Dock>\n    </div>\n  )\n}\n```\n\nJust like that, this snippet gives you a fully responsive hero area complete with an animated dock navigation. All that’s left is to swap out the placeholder text and maybe tweak a few styles to fit your brand. It’s honestly that straightforward.\n\n### Customizing and Composing Your Page\n\nHere’s where the real power of a component library comes into play: customization. The pre-built blocks are a fantastic starting point, but you're never locked into their default look. Since Magic UI is built on Tailwind CSS, changing things like colors, spacing, and fonts is as easy as adding a few utility classes directly in your markup.\n\nFor instance, changing the background color of that hero section is a one-line edit to the `className` prop:\n\n- **Original:** `className=\"... bg-background ...\"`\n- **Customized:** `className=\"... bg-slate-900 text-white ...\"`\n\nThat tiny change completely transforms the vibe. You can apply this same logic to any component—swapping images, updating copy, and fine-tuning animations until everything lines up perfectly with your prototype.\n\n> Think of components as high-quality building blocks. You can use them as-is, or you can paint them, resize them, and combine them in unique ways to construct something that is entirely your own.\n\nYou just repeat this process for each section of your landing page:\n\n1.  **Features Section:** Grab a grid or list component to show off your product’s benefits.\n2.  **Social Proof:** Drop in a testimonial carousel or a logo grid to build instant trust.\n3.  **Pricing Table:** Choose a pre-styled pricing component and fill it in with your plan details.\n4.  **CTA:** Use a button component and customize its color and text to make it impossible to miss.\n\nBy building your page piece-by-piece with these battle-tested components, you guarantee a consistent design and a responsive layout that looks great on any device. This approach massively shortens the path from a design file to a live page, letting you launch and start getting feedback that much faster.\n\n## Optimizing Your Page for Performance and Conversions\n\nAlright, you've built your landing page. The design is locked in, the code is clean, but the job isn't quite finished. A stunning page that takes forever to load or fails to convince visitors is like a sports car with no engine—it looks great but won't get you anywhere.\n\nNow, we shift gears from building to tuning. It’s time to focus on the two things that _really_ matter: making your page lightning-fast and turning visitors into customers.\n\n### Boosting Your Page Load Speed\n\nPage speed isn't just some techy vanity metric; it directly impacts your wallet. In a world of fleeting attention spans, a single second of delay can send potential customers packing. Slow pages are frustrating, and frustrated users don't stick around to hear what you have to say.\n\nSo, where do you start? **Images**. They're almost always the biggest performance hog. Before you even think about uploading, make sure every single image is compressed. Tools like TinyPNG or Squoosh are your best friends here. Serving images in modern formats like **WebP** can also slash file sizes without any noticeable quality loss.\n\nNext up, take a look at your code itself. If you're building with a framework like React or Next.js, your bundler (like Vite or Webpack) is doing a lot of heavy lifting. Double-check that it's set up for **code-splitting** and **tree-shaking**. This ensures that users only download the code they need for the initial view, not the entire app. It's a game-changer for that initial load time.\n\n> Want proof? The data doesn't lie. A 2025 study found that websites loading in **one second** have conversion rates **three to five times higher** than those that take five to ten seconds. For e-commerce specifically, that one-second load time translates to **2.5 times more sales** than a page that takes five seconds.\n\nIf you want to dive deeper, our guide on [how to improve website loading speed](https://magicui.design/blog/how-to-improve-website-loading-speed) is packed with more actionable tips.\n\n### Mastering Conversion Rate Optimization\n\nOnce your page is flying, it's time to focus on persuasion. This is where Conversion Rate Optimization (CRO) comes in—the art and science of guiding visitors to take action.\n\nIt all starts with your Call-to-Action (CTA). Your CTA button needs to be the most obvious thing on the page. Use a color that stands out from everything else and write copy that inspires action. \"Get Your Free Template\" is worlds better than a boring \"Submit.\"\n\nPlacement matters, too. Make sure your CTA is clearly visible without scrolling and then repeat it further down the page after you've laid out your key benefits.\n\n![Image of a well-designed landing page CTA](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f48a327e-e271-41ef-8f3e-c73bbd835cec.jpg)\n\nFinally, you need to build trust, and nothing does that better than **social proof**. People are naturally inclined to follow the lead of others. Seeing that other people have already gotten value from what you're offering makes the decision to convert so much easier.\n\nHere are a few proven ways to sprinkle in social proof:\n\n- **Customer Testimonials:** Real quotes from happy customers are gold. Add a name, title, and photo to make them feel genuine.\n- **Case Studies:** Go deep and show the tangible results a customer achieved. This is perfect for more complex B2B offers.\n- **Client Logos:** If you've worked with recognizable companies, show them off! Their credibility instantly rubs off on you.\n- **Simple Metrics:** Numbers like \"Trusted by **10,000+** designers\" or a 5-star rating are simple but incredibly powerful.\n\nBy pairing blistering performance with smart conversion tactics, your landing page will do exactly what it was designed for: drive real business results.\n\nAlright, your landing page is live. Pop the champagne? Not quite. Hitting \"publish\" isn't the finish line; it’s the starting block.\n\nNow the real fun begins. We're moving from building to optimizing, and that means swapping our assumptions for cold, hard data. Without it, you're just making educated guesses, and that's no way to build a page that actually converts.\n\nThink of it this way: your launch is the hypothesis. The data you're about to collect is the proof.\n\n### What Numbers Actually Matter?\n\nBefore you dive headfirst into your analytics, you need to know what to look for. It's easy to get distracted by vanity metrics, but only a few key performance indicators (KPIs) truly tell the story of how people are interacting with your page.\n\nThese are the vital signs for your landing page's health:\n\n- **Conversion Rate:** This is your North Star. It's the percentage of people who do the one thing you want them to do. If this number is low, something is fundamentally broken in your pitch or design.\n- **Bounce Rate:** This tells you how many visitors hit your page and leave without clicking anything. A high bounce rate is a huge red flag. It often means there's a disconnect between your ad and your page, or maybe your site is just too slow.\n- **Time on Page:** How long are people sticking around? If they're bailing in a few seconds, your headline and hero section aren't doing their job to hook them.\n- **Traffic Sources:** Where are your visitors coming from? Knowing whether your best traffic comes from social media, organic search, or paid ads tells you where to double down on your efforts.\n\n> Your analytics dashboard isn't just a spreadsheet; it's a story about human behavior. Learning to read that story is the single most important skill for turning a good landing page into a great one.\n\n### The Art of A/B Testing\n\nSo, your data points to a problem. What now? You test.\n\n**A/B testing** is your new best friend. It's a straightforward method: create two versions of your page (an 'A' and a 'B'), change just one thing, and see which one performs better.\n\nLet's say you think your headline is weak. You could run a test where half your visitors see the original, and the other half see a new, more benefit-focused version. After a week, you check the conversion rates. It’s a simple, scientific way to stop guessing and start knowing.\n\nYou can test almost anything, but don't get lost in the weeds. Start with the big stuff that has the most impact:\n\n- The main headline\n- The call-to-action (CTA) button copy and color\n- The hero image or video\n- The length and fields of your form\n\nThis constant cycle of **measuring, learning, and refining** is what separates a page that dies on the vine from one that becomes a consistent lead-generating machine. Every test is a lesson, getting you one step closer to a perfectly tuned landing page.\n\n## Frequently Asked Questions About Landing Pages\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/KZe0C0Qq4p0\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nEven with the best guide in hand, you’re bound to have some questions as you start building. It happens to everyone. Let's tackle some of the most common ones that pop up.\n\n### What Is the Difference Between a Landing Page and a Homepage?\n\nThink of your homepage as the lobby of your digital office—it’s built for general exploration. It has a navigation menu, various links, and multiple paths designed to let visitors wander and discover different parts of your site.\n\nA landing page, on the other hand, is a direct, one-way street. Its entire existence is dedicated to a single, hyper-focused goal, like getting a demo request or a newsletter signup. To achieve this, it strips away all distractions, especially navigation menus. This laser focus is what makes it such a powerful tool for marketing campaigns.\n\n### How Many Form Fields Should My Landing Page Have?\n\nHere’s a simple rule I stick to: only ask for what you absolutely need _right now_.\n\nFor a low-commitment action like signing up for a newsletter, just an email address is perfect. Every single extra field you add introduces friction and gives people a reason to bail. You'll see your conversion rates drop.\n\nNow, if you're offering something of high value, like a one-on-one strategy call, it's fair to ask for more info (name, company, etc.). Just be ruthless. If a field isn't essential for the very next step in your sales process, cut it.\n\n> \"A landing page has one job. Any element that doesn't support that single job—whether it's an extra navigation link or an unnecessary form field—is actively working against you.\"\n\n### How Long Should a Landing Page Be?\n\nThere’s no magic word count. The right length is dictated entirely by how complex your offer is.\n\n- **Short Pages:** These are your best bet for simple, low-commitment offers. Think free e-book downloads or webinar registrations. The value proposition is easy to grasp, so you don't need a wall of text to convince someone.\n- **Long Pages:** You’ll need more runway for higher-ticket items or complex B2B services. A longer page gives you the space to tackle objections head-on, build trust with testimonials and social proof, and lay out all the details a person needs to make a confident, informed decision.\n\nAlways prioritize clarity over length. Get to the point, deliver value, and don't waste your visitor's time.\n\n### What Are the Most Important Metrics to Track?\n\nYou could drown in data, but honestly, you only need to obsess over a few key metrics to understand what's really going on.\n\n1.  **Conversion Rate:** This is the big one. What percentage of visitors actually took the action you wanted them to take? Everything else is secondary to this number.\n2.  **Bounce Rate:** This tells you how many people landed on your page and left immediately without interacting. A high bounce rate is a clear sign that your message isn't connecting.\n3.  **Traffic Sources:** Where are your best visitors coming from? Knowing which channels (Google, social media, email) send you high-converting traffic tells you where to double down on your marketing efforts.\n4.  **Page Load Time:** Speed kills… conversions. A slow-loading page will sabotage all your other metrics before a visitor even sees your headline.\n\nNail these four, and you’ll have a crystal-clear picture of your page’s performance and know exactly where to start optimizing.\n\n---\n\nReady to build stunning, high-performance landing pages in minutes, not months? With over **50** customizable blocks and **150+** animated components, **Magic UI** gives you the tools to bring your vision to life effortlessly. [Explore Magic UI Pro and start building today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-choose-tech-stack.mdx",
    "content": "---\ntitle: How to Choose a Tech Stack for Your Business Success\ndescription: >-\n  how to choose tech stack: Align goals, skills, and budget with practical steps\n  for a scalable, future-ready foundation.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-12b8ec2b-2dc6-4ee4-9921-3883cb6777cf.jpg\nauthor: Dillion Verma\ntags:\n  - how to choose tech stack\n  - tech stack selection\n  - software architecture\n  - web development\n  - application stack\npublishedOn: \"2025-10-26T10:07:10.898753+00:00\"\nfeatured: true\n---\n\nPicking the right tech stack isn't just a technical detail—it's a foundational business decision. Get it right, and you're set up for a scalable, maintainable, and cost-effective product. Get it wrong, and you're looking at headaches down the road. The sweet spot is a perfect balance of four things: your project's needs, your team's skills, future growth, and the total cost.\n\n## Laying the Groundwork for Your Tech Stack\n\n![An abstract image representing different technology components fitting together like puzzle pieces, symbolizing a tech stack.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/15f09411-76c6-475e-8ec8-64131661cf20.jpg)\n\nBefore we start throwing around framework names, let's get on the same page about what a \"tech stack\" actually is. Think of it as the complete collection of technologies that work together to build and run your application. This includes everything from the front-end frameworks that create the user experience to the back-end servers and databases that do the heavy lifting.\n\nYour front-end stack is what your users see and interact with. This might involve tools like React to build dynamic, snappy interfaces. If your team is already in this world, exploring different [React frameworks](https://magicui.design/blog/react-frameworks) can open up new ways to build slick, high-performing components.\n\nThen you have the back-end stack, which is the engine under the hood. This includes your programming language (like Node.js or Python), a web server (like Nginx), and the database (like PostgreSQL or MongoDB) that handles all the business logic and data. These choices are what dictate your app's speed, security, and ability to grow.\n\n### The Business Impact of Your Tech Choices\n\nChoosing a tech stack has real financial and operational weight. A good choice can seriously speed up development, while a bad one can lead to expensive delays and a maintenance nightmare. Understanding things like [how long it takes to build a website](https://milktreeagency.com/insights/how-long-does-it-take-to-build-a-website) helps put the resource and timeline planning into perspective.\n\nThis decision is huge, especially when you consider that stack complexity is a major hurdle for many companies. In fact, a staggering **70% of data leaders** say their current stack is too complex, which often leads to wasted money. On the flip side, companies that nail this and adopt a modern, well-aligned stack have seen query performance jump by **70%** and their total cost of ownership drop by **50%**.\n\n> A thoughtful tech stack isn't just about picking popular tools; it's about building a sustainable foundation that supports your business goals today and prepares you for the challenges of tomorrow.\n\nTo make this decision less overwhelming, I find it helpful to break it down into four core pillars. This framework gives you a clear way to evaluate your options and make sure your final choice is both technically solid and strategically smart.\n\n#### Key Pillars for Tech Stack Selection\n\nThis table summarizes the four core areas to evaluate. Use it as a checklist to guide your conversations and ensure you're covering all your bases.\n\n| Pillar                      | Key Questions to Ask                                                  | Potential Impact                                                                    |\n| --------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |\n| **Project Requirements**    | What problem are we solving? What features are essential for the MVP? | Dictates the complexity, performance needs, and feature set of the application.     |\n| **Team Expertise**          | What technologies does our team already know well?                    | Affects development speed, code quality, and the ability to troubleshoot issues.    |\n| **Growth & Scalability**    | How many users do we expect in one year? Five years?                  | Determines if the stack can handle increased load without a complete rewrite.       |\n| **Total Cost of Ownership** | What are the costs for licensing, infrastructure, and hiring talent?  | Influences the long-term financial viability and maintenance burden of the project. |\n\nThinking through each of these areas forces you to move beyond \"what's cool\" and focus on \"what's right\" for your specific situation. It’s the difference between building a product that just works now and one that thrives for years to come.\n\n## Matching Your Stack to Your Business Goals\n\n![An abstract image representing a tech stack being aligned with business strategy icons like graphs and targets.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/69e5c074-9bfc-4abb-bdbb-75f95e013c01.jpg)\n\nIt’s a classic trap: teams jump straight into heated debates about frameworks and languages before they’ve even defined the problem. Let’s be clear—the idea of a single “best” tech stack is a total myth. The _right_ stack is the one that’s tailor-made to support your business objectives from day one.\n\nThis is all about translating your business needs into concrete technical requirements. Are you trying to ship a quick **Minimum Viable Product (MVP)** to see if an idea has legs? Or are you architecting a sprawling, enterprise-level platform meant to last a decade? The tech choices for these two scenarios couldn't be more different.\n\n### From Business Needs to Technical Specs\n\nBefore you even think about code, you need to do a practical assessment of what your application absolutely _must_ do. Forget frameworks for a minute and focus on pure functionality. This simple step is your best defense against over-engineering and ensures every technical decision has a clear \"why\" behind it.\n\nSo, what does your app actually need to do?\n\n- **Real-time Interaction:** Do you need things to happen instantly, like in a live chat app or a real-time analytics dashboard? If so, you're already leaning towards technologies like WebSockets and frameworks built for that kind of persistent connection.\n- **Heavy Data Lifting:** Is your app going to be churning through massive datasets or running complex queries? This will heavily influence your database choice (think SQL vs. NoSQL) and the backend language you pick to handle the load.\n- **Fort Knox Security:** Are you handling sensitive information, like financial data in a fintech app or patient records in healthcare? This demands a stack with a rock-solid security reputation and tools that make it easier to meet strict compliance standards like **PCI** or **HIPAA**.\n- **Connecting the Dots:** Will your app need to talk to a bunch of external services and APIs? Your choice of language and framework will matter a lot here—you’ll want something with robust HTTP clients and a rich ecosystem of libraries for integrations.\n\nGetting this down on paper is like creating a blueprint. It forces you to make decisions that solve real problems, not just chase the latest shiny object on Hacker News.\n\n### Seeing It In Action: Stacks for Different Goals\n\nTo make this tangible, let’s walk through two completely different scenarios and see how their business goals dictate their tech stack.\n\n**Scenario 1: The High-Traffic E-commerce Site**\n\nFor an e-commerce platform, the name of the game is speed, reliability, and the ability to handle massive traffic spikes during events like Black Friday. The business needs a snappy UI, lightning-fast product search, and a bulletproof checkout process.\n\nA smart stack here might look something like this:\n\n- **Front-End:** [**Next.js**](https://nextjs.org/) for its server-side rendering capabilities. This gets pages to the user incredibly fast, which is a huge deal for both SEO and keeping impatient shoppers from bouncing.\n- **Back-End:** [**Node.js**](https://nodejs.org/en) is a natural fit. Its non-blocking, event-driven architecture is brilliant at juggling thousands of concurrent connections from shoppers browsing the site.\n- **Database:** A hybrid approach often works best. [**PostgreSQL**](https://www.postgresql.org/) for critical transactional data (orders, user accounts) and something like [**Elasticsearch**](https://www.elastic.co/) to power a ridiculously fast and flexible product search.\n\n> The takeaway? Every single piece of this stack is chosen to drive performance and a killer user experience. A slow site loses money, period. So, the tech is optimized for speed above all else.\n\n**Scenario 2: The Secure Fintech App**\n\nNow, let's flip the script. For a fintech app, the absolute top priorities are security, data integrity, and regulatory compliance. The business has to build trust from the ground up, ensuring every transaction is flawless and secure.\n\nThe stack here will prioritize a different set of strengths:\n\n- **Back-End:** You'd likely see a language like **Java** (with [**Spring Boot**](https://spring.io/projects/spring-boot)) or **C#** (with **.NET**). These are battle-tested, mature ecosystems known for their robustness, extensive security features, and strong typing.\n- **Database:** A traditional relational database like **PostgreSQL** is non-negotiable. Its strict **ACID compliance** is essential for guaranteeing that financial transactions are handled with perfect integrity.\n- **Architecture:** A microservices architecture would be a strong contender. By isolating critical functions (like payments or user authentication), you limit the \"blast radius\" if one part of the system is ever compromised.\n\nIn this world, raw performance might take a backseat to bulletproof security and reliability. Choosing a \"boring\" but proven stack isn't a technical compromise; it's a strategic business decision. By putting your business goals first, you build a foundation that doesn’t just work—it succeeds.\n\n## Building on Your Team's Strengths and Expertise\n\n![A team of developers collaborating around a screen, representing team expertise in a tech environment.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f125b2ea-d7fb-49f1-bf2c-754f71377590.jpg)\n\nLet's be real. A perfectly designed tech stack is just a theoretical exercise if your team can't actually _use it_ to build, ship, and maintain your product. The most critical factor in your decision isn't the technology itself, but the people who will be living in that codebase every single day.\n\nStarting with what your team already knows is almost always the fastest path to a successful launch.\n\nWhen your developers are fluent in a language or framework, they hit the ground running on day one. They already know the common pitfalls, the best practices, and how to solve problems without losing weeks just getting up to speed. This isn't just about moving fast; it's about building a quality product that's stable for the long haul.\n\n### Conducting an Honest Skills Audit\n\nBefore you get swept up by the hype of a trendy new technology, you need to take a hard, realistic look at what your team can do _right now_. This isn't a performance review; it's a strategic gut-check to see where your collective strengths lie. A simple skills matrix can be incredibly revealing.\n\nList out your key developers and the tech they know well. Then, start asking the tough questions:\n\n- **What can we build productively today?** Pinpoint the tools your team can use to ship features immediately, without a massive learning curve.\n- **Where are our knowledge gaps?** Be brutally honest about the tech where your team only has surface-level experience.\n- **What's our \"bus factor\"?** If your one expert on a critical piece of tech leaves, are you completely stuck? Relying on a single person is a huge risk.\n\nThis audit helps you choose a path that builds on your team's existing momentum. For instance, if your team is packed with JavaScript experts, doubling down on a framework like [React](https://react.dev/) is a no-brainer. If they need to level up, our guide on [how to learn React](https://magicui.design/blog/how-to-learn-react) can give them a clear path forward.\n\n> The best tech stack is often the one you already know. Familiarity translates directly into faster development cycles, fewer bugs, and a more maintainable codebase.\n\n### The Value of a Mature Ecosystem\n\nBeyond your immediate team, the broader developer community around your chosen stack is a resource you can't afford to ignore. A mature ecosystem provides a safety net that is invaluable when you inevitably hit a wall.\n\nFirst, look at the quality and availability of documentation. When your team gets stuck, clear, comprehensive docs can be the difference between a ten-minute fix and a two-day investigation. A vibrant community also means more tutorials, conference talks, and forum discussions to pull from.\n\nFinally, think about hiring. Choosing a popular, well-established technology like [Python](https://www.python.org/) or [Java](https://www.java.com/en/) means you have a much larger talent pool to draw from when it's time to grow. Opting for a niche language can turn a simple hiring process into a long, expensive hunt for a handful of qualified developers. This is a key part of choosing a tech stack that can actually support your long-term growth.\n\n## Planning For Growth, Scalability, and Cost\n\n![An abstract image representing a tech stack scaling up with arrows pointing upwards, indicating growth and scalability.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/62b01971-9e97-4c7e-87ca-588773406045.jpg)\n\nChoosing a tech stack is a lot like laying the foundation for a skyscraper. If you plan for a two-story building but suddenly need to support fifty, the whole structure is compromised. The ability for your application to handle its own success is baked in right from the start, deep in its core architecture.\n\nThis isn't just about handling a flood of new users; it's about how gracefully your stack performs under pressure. Key performance metrics like **latency** (the time it takes to process a single request) and **throughput** (how many requests it can juggle at once) are directly tied to your technology choices. A sluggish app doesn't just annoy users—it actively costs you money.\n\nFor some practical advice on this, we've put together a guide on [how to improve website loading speed](https://magicui.design/blog/how-to-improve-website-loading-speed) that’s packed with actionable tips.\n\n### Vertical vs. Horizontal Scaling\n\nWhen you hit a growth spurt and need more power, you have two main paths to take. Your stack needs to be ready for the one you choose.\n\n- **Vertical Scaling (Scaling Up):** Think of this as swapping out your car's engine for a bigger one. You add more resources—like a beefier CPU or more RAM—to a single server to make it more powerful. It's often simpler to manage at first, but you’ll eventually hit a physical limit, and the costs can get eye-watering.\n\n- **Horizontal Scaling (Scaling Out):** Instead of one monster server, you just add more servers to the fleet and spread the workload across them. This is the bedrock of modern, cloud-native apps. It’s more complex to set up initially but offers almost infinite scalability and much better fault tolerance. If one server goes down, the others pick up the slack.\n\nA monolithic application might scale vertically without much fuss, but a microservices architecture is designed from day one to scale horizontally. Figuring out which model aligns with your long-term vision is a huge piece of the tech stack puzzle.\n\n### Calculating The True Cost Of Ownership\n\nThe initial price tag for development is just the tip of the iceberg. What you really need to look at is the **Total Cost of Ownership (TCO)**, which paints the full picture of what your stack will cost over its entire lifetime.\n\n> A stack that’s cheap to build can be a nightmare to run. You have to factor in everything: ongoing server bills, maintenance, licensing fees, and the cost of finding and hiring engineers with the right skills.\n\nThis is where a cloud-native approach really shines. Cloud computing has become the standard for modern applications for good reason—it’s cost-effective and incredibly flexible. As of 2025, around **51% of companies** have moved their infrastructure to the cloud. Projections show that over **45% of all IT spending** will shift to cloud services by 2026. This trend allows businesses to pay for what they use and scale on demand, all without shelling out for massive, upfront hardware investments.\n\n### Tech Stack Cost Comparison\n\nWhen you're mapping out your budget, it's helpful to compare the financial implications of different stack philosophies. Each comes with its own set of trade-offs.\n\n| Stack Type              | Initial Cost        | Maintenance Cost | Scalability Cost | Ideal Use Case                                              |\n| :---------------------- | :------------------ | :--------------- | :--------------- | :---------------------------------------------------------- |\n| **Open-Source**         | Low to None         | High             | Moderate         | Startups, community-driven projects, custom solutions.      |\n| **Proprietary**         | High                | Low to Moderate  | High             | Enterprise applications needing dedicated support and SLAs. |\n| **Cloud-Native**        | Low (Pay-as-you-go) | Moderate         | Low to Moderate  | Scalable applications needing flexibility and resilience.   |\n| **Headless/Composable** | Moderate            | Moderate         | Low              | E-commerce or content sites needing flexible frontends.     |\n\nUltimately, choosing a stack that can grow with you isn't just a technical decision; it's a strategic one. It's about finding that sweet spot between today's immediate needs and tomorrow's biggest ambitions. A scalable, cost-effective stack is the engine that will power your business long after the confetti from your launch party has been swept away.\n\n## Adopting Modern Tech to Stay Ahead\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/egJAqyS9CB8\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nPicking a tech stack isn't just about solving the problems you have right now; it's a strategic bet on where the industry is headed. A stack that feels cutting-edge today can quickly become a technical liability if it can’t keep up with major shifts like AI, machine learning (ML), and serverless architectures. Building an application that lasts means choosing tools that are not just functional but also flexible enough to adapt.\n\nThis is especially true with the explosion of artificial intelligence. Integrating AI is no longer a niche, \"nice-to-have\" feature—it's becoming a core part of building a competitive advantage. It's a massive wave; global spending on AI is expected to hit **$360 billion** by 2025, and **83% of companies** now see it as a top business priority.\n\nJust look at the impact: Netflix already pulls in over **$1 billion a year** from its AI-powered recommendation engine alone. That's real, tangible value. You can dive deeper into how AI is reshaping tech stacks over at [SuperAGI.com](https://superagi.com/).\n\n### Evaluating AI and ML for Your Project\n\nSo, how do you know if your project actually needs AI or ML? The first thing to do is cut through the hype and pinpoint specific, concrete ways these technologies can make your product better.\n\nStart by looking at your data. Does your application handle a lot of it? If so, you're sitting on a goldmine for AI-powered features.\n\n- **Predictive Analytics:** An e-commerce app could use ML models to predict inventory needs based on sales trends, preventing frustrating stockouts or costly overstocking.\n- **Automated Personalization:** A media site can create a completely unique experience for every visitor, recommending articles or videos based on their viewing history. This is a game-changer for engagement.\n- **Intelligent Automation:** Think about your internal tools. AI can automate tedious tasks like routing support tickets or flagging suspicious account activity, freeing up your team to focus on work that actually requires a human brain.\n\n> Building with AI/ML support in mind is a form of future-proofing. It gives you the runway to add intelligent features later without having to tear down your entire architecture and start over.\n\n### Selecting AI-Ready Frameworks and Platforms\n\nOnce you have a solid use case, the next step is finding the right tools for the job. You don't need to build everything from the ground up. The smart move is to pick platforms with a mature ecosystem for AI and ML.\n\nLook for languages and frameworks that are known for their powerful AI/ML libraries. **Python** is still the undisputed king here, with giants like **[TensorFlow](https://www.tensorflow.org/)** and **[PyTorch](https://pytorch.org/)** powering countless applications.\n\nOn the infrastructure side, cloud platforms like [AWS](https://aws.amazon.com/), [Google Cloud](https://cloud.google.com/), and [Azure](https://azure.microsoft.com/) are your best friends. They offer a whole suite of managed AI services that you can plug directly into your application. They handle all the heavy lifting of training and deploying models, so your team can stay focused on building great features.\n\nUltimately, the goal is to build an adaptable architecture. By planning for these advancements from the start, you create a stack that doesn't just meet your immediate needs—it gives you the flexibility to innovate and stay ahead for years to come.\n\n## Answering Your Biggest Tech Stack Questions\n\nEven with a solid plan, you're going to have questions. It’s only natural. Making the final call often boils down to a few practical, real-world concerns that pop up right when you’re about to commit.\n\nLet's walk through some of the most common questions I hear from teams on the verge of picking their path.\n\n### How Often Should I Review My Tech Stack?\n\nA tech stack is a living thing, not a \"set it and forget it\" decision.\n\nThink of it this way: give it a lightweight check-up once a year, and a full, in-depth audit every **two to three years**. The annual review is your chance to patch security holes, update critical libraries, and grab any easy performance wins.\n\nThe deeper audit is where you ask the tough questions. Is our stack actively slowing down feature development? Are we bleeding money on maintenance? Could a newer tool solve our core problem **10x** better? This doesn't mean you have to rip everything out and start over. More often, it leads to a smart, phased migration of one or two services.\n\n### What Is the Biggest Mistake to Avoid?\n\nEasy. The single most expensive mistake you can make is **\"resume-driven development.\"**\n\nThis is what happens when someone on the team picks a shiny new technology because they want to learn it, not because it's the right tool for the job. It's a trap. You end up with a system that's wildly over-engineered for what you actually need.\n\nWorse, you now have a system that’s hard to hire for and has a tiny support community when things inevitably break. Always, always tie your tech choices back to the business goals. The \"boring\" but stable and well-understood technology is almost always the smarter bet, especially for your core product.\n\n> The best tech stack solves your business problem with the least friction. It’s not the one that looks coolest on a resume.\n\n### Should I Choose a Monolith or Microservices?\n\nThis really comes down to your team size, the complexity of your project, and where you see it going long-term.\n\nFor most startups and MVPs, a clean, well-organized monolith is the way to go. It’s faster to build, simpler to deploy, and lets a small team move at lightning speed without getting bogged down in operational overhead.\n\nBut as your application—and your team—grows, that monolith can start to feel like a ball and chain. That's the moment to start thinking about microservices.\n\n- **Microservices** give you incredible scalability, let teams work independently, and offer the flexibility to use different tech for different jobs.\n- But don't be fooled—they also bring a ton of complexity with deployment, monitoring, and keeping data consistent across services.\n\nMy best advice? Start with what some call a \"majestic monolith.\" Build a single application, but design it with clear, logical boundaries inside. Only when you feel the _real_ pain points that microservices solve should you start breaking pieces off.\n\n---\n\nChoosing the right components is the first step, but building with them is what brings your vision to life. At **Magic UI**, we provide over **150** free, open-source animated components built with [React](https://react.dev/), [Tailwind CSS](https://tailwindcss.com/), and [Framer Motion](https://www.framer.com/motion/) to help you build beautiful and performant UIs faster.\n\nExplore the collection at [magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-create-a-landing-page.mdx",
    "content": "---\ntitle: \"How To Create a Landing Page in 8 Simple Steps\"\ndescription: \"Learn how to create a landing page in 8 simple steps and boost your conversions effortlessly. Perfect for beginners and pros.\"\nimage: https://cdn.magicui.design/assets/697478bc-5e16-49ed-bdff-c34160c9f994.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nCreating an effective landing page is crucial for boosting your business and driving conversions. Many businesses struggle with creating a landing page that resonates with their audience and converts visitors into paying customers. In this blog, we'll guide you through creating a landing page and provide valuable insights on the best practices to adopt optimized [landing page examples](https://magicui.design/blog/landing-page-examples).\n\nIf you want to learn how to create a landing page and the best practices to adopt, Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is your go-to solution. This tool makes the process easier and more efficient, ensuring you create a landing page that truly stands out and drives conversions.\n\n## What is a Landing Page?\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx3ZWJzaXRlJTIwaG9tZXBhZ2V8ZW58MHx8fHwxNzIwNjQ4MTE3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nA landing page is designed to turn site visitors into leads or customers. Their primary function is to direct visitors to the CTA. Most landing pages feature personalized content and a clear CTA to encourage users to take the desired action, such as:\n\n- Filling out a contact form\n- Downloading content\n- Purchasing\n\n### Maximizing Conversions with Multiple Landing Pages\n\nA website can have multiple landing pages. For example, you may create different landing pages to test out different messaging or layouts and see which version your visitors respond to the most. You can also create different landing pages to send visitors through a series of choices to land on a tailored CTA. This is known as a click funnel.\n\n## What Are Landing Pages Good For?\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1688561808434-886a6dd97b8c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxvbiUyMGVjb21tZXJjZXxlbnwwfHx8fDE3MjA2NDgzNTV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nLanding pages educate your visitors and use compelling content to transform them into clients. They also serve as a representation of your website and your business. For example, in most cases, a landing page is the first thing a visitor will see after clicking on an ad. However, while it may be your audience's first page, a landing page differs from a web page's focus on conversion and lead generation.\n\n### Landing Pages Designed for Conversions\n\nA landing page stands alone, often at the forefront of a homepage, and serves a single purpose: getting your visitors to give you their contact information. Landing pages have limited navigation and direct visitors to a call to action. They give your offer or promotion a place to live and act as a [gate to your materials](https://en.wikipedia.org/wiki/Landing_page).\n\n### The Rise of Landing Pages\n\nLanding pages were developed in 2003 by Microsoft's IT department in response to disappointing sales of its Office software at the time. Since then, they have become a key part of many businesses' digital marketing strategies.\n\n### Reference vs. Transactional Landing Pages\n\nThere are two main types of landing pages:\n\n- Reference\n- Transactional\n\nReference pages are designed to provide targeted information about a specific product or service without any other distractions on website pages. A transactional page aims to move visitors to take action from a CTA, usually by submitting their email addresses through a form.\n\n## Design Efficiency and Captivating User Interfaces with MagicUI\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1576595580361-90a855b84b20?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8d2Vic2l0ZSUyMGRlc2lnbnxlbnwwfHx8fDE3MjA2NDgxMzR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI, we provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### MagicUI's Powerhouse Features\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nWith MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Good To Know and Useful Tips About Landing Pages\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1613759612065-d5971d32ca49?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxpZGVhdGlvbnxlbnwwfHx8fDE3MjA2NDgxNTJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Simple Message and Promoting Desired Action\n\nThe landing page has one simple message to convey: promote the desired action and explain the benefits of performing this action. Keep it clear and concise.\n\n### Design Focused on Objective \n\nThe page's design should support the objective and not compete for attention. Keep it clean, simple, and synced with your brand identity.\n\n### Make Site Visitors Click\n\nThe goal is to make visitors click, so ensure all buttons are labeled clearly and stand out. The design and text should reflect the call to action.\n\n### Anatomy of a Landing Page\n\nThe landing page should be a single page divided into sections. It should be focused but not too long to maintain visitor attention.\n\n### Powerful Visual Representation\n\nHeaders, subheaders, buttons, and images should effectively represent the message while maintaining a cohesive design. For inspiration, check out the [best landing page examples](https://blog.hubspot.com/marketing/fantastic-landing-page-examples).\n\n### Professional Landing Page Template\n\nUse a professional landing page template for a visually appealing and structured design. You can also start with a free template and customize it to your brand's needs.\n\n### Free Template and One Page Website Builder\n\nStart with a free template and customize it for your brand's needs. You can also use a one-page website builder to tailor your landing page from scratch.\n\n## How To Create a Landing Page In 8 Steps\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1472289065668-ce650ac443d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkZXNpZ24lMjBwYWdlfGVufDB8fHx8MTcyMDY0ODIwNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Set Your campaign goal\n\nEvery landing page needs a goal. Are you summoning sales, conversions, or leads? For e-commerce marketers, it’s about turning browsers into buyers. For agencies, it’s about weaving pages to conjure more conversions. For SaaS folks, it’s creating pages to fuel your growth. Set a realistic and measurable goal to achieve it with your page.\n\n### 2\\. Select a Landing Page Template\n\nAfter setting your goal, the next step is to select the appropriate landing page template. Choosing a pre-made template is more stress-free than starting from scratch because you can use its layout and build upon it.\n\n#### MagicUI Pro for Powerful Landing Pages\n\nMost landing page builders offer time-saving templates, providing a solid foundation for customization. [Magic UI](https://pro.magicui.design/docs/templates/startup) Pro enhances this by saving thousands of hours and offering customizable templates to convert visitors into customers. With animated components, your landing page becomes more engaging and effective, making it easier to achieve specific goals.\n\n### 3\\. Write Your Copy\n\nYou should know that a landing page copy is twice as important to conversion rates as the design. Landing pages are concise by design, so it’s important to nail every word.\n\nHere are some tips on how to write your landing page to the best of your ability:\n\n#### Nail the Headline\n\nYou have less than 15 seconds to grab a visitor’s attention on a landing page, making the headline crucial. Ensure it is memorable, clear, and solves the visitor’s main problem.\n\n#### Focus on the Benefits\n\nFocus on how your product solves visitors’ problems and benefits them rather than listing features. Craft irresistible copy from their perspective, and refer to our guide for effective landing page copywriting.\n\n#### Keep It Simple\n\nIn general, landing pages convert better when they’re easy to read and not overly long. Avoid sounding like a business textbook, keep your sentences short and sweet, and cut out any unnecessary copy you don’t need on the page.\n\n### 4\\. Craft Your CTA\n\nYour CTA is crucial on your landing page. It’s the action you want visitors to take, whether filling out a form or hitting a button. Make it [compelling and clear](https://www.masterclass.com/articles/how-to-write-an-effective-call-to-action) to convince visitors effectively. Getting your CTA can make or break your landing page’s success.\n\nVisitors won’t know what to expect when they click a button like:\n\n- Learn More\n- Get Started\n\nHere are effective CTAs for better results:\n\n- See Pricing\n- Start Your Free Trial\n- Book A Demo\n\n### 5\\. Select Your Images \n\nNow that you’ve got your copy written like the wordsmith you are, it’s time to bring out that inner Picasso to work on the visuals of your landing page (but seriously, no pressure.)\n\nBefore you get thrown into full design mode, you can start out by selecting what images you want to feature:\n\n- Product images\n- Stock photos\n- Custom illustrations\n\n#### Choose a Hero Image\n\nYou want to come in hot. Most great landing pages start with a big, beautiful image to show visitors what the offer is all about.\n\n#### Go for People Over Product\n\nPeople like seeing people. Make real photographs of people using or enjoying the product on your landing page whenever possible. People-focused imagery helps visitors connect with your offer on a more personal and emotional level.\n\n#### Visualize the Benefits\n\nWondering how your offer looks in action? Use images throughout your landing page to convey its benefits. Since many visitors won’t read every word, supplement your copy with different product images or custom illustrations to help tell a visual story effectively.\n\n### 6\\. Connect Your Landing Page \n\nA landing page all by itself won’t do you much good. Here’s how to connect to your business domain, set up analytics, and integrate any other tools in your marketing stack:\n\n#### Set Your URL\n\nYour URL also reflects your brand experience. Connect your landing page to your domain and customize the URL.\n\n#### Add Tracking and Custom Scripts\n\nAfter putting in all this hard work on your landing page, you’ll want to know who’s visiting it and their actions. Embed tracking for scripts like Google Analytics or any other analytics software to gather data as you go.\n\n### 7\\. Preview and Publish\n\nThis right here is the moment you’ve been waiting for. But before you pop the champagne and hit publish on your landing page, give it one more look-over to ensure you’re ready for a world debut.\n\n#### Check the Copy\n\nDo a quick spot-check to ensure your page is free of typos or grammar issues. You don’t want to make a bad first impression.\n\n#### Check the SEO\n\nMake sure you select whether or not you want your page to be visible to search engines and optimize it by writing a keyword-focused page title and meta description.\n\n#### Check the Forms\n\nIs everything working the way you want it to? Did you set up a “Thank You” page after someone submits? Go through the page as a visitor to see if you missed anything. Do it right now; we’re watching.\n\n### 8\\. Optimize Your Landing Page\n\nLanding page creation is practically over at this step. Yet you don’t just publish your landing page and forget it. You need to test and optimize it to maximize its performance. The best way to do that is through A/B testing.\n\nSome key elements that you should test include:\n\n- Headline: Try out a different version of your headline\n- Visuals: Change the hero image with a new one on your page\n- CTA: Design an alternative CTA button with a twist in the copy\n\n## Landing Page vs. Website: When Should You Use Each?\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1481487196290-c152efe083f5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHx3ZWJzaXRlfGVufDB8fHx8MTcyMDY0ODE2NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### When You Should Use a Website?\n\nA website is the path to establishing a strong online presence and making more people aware of your brand. It should centralize all essential information, including your:\n\n- Blog\n- Careers page\n- Product pages\n\n### When You Should Use a Landing Page?\n\nA landing page should be your go-to if you have a specific marketing goal, like:\n\n- Increasing leads\n- Sign-ups\n- Sales\n- Starting a book club\n\nA landing page is designed for one clear call to action, minimizing distractions to guide visitors directly toward your desired action. It’s an efficient way to achieve your marketing objectives directly and effectively.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 4 Best Practices for Creating a Landing Page\n\n![How To Create A Landing Page](https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkaXNjdXNzfGVufDB8fHx8MTcyMDY0ODE3N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Specify Landing Page Goal\n\nCreating a landing page with a single, focused goal is crucial for increasing conversions. Avoid sending mixed messages and use a consistent CTA across your ad and landing page form instead.\n\n### 2\\. Choose a Relevant Hero Image\n\n[Selecting the right hero image](https://dowelldesignstudio.com/how-to-choose-a-hero-image/) is key when designing a landing page. Consider your target audience and choose an image that will resonate with them. The image should appeal to visitors and strengthen your message or value proposition.\n\n### 3\\. Treat Your CTA With Utmost Care\n\nStudy effective CTAs to determine which will work best for your specific purpose. Effective CTAs are benefit-focused, concise, and feature action verbs. Highlighting your CTA using contrasting colors, negative space, and strategic placement can increase its visibility and effectiveness.\n\n### 4\\. Do A/B Testing\n\nA/B testing, or split testing, involves creating two slightly different landing page variations to determine which yields better results. When conducting A/B testing, make minor changes to one element simultaneously to isolate variables. Examples of A/B testing include comparing different CTAs, headlines, or hero images. Use the ICE (Impact, Confidence, Ease) framework to [prioritize variables for testing](https://blog.growthhackers.com/the-practical-advantage-of-the-ice-score-as-a-test-prioritization-framework-cdd5f0808d64).\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It features over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI, you can easily create visually appealing and interactive elements that can be integrated into web applications.\n\n### Simplifying Landing Page Creation With MagicUI Pro\n\n[MagicUI](https://magicui.design/) Pro saves time and effort when creating attractive landing pages. The library allows users to convert visitors into customers by utilizing website templates designed for this purpose. With a focus on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering users to create engaging digital experiences effortlessly.\n\n### Leveraging MagicUI Templates for Successful Landing Pages\n\nThe startup landing page template of [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) helps businesses establish a strong online presence by effectively communicating their value proposition.\n\nKey features of our landing page template:\n\n- Visually appealing\n- Engaging\n- Easy to search\n- Fully customizable for specific branding needs\n- Enhancing visitor experience\n- Increases conversion rates\n\nReady to transform your online presence? Explore our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n"
  },
  {
    "path": "apps/www/content/blog/how-to-create-drop-down-menu.mdx",
    "content": "---\ntitle: \"How to Create Drop Down Menu: Step-by-Step Guide\"\ndescription: >-\n  Learn how to create a drop down menu with HTML, CSS, and JavaScript. Discover\n  tips on responsiveness, accessibility, and modern techniques for your website.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-fca33315-6255-43e6-b1f4-c7287bd1c30b.jpg\nauthor: Dillion Verma\ntags:\n  - how to create drop down menu\n  - html css dropdown\n  - javascript menu\n  - responsive navigation\n  - react dropdown\npublishedOn: \"2025-10-19T10:20:13.014363+00:00\"\nfeatured: true\n---\n\nAt its core, creating a drop down menu is a three-part dance between **HTML** for structure, **CSS** for looks, and **JavaScript** for the interactive magic. The basic idea is simple: you start with a navigation list that's hidden from view. When a user clicks or hovers over a specific trigger—like a button or a link—that hidden list pops into view.\n\n## Building Your First Drop Down Menu with Core Web Tech\n\n![A clean and modern drop down menu displayed on a website interface.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/14d9680c-3746-4b61-afa9-48494a771ea2.jpg)\n\nBefore you get tempted by shiny frameworks and libraries, it's a rite of passage to build one of these from scratch. Getting your hands dirty with just HTML, CSS, and vanilla JavaScript gives you a real feel for the mechanics. Trust me, this fundamental knowledge is a lifesaver when you need to debug a stubborn menu or customize a component down the line, no matter what tools you end up using.\n\nEverything starts with a solid, logical structure. A menu built on a shaky foundation is a nightmare to style and, more importantly, a dead-end for accessibility.\n\n### The HTML Foundation\n\nSemantic HTML isn't just a suggestion; it's the bedrock of any good navigation component. Using the right tags gives browsers and assistive technologies the context they need to understand what they're looking at. For a navigation menu, the playbook is pretty clear.\n\nYou'll want to kick things off with a `<nav>` element to signal that this is a navigation block. Inside that, an unordered list `<ul>` holds your menu items, with each link wrapped in a `<li>`. This isn't just arbitrary—it’s the standard that ensures your menu is accessible and machine-readable. If you want to zoom out and see how this fits into the bigger picture, check out our guide on [how to create a navigation bar in HTML](https://magicui.design/blog/how-to-create-navigation-bar-in-html).\n\nHere’s what that basic structure looks like in practice:\n\n<nav className=\"navbar\">\n  <ul className=\"nav-links\">\n    <li>\n      <a href=\"#\">Home</a>\n    </li>\n    <li className=\"dropdown\">\n      <button className=\"dropdown-toggle\" aria-expanded=\"false\">\n        Services\n      </button>\n      <ul className=\"dropdown-menu\">\n        <li>\n          <a href=\"#\">Web Design</a>\n        </li>\n        <li>\n          <a href=\"#\">SEO</a>\n        </li>\n        <li>\n          <a href=\"#\">Hosting</a>\n        </li>\n      </ul>\n    </li>\n    <li>\n      <a href=\"#\">About</a>\n    </li>\n  </ul>\n</nav>\n\n> **A Quick Pro-Tip:** See that `<button>` inside the dropdown `<li>`? That's deliberate. Buttons are for actions (like opening a menu), while `<a>` tags are for navigating to a new page. This small detail makes a world of difference for keyboard users and screen readers.\n\n### Styling with CSS\n\nOnce the HTML skeleton is in place, it's time for CSS to give it some flesh and personality. Your first job is to make sure the dropdown submenu is hidden by default. The simplest, most reliable way to do this is with `display: none;`.\n\nFrom there, you'll style the main navigation bar and the button that triggers the dropdown. The real trick happens when the menu needs to appear. We'll use JavaScript to add a class (let's call it `.show`), which will flip the submenu's display property to `display: block;`, making it visible.\n\nHere's the styling game plan:\n\n- **Initial State:** Your `.dropdown-menu` starts with `display: none;`.\n- **Positioning:** Give the dropdown container (`.dropdown`) `position: relative;` and the submenu (`.dropdown-menu`) `position: absolute;`. This lets you position the submenu precisely below its parent without messing up the rest of your layout.\n- **Visibility Toggle:** A simple class like `.show` will be our on/off switch for the menu's visibility.\n\n### Adding Interactivity with JavaScript\n\nFinally, JavaScript steps in to handle the logic. All we need to do is listen for a click event on our dropdown button. When that click happens, we'll simply toggle the `.show` class on the submenu.\n\nThis approach keeps things clean and efficient. The JavaScript is only responsible for toggling a state, while the CSS handles all the visual changes. This separation of concerns makes your code way easier to read, maintain, and debug later.\n\n## Making Your Menu Work for Mobile Users\n\n![A hamburger menu icon displayed on a mobile device screen.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e14f4d97-eeea-429e-8847-c3b8f538764d.jpg)\n\nWe’ve all been there: a navigation menu that looks perfect on a desktop but turns into a jumbled mess on a phone. It’s an instant user experience fail. Since most people browse the web on their phones, responsive design isn’t just a nice-to-have anymore—it’s an absolute must.\n\nThe numbers don't lie. The modern web is overwhelmingly mobile. The latest data shows an estimated **62.54% of global website traffic** now comes from mobile devices. This trend has been climbing for years and solidifies why components like dropdown menus need to adapt seamlessly.\n\n### Taming the Layout with CSS Media Queries\n\nSo, how do you transform your desktop menu for smaller screens? The real magic happens with CSS **media queries**. Think of them as simple rules that apply specific styles only when certain conditions are met, like when a screen’s width drops below a particular size. This lets you create a completely different layout for mobile without messing up your desktop design.\n\nA common breakpoint is **768 pixels**. Once the screen is narrower than that, you’ll typically want to:\n\n- Hide the standard horizontal navigation list.\n- Show a \"hamburger\" icon that users can tap to open the menu.\n- Make the menu items appear in a vertical stack when the icon is tapped.\n\nThis is the core of an adaptive interface. To make sure your menu adjusts gracefully on any device, it’s worth brushing up on the [foundational responsive web design principles](https://altitudedesign.co.uk/blog/what-is-responsive-web-design). It's about more than just hiding and showing elements; it's about creating a fluid experience.\n\n> A great responsive menu feels intentional, not like a compromised version of the desktop site. It’s a chance to rethink navigation for a different context, often leading to a cleaner, more focused user journey.\n\n### Designing for Fingers, Not Cursors\n\nSimply resizing your menu isn’t enough. You also have to design for touch. Fingers are far less precise than a mouse cursor, which makes tiny, tightly packed links a recipe for pure frustration.\n\nThis is where having a generous **tap target size** becomes critical. Your buttons and links need to be large enough—and have enough space around them—to prevent users from accidentally tapping the wrong thing. Try increasing the padding and spacing on your mobile menu items to create a much more forgiving interface.\n\nThis all feeds into a broader strategy called mobile-first design. If you want to dig deeper, you can explore [what is mobile-first design](https://magicui.design/blog/what-is-mobile-first-design) in our detailed guide. It’s a powerful approach that forces you to prioritize the mobile experience from the very beginning.\n\n## Making Your Dropdown Accessible to Everyone\n\nBuilding a dropdown menu that _looks_ good is only half the battle. If a user navigating with a keyboard or a screen reader can't use it, then it’s broken. That's why making your dropdown accessible isn't just a \"nice-to-have\"—it's a core part of building for the modern web.\n\nGetting this right doesn't just help users with disabilities; it actually improves the overall experience for everyone and can even give your technical SEO a little boost. It’s a true win-win. With **5.56 billion people** online as of early 2025 and **70.5% of the world's population** on mobile, creating components that work for a global audience is absolutely essential. You can dig into more of these stats in the latest [global state of digital report from WeAreSocial](https://wearesocial.com/us/blog/2024/01/digital-2024/).\n\nThis infographic really nails down the techniques that connect the technical bits of accessibility to real-world user benefits.\n\n![Infographic about how to create drop down menu](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4d16c810-215d-4bb5-9c63-65d0fa69c4ed.jpg)\n\nAs you can see, what might seem like small code attributes translates directly into a more intuitive and seamless experience for your users.\n\n### Using ARIA for Clear Communication\n\nSo, how do we make our dropdown \"talk\" to assistive technologies? We use **WAI-ARIA** (Web Accessibility Initiative – Accessible Rich Internet Applications). These attributes are like adding helpful labels and context for screen readers. For any dropdown, you'll want to focus on a few key players:\n\n- **`aria-haspopup=\"true\"`**: This tells the screen reader, \"Hey, this button opens something up.\" It sets the expectation that a menu will appear.\n- **`aria-expanded=\"false\"`**: This signals that the menu is currently hidden. When a user clicks the button, your JavaScript needs to flip this to `true`.\n- **`aria-labelledby`**: This attribute creates a clear link between the dropdown menu and the button that controls it, removing any ambiguity.\n\n> Think of ARIA attributes as sign language for your website. They translate the visual cues sighted users see into concrete information that a screen reader can announce. Without them, a user might not even realize a hidden menu is there.\n\nBut ARIA is just one piece of the puzzle. The next critical step is ensuring proper keyboard focus. Someone should be able to navigate your entire menu using only their keyboard. This means they can `Tab` through the items and use `Enter` or `Spacebar` to open and close it. If your menu isn't usable without a mouse, it's not truly accessible.\n\n## Modern Approaches with React and Tailwind CSS\n\nWhile getting your hands dirty with vanilla HTML, CSS, and JavaScript is a rite of passage for understanding how the web works, modern development workflows often demand something more robust. When you're building a large-scale application, you can't afford to reinvent the wheel every time you need a dropdown.\n\nThis is where tools like [React](https://react.dev/) and [Tailwind CSS](https://tailwindcss.com/) really shine. They let you build complex UIs efficiently and, more importantly, maintainably.\n\n![A code snippet showing React and Tailwind CSS classes for a dropdown component.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/427b322d-d3e1-4882-aea5-3cdbfe5c5e67.jpg)\n\nThe big shift in thinking here is moving towards reusable components. Instead of writing markup and styles for each individual menu, you create a single, self-contained `<Dropdown />` component. This little package contains all the necessary logic and styling, ready to be dropped anywhere you need it. It’s a game-changer for consistency and speed.\n\n### Managing State with React Hooks\n\nIn the React world, we don't manually toggle CSS classes to show or hide elements. That's considered a bit old-school. Instead, we control visibility through **state**.\n\nThe `useState` hook is your best friend for this. You can declare a piece of state, let's call it `isOpen`, and a function to update it, `setIsOpen`. It's a clean, declarative way to manage the dropdown's visibility.\n\n```jsx\nimport React, { useState } from \"react\"\n\nfunction Dropdown() {\n  const [isOpen, setIsOpen] = useState(false)\n\n  return (\n    <div className=\"relative\">\n      <button onClick={() => setIsOpen(!isOpen)}>Options</button>\n      {isOpen && (\n        <ul className=\"absolute right-0 z-10 mt-2 w-48 rounded-md bg-white py-1 shadow-lg\">\n          <li>\n            <a\n              href=\"#\"\n              className=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\"\n            >\n              Profile\n            </a>\n          </li>\n          <li>\n            <a\n              href=\"#\"\n              className=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\"\n            >\n              Settings\n            </a>\n          </li>\n          <li>\n            <a\n              href=\"#\"\n              className=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\"\n            >\n              Logout\n            </a>\n          </li>\n        </ul>\n      )}\n    </div>\n  )\n}\n```\n\nNotice how the `<ul>` element is only rendered if `isOpen` is `true`. Clicking the button simply flips that boolean value. Simple, right? If you're building out more complex navigation, this component-based approach is key. You can see more examples in our guide to building a [React JS navbar](https://magicui.design/blog/react-js-navbar).\n\n> **Pro Tip:** A crucial bit of UX is making the menu disappear when a user clicks anywhere else on the page. You can handle this gracefully by creating a custom hook that listens for click events on the `document` and checks if the target is outside your dropdown component.\n\n### Rapid Styling with Tailwind CSS\n\nThis is where the magic really happens for styling. [Tailwind CSS](https://tailwindcss.com/) lets you ditch separate CSS files and style elements directly in your JSX using utility classes. You can see it in action in the snippet above with classes like `relative`, `absolute`, `shadow-lg`, and `hover:bg-gray-100`.\n\nThis approach is incredibly fast. It keeps your markup, logic, and styles all in one place, making components truly self-contained. You can knock out a fully styled, responsive, and interactive component without ever leaving your `.jsx` file.\n\nTo help you decide which path is right for your project, let's break down the differences between these two methods.\n\n### Comparing Menu Creation Approaches\n\n| Aspect                | HTML, CSS, JavaScript                                                                      | React & Tailwind CSS                                                                              |\n| :-------------------- | :----------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ |\n| **Development Speed** | Slower; requires writing custom CSS and JS logic from scratch for each instance.           | Faster; reusable components and utility classes speed up development significantly.               |\n| **Maintainability**   | Can become difficult to manage as the project grows; styles and scripts are often global.  | Highly maintainable; encapsulated components are easy to update and debug.                        |\n| **State Management**  | Manual DOM manipulation (e.g., `classList.toggle()`) which can get messy.                  | Declarative state management with hooks like `useState` makes logic cleaner and more predictable. |\n| **Styling**           | Requires writing custom CSS, managing class names, and handling specificity.               | Utility-first styling is fast, consistent, and co-located with the component markup.              |\n| **Best For**          | Smaller projects, learning foundational web technologies, or when a framework is overkill. | Large-scale applications, projects requiring a design system, and team-based development.         |\n\nUltimately, both approaches have their place. The \"vanilla\" way is perfect for learning the fundamentals, while the React and Tailwind stack offers the power and scalability needed for modern, professional web development.\n\n## Going Beyond the Basics: Pro Tips and Common Pitfalls\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/8m-WIw_96lY\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nYou’ve got the basics down. But let’s be honest, the difference between an amateur component and a professional one lies in the details. Getting a dropdown to just _work_ is the first step; making it feel polished and intuitive is where the real craft comes in.\n\nOne of the quickest ways to level up your menu is to add subtle CSS transitions. Instead of submenus just blinking into existence, a gentle fade-in with `opacity` or a smooth slide-down with `transform` makes the whole experience feel much more refined. It’s a tiny touch, but it’s the kind of thing that tells a user the interface was built with care.\n\nAnother challenge you'll run into is nested submenus—menus popping out from other menus. These can get messy fast and easily turn into a user experience nightmare. The trick is to give users clear visual cues and enough breathing room so they don't accidentally mouse out and close the parent menu when they're aiming for a child item.\n\n### Common Mistakes I See All the Time\n\nAfter building and debugging countless navigation components, I’ve seen developers get tripped up by the same issues over and over. Sidestep these common traps, and you'll save yourself a world of headache.\n\n- **Forgetting Keyboard Warriors:** A menu that only works with a mouse isn't just inconvenient; it's inaccessible. Users need to be able to `Tab` through every single link and use `Enter` or the `Spacebar` to open submenus and follow links. No exceptions.\n- **Poor Focus Management:** This one's huge. When a dropdown opens, the keyboard focus _must_ shift into that new submenu. When it closes, focus has to return to the button that triggered it in the first place. If you lose that focus state, keyboard and screen reader users are left completely lost.\n- **The \"Div Soup\" Problem:** It’s so tempting to just use `div` elements for everything, but don't do it. Sticking with semantic HTML like `<nav>`, `<ul>`, `<li>`, and `<button>` is non-negotiable for building a structured, accessible component that machines (and other developers) can understand.\n\n> Getting these details right is what transforms a functional menu into a genuinely user-friendly one. To dig deeper into creating truly great navigation, check out these [top website navigation best practices](https://www.wandwebsites.com/post/best-practices-website-navigation).\n\n## Frequently Asked Questions\n\nBuilding a dropdown menu from scratch is a great learning experience, but it's not without its quirks. A few common issues tend to trip developers up. Let's walk through some of the questions I see pop up all the time.\n\n### How Do I Trigger a Menu on Hover Instead of Click?\n\nYou _could_ just use the CSS `:hover` pseudo-class to toggle a submenu from `display: none` to `display: block`. Technically, it works. But this approach is a trap for two big reasons: it completely breaks on touch devices and is a nightmare for anyone navigating with a keyboard.\n\nA much smarter, more inclusive solution involves a bit of JavaScript. By setting up event listeners for `mouseenter` and `mouseleave`, you get full control over the menu's visibility. This lets you properly manage the necessary ARIA attributes, guaranteeing the dropdown works for _everyone_, no matter how they're browsing.\n\n### What Is the Best Way to Handle a Dropdown That Goes Off-Screen?\n\nAh, the classic UI bug: a dropdown menu spilling right off the edge of the viewport. The fix here is to get dynamic with JavaScript.\n\nThe moment the menu opens, you can grab its exact size and position on the screen with `element.getBoundingClientRect()`. Then, you just need to compare its coordinates against the browser window's dimensions, which are easy to find with `window.innerWidth` and `window.innerHeight`.\n\nIf the menu’s right edge goes past the viewport’s edge, you can just add a CSS class that tells it to align differently. While most component libraries take care of this for you, understanding this logic is key to building your own robust components.\n\n> The core idea is simple: measure, compare, and adjust. When the menu's calculated right boundary is greater than the window's width, a class like `.align-right` can flip its positioning from `left: 0` to `right: 0`.\n\n### Should I Use a Library or Build from Scratch?\n\nHonestly, it really depends on the project.\n\nIf you're working on a personal portfolio, a simple website, or you're just trying to level up your skills, building it from scratch is an incredible way to truly understand the nuts and bolts of HTML, CSS, and JavaScript.\n\nBut if you're in a production environment or working on a large-scale application, grabbing a pre-built component from a battle-tested library like [Material-UI](https://mui.com/) or [Headless UI](https://headlessui.com/) is almost always the better call. They’ve already solved all the tricky problems—accessibility, keyboard navigation, responsive behavior—saving you a massive amount of time and potential headaches.\n\n---\n\nReady to build stunning, production-ready interfaces without the headache? **Magic UI** offers a massive library of over **150** free, open-source animated components built with React, Typescript, and Tailwind CSS. Create beautiful landing pages in minutes and accelerate your development workflow. [Explore the components at Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-create-navigation-bar-in-html.mdx",
    "content": "---\ntitle: \"How to Create Navigation Bar in HTML: Step-by-Step Guide\"\ndescription: >-\n  Learn how to create navigation bar in HTML with this complete, easy-to-follow\n  guide. Build a responsive and stylish nav bar using HTML, CSS, and JavaScript.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-79cdc989-ef5b-45da-a33e-f7a654d87be6.jpg\nauthor: Dillion Verma\ntags:\n  - how to create navigation bar in html\n  - html nav bar\n  - css navigation bar\n  - responsive navbar\n  - web development\npublishedOn: \"2025-09-27\"\nfeatured: true\n---\n\nBefore you even think about colors or fonts, the most important step is to build a solid HTML foundation for your navigation bar. This is the skeleton of your component, and getting it right ensures everything else—styling, responsiveness, and accessibility—falls into place smoothly.\n\n## Building Your Nav Bar with Semantic HTML\n\nForget the old days of stringing together a bunch of `<div>` tags. Modern, professional web development is all about using semantic HTML. This just means using tags for their intended purpose. Not only does this make your code cleaner and easier for other developers to read, but it also gives a huge boost to accessibility and SEO.\n\nA well-structured navigation bar is one of the most critical parts of your website's user experience. It tells search engines how your site is organized and helps users with screen readers understand how to get around.\n\n### The Essential HTML Tags\n\nYou only need a handful of tags working together to create a perfectly structured navigation menu. Each one has a specific job.\n\nThe `<nav>` element is your main wrapper. It’s a clear signal to browsers and assistive technologies that \"Hey, this block of links is the main site navigation.\" Inside that, you'll use an unordered list (`<ul>`) to group all your menu items together.\n\nEach individual menu item gets its own list item (`<li>`) tag. Finally, the actual clickable link is the anchor tag (`<a>`), which sits inside the `<li>`.\n\nLet's break down the core HTML elements you'll be using.\n\n### Core HTML Elements for a Navigation Bar\n\nA quick look at the essential HTML tags for building a semantic navigation bar and their specific roles.\n\n| HTML Tag    | Purpose                                                     | Best Practice Tip                                                                                                               |\n| :---------- | :---------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |\n| **`<nav>`** | The main container for your primary navigation links.       | Use it for major navigation blocks like the main site header, but not for every group of links (e.g., footer links).            |\n| **`<ul>`**  | Groups the collection of navigation items into a list.      | `<ul>` is standard for navigation because the order of links usually doesn't imply a sequence, unlike an ordered list (`<ol>`). |\n| **`<li>`**  | Represents a single list item, holding one navigation link. | This tag acts as a wrapper, allowing you to style the area around the link, like adding padding or a background color on hover. |\n| **`<a>`**   | The anchor tag, which creates the actual hyperlink.         | Always include an `href` attribute. For placeholder links during development, use `href=\"#\"`.                                   |\n\nThis structure might seem simple, but it's incredibly powerful and is the industry standard for a reason.\n\nThe introduction of **HTML5** back in **2014** was a game-changer because it gave us the `<nav>` tag. Before that, developers had to rely on generic `<div id=\"nav\">` containers, which offered no real semantic meaning. Using `<nav>` properly helps search engines map out your site's architecture, which can have a positive impact on your rankings.\n\n> A great navigation bar is intuitive and almost invisible; it guides users without making them think. The foundation for that experience starts with clean, semantic HTML. It’s the difference between a flimsy shack and a solid foundation.\n\nBy focusing on this structure first, you make the styling process so much easier down the line. If you're looking for some inspiration on how different structures can lead to incredible designs, check out these [amazing website header examples](https://magicui.design/blog/website-header-examples).\n\n## Styling Your HTML Nav Bar with CSS\n\nAn unstyled list of links is a starting point, but let's be honest, it's a long way from the polished, professional navigation you see on real-world websites. This is where CSS (Cascading Style Sheets) steps in. It's the magic wand that transforms that basic HTML structure into something both beautiful and intuitive. The styling is what truly gives your nav bar its personality.\n\nFirst things first, we need to deal with the default browser styles. Unordered lists (`<ul>`) come with their own opinions—they've got built-in padding, margins, and those classic bullet points. Our first job is to wipe the slate clean.\n\n```css\nul {\n  list-style-type: none; /* Say goodbye to bullet points */\n  margin: 0;\n  padding: 0;\n}\n```\n\nWith that boilerplate out of the way, we can get to the fun part. Most desktop nav bars lay their links out side-by-side, not stacked vertically. The modern and, frankly, easiest way to handle this is with **CSS Flexbox**.\n\n### Creating a Horizontal Layout with Flexbox\n\nFlexbox is a lifesaver for layout challenges. It just makes aligning items simple. By adding `display: flex` to our `<ul>` container, we're essentially telling all of its direct children—the `<li>` elements—to fall in line, literally.\n\n```css\nul {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n  display: flex; /* Lines up the list items in a row */\n  gap: 1rem; /* Adds some breathing room between them */\n}\n```\n\nThat one `display: flex` property does a ton of heavy lifting. Your vertical list is now a clean, horizontal menu. While we're writing custom CSS from scratch here, it's worth knowing you can also [integrate frameworks like Tailwind via CDN](https://magicui.design/blog/tailwind-cdn-html) to make this kind of styling happen even faster.\n\nNext up, let's style the links themselves. The anchor (`<a>`) tags need some attention to get rid of that default blue, underlined look and to make them easier to click. We can do this by adding some padding to increase their target size and changing the text color.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/42fe9eaf-07a9-40af-8804-1e05ce1da4f0.jpg)\n\nTo really dial in the user experience, you absolutely need a **hover effect**. This is a small detail that provides huge visual feedback, letting the user know that an item is interactive. A simple color change on hover is effective and super easy to set up using the `:hover` pseudo-class.\n\n> Good design is about communication. A hover effect is a small but vital conversation with your user, telling them, \"Yes, you can click this.\" It builds confidence and makes the interface feel responsive to their actions.\n\nBy pulling together just these few foundational CSS properties, you can quickly turn a bare-bones HTML list into a nav bar that not only looks professional but is also a pleasure to use.\n\n## Adding Interactive Dropdown Menus\n\nAs your website gets bigger, a simple, single-level navigation bar just doesn't cut it anymore. Things start to feel cluttered. This is the perfect time to bring in dropdown menus, letting you neatly tuck away related sub-pages under a main category. The best part? We can build this slick functionality using only HTML and CSS—no JavaScript required.\n\nThe whole trick is to nest another unordered list (`<ul>`) inside a parent list item (`<li>`). This nested list is what becomes our dropdown menu. From a code perspective, it's just a list within a list, which creates a logical hierarchy that's easy for search engines and screen readers to follow.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b8ee0bc6-19b8-43da-b73a-9a40dc4b37d0.jpg)\n\nRight now, if you add that nested list, it will show up on the page and probably mess up your layout. Our job is to hide it by default and only make it appear when someone hovers over its parent menu item.\n\n### Structuring the HTML for a Submenu\n\nLet's say you want to create a dropdown under a \"Services\" link. The structure is pretty intuitive: you'll add a new `<ul>` right inside the \"Services\" `<li>`, just after the link tag.\n\nHere’s exactly what that looks like in practice:\n\n```html\n<nav>\n  <ul>\n    <li><a href=\"#\">Home</a></li>\n    <li><a href=\"#\">About</a></li>\n    <li className=\"dropdown\">\n      <a href=\"#\">Services</a>\n      <ul className=\"submenu\">\n        <li><a href=\"#\">Web Design</a></li>\n        <li><a href=\"#\">SEO</a></li>\n        <li><a href=\"#\">Hosting</a></li>\n      </ul>\n    </li>\n    <li><a href=\"#\">Contact</a></li>\n  </ul>\n</nav>\n```\n\nWith the HTML skeleton in place, we can jump over to the fun part—using CSS to control the submenu's visibility and positioning. This is where we bring the interactive \"dropdown\" behavior to life.\n\n### Hiding and Showing the Dropdown with CSS\n\nThe game plan is simple: use CSS to hide the submenu initially and then display it whenever a user hovers over its parent `<li>`. We can handle all of this with the `:hover` pseudo-class and a descendant selector.\n\nWe also need to give the submenu `position: absolute`. This pulls it out of the normal flow of the page, so it floats over your content instead of pushing everything down when it appears. To make sure it appears in the right spot, we give its parent `<li>` `position: relative`, which turns it into a positioning anchor for the submenu.\n\n> The parent element with `position: relative` becomes the coordinate system for its absolutely positioned children. This is a fundamental concept in CSS that ensures your dropdown appears exactly where you want it—right below its parent link.\n\nHere’s the core CSS that makes the magic happen:\n\n- **Hide the submenu:** Set `display: none;` on your `.submenu` class.\n- **Position the parent:** Apply `position: relative;` to the `.dropdown` list item.\n- **Position the submenu:** Use `position: absolute;` on `.submenu`.\n- **Show on hover:** Use `.dropdown:hover .submenu { display: block; }` to reveal it.\n\nThis pure CSS method is lightweight and completely reliable, giving your users a smooth experience as they navigate through more complex parts of your site.\n\n## Making Your Navigation Bar Responsive\n\nA nav bar that looks sharp on a desktop but completely breaks on a phone is more than just an inconvenience; it’s a user experience dead end. In a world where most of your traffic is likely coming from mobile devices, making your navigation adapt to different screen sizes isn't optional. It’s a core skill.\n\nThis whole process boils down to **CSS media queries**. Think of them as simple \"if-then\" rules for your stylesheet. A media query tells the browser, \"If the screen is 768px wide or smaller, then apply these specific styles.\" It’s how you can completely transform your navigation for smaller viewports without messing up the desktop version.\n\nBy far, the most common solution you'll see in the wild is the \"hamburger\" menu. The idea is to tuck away the full list of navigation links on small screens and show a simple, clickable icon that toggles the menu open and closed.\n\n### Implementing Media Queries\n\nFirst thing's first, we need to pick a **breakpoint**. This is the specific screen width where our mobile styles will kick in. A popular and effective choice is **768 pixels**, which generally covers tablets and smartphones held upright.\n\nInside that media query, we'll write the CSS to hide the standard navigation links and, in their place, display our hamburger icon.\n\nGood navigation isn't just about looks; it directly impacts how people use your site. By **2025**, it's predicted that **91% of consumers** will gravitate toward sites offering personalized and easy-to-use navigation. A clean, responsive menu is the first step—it helps people find what they need without getting frustrated.\n\n### Toggling Visibility With JavaScript\n\nWhile CSS handles the heavy lifting of hiding and showing elements, we need a little sprinkle of JavaScript to bring the hamburger icon to life.\n\nThe logic is straightforward: when someone clicks the icon, we’ll use JavaScript to add a CSS class (like `.is-visible`) to our navigation menu. That class will contain the styles to make the menu appear, usually by changing its `display` property from `none` to `flex` or `block`. Clicking the icon a second time removes the class, hiding the menu again.\n\nThis diagram lays out the foundational CSS steps you'd take even before thinking about responsiveness.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e3a8d34b-22d4-454c-be8f-0eb6a14dd9b3.jpg)\n\nThis workflow—styling the container, arranging the items, and adding interactive states—is the base layer. Responsive styles are then built right on top of this foundation.\n\n> A responsive navigation bar is a sign of respect for your users. It acknowledges that they access your site from a variety of devices and ensures they have a seamless experience, no matter the screen size.\n\nIf you’re looking for some real-world inspiration, it helps to explore various [responsive web design examples](https://getnerdify.com/blog/responsive-web-design-examples) to see how others have solved this problem. The combination of HTML, CSS media queries, and a touch of JavaScript remains the industry-standard approach. Of course, if you're working within a framework, you can find more tailored solutions, like our guide to building a responsive [React header](https://magicui.design/blog/react-header).\n\n## Pushing Your Nav Bar to the Next Level\n\nOnce you have a solid, responsive navigation bar, it's time for the professional touches that take it from functional to fantastic. These finer points are all about boosting usability, accessibility, and even your SEO. It's the small refinements at this stage that really make a difference.\n\nA huge win for user experience is adding a **sticky navigation bar**. This simple trick keeps your menu locked to the top of the screen as someone scrolls down the page. Think about it—on longer pages, nobody wants to scroll all the way back up just to find the menu.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/683a254e-b0bb-48b0-b6f8-a06e838722fe.jpg)\n\nPutting this into practice is surprisingly simple with CSS. All it really takes is a single property: `position: sticky;`, along with `top: 0;` to tell it where to stick.\n\n```css\n.main-nav {\n  position: sticky;\n  top: 0;\n  background-color: white; /* Ensures content doesn't show through */\n  z-index: 1000; /* Keeps it above other page elements */\n}\n```\n\nThis tiny snippet of code keeps your main navigation within easy reach at all times, dramatically cutting down on user frustration.\n\n### Don’t Forget ARIA for Accessibility\n\nMaking your navigation usable for everyone, including people who rely on screen readers, isn't just a nice-to-have; it's essential. This is where **Accessible Rich Internet Applications (ARIA)** attributes come in. They don’t change how your nav bar looks, but they add critical context for assistive technologies.\n\nYou can easily weave a few key ARIA attributes into your HTML to clarify what each part of your navigation does:\n\n- Add `role=\"navigation\"` to your `<nav>` tag to explicitly define its purpose.\n- Use `aria-label=\"Main Navigation\"` to give the whole block a clear, descriptive name.\n- Apply `aria-current=\"page\"` to the link for the page the user is currently on, which tells screen readers which link is active.\n\nThese attributes might seem small, but they are a cornerstone of building an inclusive web.\n\n> Great design isn’t just about visual appeal; it’s about clarity and ease of use for every single visitor. ARIA attributes are a fundamental part of building an interface that works for everyone, not just most people.\n\nFinally, take a hard look at the text inside your links. Clear, descriptive labels like \"Our Services\" or \"Case Studies\" are always better than vague terms like \"More\" or \"Click Here.\" A well-thought-out navigation bar is a powerful tool for both your users and search engines. To make sure your site structure is solid, [optimizing internal linking](https://lpagery.io/blog/internal-linking/) is a must-read. All these details add up to create a truly professional, effective, and accessible navigation system.\n\n## A Few Common Questions About HTML Nav Bars\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/eKo1NV1qxbc\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nEven with a good roadmap, you're bound to hit a few specific bumps when you're deep in the code. It happens to everyone. Let's tackle some of the most common hurdles developers run into when building nav bars—the kind of stuff that often falls outside a standard tutorial.\n\n### How Do I Center My Navigation Links?\n\nThe cleanest, most modern way to handle this is with CSS Flexbox. It's practically made for this kind of layout challenge.\n\nJust target your `<ul>` element—which is the container for all your `<li>` navigation links—and add two simple properties to its CSS rule:\n\n- `display: flex;`\n- `justify-content: center;`\n\nThat's it. Flexbox automatically figures out the spacing and perfectly centers your links horizontally inside the container. It doesn't matter if you have **three** links or **ten**; it just works.\n\n### Can I Use an Icon Library for My Hamburger Menu?\n\nAbsolutely. In fact, for most projects, I'd recommend it. Instead of fussing with styling a bunch of `<div>` elements to look like a hamburger icon, pulling in a library like [Font Awesome](https://fontawesome.com/) is way more efficient. Plus, you get icons that are consistently crisp and professional.\n\nYou’d just link the library's stylesheet in your HTML's `<head>`. Then, you can drop their icon element right into your HTML, something like `<i className=\"fas fa-bars\"></i>`. From there, your JavaScript click listener simply targets that `<i>` element to toggle your mobile menu.\n\n> The real difference between using `<nav>` and a `<div>` for your navigation bar comes down to one word: **semantics**. While you can make them look identical with CSS, the `<nav>` tag gives crucial context to browsers, search engines, and assistive technologies, telling them, \"Hey, this is the main way to get around the site.\" This is a huge win for both accessibility and SEO.\n\nGetting the HTML element right from the very beginning makes every other step more effective. It’s a core principle of professional web development and ensures your site is built for everyone (and everything) that visits it.\n\n---\n\nReady to build stunning web interfaces in minutes? **Magic UI** offers over **150** free and open-source animated components built with React, Typescript, and Tailwind CSS. [Explore our components and start creating today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-design-a-landing-page.mdx",
    "content": "---\ntitle: \"A Complete Guide On How To Design A Landing Page & Best Practices\"\ndescription: \"Learn how to design a landing page with Magic UI's Startup Template. Get your free guide & design like a pro!\"\nimage: https://cdn.magicui.design/assets/p1bpybw003r.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you a developer looking to enhance your skillset by learning how to design an effective landing page with [landing page examples](https://magicui.design/blog/landing-page-exampleshttps://magicui.design/blog/landing-page-examples)? Understanding the ins and outs of creating a captivating landing page can be a game-changer for your career. The ability to make a seamless user experience and drive conversion rates is a skill that sets elite developers apart. This blog is your one-stop shop for learning that.\n\nAre you ready to embark on a journey toward designing captivating landing pages that turn visitors into customers? Magic UI's solution, the [startup landing page template](https://pro.magicui.design/docs/templates/startup), is the ultimate tool to help you master the art of designing effective landing pages that convert. Let's examine the details and explore the methods for crafting a landing page that propels your business toward success.\n\n## What Is A Landing Page?\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/kn6xtfcip5k.jpg)\n\nA [landing page](https://mailchimp.com/marketing-glossary/landing-pages/) is a web page specifically designed to convert site visitors into leads or customers. These pages often feature personalized content and a clear call-to-action (CTA) to encourage users to take the desired action, such as:\n\n- Filling out a contact form\n- Downloading content\n- Purchasing\n\nThe primary function of a landing page is to direct visitors towards the call-to-action (CTA).\n\n### First Click, Lasting Impact\n\nLanding pages are not just about educating your visitors; they are powerful tools that leverage compelling content to transform them into clients. They also serve as a representation of your website and your business.\n\nA landing page is often the first thing visitors encounter after clicking on an ad. A landing page is more than just a first impression. It's a dedicated lead generation and conversion tool, distinct from a regular web page.\n\n### Guiding Visitors to Your Call to Action\n\nA landing page stands alone, often at the forefront of a homepage, and serves a single purpose: getting your visitors to give you their contact information. [Landing pages](https://www.wsiworld.com/blog/the-importance-of-landing-pages) have limited navigation and direct visitors to a call to action. They give your offer or promotion a place to live and act as a gate to your coveted materials.\n\n### Birth of Landing Pages\n\nThe concept of landing pages emerged in 2003, a pivotal year in digital marketing. During this time, the IT department at Microsoft developed the first landing page in response to disappointing sales of their Office software.\n\nSince then, landing pages have become a critical component of many businesses' digital marketing strategies, demonstrating their effectiveness in lead generation and conversion.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Landing Page vs Website\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/feobkoaxsbu.jpg)\n\nThe primary distinction between landing pages and websites lies in their distinct purposes. A landing page is meticulously designed with a singular goal: to encourage a visitor to take a specific action competitively. Every element, from the copy to the images to the layout, is strategically crafted to serve this purpose.\n\nOn the other hand, a website is a versatile platform designed for exploration and browsing. It serves various goals, such as:\n\n- Providing information\n- Showcasing products\n- Enabling shopping\n- Offering customer support\n\n### CTAs & Clarity\n\nCreating a landing page is unnecessary when a perfect home page will do. Linking to your [home page](https://www.techopedia.com/definition/5172/home-page) might yield different conversions. A home page contains a lot of information (too much information, for that matter) and invites the visitor to explore.\n\nConversely, a well-crafted landing page with a clear Call-to-Action (CTA) can be a powerful tool for driving conversions. A landing page guides visitors toward a desired outcome by presenting them with a specific action. This focused approach ensures visitors understand what they’re getting and are likelier to engage with your message.\n\n### Free and Pro Solutions for Building Captivating Web Experiences\n\nMagicUI is a free and open-source UI library designed specifically for design engineers. It offers over 20 animated components that can be seamlessly integrated into web applications. With MagicUI Pro, you can save time and create a beautiful landing page using our [startup landing page template](https://magicui.design/).\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today!\n\n## How To Design A Landing Page In 7 Steps\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/35khhq63j7e.jpg)\n\n### 1\\. Set Your Campaign Goal\n\nEvery successful landing page starts with a clear goal. Defining your objective upfront is crucial whether you are looking to increase:\n\n- Sales\n- Generate leads\n- Boost conversions\n\nYour goal will shape every aspect of your landing page, from the copy to the design elements.\n\n### 2\\. Select a Landing Page Design Software\n\nChoosing the right landing page software is critical to creating an effective page. Look for tools that align with your needs, whether you require specific features like animations or templates. For instance, you may want to add animations to your page easily, but not all software offers that, so you need to find one that does.\n\nOnce you find the right software, choosing a pre-made template is more stress-free than starting from scratch because you can use its layout and build upon it. Most landing page builders, including [Magic UI](https://magicui.design/), offer a wide range of templates that can be used to save time and increase efficiency.\n\n#### Build Faster, Convert More\n\nThese templates provide a solid foundation for your page, allowing you to focus on customizing the content and design to meet your specific goals and needs. With [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can:\n\n- Save several hours\n- Create a beautiful landing page\n- Convert your visitors into customers\n\nWhat's remarkable is you get animated components to bring your landing page to life, making it engaging for visitors.\n\n### 3\\. Write Your Copy\n\nCrafting compelling copy is essential for engaging visitors and encouraging them to take action. Your headline should be:\n\n- Attention-grabbing\n- Concise\n- Address the visitor's pain points\n\nFocus on highlighting the benefits of your offering rather than just listing features, and keep the copy simple and easy to read.\n\n### 4\\. Craft Your CTA\n\nYour [Call to Action (CTA)](https://www.hotjar.com/conversion-rate-optimization/glossary/call-to-action/) drives your landing page, guiding visitors toward the desired action. Make your CTA:\n\n- Clear\n- Specific\n- Compelling to prompt visitors to act\n\nAvoid generic CTAs like \"Learn More\" and opt for descriptive options like \"Start Your Free Trial\" or \"Book A Demo\" instead.\n\n### 5\\. Select Your Images\n\nVisual elements capture visitors' attention and convey your message effectively. Choose images that align with your brand and engagingly showcase your offering. Including people in your pictures can create a more personal connection with visitors and increase conversion rates.\n\n### 6\\. Connect Your Landing Page\n\nOnce your landing page is designed, it's essential to:\n\n- Integrate it with your domain\n- Set up analytics\n- Connect it to other marketing tools\n\nCustomizing your URL and adding tracking scripts like [Google Analytics](https://marketingplatform.google.com/about/analytics/) will help you monitor visitor behavior and optimize your page for better performance.\n\n### 7\\. Publish and Test Your Landing Page Design\n\nOnce your design is set, it’s time to publish and test it among your audience members. After your landing page is published, you can A/B test different design elements (e.g., colors, CTA buttons, phrases, font, etc.) to see which options lead to the highest conversions.\n\n#### The ICE Framework\n\nYou can’t just do A/B Testing at random, so to decide which variable to test, follow the [ICE (Impact, Confidence, Ease)](https://blog.growthhackers.com/the-practical-advantage-of-the-ice-score-as-a-test-prioritization-framework-cdd5f0808d64) framework(opens in a new tab or window).\n\nThis way, you can ensure your landing page meets your audience’s needs while guaranteeing you’re getting the best results that will impact your business’s bottom line.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Best Practices On Designing A Landing Page\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/iozlh3obc9.jpg)\n\n### Specific Goal/Purpose of Your Landing Page\n\nA single, fixed goal allows you to get better conversion rates. So don’t send out multiple, mixed messages. Instead, stick to a single CTA in your ad and [landing page](https://unbounce.com/landing-page-articles/landing-page-best-practices/) form.\n\n### Responsive Design\n\nYour website visitors, leads, and customers will likely visit your website via a:\n\n- Mobile device\n- Tablet\n\nSo, ensure your landing page has a responsive design that automatically changes format based on the device it’s being viewed on, providing a seamless and consistent user experience.\n\n### Unique and Engaging Visuals\n\nInclude engaging visual content on your landing page. Whether it’s a photo, video, or animation, you want your landing page design to pique your visitors' interest. The [Magic UI](https://pro.magicui.design/docs/templates/startup) landing page template's visual content is unique to the company. The animated design and colors are on-brand, and they don’t distract from the written content on the page.\n\n### Keep It Simple\n\nAlthough you want to include a headline, written content, CTA, and visual content on your landing page, that doesn’t mean you want your design to be too busy. You want the opposite. Less is more when it comes to the design of your landing page (and your entire website). This keeps things:\n\n- Clean\n- Organized\n- Simple to understand and navigate for your visitors\n\n### Remember Your Audience Throughout the Design Process\n\nAs we reviewed above, the first part of designing your landing page is identifying your target audience. Remember to keep them in mind throughout the design process. This way, you’ll design and incorporate content that resonates with your audience. By doing so, you’ll have a more significant chance of increasing conversions among site visitors.\n\n### CTA Importance and Implementation\n\nStudying effective CTAs is the best way to determine which could work for your purpose. Some characteristics of effective landing page CTAs are that they are focused on the benefit, straight to the point (five words at most), and include action verbs (e.g., get, download, click, register).\n\nApart from copying the button, you also have to highlight your CTA. Surround your CTA button with negative space so it won’t compete for attention. Look at your page the way your visitor will, follow where their eyes go, and place the CTA there. Test your button shape, size, color, font, and copy.\n\n## What Goes Into A Great Landing Page?\n\nCrafting an effective landing page seamlessly blends appealing design and clear content. The top-notch ones grab attention with enticing visuals, persuasive text, and a layout that is a breeze to navigate.\n\n### The Magic Formula for a Standout Landing Page\n\nStriking images and videos are essential to hook users quickly. Equally crucial is straightforward writing that:\n\n- Conveys the page's message\n- Addresses user needs\n\nThe magic formula for a standout landing page is the balance between captivating visuals and compelling words, creating a harmonious blend of design and content.\n\n### User-Friendly Layout\n\nIt is incomplete without a user-friendly layout. That means a clean, easy-to-follow design with a well-placed call to action (CTA). A strategically positioned [CTA is a roadmap](https://www.ballardspahr.com/insights/alerts-and-articles/2023/10/a-roadmap-to-the-ctas-game-changing-reporting-requirements), effortlessly guiding visitors toward the page's goal.\n\n### Capturing Attention and Delivering a Clear Message\n\nA successful landing page combines visuals, writing, and layout to capture attention and deliver a crystal-clear message, smoothly guiding visitors toward the intended action.\n\n## Common Mistakes To Avoid When Designing A Landing Page\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/uo426k2k7.jpg)\n\n### No Images or Low-quality Graphics\n\nUsing high-quality images and videos on your landing page is crucial for catching the user's attention quickly and effectively. Research indicates that people process [images and symbols](https://www.easel.ly/blog/text-vs-images-which-content-format-effective/) much faster than text. Using generic, pixelated, or outdated images, as well as stock photography, can severely damage your landing page's:\n\n- Credibility\n- Trustworthiness\n- Authenticity in the eyes of the viewer\n\n### Page Layouts with Too Much Content and Complexity\n\nLanding pages should be designed to be user-friendly and easy to navigate. Overly complex layouts that are difficult to scroll through, overloaded with elements, and hard to scan can detract from the user experience and reduce landing page conversions. Consider the necessity and relevance of each case's common website elements like navigation bars or footers.\n\n### Unscannable Copy\n\nHigh-quality copy is fundamental to creating an intuitive, clear landing page experience for visitors. A well-written copy should be descriptive but also engaging. [Crafting engaging copy](https://www.webfx.com/blog/web-design/landing-page-mistakes/) is in high demand as business owners, designers, and marketers understand the impact of compelling content.\n\nStorytelling is crucial in creating a customer-centric copy. Excessive text, grammatical errors, large chunks of unbroken text, and a dull tone can all contribute to a poorly performing landing page. Tailor your copy to the audience to build trust and tell a captivating story.\n\n## 5 Best Landing Page Design Software\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/d286w5h0nma.jpg)\n\n### 1\\. MagicUI\n\nMagicUI is a free and open-source UI library designed specifically for design engineers. It offers over 20 animated components that can be seamlessly integrated into web applications. With MagicUI Pro, you can save time and create a beautiful landing page using our [startup landing page template](https://magicui.design/).\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\n### 2\\. Mailchimp\n\nMailchimp simplifies the landing page design process with its intuitive drag-and-drop page builder, allowing users to create a page in minutes. The software lets you add custom CTAs to encourage your target audience to convert or sign up. Tutorial videos are available for users who need help personalizing their landing page.\n\n### 3\\. Leadpages\n\nLeadpages offers a drag-and-drop builder that makes it easy to customize landing pages and A/B test designs to determine which option converts the most visitors. If you need additional design inspiration while working on your landing page, Leadpages provides valuable tools to help you through the process.\n\n### 4\\. Instapage\n\nInstapage allows users to design and publish custom post-click landing pages with various template options. The software's easy-to-use page builder enables A/B testing of different designs to [find the most effective option](https://unbounce.com/landing-page-examples/best-landing-page-examples/) for your audience. Instapage also helps optimize landing pages with dynamic text replacement to automate opt-in content.\n\n### 5\\. Unbounce\n\nUnbounce's landing page creator offers over 100 templates to ensure your design complements your brand and content. Templates are organized by business type, including options for SaaS companies, agencies, and e-commerce businesses. Unbounce landing pages are responsive and completely customizable.\n\n## 4 Best Landing Page Examples For Design Inspiration\n\n![How To Design A Landing Page](https://cdn.magicui.design/assets/3x2yxyht03q.jpg)\n\n### 1\\. Langfuse: Animated and Minimalistic Design\n\nLangfuse's landing page uses animated components to bring it to life. It is built with [Magic UI](https://magicui.design/), which allows easy access to animated components. The page is clean, with a minimalistic design and a clear call to action, making it easy for visitors to navigate and take their desired action.\n\n### 2\\. AirBnB: User-Friendly One-Stop Shop\n\nThe [AirBnB](https://instapage.com/blog/how-airbnb-uses-landing-pages-to-drive-revenue/) landing page is a user-friendly, one-stop shop for visitors looking to book a holiday rental. It features a variety of options, such as:\n\n- Beachfront\n- Cabins\n- Incredible views\n\n#### Click to Close\n\nOnce a user clicks, they can easily:\n\n- View the potential home\n- Read testimonials\n- View the pricing\n\nThe page’s ability to allow users to select a date to book on the same page and convert on the spot if the info is convincing makes it a standout example of an effective landing page.\n\n### Wix: Creative Playground and Captivating Design\n\nWix has turned its landing page into a creative playground with a [captivating digital illustration](https://www.wix.com/playground/post/collaborative-web-design-in-a-remote-world) that follows you down the page. It‘s not overwhelming or distracting—it’s carefully balanced with white space and clear text.\n\nWix uses design to emphasize certain touchpoints on the page. For instance, the mountain's peak in the illustration points to the main CTA, encouraging visitors to get started.\n\n### Netflix: Short, Sweet, and Straightforward\n\nThe streaming giant’s landing page is short, sweet, and straightforward, including only the necessary details. It makes it extremely easy for users to complete the page's goal of entering their email address to get started with a [Netflix membership](https://help.netflix.com/en/node/24926).\n\nA single field form above the page fold makes starting with Netflix seem like a breeze. The copy:\n\n- Is succinct\n- States the brand’s value proposition\n- Clarifies that you can cancel anytime\n\nIt includes details on basic pricing upfront, so users don’t have to search for them.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a revolutionary free and open-source UI library designed for design engineers. This innovative library provides a vast collection of over 20 animated components built using cutting-edge technologies like:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nMagicUI's primary aim is to offer visually appealing and interactive elements that can be effortlessly integrated into web applications, enabling the creation of stunning user interfaces with minimal effort.\n\n### Effortless Design Customization\n\nThe highly customizable nature of [MagicUI](https://magicui.design/) components makes it a preferred choice for developers worldwide. These components can be seamlessly adapted to match specific branding and design requirements, allowing for a cohesive and consistent visual identity across the web application.\n\nWith a strong focus on animation and a design-centric approach, MagicUI acts as a bridge between design and development, empowering users to craft captivating digital experiences that leave a lasting impression on visitors.\n\n### Boost Efficiency and Conversions\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) takes the capabilities of the free component library to the next level, allowing users to save thousands of hours and create beautiful landing pages that can effectively convert visitors into customers. By leveraging the ready-to-use website templates available in MagicUI Pro, users can quickly start their landing page design process and achieve remarkable results.\n\n### Captivate Your Audience\n\nAre you ready to transform your landing page design process and create a visually striking online presence that captivates your audience? Use our startup landing page template today to take the first step toward achieving your goals!\n"
  },
  {
    "path": "apps/www/content/blog/how-to-display-testimonials-on-website.mdx",
    "content": "---\ntitle: \"How To Display Testimonials On Website (With Examples)\"\ndescription: \"Learn how to display testimonials. Boost brand credibility with our startup landing page template that helps create impactful displays. Try Magic UI now!\"\nimage: https://cdn.magicui.design/assets/77a24ad9-2c28-49e7-b99f-bdeee8614be0.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you looking for inspiration and ideas on displaying testimonials on a website? [Landing page examples](https://magicui.design/blog/landing-page-examples) can be tricky to master, but they can be a powerful tool for social proof that boosts credibility and trust in your brand.\n\nAre you ready to enhance your online presence and increase conversions with captivating testimonials? Magic UI's solution, a [startup landing page template](https://pro.magicui.design/docs/templates/startup), is an invaluable tool that will help you harness the power of testimonials to boost your brand credibility significantly.\n\n## What Are Testimonials And Why Are They Crucial?\n\n![How To Display Testimonials On Website](https://cdn.magicui.design/assets/iz6wd2ma7w.jpg)\n\nA [testimonial](https://www.bigcommerce.com/blog/customer-testimonials/) is, at its core, a customer review. The customer attests to using your product and, in their own words, tells the vast audience of the internet what their experience was like.\n\n- While you can get testimonials from celebrities and other influencers, the testimonials of regular people, just like your potential customers, carry the most weight.\n- Their experiences are relatable and trustworthy, instilling in your audience a sense of security and confidence.\n- When you add customer testimonials and reviews to your website, your customers help you tell your story, market your products, and stand out.\n\nDisplaying testimonials on your website is a strategic move that offers several key benefits:\n\n### Builds Trust and Credibility\n\nTestimonials provide social proof, demonstrating that other people have had positive experiences with your company. This boosts your credibility and reassures potential customers about the reliability of your products or services.\n\n#### Powerful Impact\n\n[Statistics underscore this impact](https://boast.io/20-statistics-about-using-testimonials-in-marketing/), where 92% of consumers read online reviews before buying, and 72% say positive testimonials and reviews increase their trust in a business.\n\n### Explains Specific Aspects of Your Products or Services\n\nTestimonials can address common questions or concerns about your offerings, giving potential customers detailed insights without a hard sell.\n\nThis can be especially effective if the testimonials highlight unique features or benefits that may take time to be noticeable.\n\n### Tells Your Company’s Story\n\nPersonal stories and experiences shared through testimonials help potential customers connect emotionally with your brand.\n\nThis connection can be a powerful motivator, as people often make purchasing decisions based on their feelings about a brand.\n\n### Addresses Common Questions\n\nBy having your customers address frequently asked questions or specific concerns, testimonials can provide answers and solutions that resonate with new visitors. This approach informs and builds confidence in your ability to meet their needs. Testimonials are more than just praise—they are a strategic tool for:\n\n- Building trust\n- Explaining your value\n- Connecting with your audience on a deeper level\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Common Types Of Testimonials You Can Use On A Website\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1529339017023-c2f2ce633d0d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyMjg5NzQ3N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Video Testimonials\n\n[Video testimonials](https://youtu.be/GyShO1WncyA?t=5) are engaging recordings where users share their personal experiences with your product or service.\n\n#### Real-time Feedback\n\nThey are effective because they provide a dynamic, real-time glimpse into user satisfaction, helping to build trust and authenticity.\n\n#### Concise Videos\n\nVideos should be concise to maintain viewer interest, ideally under 2 minutes. If the information is extensive, consider breaking it into short clips.\n\n#### Optimize Impact\n\nTo maximize their impact, ensure the videos feature genuine user feedback and use A/B testing to find the optimal length and content.\n\n### Quote Testimonials\n\nQuote testimonials are user endorsements detailing their experiences with your product or service. These quotes, often from customers, influencers, or celebrities, are straightforward to integrate into various marketing materials.\n\n#### Easy Collection\n\nThey offer a simple way to convey positive feedback, which can be quickly gathered through surveys or direct requests.\n\n#### Legal & Ethical\n\nAlways obtain permission from users before using their quotes and attribute them to enhance credibility and trust.\n\n### Blog Post Reviews\n\nBlog post reviews are detailed evaluations published by third-party bloggers or influencers that provide an in-depth look at your product or service.\n\n#### Traffic & SEO\n\nThese reviews are valuable for driving traffic to your website and improving SEO, as they offer comprehensive insights and address potential customer concerns.\n\n#### Partner & Engage\n\nCollaborate with reputable bloggers to ensure honest and thorough reviews and use them to link to relevant product pages.\n\n#### Reader Interaction\n\nEngaging with blog readers through comments and questions can further enhance the effectiveness of these reviews.\n\n### User-Generated Content\n\nUser-generated content includes materials created and shared by users, such as text, images, or videos, reflecting their authentic experiences without direct company influence.\n\n#### Community Building\n\nThis type of content provides peer-driven validation and fosters a sense of community around your brand. Encourage users to create content through incentives or campaigns and curate it to align with your brand’s message.\n\n#### Content Amplification\n\nHighlight high-quality user-generated content on your website and social media to maximize its impact.\n\n### Case Studies\n\nCase studies are in-depth reports exploring [how clients use your products](https://www.detype.com/why-you-should-have-case-studies-on-your-website/) or services, often including specific outcomes and data.\n\n#### Demonstrations\n\nThey are handy for demonstrating the effectiveness of complex products or services by providing detailed, real-world applications.\n\n#### Impactful Storytelling\n\nFocus on real-life examples and measurable results to build credibility and educate potential customers—present case studies in engaging formats like written reports or multimedia presentations to communicate their value effectively.\n\n### Customer Interviews\n\nCustomer interviews involve detailed conversations with users about their experiences with your product or service.\n\n#### Customer Voices\n\nThese interviews can be conducted by your team or third-party experts and provide in-depth insights into customer satisfaction.\n\n#### Structured Inquiry\n\nPrepare structured questions to guide the discussion and ensure comprehensive coverage of key topics.\n\n#### Expert Insights\n\nThird-party interviews add credibility, while in-house interviews offer more profound insights. Use the content to address frequently asked questions and highlight customer successes.\n\n### Success Stories\n\nSuccess stories showcase how clients have achieved their goals or overcome challenges using your product or service.\n\n#### Customer Success Stories\n\nThey illustrate the positive impact of your offerings and can be highly motivational for potential customers. Focus on compelling, specific examples of success and present these stories using various formats, such as:\n\n- Written articles\n- Videos\n- Infographics\n\nEnsure they are authentic and align with your brand’s message to effectively resonate with your audience.\n\n### Press Reviews\n\nPress reviews evaluate your product or service published by media outlets such as:\n\n- Newspapers\n- Magazines\n- Blogs\n\n#### Independent Verification\n\nThey provide independent assessments from respected sources, adding credibility to your offerings. Promote positive press reviews on your website and marketing materials to enhance your brand’s reputation.\n\n#### Leverage Coverage\n\nEnsure the reviews are recent and relevant to your target audience, and engage with media mentions to address any feedback.\n\n### Social Media Posts\n\nSocial media posts are testimonials shared by users on platforms like Facebook, Twitter, and Instagram, often including:\n\n- Text\n- Images\n- Videos\n\n#### Amplify Reach\n\nThese posts leverage online communities and can spread positive word-of-mouth quickly. Encourage users to share their experiences through social media campaigns or incentives and engage with their posts to amplify your reach.\n\n#### Monitor Feedback\n\nMonitor social media channels for feedback and interactions to foster engagement and address concerns.\n\n### Hero Images\n\n[Hero images](https://www.justinmind.com/blog/inspiring-hero-image-websites/) are large, visually striking images that showcase people using your products, often featuring overlaid text or quotes.\n\n#### Visual Impact\n\nThey create a solid first impression and highlight key messages about your product. Use high-quality, engaging images that reflect your brand’s identity and product benefits.\n\n#### Optimize Delivery\n\nIncorporate compelling testimonials or quotes into the hero images to enhance their impact and ensure they are optimized for various devices and platforms.\n\n### MagicUI’s Pre-Built Components\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n#### Effortless Integration\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n#### Branding Flexibility\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. Use our startup landing page template today. ([https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup)).\n\n## Where Should You Put Testimonials On A Website?\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1617012811506-344ff32b7055?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHx3b3JraW5nJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzIyODk3NDkwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nShowcasing testimonials on your website is a powerful way to [build trust with your audience](https://spiegel.medill.northwestern.edu/how-online-reviews-influence-sales/). Here are some strategic ideas for placing them to maximize their impact.\n\n### Dedicated Testimonials Section\n\nConsider creating a dedicated section on your homepage or landing page for testimonials. This can instantly grab visitors' attention and establish credibility immediately.\n\n### Testimonial Page\n\nCreating a separate testimonial page might be a good idea if you have an extensive collection of testimonials. This allows visitors to delve deeper into your customers' positive experiences.\n\n### About Us Page\n\nIntegrate testimonials into your [About Us page](https://www.business.com/articles/importance-of-about-page-on-website/#:~:text=The%20About%20page%20helps%20visitors,quality%20product%20in%20the%20industry.) to add credibility to your brand narrative. Including testimonials here can complement your story with the real voices of satisfied clients.\n\n### Product Pages\n\nEmbedding reviews on product pages can significantly boost conversion rates. Research shows that having at least five reviews can increase conversion rates by up to 270%, making it a valuable placement for testimonials.\n\n### Checkout Pages\n\nPlacing testimonials on checkout pages can help nudge visitors toward making a purchase. Seeing positive feedback from other customers at this final stage can reassure them and facilitate their decision-making process.\n\n#### Build Trust\n\nBy thoughtfully distributing testimonials across your website, you can create an ongoing conversation with satisfied customers, establish trust, and boost conversions. Remember that testimonials are about sharing positive feedback and building credibility and trust with your audience.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How To Display Testimonials On Website\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1499914485622-a88fac536970?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcCUyMGluZnJvbnR8ZW58MHx8fHwxNzIyODk3NTIyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Dedicated Website Testimonials Page\n\nIntegrating a dedicated [testimonials page into your website](https://webflow.com/blog/testimonials-on-website) is a dynamic showcase of customer feedback. This centralized location efficiently presents customer reviews, enhancing your brand's credibility.  This approach makes it easier for visitors to explore and gain trust in your brand. By embedding reviews from platforms like Twitter, you can ensure that these testimonials are neatly displayed to avoid cluttering your website.\n\nThe [Magic UI's Marquee component](https://magicui.design/docs/components/marquee) offers a visually appealing, cohesive experience emphasizing customer satisfaction and credibility. Utilizing this component adds liveness and interactivity to your website, enhancing the user experience.\n\n### Testimonials on Your Home Page\n\nFeaturing testimonials on your homepage provides immediate positive feedback to potential customers, making a solid first impression.\n\nPresenting reviews from social media platforms like Facebook and Twitter directly on your homepage highlights your active online community and increases engagement by showcasing diverse social proof.\n\n### Twitter Testimonials in a Scrolling Carousel\n\nUtilizing a scrolling carousel to display Twitter testimonials allows you to present a dynamic range of real-time feedback.\n\nThis method adds a lively, interactive element to your testimonials page, providing a clear call to action by positioning product information alongside the testimonials.\n\n### Instagram Photo Testimonials in Your Footer\n\nIncorporating Instagram photo testimonials in your website's footer leverages visual content to engage visitors. By displaying user-generated content (UGC) through Instagram feeds, you can illustrate how customers use your products in real life, enhancing authenticity and relatability.\n\n### Video Testimonial Page\n\nA dedicated video testimonial page adds depth to your testimonials by capturing customer emotions and body language.\n\n#### Visual Testimonials\n\nThis format persuades potential customers by allowing them to see and hear real experiences. Tools like YouTube Feed Pro can create an interactive video feed that effectively showcases these testimonials.\n\n### Sidebar Testimonial Widget\n\nIncluding a [testimonial widget](https://elementor.com/help/testimonial-widget/) in your website's sidebar enables you to present customer feedback while keeping your main content accessible prominently.\n\nThis space, often overlooked, can be utilized to display rotating reviews or ratings, adding a layer of social proof to various sections of your site.\n\n### Testimonials in Image Galleries\n\nDisplaying testimonials in image galleries introduces a visually engaging element to your website, breaking up text-heavy content.\n\n#### Interactive Feedback\n\nThis format provides an interactive way to showcase customer feedback and offers a more visually appealing approach.\n\n#### Visual Testimonials\n\nTools like Instagram Feed Pro can create visually appealing galleries highlighting positive testimonials.\n\n### User Generated Content Testimonials on Product Pages\n\nIncorporating [user-generated content (UGC)](https://blog.hootsuite.com/user-generated-content-ugc/) testimonials directly on your product pages showcases real-life applications of your products.\n\n#### Authenticity Boost\n\nThis method enhances authenticity and provides potential customers with relatable examples of how your offerings are used, driving engagement and increasing conversion rates.\n\n## 6 Effective Tips For Gathering Client Testimonials\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1649252504308-af4a8477cd2a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxpZGVhdGlvbnxlbnwwfHx8fDE3MjI4OTc1MzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Reach Out via Email to Satisfied Customers\n\nOne of the best ways to gather client testimonials is to email satisfied customers. These customers have previously expressed positive feedback about your business through meetings or calls.\n\nBy sending a personalized email requesting a testimonial, you can make them feel appreciated and more likely to contribute. This approach reinforces their importance to your business and shows that you value their feedback.\n\n### 2\\. Check Social Media Pages and Review Sites\n\nAnother strategy for collecting testimonials is to review customer comments on your social media pages and monitor mentions of your business using social listening tools.\n\n#### Review Platforms\n\nFor more feedback, explore review sites like:\n\n- Google Maps\n- Yelp\n- TripAdvisor\n- Trustpilot\n\n#### Legal Review Use\n\nInstead of directly copying reviews, display them using widgets or seek permission to feature unique testimonials to [avoid copyright issues](https://www.copyright.gov/what-is-copyright/).\n\n### 3\\. Use Pre-Existing Testimonials for Individual Team Members\n\nIf your business is newer and has limited client feedback, consider leveraging testimonials for individual team members or employees.  A testimonial about a specific team member's work can serve as a valuable endorsement and help build credibility for your business.\n\n### 4\\. Pay a Previous Customer, Celebrity, or Influencer for an Endorsement\n\nWhile not a strategy that will work for every business, paying a previous customer, celebrity, or influencer to provide a testimonial can significantly boost. To maintain authenticity, it's essential to ensure transparency by clearly stating any compensation or incentives associated with the testimonial.\n\n### 5\\. Integrate Testimonial Requests into the Service Process\n\nAnother effective way to gather testimonials is to integrate feedback requests into your service process or follow-up communications.\n\nThis can be done through automated emails or surveys after service completion, making it easier for customers to provide testimonials and share their experiences with your business.\n\n### 6\\. Prioritize Authenticity and Uniqueness\n\nWhen collecting testimonials, it's crucial to prioritize authenticity and uniqueness. Avoid fabricating testimonials, as consumers can usually spot fake reviews.\n\nFocus on collecting unique and genuine testimonials that address common pain points or concerns. Highlight how your business resolves issues or improves experiences to demonstrate your commitment to quality and customer satisfaction.\n\n## 6 Best Tips For Presenting Reviews And Testimonials On A Website\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1612773073063-5dc1e48fa47b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxpZGVhdGlvbnxlbnwwfHx8fDE3MjI4OTc1MzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Be Concise\n\nWhen presenting testimonials, displaying only the most impactful parts of each testimonial is crucial.\n\n#### Author Approval\n\nLengthy quotes should be trimmed to their essence while ensuring the original author's approval before publication.\n\n#### Engaging\n\nThis approach keeps the content engaging and to the point, giving visitors a quick and compelling overview of the positive feedback your product or service has received.\n\n### 2\\. Use a Clear, Readable Font Size\n\nOne crucial aspect to keep in mind is the readability of the font size used for [testimonials.](https://www.contentbeta.com/testimonial-landing-page/) Ensuring that the font size is easily readable will engage your audience, making the testimonials more accessible and increasing the likelihood of them being read and trusted.\n\n### 3\\. Embrace Negative Space\n\nCreating an uncluttered design with ample white space around each testimonial improves readability and visual appeal.\n\nOvercrowding the page could confuse and make it challenging for readers to focus on the testimonials. Opting for a clean, straightforward design keeps each testimonial prominent and easy to digest.\n\n### 4\\. Refine Grammar and Preserve the Essence\n\nCorrecting any typos or spelling mistakes in testimonials is essential while maintaining the original voice and message of the testimonial.\n\n#### Trustworthy Testimonials\n\nThis balance between professionalism and authenticity can significantly impact the trustworthiness of testimonials.\n\n#### Author Consent\n\nAlways seek the author's approval on the edited content to ensure their satisfaction with the final testimonial.\n\n### 5\\. Share Reviewer Details as Appropriate\n\nFor B2B platforms, credibility can be enhanced by including full names, job titles, and company logos.\n\n#### Testimonial Verification\n\nProviding full names and photos (with consent) on consumer sites can authenticate the testimonial. In sensitive sectors like healthcare, using partial names or allowing for complete anonymity can help maintain privacy and confidentiality.\n\n### 6\\. Personalize with Signatures or Handwriting Fonts\n\nAdding a personalized touch, such as authentic signatures or [handwriting fonts](https://fontmeme.com/handwriting-fonts/), can enhance the authenticity of testimonials. It's essential to have permission before using real signatures or fonts that resemble a customer's handwriting.\n\nThis personalization can make testimonials feel more genuine and relatable to website visitors, increasing their trust in the reviews and testimonials displayed.\n\n## 10 Examples Of Testimonial Display On Websites\n\n![How To Display Testimonials On Website](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8bGFwdG9wJTIwaW5mcm9udHxlbnwwfHx8fDE3MjI4OTc1NTJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Langfuse\n\nLangfuse is a tech startup that focuses on improving the observability of AI applications, especially those using large language models (LLMs).\n\nTheir landing page uses [Magic UI](https://magicui.design/) and adopts a classic style to display testimonials by showcasing their clients' logos on the homepage. This approach effectively builds trust with website visitors by demonstrating the credibility of their product. Additionally, Langfuse includes industry certifications on their landing page to establish trust with potential customers further.\n\n### 2\\. Petal\n\nPetal offers credit cards to individuals who may struggle to get approved by traditional financial institutions, helping them build credit responsibly.\n\n#### Visual Appeal\n\nThe testimonial display on Petal's website features reviews displayed on colored sticky notes, which creatively breaks up the text for easy reading.\n\n#### Privacy Focus\n\nBy using only the reviewer's first name and initial, Petal emphasizes privacy and confidentiality, particularly given the topic's sensitive nature.\n\n#### Themed Testimonials\n\nEach testimonial highlights a central theme, providing potential clients with specific insights into the credit card's functionality.\n\n### 3\\. BambooHR's Case Study Testimonial\n\nBambooHR's landing page features a [case study testimonial](https://www.bamboohr.com/customers/crbr) with a large smiling picture of Angie, a real person, to help readers connect with the testimonial on a personal level.\n\n#### Case Study Format\n\nThe case study format focuses on the challenge Angie's organization faced, BambooHR's solution, and the results achieved.\n\n#### Personal Touch\n\nIncluding quotes from Angie in the content personalizes the testimonial and makes it more relatable to readers, enhancing its effectiveness.\n\n### 4\\. OptinMonster's Case Study Testimonials\n\nOptinMonster strategically leverages social proof by showcasing a significant testimonial page with a pull quote and photo for each customer.\n\n#### In-depth Analysis\n\nClicking on a testimonial opens a full case study that presents quantitative results upfront, followed by a narrative detailing the customer's journey.\n\n#### Impact Demonstration\n\nThis format enhances credibility and helps potential customers understand the impact of OptinMonster's solutions on real businesses.\n\n### 5\\. Zendesk's Case Studies\n\nZendesk's landing page features a [dedicated customer page highlighting success](https://www.zendesk.com/why-zendesk/customers/#americas) stories from companies using their product.\n\n#### Expert Endorsements\n\nThe testimonials include quotes from leading Tile players, offering readers social proof. Each case study outlines the challenges faced by the company and how Zendesk's solutions helped address them, making the testimonials specific and relatable to potential customers.\n\n### 6\\. OpenPhone\n\nOpenPhone prioritizes in-depth case studies over short review snippets on their landing page, catering to B2B companies requiring detailed purchasing decision evaluations.\n\n#### Case Study Format\n\nEach case study follows a structured format, focusing on:\n\n- The challenge\n- The solution implemented\n- The impact achieved\n\n#### Multimedia Engagement\n\nBy including an overview of the business, key quotes from senior executives, a short video, and screenshots of the product in action, OpenPhone effectively engages visitors and showcases the value of their solution.\n\n### 7\\. Everything Design\n\nEverything Design's landing page features repeat business, emphasizing customer satisfaction and fostering enduring client partnerships.\n\n#### Social Proof Mix\n\nThe B2B firm strategically combines various forms of social proof, including video testimonials, written endorsements, and partner company logos, to enhance its credibility and reputation.\n\n#### Trust Building\n\nThis strategy showcases the company's dedication to quality work and strengthens trust with site visitors.\n\n### 8\\. YouthLogic\n\nYouthLogic and their CEO, Connor Blakley, boast mentions in prestigious media platforms like:\n\n- The Washington Post\n- Forbes\n- CNBC\n\n#### Authority Building\n\nBy providing links to these features on its media page, YouthLogic establishes itself as an industry authority, enhancing its credibility among visitors and potential clients.\n\n#### Media Outreach\n\nThe \"feature our insights\" CTA directs journalists and visitors to a contact form, opening opportunities for potential media collaborations.\n\n### 9\\. Vale Tudo Training\n\nVale Tudo, a training gym inspired by MMA, integrates Google reviews directly from Google Maps on its landing page, displaying unbiased and transparent endorsements from customers across multiple Sydney locations.\n\n#### Authentic Feedback\n\nThese testimonials foster trust with potential clients as they present genuine feedback that is difficult for businesses to manipulate.\n\n#### Reputation Management\n\nMonitoring and addressing reviews is crucial to maintaining a solid brand image and promptly addressing potential issues.\n\n### 10\\. Model Living  \n\nModel Living's landing page effectively combines [testimonials with illustrative case studies](https://model-living-89e18619dd3a1b502f5a33cd04.webflow.io/projects/project-200611), outlining each renovation project's specifics, including:\n\n- Cost\n- Location\n- Type\n\n#### Visual Testimonials\n\nModel Living bolsters credibility and provides visually compelling proof of their effectiveness by showcasing transformative before-and-after images within testimonials.\n\n#### Targeted Impact\n\nThis approach resonates well with audiences interested in tangible results, making it highly effective for:\n\n- Skincare\n- Fitness\n- Renovation services\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specifically designed for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Design-First Approach\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences effortlessly.\n\n### Customizable Components\n\nMagicUI components are highly customizable, allowing seamless adaptation to match desired branding and design requirements.\n\n### Effortless UI Creation\n\nThis library provides a range of visually appealing and interactive elements that can be easily integrated into web applications, making it easier to create stunning user interfaces with minimal effort.\n\n### Time-Saving Solution\n\nThe MagicUI Pro option takes things further by offering thousands of hours saved and beautiful landing page creation capabilities, helping businesses easily convert visitors into customers.\n\n### Designer's Toolkit\n\nIt's an invaluable tool for design engineers looking to create captivating digital experiences effortlessly.\n\n### Experience MagicUI\n\n[Give MagicUI a try](https://magicui.design/) today and see the difference it can make in your landing page design efforts.\n"
  },
  {
    "path": "apps/www/content/blog/how-to-improve-website-conversion-rates.mdx",
    "content": "---\ntitle: \"How to Improve Website Conversion Rates: Proven Tips\"\ndescription: >-\n  Learn how to improve website conversion rates with actionable strategies.\n  Boost your site performance today and turn visitors into customers!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-74caa7bf-a5b9-4aff-a9a7-8d2b9e0f080d.jpg\nauthor: Dillion Verma\ntags:\n  - improve website conversion rates\n  - conversion rate optimization\n  - CRO strategies\n  - A/B testing\n  - user experience\npublishedOn: \"2025-10-08T07:37:37.764137+00:00\"\nfeatured: true\n---\n\nIf you want to boost your website's conversion rates, you need to zero in on a few critical things: the overall user experience, your most important pages (like landing pages and checkout), and using real data to back up your decisions. It’s all about turning the traffic you _already have_ into paying customers by smoothing out the bumps in the road and building some serious trust.\n\n## Why Conversion Rates Are Your Most Valuable Metric\n\n![A focused image showing a graph with an upward trend line, symbolizing growth and improved conversion rates.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/982f834a-da0a-4da1-ace6-822bc335219a.jpg)\n\nGetting traffic to your website is hard work. It's expensive and takes time. But what actually happens once people show up? Just getting more eyeballs on your site is only half the battle. The real win is turning those visitors into customers, subscribers, or leads—and that's where your conversion rate tells the true story.\n\nA **conversion rate** is simply the percentage of visitors who do the thing you want them to do. That could be anything from buying a product to signing up for your newsletter. When you focus on improving this number, you get a much higher return on your marketing dollars than just pouring more money into ads.\n\nThink of it this way: doubling your conversion rate from **1%** to **2%** has the exact same impact on your bottom line as doubling your traffic. The big difference? Optimizing for conversions makes the money you're already spending work twice as hard.\n\n### Understanding the Benchmarks\n\nIt always helps to know where you stand in the grand scheme of things. Recent data shows that the average global ecommerce conversion rate hovers between **2.5% and 3.0%**. More established brands often hit the **3-4%** mark. If your numbers are falling short, that's not bad news—it's a massive opportunity.\n\nThis guide is your roadmap to finding and fixing the \"leaks\" in your conversion funnel. We're going to tackle three core areas head-on:\n\n- **Mastering User Experience:** How to create a seamless, trustworthy environment that makes people _want_ to stick around.\n- **Optimizing Key Pages:** Refining your highest-impact pages—the ones that do the heavy lifting—to drive action.\n- **Leveraging Data:** Using analytics to get inside your users' heads and make changes that actually move the needle.\n\n> The core idea is simple: a great user experience is what drives great conversion rates. When you get rid of the friction and make your value crystal clear, you empower visitors to take that next step.\n\nAnd since more people are browsing on their phones than ever before, a smooth mobile experience isn't just a nice-to-have; it's a must. A lot of what we'll cover ties directly into responsive design. If you're new to the concept, our guide on [what is mobile-first design](https://magicui.design/blog/what-is-mobile-first-design) is a great place to get your bearings.\n\n## Building a Foundation of Trust with User Experience\n\n![A clean, modern website layout on a laptop screen, emphasizing intuitive design and a positive user experience.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3940a6dd-8fd7-4297-8b61-e68f0d686f08.jpg)\n\nBefore anyone even considers clicking \"buy\" or filling out your form, they're asking a subconscious question: \"Can I trust this place?\" The answer lies in your website's user experience (UX). A clunky, confusing, or unprofessional site immediately plants a seed of doubt. A seamless one, on the other hand, builds the confidence you need to earn that conversion.\n\nThink about it: **38% of people** will ditch a website if the layout is unattractive. This isn't just about pretty visuals; it's a direct signal of professionalism and reliability. You only get milliseconds to make a first impression, and in that flash, your design does all the talking.\n\nSpeed is another huge piece of the trust puzzle. A delay of just a few seconds can send your conversion rates into a nosedive, especially on mobile where patience is thin. If your site feels sluggish, visitors assume the entire process—from browsing to checkout—will be just as frustrating.\n\n### Craft a Clear and Compelling Value Proposition\n\nThe second a visitor lands on your page, the clock starts ticking. You have to tell them why they should stick around, and you have to do it fast. A strong value proposition isn't some fluffy slogan; it's a crystal-clear statement explaining the benefit you offer, who you offer it to, and what makes you the best choice.\n\nIt must instantly answer the user's \"What's in it for me?\" question. Don't make them hunt for it—place it front and center, right above the fold. A muddled message is a one-way ticket to a bounced visitor.\n\n> Your value proposition is the promise you make to your visitor. A great user experience is how you prove you can deliver on that promise, building credibility with every single click.\n\nThis need for clarity extends to your navigation, too. If people can't easily find what they’re looking for, they won't stick around to play detective. An intuitive menu structure guides them effortlessly through your site, cutting down on frustration and keeping them on the path to conversion.\n\n### Harness the Power of Visuals and Social Proof\n\nLet's be blunt: high-quality images, a clean design, and consistent branding are non-negotiable. Grainy photos or a cluttered layout scream amateur, completely eroding credibility. These visual cues reinforce the quality of your brand before a user reads a single word of your copy.\n\nBut it’s not just about what you say. It's about what others say about you. This is where **social proof** becomes your secret weapon. Weaving in testimonials, reviews, or detailed case studies validates your claims and builds an incredible amount of trust. If you're looking for inspiration, exploring different ways to [display social proof on your website](https://magicui.design/blog/social-proof-on-website) can give you some powerful ideas.\n\nFinally, making your site usable for _everyone_ is a fundamental part of building trust. A commitment to accessibility signals that you care about every user's experience, not just a select few. Diving into [how accessibility boosts your website's UX and sales](https://www.webability.io/blog/how-accessibility-boosts-your-website-s-ux-and-sales) reveals just how big of an impact this can have. An inclusive environment is a trustworthy one.\n\n## Optimizing Your Most Critical Pages for Conversion\n\n![A person's hand using a tablet to navigate a clean, well-designed product page, highlighting the importance of optimizing key pages for conversion.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a3ebec0d-7d4e-4ff4-8da4-a8371ecb082e.jpg)\n\nWhile a solid overall user experience is the foundation, your conversion rate really comes down to a few high-stakes pages. If you want to see a real impact, you have to pour your energy into optimizing your landing pages, product pages, and especially the checkout process. These are the make-or-break moments.\n\nEvery single element on these pages has one job: guide the user toward a single, obvious action. There’s simply no room for confusion or distractions. It's all about creating the smoothest possible path from interest to purchase.\n\n### Anatomy of a High-Converting Landing Page\n\nThink of your landing page as your digital sales pitch. It all starts with a headline that grabs attention and immediately screams value. Critically, it needs to echo the language from the ad or link that brought the visitor there, which creates a sense of continuity and trust right off the bat.\n\nThen there's your call-to-action (CTA) button. It needs to be impossible to miss and ridiculously compelling to click. Drop the passive \"Submit\" and go for action-packed words like \"Get,\" \"Reserve,\" or \"Try.\" The color, size, and placement all play a huge part in drawing the user's eye. For a much deeper look into creating buttons that people actually click, our guide on https://magicui.design/blog/cta-design has some fantastic, actionable tips.\n\n> A landing page isn’t a brochure; it’s a conversation with a single goal. Every word, image, and button should contribute to that one desired outcome, eliminating anything that pulls focus away from the main call to action.\n\nWhen you're dialing in these critical pages, the focus has to be on crystal-clear calls to action and content that truly connects. For a wider view on turning those clicks into cash, exploring [proven strategies to boost online sales](https://kpinfo.tech/how-to-increase-online-sales/) can give you some valuable perspective. This big-picture approach ensures every little tweak you make is pushing your main business goals forward.\n\n### Streamlining the Checkout Flow to Reduce Abandonment\n\nThe checkout process is where so many potential sales just vanish. The tiniest bit of friction is all it takes to send a motivated buyer packing.\n\nOne of the easiest wins? Offer a **guest checkout option**. Forcing people to create an account before they can hand over their money is a massive, unnecessary barrier.\n\nAnother huge conversion killer is surprise costs. It’s no shock that the shopping cart abandonment rate has shot past **70%**. And in many places, the number one reason is unexpected shipping and tax fees popping up at the last second. You have to be transparent with all costs upfront—ideally, right on the product page. For more on this, check out the [global conversion rate analysis on Statista](https://www.statista.com/statistics/1106713/global-conversion-rate-by-industry-and-device/).\n\nTo make the whole thing even simpler, use a progress bar so people know where they stand, and keep your forms as short as humanly possible. Only ask for what you absolutely need to complete the sale.\n\nHere’s a quick checklist to slash that checkout friction:\n\n- **Offer Guest Checkout:** Never force someone to create an account.\n- **Show All Costs Upfront:** No one likes surprise shipping fees or taxes.\n- **Minimize Form Fields:** If you don't need it, don't ask for it.\n- **Provide Multiple Payment Options:** Include digital wallets like Apple Pay or Google Pay for that sweet one-click convenience.\n- **Ensure Mobile Friendliness:** The checkout has to be absolutely flawless on a small screen.\n\n## Using Data to Understand What Your Visitors Want\n\n![Infographic about how to improve website conversion rates](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fb7eb6f7-c789-49e8-bc66-855340fc5c87.jpg)\n\nThis chart is a perfect example of data in action. It shows the click-through rates for three different button colors, and the results are crystal clear. The green button, with its **5% CTR**, is the obvious winner, giving us a solid, data-backed reason to make a change. No guesswork needed.\n\nMaking assumptions about your website visitors is one of the fastest ways to tank your conversion rates. The real magic happens when you stop guessing and start _listening_ to what their actions are telling you. Data gives you a direct line into their needs, wants, and frustrations, forming the bedrock of any successful optimization strategy.\n\nGoing beyond simple page views, qualitative analytics tools are like getting a window into your user's mind. They don’t just tell you _what_ happened; they help you uncover the _why_. And that's where the biggest opportunities for boosting your website's conversion rates are hiding.\n\n### Uncovering User Behavior with Visual Tools\n\nTwo of the most powerful tools in this arena are **heatmaps** and **session recordings**. They take abstract numbers and turn them into visual stories of how real people are actually using your website.\n\n- **Heatmaps** give you a big-picture view, showing you where people are clicking, where their mouse hovers, and how far they bother to scroll down a page. You can instantly see which parts of your page are hot and which are getting the cold shoulder.\n- **Session Recordings** are literal videos of individual user visits. Watching these is like looking over someone's shoulder as they navigate your site. You see every confused click, every moment of hesitation, and every ounce of frustration in real-time.\n\n> Think of analytics as a conversation with your users where they communicate through their clicks and scrolls. When you learn to interpret this language, you stop making blind changes and start solving real problems.\n\nI once saw this play out perfectly on a client's site. A heatmap revealed that dozens of people were furiously clicking on a gorgeous, high-res image that wasn't actually a link. This \"rage clicking\" was a massive red flag. Users clearly expected that image to take them somewhere—probably a product gallery—and when it didn't, they hit a dead end. We made one simple change: we made the image clickable. Engagement on the product pages shot up almost immediately.\n\n### Translating Insights into Actionable Changes\n\nThe goal here isn't just to hoard data; it's to pull out actionable insights that lead to specific, tangible improvements. This is how you turn simple observation into powerful optimization.\n\nIt's also essential to know where your best traffic is coming from, because not all visitors are created equal.\n\n### Average Conversion Rates by Traffic Source\n\nThis table compares the typical conversion rates from different marketing channels, helping you prioritize optimization efforts based on traffic source performance.\n\n| Traffic Source  | Average Conversion Rate | Primary User Intent                                           |\n| :-------------- | :---------------------- | :------------------------------------------------------------ |\n| Direct Traffic  | **3.3%**                | High intent; users already know the brand.                    |\n| Email Marketing | **2.8%**                | Engaged audience; responding to a specific offer or message.  |\n| Organic Search  | 2.5%                    | Problem/solution-focused; actively searching for answers.     |\n| Paid Search     | 2.1%                    | High commercial intent; ready to buy or take action.          |\n| Social Media    | 1.1%                    | Low intent; browsing or discovery phase, not actively buying. |\n| Referral        | 0.9%                    | Varies; depends heavily on the context of the referring site. |\n\nAs you can see, someone typing your URL directly into their browser (**direct traffic converts at 3.3%**) is a much warmer lead than someone casually scrolling through social media. Similarly, a well-targeted email campaign can drive impressive results (**2.8% conversion rate**) by reaching people who already want to hear from you. For a deeper dive, it's worth reading the latest research on website visitor conversion rates to see how you stack up.\n\nArmed with this user behavior data, you can start creating a backlog of smart, data-informed hypotheses to test. Here’s a simple process to get started:\n\n1.  **Hunt for Drop-Off Points:** Start in your analytics. Find the pages with the highest exit rates, then pull up session recordings for those pages. Watch what people are doing right before they bail.\n2.  **Dissect Your Forms:** Are people abandoning your signup or checkout forms? Watch recordings to see which fields are causing them to pause or give up. Maybe the form is too long, or a question is just plain confusing.\n3.  **Find Your Invisible CTAs:** If your main call-to-action isn't getting the clicks it deserves, a heatmap will tell you if it's being ignored. Sometimes another, less important element on the page is stealing all the attention.\n\n## Running A/B Tests That Actually Drive Improvements\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/vV3g5VuSrIQ\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nAlright, you’ve done the hard work of digging through the data and pinpointing where your users are getting stuck. Now for the fun part: turning those insights into real, measurable wins. This is exactly what **A/B testing** (or split testing) was made for.\n\nThink of it as a methodical way to let your users vote on what works best. Instead of making changes based on a gut feeling or what you _think_ will work, you test your ideas in a controlled way. This is how you build a culture of continuous improvement, one that systematically lifts your conversion rates over time.\n\nThe concept is simple. You show one version of your page (the original, or \"control\") to one chunk of your visitors, and a slightly modified version (the \"variation\") to another. Then, you sit back and see which one drives more conversions.\n\n### It All Starts With a Solid Hypothesis\n\nEvery great A/B test is built on the foundation of a strong hypothesis. This isn't just a random idea—it's a specific, testable statement about what you expect to happen, and it should be directly informed by your user data. Without a clear hypothesis, you’re just throwing spaghetti at the wall.\n\nA good hypothesis usually follows this simple formula: \"If I change [X], then [Y] will happen, because [Z].\"\n\nLet’s use a real-world example. Imagine you noticed in your session recordings that a lot of users pause and hover over your \"Sign Up\" button, but never click.\n\n- **The Change (X):** I’ll change the CTA button text from \"Sign Up\" to \"Get My Free Guide.\"\n- **The Predicted Outcome (Y):** I expect the number of lead form submissions to increase.\n- **The Reason (Z):** The new text is focused on immediate value (getting something free) instead of a commitment (signing up for something).\n\nSee how that connects the dots? Your observation leads directly to a proposed solution with a clear purpose.\n\n> The golden rule of A/B testing is to **test only one variable at a time**. Seriously. If you change the headline, the button color, _and_ the main image all at once, you’ll have no clue which change actually moved the needle. Keep your tests clean by isolating one variable at a time.\n\n### Practical A/B Tests You Can Run Today\n\nYou don't need a massive team of developers to get started. Most modern testing tools, like [VWO](https://vwo.com/) or [Optimizely](https://www.optimizely.com/), make it surprisingly easy to set up experiments. The trick is to start with changes that have the potential for a big impact.\n\nHere are a few high-impact ideas you can start testing right away:\n\n- **Headlines:** Pit your current headline against one that's more benefit-driven. For example, instead of \"Powerful UI Components,\" try \"Build Stunning Landing Pages in Minutes.\"\n- **Call-to-Action (CTA) Button:** This is a classic. Test the text, the color, the size, even the placement. You'd be shocked how often a simple switch from a muted grey to a vibrant green can lift conversions.\n- **Page Layout:** Try moving a key element, like your testimonials or social proof, higher up on the page. Does building trust earlier in the user's journey make a difference?\n- **Form Fields:** If you're running a lead gen form, test a version with fewer required fields. Every field you remove reduces friction, which can often lead to a direct increase in submissions.\n\n### Making Sense of the Results\n\nOnce your test has run long enough to achieve **statistical significance** (meaning the results aren't just a random fluke), it's time to see what you've learned. Your A/B testing tool will declare a winner, but your job isn't done.\n\nThe real gold is in understanding the _why_. Why did the benefit-focused headline win? Did the brighter button color simply grab more attention, or did the text resonate more?\n\nEvery test, win or lose, teaches you something invaluable about your audience. That insight is what you’ll use to build your next, even smarter, hypothesis.\n\n## Common Questions on Improving Conversion Rates\n\nWhenever I talk to marketers and business owners about conversion rate optimization, the same few questions always pop up. If you're just starting to dig into how to improve your website's performance, chances are you've wondered about these things too. Let's clear them up.\n\n### What Is a Good Website Conversion Rate\n\nEveryone wants a magic number, but the truth is, there isn't one. A \"good\" conversion rate is completely relative to your industry, your business model, and even where your traffic is coming from.\n\nYou might hear that an e-commerce average is around **2-3%**, but honestly, the only benchmark that matters is your own. The real goal isn't to hit some universal average; it's to consistently beat your own last record.\n\n> The best metric for success is progress, not perfection. Aim to consistently beat your own previous conversion records. This internal benchmark is far more valuable than comparing yourself to broad industry statistics that might not apply to your unique audience.\n\nGetting a **1% lift** this month compared to last month? That's a huge win. That's the kind of sustainable, incremental improvement that leads to massive long-term growth.\n\n### How Long Should I Run an A/B Test\n\nThe right length for an A/B test comes down to one thing: traffic volume. You have to let a test run long enough to collect enough data to be confident in the results—something statisticians call **statistical significance**. It just means the outcome wasn't a fluke.\n\nFor most sites, you'll want to run a test for at least one to two full weeks. Why? Because user behavior on a Tuesday morning is often wildly different from behavior on a Saturday night. Running it for a full business cycle helps you capture those natural fluctuations.\n\nDon't cut it short. Your testing tool will tell you when you have a statistically significant result. Trust the process, because ending a test too early is a classic mistake that can send you chasing the wrong conclusion.\n\n### Should I Focus on Traffic or Conversions First\n\nConversions first. Always. It’s so much cheaper and more effective to get more out of the traffic you _already_ have than it is to just go out and buy more.\n\nI always use the leaky bucket analogy. Your website is the bucket, and traffic is the water you're pouring into it. If your bucket is full of holes—like a confusing checkout process, slow-loading pages, or a broken form—pouring more water in is a complete waste.\n\nPlug the leaks first. Once your website is a well-oiled machine that converts visitors effectively, every dollar you spend on ads or SEO will work that much harder for you. It's the only way to get a real return on your marketing spend.\n\n---\n\nReady to build stunning, high-converting landing pages without the headache? **Magic UI** gives you over 50 customizable blocks and templates to create beautiful web interfaces in minutes. [Explore our components and start building today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-improve-website-loading-speed.mdx",
    "content": "---\ntitle: \"How to Improve Website Loading Speed: Fast & Easy Tips\"\ndescription: >-\n  Learn how to improve website loading speed with simple strategies. Boost\n  performance and enhance user experience today. Click to get started!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-7fb53038-319a-4daa-b7fb-38a59fef648c.jpg\nauthor: Dillion Verma\ntags:\n  - how to improve website loading speed\n  - website speed optimization\n  - page speed tips\n  - core web vitals\n  - site performance\npublishedOn: \"2025-10-11T08:18:34.20601+00:00\"\nfeatured: true\n---\n\nImproving your website's loading speed isn't just a technical tweak; it's about fundamentally changing how users perceive and interact with your brand. The core idea is simple: shrink the amount of data a browser needs to download and process. When you get this right, your content appears almost instantly, creating a seamless and positive first impression.\n\n## Why Website Speed Is Non-Negotiable\n\nBefore we jump into the nuts and bolts of optimization, let's get one thing straight: every millisecond counts. Website speed is a cornerstone of the user experience, and it has a direct, measurable impact on your bottom line. A slow site doesn't just annoy people—it actively drives them away, damages your credibility, and sends them right into the arms of your competitors.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/qJtOq35jpUE\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWe live in an era of instant gratification, and user patience is razor-thin. This isn't just a feeling; the data backs it up. Google’s research found that nearly half of all consumers—about **47%**—expect a website to load in **two seconds or less**.\n\nIt gets even more critical on mobile. A staggering **53% of mobile users** will hit the back button if a page takes more than three seconds to show up. The message is clear: speed isn't a bonus feature; it's a fundamental requirement.\n\n### The Connection Between Speed and Success\n\nThe ripple effects of a slow site are felt across every important business metric. You're not just losing a few impatient visitors. You're losing revenue, eroding trust, and sacrificing your visibility on search engines. A snappy, responsive site feels professional and reliable. A sluggish one? It just feels neglected.\n\n> Your website's performance is often the first impression a potential customer has of your brand. A delay of just a few seconds can be enough to communicate that your business is inefficient or untrustworthy.\n\nThis perception has a real impact on your conversion rates. For example, shaving off just **0.1 seconds** from your load time can boost retail conversions by a surprising **8.4%**. That kind of data shows a clear and powerful return on investment for any time you spend on optimization.\n\nThis infographic paints a pretty stark picture of how quickly users abandon a slow site.\n\n![Infographic about how to improve website loading speed](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/6cee3deb-4540-4b92-97af-26ccc970e830.jpg)\n\nLook at that jump. Going from a 2-second load time to 6 seconds can increase your bounce rate tenfold. That’s a devastating loss of potential customers before they’ve even seen what you have to offer.\n\n### SEO and Core Web Vitals\n\nBeyond keeping users happy, speed is a massive ranking factor for search engines like Google. They know that faster sites provide a better experience, so they reward them with better visibility. It's no coincidence that the average load time for sites on the first page of Google is a blistering **1.65 seconds**.\n\nGoogle's [Core Web Vitals optimization](https://galantstudios.com/core-web-vitals-optimization/) guidelines make this connection even more explicit. These metrics, like Largest Contentful Paint (LCP), directly measure how quickly a user perceives your main content. A poor score here can hamstring your organic reach, making all your other SEO efforts feel like an uphill battle. A slow site is already losing the race for visibility before a user even clicks.\n\n## Optimize Your Digital Assets for Peak Performance\n\nWhen you're hunting for ways to **improve website loading speed**, your images and videos are usually the biggest culprits. Think of them as the heaviest luggage on your webpage—they’re often the reason everything feels slow and clunky. Taming these assets is one of the most impactful changes you can make, and the best part is, you don't have to sacrifice visual quality to do it.\n\n![A person working on a laptop with code and design elements on the screen, representing digital asset optimization.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7fe03adb-1ab8-4649-84bd-a1a1fb4e1700.jpg)\n\nThe guiding principle is straightforward: get your media files as small as possible without a noticeable drop in clarity. It’s a bit of a balancing act, but modern tools and formats have made this easier than ever.\n\n### Choosing The Right Image Format\n\nNot all image formats are built the same. The file type you select has a direct, measurable impact on its size and, by extension, how fast it loads. Picking the right format for the job isn't just a technical detail; it's a strategic move that shaves off precious milliseconds.\n\nBefore you save your next image, it's worth knowing which format is best suited for the task. Here's a quick comparison to help you make an informed decision.\n\n| Format   | Best For                                           | Key Feature                                                     | Performance Impact |\n| :------- | :------------------------------------------------- | :-------------------------------------------------------------- | :----------------- |\n| **JPEG** | Photographs and complex, multi-colored images.     | Great balance of quality and file size with lossy compression.  | Good               |\n| **PNG**  | Graphics with sharp lines, logos, or transparency. | Lossless compression preserves every detail perfectly.          | Moderate           |\n| **WebP** | A versatile replacement for both JPEGs and PNGs.   | Offers much smaller file sizes for similar or better quality.   | Excellent          |\n| **AVIF** | High-quality images where performance is critical. | Provides the best compression, but has limited browser support. | Best               |\n\nEach format has its strengths, and making a smart choice here is a simple win for performance. A user might not know you chose **WebP** over **JPEG**, but they will absolutely feel the difference when your page snaps into view.\n\nFor a deeper dive into this topic, check out our detailed guide on [how to optimize images for the web](https://magicui.design/blog/how-to-optimize-images-for-web), where we cover more advanced techniques.\n\n### Master Smart Compression Techniques\n\nOnce you've settled on a format, the next move is compression. This is where you algorithmically shrink the file size. You'll run into two main approaches: **lossy** and **lossless**.\n\n**Lossless** compression is like perfectly organizing a suitcase—everything is still in there, just packed more efficiently to save space. It reduces file size with zero loss in quality.\n\n**Lossy** compression, on the other hand, is like deciding to leave a few non-essential items behind to make the bag lighter. It strategically removes some data permanently. When done right, the human eye can't even tell the difference.\n\nMost optimization tools give you a quality slider to control the level of lossy compression. I’ve found that a quality setting around **70-80%** is the sweet spot. It usually delivers a massive reduction in file size with almost no visible degradation.\n\n### Implement Lazy Loading For a Faster Start\n\nPicture this: a user lands on a long blog post, and their browser immediately tries to download every single image on the page, even the ones way down at the bottom. It’s a recipe for a slow, frustrating initial load.\n\nThis is where **lazy loading** saves the day.\n\nIt's a clever technique that tells the browser to hold off on loading images and videos until they are just about to scroll into view. Instead of a massive upfront download, the browser can focus on rendering the content the user sees first, providing a huge boost to perceived performance.\n\nThe impact is significant. On average, images make up **21% of a total webpage's weight**. Switching to modern formats like WebP can slash file sizes by **25-34%** compared to JPEGs, and lazy loading can improve the Largest Contentful Paint (LCP) by up to **50%** on media-heavy pages.\n\nBest of all, implementing it is ridiculously easy. Modern browsers support it natively with a single HTML attribute:\n\n<img\n  src=\"image.jpg\"\n  loading=\"lazy\"\n  alt=\"An example image.\"\n  width=\"600\"\n  height=\"400\"\n/>\n\nJust by adding `loading=\"lazy\"`, you're offloading the work to the browser. It’s one of the simplest and most effective optimizations you can make.\n\n## Leverage Caching and CDNs\n\nYou've squeezed every last kilobyte out of your assets, but now it's time to tackle the next big performance killer: distance. The physical distance between your server and your user can make even the most optimized site feel slow.\n\nThis is where caching and Content Delivery Networks (CDNs) come in. Don't let the technical names fool you; they're basically just smart shortcuts that make your site feel instantly faster for everyone, everywhere.\n\nThink of them as a tag team. Caching handles the repeat visitors, while a CDN speeds things up for new users, no matter where they are in the world. Together, they dramatically reduce the load on your server and create a much smoother experience.\n\n### Give Returning Visitors an Instant Welcome with Browser Caching\n\nEver go back to a coffee shop where the barista remembers your usual order and starts making it before you even speak? That's pretty much how browser caching works.\n\nWhen someone lands on your site for the first time, their browser has to download everything—HTML, CSS, JavaScript, images, the works. Browser caching is a simple instruction you give the browser to save a copy of those files locally on the user's device.\n\nThe next time they swing by, the browser doesn't need to fetch everything from your server all over again. It just loads the files it already has stored. The difference is night and day, making those repeat visits feel blazing fast.\n\n> Browser caching is your website's short-term memory. It dramatically reduces the number of requests back to your server for returning visitors, which is why subsequent page loads often feel much quicker than the first one.\n\nSetting this up usually involves configuring \"cache-control\" headers on your server. This tells browsers how long to hang onto files before asking for a new version. For things that don't change often, like your logo or core stylesheets, you can set a nice long expiration date.\n\n### Go Global and Eliminate Lag with a CDN\n\nWhile caching is a huge win for repeat visitors, a Content Delivery Network (CDN) is all about making that _first_ visit lightning-fast for anyone, anywhere.\n\nLet's say your server is physically located in Dallas. If a user from Dallas visits your site, the connection is short and sweet. But what about a visitor from Tokyo? The data has to travel halfway around the planet, and that trip takes time. This delay is called latency.\n\nA CDN solves this geography problem by creating a worldwide network of \"edge servers.\" These servers act like mini-copies of your website, storing your static content in dozens of locations.\n\nWhen that user from Tokyo visits, the CDN automatically connects them to the closest server—maybe one right there in Japan. Instead of a cross-planet journey to Dallas, the files are delivered from just around the corner.\n\nThe results are huge. A well-implemented CDN can slash load times by as much as **50%**, while good browser caching can make repeat visits feel **70%** faster. The folks at [Cloudflare have some great performance insights](https://www.cloudflare.com/learning/cdn/what-is-a-cdn/) that break down how this works in more detail.\n\n### Putting a CDN to Work\n\nGetting started with a CDN is probably easier than you think. A lot of modern web hosts, like Vercel or Netlify, have CDNs built right in that you can enable with a click.\n\nIf you're using popular libraries, serving them via a CDN is standard practice. For instance, you can see how this works by checking out this guide on using a [Tailwind CDN in your HTML](https://magicui.design/blog/tailwind-cdn-html).\n\nWhen you're picking a CDN provider, keep these points in mind:\n\n- **Global Reach:** Does their network have servers (Points of Presence) in the regions where your users actually live?\n- **Easy Setup:** Look for simple integrations or plugins for your platform, whether it's WordPress, Shopify, or a custom build.\n- **Bonus Features:** Many CDNs bundle in other cool optimizations, like automatic image compression or code minification, giving you more bang for your buck.\n\nBy combining local browser caching with a global CDN, you're building a powerful, two-pronged attack on slow load times. You’re not just speeding up your site for one person; you're making it faster for everyone.\n\n## Streamline and Optimize Your Code\n\nOnce you’ve tuned up your server and compressed your assets, the next performance battle is fought in the code itself. Bloated or clunky HTML, CSS, and JavaScript can act like an invisible anchor, weighing down your site and making browsers work way harder than they need to. It's time to make your site's backbone lean, clean, and fast.\n\n![A developer's screen showing clean, organized code, symbolizing the process of code optimization and streamlining.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8ee9f867-6c33-403e-9a16-637a9d3cfb48.jpg)\n\nThink of your code files as a set of instructions for the browser. The more convoluted those instructions are, the longer it takes for the browser to read, understand, and finally execute them. Our goal here is to make these instructions as direct and concise as possible.\n\n### Shrink Your Files with Minification\n\nOne of the quickest wins in code optimization is **minification**. When we’re developing, we add comments, whitespace, and line breaks to keep our code readable for other humans (and our future selves). Super helpful for maintenance, sure, but completely useless to a browser. All that extra formatting just adds unnecessary weight to your files.\n\nMinification is an automated process that ruthlessly strips out all that extra baggage. It takes a nicely formatted script and crushes it into a compact, single line of code that the browser can download and chew through much faster.\n\nDon't mistake this for a minor tweak; the impact can be huge. Minifying your CSS, JavaScript, and HTML can slash file sizes by as much as **60%**. That translates directly into faster downloads and parsing, giving you a serious performance bump for very little effort. If you want to dive deeper into the numbers, check out Google's guide on reducing network payloads.\n\n### Tackle Render-Blocking Resources Head-On\n\nEver seen a construction crew grind to a halt because a single, non-essential delivery truck is blocking the road? That’s exactly what happens when a browser hits a **render-blocking resource**. These are typically CSS and JavaScript files that the browser _must_ download and run before it can show a single pixel of your page, leading to that dreaded blank white screen.\n\nThe trick is to figure out which scripts are absolutely essential for that initial view and which ones can wait. Your site’s core layout styles? Critical. The JavaScript for your footer’s interactive map? Probably not so much.\n\nTo fix this, we can use two simple HTML attributes: `async` and `defer`.\n\n- **`async`**: Tells the browser to download the script in the background while it keeps parsing the HTML. The script then runs the moment it's finished downloading, which might interrupt rendering. It’s best for standalone, third-party scripts like analytics.\n- **`defer`**: Also downloads the script in the background but waits to execute it until after the entire HTML document has been parsed. This is usually the better choice for scripts that depend on the full document being ready, like interactive page elements.\n\nHere’s what that looks like in practice:\n\n<script async src=\"analytics-tracker.js\"></script>\n\n<script defer src=\"interactive-component.js\"></script>\n\nBy deferring non-critical JavaScript, you let the browser render the visible part of your page first. This drastically improves the _perceived_ loading speed for your users and is a top recommendation in Google's PageSpeed Insights because it directly boosts your First Contentful Paint (FCP) score.\n\n### Trim the Fat by Removing Unused Code\n\nOver the years, websites inevitably accumulate code cruft. You install a new plugin, update a theme, or retire an old feature, but the old CSS and JavaScript often get left behind. This unused code is dead weight that still gets downloaded and parsed by the browser, wasting bandwidth and processing power.\n\nHunting down and removing this digital baggage is a crucial cleanup step. Modern browsers have a powerful tool for this in their developer tools: the \"Coverage\" tab. It shows you, line by line, which parts of your CSS and JavaScript files were actually used to render the page and which were just sitting there.\n\n> Identifying unused code can feel like digital archaeology, digging through old files to find what’s no longer needed. The payoff is a leaner, faster website that isn't bogged down by the ghosts of features past.\n\nWhile this can be a manual process, the results are well worth the effort. Trimming a large CSS file by even **20-30%** can make a tangible difference.\n\nFor developers using modern frameworks, tools like tree-shaking can automate this during the build process, ensuring only the code that’s actually needed makes it to production. If you’re building with React, sticking to smart development patterns can also keep your codebase lean from the start. You can learn more by reading about these [React best practices in our guide](https://magicui.design/blog/react-best-practices).\n\nBy combining minification, deferring scripts, and cutting out unused code, you’re doing more than just optimizing—you’re decluttering your site’s foundation for pure speed.\n\n## Build on a Solid Foundation with Better Hosting\n\nYou can spend weeks optimizing every image and compressing every script, but if your website is built on a shaky foundation, it will never be truly fast. That foundation is your hosting provider.\n\nThink of it as the engine powering your entire site. Opting for a cheap, overloaded shared server is a classic case of a costly mistake disguised as a bargain. It’s like trying to build a skyscraper on a foundation meant for a small house—no matter how brilliant the architecture, the whole structure is compromised from the start. Your hosting dictates the absolute speed limit for your entire user experience.\n\n### Understanding Your Hosting Options\n\nNot all hosting is created equal. The environment where your website lives has a direct, massive impact on its responsiveness and ability to handle traffic when you need it most. Let's break down the common types.\n\n- **Shared Hosting:** This is the budget option. Your site shares server resources—CPU, RAM, bandwidth—with hundreds, sometimes thousands, of other websites. It’s like living in a crowded apartment building; if your neighbor throws a massive party (gets a surge in traffic), the whole building feels the strain. It's an okay starting point, but you'll outgrow it fast if performance is a real priority.\n\n- **Virtual Private Server (VPS) Hosting:** A VPS is a major step up. You still share a physical server, but you get a dedicated, partitioned slice of its resources. This is more like owning a condo in that building. You have your own space and utilities, and you're not as affected by what your neighbors are doing. It gives you far more power, control, and consistency.\n\n- **Cloud Hosting:** This is the modern approach. Instead of relying on one machine, your site uses a network of connected virtual servers. It can pull resources from this \"cloud\" as needed, which provides fantastic scalability and reliability for sites with unpredictable traffic spikes.\n\nAs you optimize your site, don't forget the infrastructure it's built on. It's worth exploring options like [free web hosting services](https://www.acornbusinesssolutions.com/web-hosting-services/free-web-hosting/) just to get a feel for the different performance levels out there and how they might affect your speed.\n\n### The Critical First Metric: Time to First Byte\n\nOne of the most revealing metrics for server health is **Time to First Byte (TTFB)**. This measures how long it takes for a browser to get the _very first byte_ of data from your server after it makes a request. A slow TTFB is a red flag that your server is sluggish, creating a delay before your page can even begin to render.\n\n> TTFB is the starting gun for your page load. A fast TTFB gives your website a head start. A slow one means you're already behind before the race has even begun.\n\nGlobally, the average website page load time is around **3.21 seconds**, a number heavily influenced by server response time. Google recommends a TTFB under **200ms**. Hitting this target is a huge step toward passing Core Web Vitals, a feat that only **48%** of mobile sites currently manage.\n\n### How to Choose a High-Performance Host\n\nImproving your TTFB and overall site speed often comes down to picking a host that prioritizes modern tech and smart infrastructure. A fast server isn't just about raw power; it's about having an up-to-date tech stack.\n\nLook for providers that offer:\n\n- **Modern PHP Versions:** If you’re on WordPress, using the latest PHP version (like **PHP 8+**) can deliver a massive speed boost compared to older, outdated versions.\n- **HTTP/3 Support:** This is the newest version of the protocol that powers the web. It offers major performance gains, especially for users on mobile or less reliable networks.\n- **Strategic Data Center Locations:** The physical distance data has to travel matters. Choose a host with servers located close to where most of your audience is. Shorter distance means lower latency and a faster TTFB.\n\nUpgrading your hosting shouldn't be seen as just another expense. It's a direct investment in every other optimization you make. A fast server is the bedrock that ensures all your hard work on the front end actually pays off.\n\n## Website Speed FAQs\n\nDiving into website performance optimization always stirs up a ton of questions. As you start making changes, you'll naturally wonder where to focus your energy first or how to even read the results you're getting.\n\nI've put together some quick, straightforward answers to the questions that come up most often. Think of this as your personal cheat sheet for making smart, effective decisions on how to speed up your site.\n\n### What Is a Good Website Loading Speed?\n\nWe'd all love \"instant,\" but setting a realistic target is key. In my experience, a load time of **under 2 seconds** is the gold standard. It's what users now expect, and it feels snappy.\n\nIf you're landing between **2 and 4 seconds**, you're in an acceptable range, but there's definitely room to improve. Once you creep past that 4-second mark, you’re in trouble. Bounce rates start to skyrocket. And remember, it's not just about the full page load. Core metrics like Time to First Byte (TTFB) should be lightning-fast—aim for under **200 milliseconds**.\n\n### Which Optimization Has the Biggest Impact?\n\nLooking for the biggest bang for your buck? Go straight for your **images**. Nine times out of ten, unoptimized images and other digital assets are the heaviest things on a page and the number one reason for slow load times.\n\nIt's the lowest-hanging fruit, but it has the highest reward. Simply compressing your images, switching to modern formats like WebP, and turning on lazy loading can produce night-and-day differences almost immediately.\n\n> The Pareto principle is absolutely in play with site speed. You'll find that 80% of your performance headaches come from just 20% of the causes—and I can almost guarantee images are in that 20%.\n\nAfter you've tackled images, your next biggest wins will come from upgrading your hosting and getting a solid Content Delivery Network (CDN) in place.\n\n### Will Using Google Tag Manager Slow Down My Site?\n\nThis one comes up all the time. The short answer is: it can, but it’s not GTM itself that's the problem. An empty [Google Tag Manager](https://marketingplatform.google.com/about/tag-manager/) container has a virtually zero impact on your site's speed.\n\nThe real culprit is **what you put inside it**. Every single tracking script, from your analytics to ad pixels, adds another network request and eats up browser resources to execute. A GTM container packed with dozens of tags all firing at once will absolutely drag your site down.\n\nHere’s how I recommend managing it to keep things speedy:\n\n- **Do a regular audit.** You'd be amazed at how much digital junk accumulates. Get in there and remove tags for services you aren't even using anymore.\n- **Delay non-essential scripts.** Does your heatmap tool really need to fire the second the page starts loading? Probably not. Set less critical tags to trigger after the `Window Loaded` event, or even after a few seconds of user inactivity. This lets the important stuff load first.\n- **Get specific with your triggers.** Don't just fire every tag on \"All Pages.\" If a conversion pixel is only needed on the \"thank you\" page, create a trigger just for that URL.\n\nBy managing your tags thoughtfully, you can get all the marketing data you need without making your users pay the price with a slow experience. It's all about striking that balance.\n\n---\n\nReady to build stunning, high-performance websites without the headache? **Magic UI** gives you a library of over 50 customizable, production-ready components built with React, TypeScript, and Tailwind CSS. Stop building from scratch and start creating beautiful, fast-loading landing pages in minutes. Explore our components and templates at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-improve-website-performance.mdx",
    "content": "---\ntitle: \"How to Improve Website Performance: Essential Tips & Tricks\"\ndescription: >-\n  Learn how to improve website performance with practical strategies. Boost\n  speed, user experience, and SEO. Discover how to improve website performance\n  today!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-479c638e-10e8-4506-87d7-6c6fc785af3a.jpg\nauthor: Dillion Verma\ntags:\n  - website performance\n  - site speed\n  - core web vitals\n  - improve website performance\n  - technical seo\npublishedOn: \"2025-10-12T08:34:47.168634+00:00\"\nfeatured: true\n---\n\nWhen you're trying to improve your website's performance, it's easy to get lost in the weeds of optimizing images, cleaning up code, and messing with browser caching. All of that is important, but the real goal is simple: get your content in front of the user as fast as humanly possible.\n\nWhy? Because even a **one-second delay** isn't just a minor annoyance—it's enough to torpedo your engagement and kill conversions.\n\n## Why Website Performance Is Your Most Important Metric\n\nBefore we start tweaking settings and running tests, let's get one thing straight. Website performance isn't just some item on an IT checklist. It's a core driver of your business. The speed and responsiveness of your site have a direct, measurable impact on everything from user happiness and search engine rankings right down to your bottom line.\n\nHere’s a good way to think about it: a slow website is the digital version of a brick-and-mortar store with ridiculously long checkout lines. People get frustrated. They leave. This exact scenario plays out millions of times a day online, where patience is practically non-existent.\n\n### The Financial Cost of a Slow Website\n\nThe link between your site's speed and your revenue is crystal clear. If you run an e-commerce store, a one-second delay could literally mean thousands of dollars in lost sales over a year. For a B2B company, it's the difference between snagging a high-value lead or watching them click away to a competitor who didn't keep them waiting.\n\n> Website speed isn't just a technical metric—it directly impacts user behavior, search rankings, and business revenue on a global scale. Studies consistently show that even tiny delays in page load times can have a dramatic effect.\n\nA single second of added load time can cause a **7% drop in conversions**. That might not sound like much, but let's do the math. For a business pulling in $100,000 a day, that's a staggering **$365,000** lost every year. The small delays really do add up.\n\nTo put this in perspective, here's a quick look at how those fractions of a second hurt your key metrics.\n\n#### The Impact of Load Time on Key Business Metrics\n\n| Load Time Increase | Impact on Bounce Rate      | Impact on Conversions |\n| :----------------- | :------------------------- | :-------------------- |\n| **1s to 3s**       | Bounce rate increases 32%  | Drops significantly   |\n| **1s to 5s**       | Bounce rate increases 90%  | Often drops by half   |\n| **1s to 6s**       | Bounce rate increases 106% | Plummets to near zero |\n\nAs you can see, the relationship is brutal. The longer you make people wait, the more certain it is they'll leave without buying a thing.\n\nThis infographic paints a pretty clear picture of that chain reaction.\n\n![Infographic about how to improve website performance](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/57572e55-377f-43db-96a9-9c0d140df772.jpg)\n\nIt’s a direct line from poor performance to poor business outcomes. There’s really no ambiguity there.\n\n### Performance Beyond the Desktop\n\nThese days, optimizing for performance really means optimizing for mobile first. More people are browsing on their phones than on desktops, and they're often doing it over spotty network connections. A site that feels snappy on a high-end desktop hooked up to fiber internet can be painfully, unusably slow on a smartphone.\n\nThis is why adopting a mobile-first mindset isn't just a nice-to-have anymore; it's absolutely essential if you want to reach your whole audience. We actually have a great guide that dives deeper into [what is mobile-first design](https://magicui.design/blog/what-is-mobile-first-design).\n\nIt also helps to understand what's happening on the user's end of the connection. Learning a bit about [how to optimize internet speed and boost Wi-Fi](https://clouddle.com/blog/how-to-optimize-internet-speed/) gives you perspective on the challenges your visitors might be facing.\n\nOnce you start framing performance as a cornerstone of your digital strategy, you’re in the right headspace to make improvements that truly matter.\n\n## Diagnosing Speed Issues with the Right Tools\n\nYou can't fix what you can't measure. That nagging feeling that your site is \"slow\" isn't enough—you need data. The first real step is moving from a vague hunch to a concrete, data-backed action plan. This means getting comfortable with the tools that pinpoint exactly where the bottlenecks are.\n\nA fantastic place to start is Google's [PageSpeed Insights](https://pagespeed.web.dev/). It's free, intuitive, and gives you a clear performance score along with a punch list of actionable recommendations.\n\nHere's what a typical report looks like. It immediately flags key metrics like LCP, INP, and CLS, giving you a health check at a glance.\n\n![Screenshot from https://pagespeed.web.dev/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c4d1cd2c-da6a-4f55-b3dd-f71ff324e893.jpg)\n\nThe best part? It turns abstract problems into a tangible checklist. Instead of just knowing your site is slow, you see _why_—maybe you need to optimize images or slash some unused JavaScript.\n\n### Understanding Lab Data vs. Field Data\n\nWhen you run a test, you'll notice two kinds of data: **lab data** and **field data**. Knowing the difference is a game-changer.\n\n- **Lab Data:** This is a performance checkup in a perfect, controlled environment. Think of it as a simulation on a consistent device with a stable network speed. It's brilliant for debugging and testing changes before you push them live.\n- **Field Data:** This is the real deal—data collected from actual users visiting your site. It captures the true experience of your audience across all their different devices, spotty Wi-Fi connections, and locations. This is what Google uses for its Core Web Vitals assessment.\n\n> A site might ace a lab test but still feel sluggish for a user on a shaky 4G connection. Always treat field data as your ultimate source of truth for user experience.\n\n### Decoding Key Performance Metrics\n\nTo make any sense of these reports, you have to speak the language of performance metrics. The most important ones today are Google's **Core Web Vitals**.\n\nThese three benchmarks have become central to technical SEO, completely reshaping how we optimize sites. Google's intense focus on them means you need to be watching them like a hawk. It’s no coincidence that websites on the first page of Google's search results typically load in just **1.65 seconds**—speed is a massive competitive edge.\n\nLet's break them down quickly:\n\n1.  **Largest Contentful Paint (LCP):** This is all about _loading performance_. It measures the time it takes for the largest image or text block to become visible. Your target here is **2.5 seconds** or less.\n2.  **Interaction to Next Paint (INP):** This one measures _responsiveness_. It tracks the lag between a user's action (like a click or tap) and the moment the page visually responds. A good INP is under **200 milliseconds**.\n3.  **Cumulative Layout Shift (CLS):** This metric is for _visual stability_. It quantifies how much the page layout unexpectedly jumps around while loading. Annoying, right? A good CLS score is **0.1** or less.\n\nAs you start digging into these numbers, remember that your site's foundation plays a huge role. Sometimes, the problem isn't your code or images—it's the server itself. Before you spend hours tweaking code, it might be worth [choosing a high-performance website hosting service](https://thebrandexpress.com.au/blog/top-10-website-hosting-services/), as that can be a fundamental step toward better performance.\n\nBy arming yourself with the right tools and a solid grasp of these metrics, you can build a clear, data-driven roadmap to a faster site.\n\n## Optimizing Images and Media Without Sacrificing Quality\n\nIf there's one thing that consistently drags a website's performance down, it's large, unoptimized media files. Images and videos are non-negotiable for creating an engaging user experience, but they're almost always the heaviest assets a browser has to download.\n\nGetting this part right can deliver some of the most dramatic speed improvements you'll see. The goal isn't to ditch rich media entirely—it's to serve it intelligently. It's all about finding that perfect balance between visual quality and file size so your site stays both beautiful and fast.\n\nThe stakes are higher than you might think. Even a tiny **0.1-second** improvement in page speed can boost conversions by **8.4%**. Every single kilobyte you save really does matter.\n\n![A visually striking but optimized website hero image on a laptop screen.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5380a369-b70d-46c0-8223-ebeb3f20d111.jpg)\n\n### Choose Next-Gen Image Formats\n\nStill relying on old-school JPEGs and PNGs? You're leaving a ton of performance on the table. Modern browsers are built to handle next-generation formats that offer far superior compression without sacrificing quality.\n\n- **WebP:** This format, developed by Google, is a game-changer. It creates files that are typically **25-34% smaller** than an equivalent JPEG, with no noticeable drop in quality. It supports both lossy and lossless compression, making it incredibly versatile.\n- **AVIF:** If you need the absolute best compression, especially for high-detail hero images or product photos, AVIF is your answer. It's newer than WebP and often produces even smaller files.\n\nSwitching your main images over to these formats will make a serious dent in your page weight. The good news is that most modern CMS platforms and image optimization plugins can handle the conversion for you automatically.\n\n### Implement Smart Compression and Resizing\n\nJust picking the right format isn't quite enough. You also need to apply smart compression, a process that strips out data the human eye is unlikely to notice.\n\n> Here’s a pro tip: never upload a massive 4000-pixel image just to have it displayed in a 500-pixel container. Always resize your images to the maximum dimensions they'll be shown at _before_ you upload them. This one simple habit prevents your users from downloading huge, unnecessary files.\n\nTools like [Squoosh](https://squoosh.app/) or [ImageOptim](https://imageoptim.com/mac) are fantastic for dialing in that perfect balance between file size and visual fidelity. If you want to go deeper on this, we've got a whole guide on [how to optimize images for web](https://magicui.design/blog/how-to-optimize-images-for-web) performance.\n\n### Serve Responsive Images for Every Device\n\nServing the same huge desktop banner image to a tiny mobile screen is a massive waste of bandwidth. This is where responsive images come into play, and they're a must-have for modern web performance.\n\nBy using the `srcset` attribute in your HTML, you can give the browser a menu of different-sized versions of an image. The browser then gets to be the smart one, picking and downloading only the most appropriate size based on the user's device and screen resolution.\n\nIt looks something like this in your code:\n\n<img\n  src=\"small-image.jpg\"\n  srcset=\"small-image.jpg 500w, \n             medium-image.jpg 1000w, \n             large-image.jpg 1500w\"\n  alt=\"A descriptive alt text for the image\"\n/>\nThis simple snippet ensures mobile users get a small, fast-loading image, while\ndesktop users see the high-resolution version they expect.\n\n### Defer Offscreen Media with Lazy Loading\n\nFinally, remember that not every single image needs to load the second someone lands on your page. That's where **lazy loading** comes in.\n\nThis technique tells the browser to hold off on loading any media assets until they're just about to scroll into the user's view. By implementing lazy loading for all images and videos \"below the fold,\" you drastically cut down the initial load time. The browser focuses only on what's immediately visible, making your site _feel_ lightning-fast and giving your Largest Contentful Paint (LCP) score a healthy boost.\n\n## Streamlining Your Code and Putting the Browser to Work\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/Cy2ZJOBgk84\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nMoving beyond images and videos, the very code that builds your pages—HTML, CSS, and JavaScript—is a goldmine for performance gains. I've seen firsthand how clean, efficient code isn't just a \"nice-to-have\" for developers; it directly impacts how fast a browser can download, understand, and actually render your website for a visitor.\n\nEvery extra comment, space, or unnecessary line of code adds a tiny bit of weight. It might seem insignificant, but when you multiply that by thousands or even millions of visitors, those little bytes snowball into a real drag on your load times. This is exactly where **minification** comes into play.\n\n### Shrinking Your Code with Minification\n\nMinification is a simple, automated process that intelligently strips out all the fluff from your code files without breaking anything. Think of it as vacuum-sealing your code—it removes all the air (unneeded characters) to make the package much smaller.\n\nThis process tidies up three main file types:\n\n- **HTML:** It gets rid of code comments and extra white space.\n- **CSS:** It removes comments, spaces, and even combines duplicate style rules.\n- **JavaScript:** It cuts out comments and white space, and often shortens variable names to save a few more bytes.\n\nThe end result is a dramatically smaller file that the browser can grab and process in a fraction of the time. Thankfully, you don't have to do this by hand. Most modern development tools and platforms like [WordPress](https://wordpress.org/) have plugins or built-in features that handle minification automatically. It's a quick win.\n\n### Prioritizing What Loads First\n\nLet's be honest: not all code is equally important. The CSS that styles your header and hero section is critical. The JavaScript for that chat widget in the footer? Not so much. Loading every single script and stylesheet at once creates a digital traffic jam, leaving your visitors staring at a blank white page.\n\nThis is why **deferring non-critical resources** is such a game-changer. By instructing the browser to load less important JavaScript and CSS _after_ the main content has appeared, you free it up to render the visible part of the page first. This massively improves the _perceived_ load time, which is what really matters for keeping people from bouncing.\n\n> Your number one job is to get meaningful content in front of the user as fast as humanly possible. Deferring secondary scripts means your core message isn't held up by a non-essential analytics tracker.\n\n### Tapping into Browser Caching\n\nFor anyone who visits your site more than once, **browser caching** is probably the single most powerful performance trick you have. It’s a simple concept: you tell the visitor’s browser to save a copy of your site’s static files—like your logo, CSS, and JavaScript—on their own computer.\n\nWhen they come back for a second visit, their browser doesn't have to re-download all those files from your server. It just pulls them from its local storage. The difference is staggering, often resulting in near-instant page loads. This creates an amazing experience for your returning audience and lightens the load on your server.\n\nHere's a quick breakdown of how different caching types fit together.\n\n### Caching Strategy Comparison\n\nEach caching method plays a different role in speeding up your site. Browser caching is fantastic for repeat visitors, while server-side caching helps everyone by reducing the work your server has to do. A CDN, on the other hand, focuses on closing the physical distance between your content and your users.\n\n| Caching Method    | Best For                                             | Typical Performance Gain                                 |\n| :---------------- | :--------------------------------------------------- | :------------------------------------------------------- |\n| **Browser Cache** | Static assets (images, CSS, JS) for repeat visitors. | **Drastic** reduction in load times for returning users. |\n| **Server Cache**  | Dynamic content and database queries.                | Reduces server processing time for all users.            |\n| **CDN Cache**     | Serving assets from geographically close locations.  | Improves speed for a global audience.                    |\n\nGetting this right comes down to properly configuring the cache-control headers on your server. When you see a high \"cache hit ratio\" in your analytics, you know your caching strategy is working effectively, with most requests being served instantly from a cache instead of your server.\n\n## Speed Up Your Site Worldwide with a CDN\n\n![Screenshot from https://www.cloudflare.com/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8a4afbbb-12fd-46d5-b0b7-91b0e1cb31f4.jpg)\n\nIf you have users visiting your site from all over the world, you're eventually going to hit a wall that no amount of code optimization can break through: physics. The physical distance between your server and your visitor creates a delay called **latency**. Data simply takes time to travel across oceans and continents.\n\nThis is where a **Content Delivery Network (CDN)** becomes a game-changer. Think of a CDN as a network of proxy servers scattered across the globe, each holding a cached copy of your site's static files—things like images, CSS, and JavaScript.\n\nWhen someone visits your site, the CDN jumps in and serves those files from the server physically closest to them. This simple shift dramatically shortens the data's travel time.\n\n### How a CDN Really Moves the Needle on Performance\n\nSo, instead of a user in London having to wait for files to travel all the way from a server in Los Angeles, they get them from a local server, maybe just down the road. It’s a huge difference.\n\nBut the benefits don't stop with international visitors. By handling all the requests for static files, a CDN takes a massive load off your main server. This frees up your server's resources to do the heavy lifting, like handling dynamic content and database queries, making the site faster for _everyone_.\n\nThe numbers back this up. Websites using a CDN can slash their latency by up to **27%** and see load times improve by an average of **50%**. These aren't just vanity metrics; they directly impact user experience. In fact, sites with a CDN often report a **15% lower bounce rate**.\n\n### Getting Started with a CDN\n\nJumping into the world of CDNs is much easier than it sounds. You don't need to be a network engineer to get one up and running.\n\nWhen you're picking a provider, here’s what to look for:\n\n- **Global Reach:** Does their network have Points of Presence (PoPs) in the regions where your audience is?\n- **Easy Setup:** Look for services with straightforward integration, especially plugins for platforms like WordPress if that's what you use.\n- **Performance and Security:** Check reviews, uptime stats, and what kind of security features (like DDoS protection) are included.\n- **Price:** Many great CDNs, like [Cloudflare](https://www.cloudflare.com/), have generous free plans that are perfect for getting started and scale with you as you grow.\n\n> A CDN isn't just for massive enterprise companies anymore. It's a fundamental, accessible tool for delivering a consistently fast experience to every single user, no matter where they are.\n\nFor many sites, implementing a CDN is one of the single most impactful performance optimizations you can make. And if you're deep in the weeds with modern frameworks, you can take this concept even further. For instance, we have a guide on using a [Tailwind CDN in your HTML](https://magicui.design/blog/tailwind-cdn-html) to serve your styles just as efficiently as your other assets.\n\n## Common Website Performance Questions\n\nAs you start digging into site optimization, questions are bound to bubble up. It's totally normal to wonder where you should focus your energy first or how to make sense of the endless list of potential fixes.\n\nLet's walk through some of the most common questions we get about improving website performance.\n\n### How Often Should I Check My Website’s Speed?\n\nThink of website performance less like a one-time project and more like a regular health check-up. As a good rule of thumb, you should run a full performance audit **at least once every quarter**. This gives you a steady baseline, letting you track improvements over time and spot new issues before they snowball into bigger problems.\n\nThat said, you should absolutely run a quick check after any significant change to your site. This could be anything from:\n\n- Installing a new plugin or theme\n- Rolling out a major new feature or script\n- Redesigning a key page, like your homepage\n\nThese kinds of updates can have unexpected side effects on performance, so a quick pass with a tool like [PageSpeed Insights](https://pagespeed.web.dev/) is always a smart move.\n\n### What Is a Good Page Load Time to Aim For?\n\nWhile \"as fast as possible\" sounds about right, having a concrete target is much more helpful. The goal you should be shooting for is getting your key pages to load in **under two seconds**. Study after study has shown that user patience falls off a cliff right around the three-second mark.\n\n> Aiming for a load time under two seconds puts you in a great competitive position. Many sites on the first page of Google load in just **1.65 seconds**, proving that speed is a critical factor for top rankings and happy users.\n\nIt's also worth remembering that _perceived performance_ matters just as much. If your Largest Contentful Paint (LCP) is lightning-fast and the page _feels_ interactive almost immediately, users will see the site as fast, even if a few minor scripts are still loading in the background.\n\n### What’s More Important: Lab Data or Field Data?\n\nThis is a classic one, and the answer is: you need both. They just serve different purposes.\n\n**Field data**, often called Real User Monitoring (RUM), is your ultimate source of truth. It’s raw data from your actual visitors using their own devices, browsers, and network connections. This is what Google uses for its Core Web Vitals assessment, so it has a direct impact on your SEO.\n\n**Lab data**, on the other hand, is your go-to for debugging. It gives you a controlled, repeatable environment where you can test changes and pinpoint specific bottlenecks without all the noise of real-world variables.\n\nSo, use lab data to diagnose and fix problems, but always use field data to confirm that your fixes actually worked for real users.\n\n### My Site Is Really Slow. Where Should I Even Start?\n\nFeeling overwhelmed when you see a low performance score is completely normal. The key is to ignore the noise and start with the low-hanging fruit—the things that will give you the biggest bang for your buck.\n\n1.  **Optimize Your Images:** This is almost always the number one offender. Properly compressing images, resizing them for the web, and using next-gen formats like WebP can slash your page weight like nothing else.\n2.  **Get Caching in Place:** Set up browser caching and look into a page caching solution. This can give repeat visitors a practically instant loading experience.\n3.  **Use a CDN:** A Content Delivery Network (CDN) is one of the single most effective upgrades you can make for global load times. Many, like [Cloudflare](https://www.cloudflare.com/), have free plans that are incredibly easy to get running.\n\nIf you tackle just these three areas first, you'll likely solve a huge chunk of common performance issues and have a much better foundation to work from.\n\n---\n\nReady to build stunning, high-performance websites without the headache? **Magic UI** gives you a library of over 50 customizable components built with modern, speed-focused technologies. Create beautiful landing pages in minutes at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-learn-react.mdx",
    "content": "---\ntitle: \"How to Learn React: Your Ultimate Beginner's Guide\"\ndescription: >-\n  Wondering how to learn React? Discover essential steps, core concepts, and\n  practical projects to become a confident React developer. Start learning\n  today!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-239c3b89-d917-4dfb-81c2-467b06173320.jpg\nauthor: Dillion Verma\ntags:\n  - how to learn react\n  - react guide\n  - javascript\n  - web development\n  - learn to code\npublishedOn: \"2025-10-06T07:40:36.852624+00:00\"\nfeatured: true\n---\n\nLearning React the right way isn't about memorizing syntax. It's about following a smart path: nail down modern JavaScript first, _then_ dive deep into core concepts like components and JSX. Once you've got that, the real learning happens when you start building actual projects. This approach turns what could be an overwhelming task into a clear, manageable journey.\n\n## Why Learning React Is a Career-Defining Move\n\nBefore you even think about writing a line of code, let's get one thing straight. Learning React isn't just about adding another skill to your resume. It’s a serious investment in your future as a developer.\n\nThe biggest names in tech—think Netflix, Airbnb, and Instagram—all use React to build the user interfaces you use every day. That tells you something. It’s built for creating the fast, scalable, and interactive apps that companies and users demand. This massive adoption means the demand for skilled React developers is huge, opening doors to high-impact roles that can shape your entire career.\n\n### The Power and Popularity of React\n\nThe secret sauce behind React is its **component-based architecture**. It’s a total game-changer. Instead of wrestling with a giant, tangled codebase, you break down complex UIs into small, self-contained, and reusable chunks of code called components.\n\nThink of it like building with digital Lego bricks. You can snap them together, reuse them, and build almost anything you can imagine. This makes development not just faster, but far more organized and easier to maintain.\n\nThis infographic really puts React's explosive growth and lasting popularity into perspective.\n\n![Infographic about how to learn react](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b52abd1d-1c2b-4244-86b1-021a3edaa1a9.jpg)\n\nThe numbers don't lie. React isn't just a fleeting trend; it's a dominant force in web development, supported by a massive and incredibly active community.\n\n### A Look at Market Dominance\n\nYou can't overstate the framework's influence. By **2025**, React is already powering around **11 million websites** across the globe, which is a massive slice of the web. Why? Developers have found it can slash development time by an incredible **60%** compared to older, monolithic methods. For any business, that's a monumental efficiency boost.\n\n> The core advantage is clear: mastering React makes you a more valuable and efficient developer. The skills you gain are directly applicable to building the high-performance applications that companies are actively seeking.\n\nTo give you a bird's-eye view, here's a quick breakdown of what your learning journey will look like.\n\n### Your React Learning Roadmap Quick Overview\n\nThis table outlines the essential stages for getting up to speed with React, moving from the absolute basics to more advanced skills that will make you job-ready.\n\n| Stage                     | Key Focus                                                   | Estimated Time |\n| :------------------------ | :---------------------------------------------------------- | :------------- |\n| **Foundations**           | Mastering modern JavaScript (ES6+), HTML, and CSS           | 2-4 Weeks      |\n| **Core React**            | Components, JSX, Props, State, Hooks (useState, useEffect)  | 3-5 Weeks      |\n| **Intermediate Concepts** | Routing, State Management (Context API/Redux), API Calls    | 4-6 Weeks      |\n| **Building & Deploying**  | Creating full-stack projects, using build tools, deployment | 4-8 Weeks      |\n\nThis roadmap provides a structured path, but remember that the real learning happens when you start building.\n\nOnce you feel confident in your skills, the next step is showing them off. Using [a specialized frontend developer resume template](https://cvanywhere.com/frontend-developer-resume-template) can make a huge difference in how your applications are received. Committing to learning React is your ticket to a more rewarding and future-proof career in tech.\n\n## Building Your JavaScript Foundation\n\n![A diagram showing the relationship between JavaScript and React](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/35423bd2-39bb-4620-8fc0-723a12fe2e09.jpg)\n\nLet's get one thing straight: trying to learn React without a decent handle on JavaScript is like trying to build a house on sand. You might get a frame up, but it's going to be a frustrating, wobbly mess that collapses the second you try to add anything complex.\n\nThe simple truth is that **React is JavaScript**. Every single component you build, every piece of state you manage, and every user interaction you handle is just JavaScript, plain and simple.\n\nThis isn't about becoming a JavaScript master overnight. It’s about being strategic. We're going to focus on the modern features (often called ES6+) that React relies on day in and day out. Get these under your belt first, and your journey to **learn React** will be dramatically smoother.\n\n### Mastering Modern Variable Declarations\n\nFirst things first: forget you ever saw `var`. In modern JavaScript—and by extension, modern React—it’s all about `let` and `const`. This isn't just a style preference; it's about writing predictable, less buggy code.\n\n- **`const`**: Make this your default. You'll use it for almost everything. It creates a constant reference, meaning you can't reassign the variable. This single practice eliminates an entire class of bugs caused by accidentally changing values.\n- **`let`**: Save this for the rare occasions when you _know_ a variable needs to be reassigned. Think counters in loops or a value that gets updated based on user input.\n\nSticking to `const` forces you to be more intentional about your data flow, a skill that's absolutely critical for managing state in React.\n\n### Unlocking the Power of Arrow Functions\n\nYou’re going to see arrow functions (`=>`) everywhere in React code, and for good reason. Yes, they have a shorter syntax, but their real superpower is how they handle the `this` keyword.\n\nIn traditional functions, the meaning of `this` can change based on where and how the function is called, which has been the source of countless headaches for developers. Arrow functions, on the other hand, don't have their own `this`; they simply inherit it from their parent. This neatly solves the \"binding\" problem, making your component logic cleaner and far more predictable.\n\nIt means that when you pass an event handler to a button, an arrow function ensures `this` still refers to your component, just like you'd expect. No more clunky `.bind(this)` calls in a constructor.\n\n### Essential Tools for Data Manipulation\n\nReact is all about managing and moving data. Two ES6 features you will use constantly are destructuring and the spread operator. They are powerful shortcuts for working with objects and arrays.\n\n- **Destructuring**: This lets you cleanly pull values out of objects or arrays into their own variables. In React, you'll use this all the time to extract props. Instead of typing `props.name` and `props.age` over and over, you just write `{ name, age }`. It’s cleaner and much easier to read.\n- **Spread Operator (`...`)**: This operator lets you expand an iterable (like an array or object) into its individual elements. It's your primary tool for creating copies of arrays or objects, which is fundamental to React's principle of immutability, especially when updating state.\n\n> Understanding these data manipulation techniques is non-negotiable. They are not just \"nice-to-haves\"; they are the idiomatic way to handle props and state in modern React development.\n\n### Handling Asynchronous Operations with Ease\n\nMost web apps need to fetch data from an API, and those operations are asynchronous—they don’t happen instantly. This is where Promises and the `async/await` syntax become your best friends.\n\nA **Promise** is an object representing the eventual result of an async operation. It’s a huge improvement over the nested \"callback hell\" of older JavaScript.\n\nEven better is **`async/await`**, which is just a cleaner syntax built on top of Promises. It allows you to write asynchronous code that _looks_ and behaves like it's synchronous, making it incredibly easy to follow and debug. You'll be using `async/await` inside `useEffect` Hooks all the time to fetch data, manage loading states, and handle errors gracefully. Mastering this will make your data-fetching code look professional and stay maintainable.\n\n## Thinking in React Core Concepts\n\n![A diagram illustrating React's core concepts like components, state, and props.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c85a747b-32df-4d48-94f0-461f62b831c4.jpg)\n\nOnce you have a decent handle on JavaScript, the real shift begins: you need to start _thinking_ like a React developer. This isn't about memorizing syntax; it's about adopting a whole new mindset for building user interfaces. React's big idea is to break down complex UIs into small, self-contained pieces of code called **components**.\n\nThink about a typical social media profile. Instead of one giant, tangled HTML file, you'd have a `UserProfile` component. Inside that, you might find a `ProfilePicture` component, a `UserInfo` component, and a `PostFeed` component. Each one is its own little world, with its own logic and markup, which is what makes React so incredibly scalable.\n\n### Functional Components: The Modern Standard\n\nNot too long ago, React developers built everything with **class components**. You'll definitely still see them in older codebases, but the entire community has moved decisively toward **functional components** and Hooks.\n\nWhy the big change? Functional components are just cleaner, shorter, and way easier to test. They're literally just JavaScript functions that return something that looks like HTML. This evolution has made React much more approachable for newcomers.\n\n> If you're starting to learn React today, pour **99% of your effort** into understanding functional components and Hooks. Knowing that class components exist is useful for older projects, but you don't need to be an expert in them to succeed.\n\nHere’s a quick look at why the new way is better.\n\n| Feature         | Class Component                               | Functional Component with Hooks            |\n| :-------------- | :-------------------------------------------- | :----------------------------------------- |\n| **Declaration** | `class MyComponent extends React.Component`   | `function MyComponent() { ... }`           |\n| **State**       | `this.state = { count: 0 }`                   | `const [count, setCount] = useState(0);`   |\n| **Lifecycle**   | `componentDidMount()`, `componentDidUpdate()` | `useEffect()` Hook                         |\n| **Readability** | More boilerplate, confusing `this` keyword    | Cleaner, more direct, and easier to follow |\n\nThe functional approach gets rid of the dreaded `this` keyword and bulky constructors, leaving you with code that’s much simpler to reason about.\n\n### Understanding JSX: The Syntax of React\n\nOne of the first things that jumps out in a React component is JSX, which stands for **JavaScript XML**. It looks almost exactly like HTML, but it's supercharged with the full power of JavaScript.\n\nJSX lets you write your UI declaratively, right inside your JavaScript files. Behind the scenes, tools like Vite or Create React App compile this familiar-looking syntax into plain old JavaScript function calls that create the HTML elements for you.\n\nThis means you can drop JavaScript logic directly into your \"markup.\" You can render variables, loop over arrays to create lists, or conditionally show an element based on application logic.\n\nCheck out this simple welcome message:\n\n```jsx\nfunction WelcomeMessage({ user }) {\n  const greeting = \"Hello\"\n  const elementStyle = {\n    color: \"blue\",\n    fontSize: \"24px\",\n    fontFamily: \"Arial, sans-serif\",\n  }\n\n  return (\n    <div className=\"welcome-container\" style={elementStyle}>\n      <h1>\n        {greeting}, {user.name}!\n      </h1>\n      {user.isLoggedIn && <p>Welcome back to the dashboard.</p>}\n    </div>\n  )\n}\n```\n\nSee how we can use the `greeting` variable and even render the `<p>` tag conditionally with a simple `&&` operator? Notice `className` instead of `class` and the camelCase style object—these are small but important differences from regular HTML.\n\n### Managing Data with Props and State\n\nThe two pillars holding up any React application are **props** and **state**. Understanding the difference between them is non-negotiable for becoming a proficient React dev.\n\n- **Props (Properties)**: This is how you pass data from a parent component down to a child. The data flow is strictly one-way (parent to child), and props should be treated as read-only. A child component should _never_ modify the props it receives.\n\n- **State**: This is data that a component owns and manages internally. State is meant to change over time, typically based on user interactions. Whenever a component's state changes, React is smart enough to automatically re-render just that component to reflect the update.\n\nLet's use an analogy. In a `UserProfile` component, the user's name and avatar URL would likely be passed down as **props** from a higher-level `App` component. But whether the \"Follow\" button has been clicked is a piece of **state** managed entirely within the `UserProfile` component itself.\n\n### Introducing Essential Hooks\n\nHooks are special functions that let you \"hook into\" React's core features—like state and lifecycle events—from your functional components. They are the magic that makes functional components so powerful. You'll start with these three.\n\n1.  **`useState`**: This is your bread and butter. It lets you add state to a component, returning the current state value and a function to update it.\n2.  **`useEffect`**: This Hook is for handling \"side effects\"—things like fetching data from an API, setting up timers, or directly manipulating the DOM after a render.\n3.  **`useContext`**: This solves a common problem called \"prop drilling,\" where you have to pass data through many layers of components. Context provides a way to share data globally without all the hassle.\n\nLet's see `useState` and `useEffect` work together to fetch and display a list of blog posts.\n\n```jsx\nimport React, { useEffect, useState } from \"react\"\n\nfunction PostList() {\n  const [posts, setPosts] = useState([])\n  const [loading, setLoading] = useState(true)\n\n  useEffect(() => {\n    // This function runs after the component renders\n    async function fetchPosts() {\n      try {\n        const response = await fetch(\"https://api.example.com/posts\")\n        const data = await response.json()\n        setPosts(data)\n      } catch (error) {\n        console.error(\"Failed to fetch posts:\", error)\n      } finally {\n        setLoading(false)\n      }\n    }\n\n    fetchPosts()\n  }, []) // The empty array means this runs only once, like componentDidMount\n\n  if (loading) {\n    return <p>Loading posts...</p>\n  }\n\n  return (\n    <ul>\n      {posts.map((post) => (\n        <li key={post.id}>{post.title}</li>\n      ))}\n    </ul>\n  )\n}\n```\n\nHere, `useState` keeps track of our `posts` array and the `loading` status. `useEffect` handles the API call right after the component first appears on the screen. Mastering these core concepts is the biggest leap you'll take to **learn React**.\n\nAs you get more comfortable, you can start exploring more advanced patterns. A great next step is reading up on [React best practices to keep your code clean and scalable](https://magicui.design/blog/react-best-practices).\n\nReady to move from theory to actual code? You'll need a solid, professional-grade development environment. A clean and efficient setup isn't just a nice-to-have; it's what stops frustrating roadblocks before they start and lets you focus on one thing: learning React. This is how you start writing high-quality code from day one.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/O6P86uwfdR0\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nFirst things first, you need **Node.js** and its package manager, **npm**. Think of Node.js as the engine that lets you run JavaScript outside of a browser—absolutely essential for modern development tools. Npm is the massive warehouse where you get all your project's \"parts,\" like libraries and other packages. You can grab both together straight from the [official Node.js website](https://nodejs.org/).\n\n### Launching Your First App with Vite\n\nNot long ago, every tutorial pointed you toward Create React App (CRA). While it still works, the go-to choice for kickstarting a new React project today is **Vite**. Why? It's ridiculously fast. It uses native ES modules to give you a near-instant server start and Hot Module Replacement (HMR), which means your changes pop up in the browser almost immediately without a full page refresh.\n\nGetting started is as simple as running a single command in your terminal:\n\n```bash\nnpm create vite@latest your-app-name -- --template react\n```\n\nJust follow the prompts, `cd` into your new project folder, and run `npm install`. In a couple of minutes, you'll have a fully functioning React application up and running. That's a massive speed boost compared to the older tools.\n\n### Essential Tools for High-Quality Code\n\nWith your project set up, it's time to arm your code editor. For React development, [Visual Studio Code (VS Code)](https://code.visualstudio.com/) is the undisputed industry standard, thanks to its powerful features and a huge library of extensions.\n\n> A professional setup isn't just about making the code run. It’s about ensuring the code you write is clean, consistent, and easy to maintain. Tools like linters and formatters automate this, instilling professional habits from day one.\n\nHere are the extensions you absolutely need to install in VS Code:\n\n- **ESLint**: This is your personal code reviewer, working in real-time. It catches potential errors, bugs, and stylistic issues, pushing you to follow best practices automatically.\n- **Prettier**: This is an opinionated code formatter that puts an end to all debates about tabs versus spaces. Every time you save, it automatically reformats your code to a consistent style.\n\nGetting ESLint and Prettier to play nicely together is the hallmark of a professional workflow. It ensures your code isn't just correct, but also perfectly formatted and readable.\n\nFinally, make sure you install the **React Developer Tools** extension for [Chrome](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/react-devtools/). This tool is a lifesaver for debugging. It lets you inspect your component hierarchy, see their props and state in real time, and even analyze performance bottlenecks.\n\nOnce you're comfortable, a great next step is to start styling your app. You can learn how to [install and configure Tailwind CSS in your React project](https://magicui.design/blog/install-tailwind-react), a modern styling solution that pairs perfectly with a Vite setup.\n\n## Turning Theory into Practice with Real Projects\n\n![A developer's desk setup, showing a laptop with code on the screen and other accessories.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/70711c25-cc6a-449e-86f9-da6769e83370.jpg)\n\nYou can binge tutorials and read docs all day, but the real \"aha!\" moments in React happen when you get your hands dirty and actually build something. Theory gives you the map, but hands-on projects are where the adventure is. This is the part where fuzzy concepts like state management and component composition finally click.\n\nMaking that switch from just consuming information to actively creating is what solidifies your skills. It's one thing to watch someone else debug an error; it's another thing entirely to hunt down your own bugs and figure out why your state isn't updating.\n\nLet’s walk through a couple of foundational projects that will cement what you've learned and kickstart your portfolio.\n\n### Your First Project: The Classic To-Do List\n\nJust about every developer has built a to-do list app at some point, and there's a good reason for that. It’s the perfect training ground. You get to wrestle with React's core ideas in a practical setting without getting totally overwhelmed.\n\nDon't underestimate this little app. Building it forces you to get comfortable with the essentials:\n\n- **Managing State with `useState`**: You’ll need state to hold the list of tasks, and you'll need another piece of state to track what the user is typing into the input field.\n- **Handling User Events**: This means writing functions that fire when a user clicks a button to add a new task or clicks another to delete one.\n- **Rendering Lists with `.map()`**: You'll get plenty of practice iterating over your array of tasks to dynamically render each to-do item on the screen.\n- **Passing Props**: You'll almost certainly create a `TodoItem` component and learn how to pass data (like the task's text) and functions (like a `handleDelete` function) down to it as props.\n\nThe goal isn't to build the next big productivity app. It's to build muscle memory for the patterns you’ll use in every single React project you touch from here on out.\n\n### Leveling Up with a Data-Fetching Project\n\nOkay, you’ve conquered the to-do list. Now it's time for something more dynamic: an app that pulls in data from a public API. Think movie search, recipe finder, or a simple weather dashboard. This is where you learn a skill every web developer needs: working with external data.\n\nThis kind of project forces you to learn how to handle asynchronous operations, which is just a fancy way of saying \"waiting for something to happen.\" You’ll learn how to manage that entire data lifecycle right inside your React components.\n\n> Building an API-driven project is a huge milestone. It’s the moment you go from creating self-contained little widgets to building apps that can interact with the wider web. This is how you build something genuinely useful and interactive.\n\nFor this project, you'll need to wrap your head around a few key concepts:\n\n- **Fetching Data with `useEffect`**: This is the go-to Hook for making an API call as soon as your component first loads.\n- **Managing Loading and Error States**: In the real world, data doesn't appear instantly. You'll use `useState` to track whether you're still loading or if something went wrong, so you can show the user a loading spinner or an error message.\n- **Conditional Rendering**: This is the magic that lets you display different UI based on the current state. You'll show a \"Loading...\" message while fetching, the movie data once it arrives, or \"No results found\" if a search comes up empty.\n- **Component Composition**: You’ll start thinking more about breaking down your UI into smaller, reusable pieces—maybe a `SearchBar` component, a `MovieList` component, and a `MovieCard` component that all work together.\n\nNailing a project like this shows you've got a solid, intermediate grasp of React. It's a fantastic portfolio piece that tells potential employers you can build applications that are more than just static pages. For more inspiration, check out our guide on other great [React projects for beginners](https://magicui.design/blog/react-projects-for-beginners).\n\n## Navigating the Broader React Ecosystem\n\nGetting comfortable with components, props, and state is a huge win. Seriously, pat yourself on the back. But that's just the foundation. To build a real-world, feature-rich application, you'll need to venture out into the wider React ecosystem.\n\nCore React is brilliant but intentionally lean. It doesn't have an opinion on things like page navigation or managing complex data across your app. That's where the ecosystem shines. You'll need to learn how to pick the right tools for handling routing, managing shared data, and building beautiful user interfaces without reinventing the wheel.\n\n### Handling Navigation with React Router\n\nOut of the box, React builds what we call a Single-Page Application (SPA). The entire app loads once, and then JavaScript handles all the \"page\" changes without a full browser refresh. This makes for a super fast, fluid user experience. But how do you actually create different pages?\n\nThe undisputed king of routing is **[React Router](https://reactrouter.com/en/main)**. It's the tool that lets you map your components to specific URLs, making your SPA feel like a traditional multi-page website. You can set up routes for `/`, `/about`, or even dynamic ones like `/products/:productId` and tell React exactly which component to show. It gives you the best of both worlds: familiar URLs and the snappy performance of a SPA.\n\n### Managing Complex State\n\nAs your apps get bigger, you'll inevitably run into a headache called \"prop drilling.\" It’s that annoying process of passing data down through five, six, or even ten layers of components just because a deeply nested child needs it. It’s messy and a pain to maintain.\n\nWhile React's built-in Context API can help with this, dedicated state management libraries offer more power and fantastic developer tools for more complex situations.\n\n> Think of global state management as a central data hub for your app. Instead of passing data down the component tree, any component can just connect directly to the hub to get what it needs or to update it.\n\nHere are the two heavy hitters you'll see everywhere:\n\n- **[Redux Toolkit](https://redux-toolkit.js.org/)**: This is the modern, official way to use Redux. It cuts down on the boilerplate that gave original Redux a bad rap and provides a predictable, centralized store for your app's state. It’s an absolute beast for large, complex applications where data integrity is critical.\n- **[Zustand](https://zustand-demo.pmnd.rs/)**: A much simpler, more lightweight alternative. It uses a clean, hook-based API that feels very natural to anyone who knows React. People love it for small to medium-sized projects because it's so quick to set up and learn.\n\nWhich one should you choose? For a massive app with intricate data flows, Redux Toolkit offers a solid, battle-tested structure. But if you just need a simple global store without all the ceremony, Zustand is an excellent choice.\n\n### Building Beautiful UIs Faster\n\nLet's be real: no one wants to build every single button, modal, and dropdown from scratch. That's where UI component libraries come in, saving you hundreds of hours while ensuring your app looks professional and consistent. Libraries like **[Material-UI (MUI)](https://mui.com/)** and **[Chakra UI](https://chakra-ui.com/)** provide huge collections of pre-built, accessible components that you can easily customize.\n\nAnd for that extra bit of magic? Animation libraries. They make it easy to create delightful, performant animations that bring your UI to life without having to fight with complex CSS.\n\n---\n\nAt **Magic UI**, we're all about empowering developers to build stunning, animated interfaces without the hassle. Our library has over **150** open-source components built with React, Typescript, and Tailwind CSS, letting you drop professional-grade animations and UI elements into your projects in minutes.\n\nCheck out our components and templates at [https://magicui.design](https://magicui.design) and see just how fast you can elevate your next React app.\n"
  },
  {
    "path": "apps/www/content/blog/how-to-make-an-animated-website.mdx",
    "content": "---\ntitle: \"How To Make An Animated Website: A Comprehensive Guide\"\ndescription: \"Captivate your audience with an animated website! Learn how to make an animated website & boost conversions. Try MagicUI for FREE!\"\nimage: https://cdn.magicui.design/assets/2a407738-1c21-406b-87ce-18b31be3f74e.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nDo you want to enhance your website's effectiveness by creating a compelling user experience that attracts and engages visitors? Making an animated website isn't just about making things look pretty; it's about creating a landing page that speaks volumes about your brand, vision, and product or service. After all, you want visitors to stay on your site and take the desired action. Animated [landing page examples](https://magicui.design/blog/landing-page-examples) effectively showcase a website's ability to capture attention, maintain interest, and encourage desired actions.\n\nIf you're looking for an easy-to-use, clean, and professional [startup landing page template](https://pro.magicui.design/docs/templates/startup) that will take your website to the next level, you're in the right place! Try MagicUI, a tool that will help you create a truly remarkable website that converts.\n\n## The Importance of Animation in Web Design\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/6zahri77rg7.jpg)\n\n### Engagement and Interactivity\n\nAnimation captivates users' attention and keeps them engaged. Subtle animations can draw attention to essential buttons or calls to action, making them more noticeable and encouraging user interaction. This can significantly improve user engagement by [making the website more dynamic](https://www.halo-lab.com/blog/best-website-animation-techniques) and less monotonous.\n\n### Enhanced User Experience\n\nEffective use of animation can simplify complex interactions. Loading animations can provide feedback during data retrieval, reducing user frustration by indicating something is happening. Animations can also smooth transitions between pages or sections, creating a more cohesive and pleasant user experience.\n\n### Visual Hierarchy and Guidance\n\nAnimation helps establish a clear visual hierarchy. Through animations, designers can highlight key elements or guide users through a process, such as filling out a form or navigating a site. This can reduce cognitive load and make the website easier to use.\n\n### Brand Identity and Differentiation\n\nCustom animations can reinforce brand identity and make a website stand out from competitors. Unique and well-designed animations contribute to a memorable brand experience and help create a distinctive visual style that aligns with the brand’s personality.\n\n### Emotional Connection\n\nAnimation can evoke emotions and create a connection with users. For example, a well-executed animated story or character can resonate with users emotionally, enhancing the website's overall impact and fostering deeper engagement.\n\n### Feedback and Communication\n\nAnimations provide immediate feedback on user actions. For instance, button presses, form submissions, and other interactions can be visually acknowledged through animations, helping users understand the result of their actions and enhancing the overall interaction flow.\n\n### Accessibility Considerations\n\nWhile animation enhances usability, it's essential to ensure accessibility to all users, including those with disabilities. Proper implementation and testing can ensure that [animations do not hinder usability](https://www.linkedin.com/pulse/using-animation-enhance-user-experience-web-design-jayed-hosen-z8l0c#:~:text=Animation%20is%20a%20powerful%20storytelling,and%20charisma%20to%20your%20website.) for users relying on assistive technologies.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## What Are the Key Benefits of Using Animation in Web Design?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/netsk3bacvd.jpg)\n\n### Enhanced User Engagement\n\nAnimation captures attention and keeps users interested. Interactive elements like [animated buttons](https://www.topnotchdezigns.com/advantages-of-animation-in-web-design-its-uses-and-more/) or hover effects encourage users to explore and interact more with the content.\n\n### Improved User Experience\n\nAnimations can make complex actions or processes more intuitive. For instance, loading spinners and progress bars provide feedback during data processing, reducing uncertainty and improving user satisfaction.\n\n### Visual Appeal\n\nWell-designed animations can add aesthetic value to a website. Smooth transitions, animated backgrounds, and other effects can make the site more visually appealing and create a modern look.\n\n### Effective Storytelling\n\nAnimation can be used to tell a story or convey information more engagingly. For example, animated infographics can present data visually compellingly, making it easier to understand and retain.\n\n### Increased Conversion Rates\n\nAnimated elements like attention-grabbing CTAs and product demos can lead to higher conversion rates. Engaging animations can persuade users to act, such as signing up for a newsletter or purchasing.\n\n### Brand Differentiation\n\nCustom animations can set a brand apart from competitors. Unique and creative animations can reinforce brand identity and make a website more memorable to users.\n\n### Enhanced Navigation\n\nAnimations can improve navigation by providing visual cues. For example, animated menus or scroll effects can guide users through different site sections, making it easier to find information.\n\n### User Feedback\n\nAnimations provide feedback on user interactions, such as button clicks or form submissions. This feedback helps users understand the result of their actions and ensures a smoother user experience.\n\n### Emotional Engagement\n\nAnimation can evoke emotions and create a connection with users. Animated characters or stories can resonate with users and enhance their overall experience with the site.\n\n### Data Visualization\n\nAnimation can make data visualization more engaging. For instance, animated charts and graphs can illustrate trends and changes over time, making complex data more accessible and understandable.\n\n### Evidence\n\nStudies have shown that websites with animations experience higher user engagement and satisfaction.\n\nAccording to a Google report, [websites with high-quality animations](https://explainvisually.co/en/services-unleashed-the-impact-of-animation-in-the-service-industry/) see a 30% increase in user engagement and a 20% increase in conversion rates compared to those without animations.\n\n## How Do You Plan and Design Animations for Your Website?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/uke0d2f0mtk.jpg)\n\n### Setting Clear Objectives\n\nBefore incorporating animations into a website, it's essential to establish clear objectives for what you want to achieve with the animations.\n\nHaving well-defined goals helps in designing animations that align with these objectives whether it's to:\n\n- Improve user engagement\n- Guide users through a specific process\n- [Enhance the site's visual appeal](https://namtheartist95.medium.com/the-benefits-of-using-animation-in-web-design-2d11a5503484)\n\n### Understanding the Audience\n\nConsideration of the target audience and their preferences is crucial when designing animations.\n\nBy understanding the demographic and behavioral characteristics of users, designers can:\n\n- Create animations that resonate with the audience\n- Enhance their overall experience on the website\n\n### Choosing the Right Type of Animation\n\nWith various types of animations available, such as transitions, micro-interactions, loading animations, and more, it's important to select the type that best suits your objectives and aligns with the user experience. It's key to choose animations that seamlessly fit into the [website's flow](https://www.vev.design/blog/web-animation-tools/) without detracting from the content.\n\n### Creating a Design Plan\n\nDeveloping a design plan that outlines the animations' appearance, timing, and behavior is essential in the design process. Creating wireframes or storyboards helps visualize the animations' appearance and function within the website's overall design.\n\n### Utilizing Animation Tools\n\nTools like [MagicUI](https://magicui.design/) offer a range of animated components and design elements that can streamline the animation design process. These tools simplify the creation and integration of animations by providing pre-built, customizable components that align with design goals.\n\n### Considering Performance\n\nIt's essential to ensure that animations do not negatively impact website performance. Optimizing animations for smooth rendering and efficiency while avoiding overly heavy or excessive animations that may slow down the site, is crucial.\n\n### Testing for Usability\n\nTesting animations with real users helps enhance the user experience without causing confusion or frustration. Collecting feedback and making adjustments based on user input can significantly improve the effectiveness of the animations.\n\n### Ensuring Accessibility\n\nDesigning animations with accessibility in mind ensures that they do not impede the site's usability for users with disabilities. Providing options to reduce or disable animations when necessary enhances the user experience for all visitors.\n\n### Incorporating Branding\n\nAligning animations with the brand's identity helps create a cohesive visual experience for visitors. Using animations that reflect the brand's style and tone while complementing other design elements on the site reinforces the brand's image.\n\n### Iterating and Refining\n\nContinuously refining animations based on user feedback and performance metrics helps keep them relevant and effective. Regularly updating and improving animations ensures they remain engaging and enhance the overall user experience on the website.\n\n## What Are the Essential Steps to Implement Animations on Your Website?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/rkho5i5uh2.jpg)\n\n### Plan Your Animation Strategy\n\nDevelop a clear strategy for incorporating animations into your website. Identify the goals, types of animations, and their placement within the site to ensure they align with your:\n\n- Overall design\n- User experience objectives\n\nPlanning your animation strategy can establish a cohesive approach that enhances your website's:\n\n- Visual appeal\n- User engagement\n\n### Select the Right Tools\n\nChoose appropriate tools and libraries for creating and implementing animations. Tools like [MagicUI](https://pro.magicui.design/docs/templates/startup) offer a range of animated components that can be easily integrated into your website. By selecting the right tools for your animation needs, you can streamline the development process and create animations that align with your design vision.\n\n### Design Animations\n\nCreate detailed designs for your animations, including timing, behavior, and visual style. Use design tools and prototypes to visualize how the animations will appear and function on the site. By designing detailed animations, you can ensure that they enhance your website's:\n\n- Aesthetic appeal\n- User experience\n\n### Implement Animations\n\nIntegrate the animations into your website using HTML, CSS, and JavaScript. Ensure the animations are implemented correctly and function as intended across different devices and browsers. By implementing animations effectively, you can create a seamless user experience that captivates visitors and encourages them to explore your site further.\n\n### Optimize Performance\n\nOptimize animations for performance by minimizing their impact on page load times and overall site speed. Use techniques like lazy loading and CSS animations to enhance performance. By optimizing animation performance, you can create a smooth browsing experience that keeps visitors engaged and encourages them to return to your site.\n\n### Test Across Devices\n\n[Test animations](https://www.linkedin.com/advice/0/how-do-you-test-web-animations-across-different-platforms) across various devices and screen sizes to ensure they work consistently and look good on different platforms. Address any issues related to responsiveness and compatibility. By testing animations across devices, you can ensure that your website provides a consistent and engaging experience for all visitors, regardless of their device.\n\n### Ensure Accessibility\n\nEnsure that animations are accessible to all users, including those with disabilities. Provide options to control or disable animations if needed and ensure that they do not hinder usability. By ensuring accessibility, you can create an inclusive and user-friendly website for all visitors.\n\n### Gather User Feedback\n\nCollect feedback from users regarding their experience with the animations. Use surveys, usability testing, and analytics to understand how animations affect user behavior and satisfaction. By gathering user feedback, you can gain valuable insights into how animations are perceived and make necessary adjustments to improve their effectiveness.\n\n### Iterate and Improve\n\nContinuously refine and improve animations based on user feedback and performance data. Adjust to enhance their effectiveness and align with the following:\n\n- Evolving design trends\n- User expectations\n\nBy iterating and improving animations, you can create a dynamic website that stays current and resonates with your target audience.\n\n### Monitor Performance\n\nMonitor your website and animations regularly. Use [analytics tools](https://www.hypergene.com/resources/blog/analytics-tools-what-how-and-why/) to track metrics such as load times, user engagement, and conversion rates to assess the impact of animations. By monitoring performance, you can identify areas for improvement and make informed decisions to enhance your website's overall effectiveness.\n\n### Update and Maintain\n\nKeep animations up to date with changes in design trends and technology. Review and update animations regularly to ensure they remain relevant and effective. Updating and maintaining animations ensures that your website continues to captivate visitors and deliver an exceptional user experience.\n\n### Document and Share\n\nDocument your animation implementation process and share best practices with your team. Creating documentation helps maintain consistency and provides a reference for future projects. By documenting and sharing your animation implementation process, you can streamline development efforts and ensure that animations are implemented effectively.\n\n## How Can You Optimize Your Animated Website for Performance and Usability?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/p7eiqwiw3f.jpg)\n\n### Use Efficient Animation Techniques\n\nChoose lightweight animation techniques, such as [CSS or SVG animations](https://css-tricks.com/animating-svg-css/), that have minimal impact on performance. Avoid using heavy JavaScript libraries or complex animations that can slow down the site.\n\n### Optimize Assets\n\nCompress and optimize images and video assets used in animations. Ensure media files are in appropriate formats and resolutions to reduce load times and improve performance.\n\n### Leverage Hardware Acceleration\n\nUse hardware acceleration to offload animation processing to the GPU, which can:\n\n- Improve rendering performance\n- Reduce CPU load\n\n### Minimize Repaints and Reflows\n\nUsing techniques like transforming properties instead of changing layout properties can reduce the number of repaints and reflows. This helps minimize performance bottlenecks during animations.\n\n### Implement Lazy Loading\n\nUse lazy loading for animations that are not immediately visible on the page. This technique delays animations loading until they are in the viewport, improving initial page load times.\n\n### Optimize JavaScript Performance\n\nOptimize [JavaScript code](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript) that handles animations. Avoid blocking the main thread and use requestAnimationFrame for smooth and efficient animations.\n\n### Test on Multiple Devices\n\nTest animations on various devices and screen sizes to ensure they perform well across different platforms. Address any issues related to performance or usability on specific devices.\n\n### Provide Accessibility Options\n\nOffer options to reduce or turn off animations for users with accessibility needs. This ensures that animations do not interfere with the site's usability for users with disabilities.\n\n### Monitor Performance Metrics\n\nUse performance monitoring tools to track metrics such as:\n\n- Load times\n- Frame rates\n- User interactions\n\nAnalyze the data to identify and address performance issues related to animations.\n\n### Optimize CSS and JavaScript\n\nMinimize and combine CSS and JavaScript files used for animations. Minification and bundling techniques reduce file sizes and improve load times.\n\n### Magic UI’s Core Components\n\nMagicUI is a free and [open-source UI library](https://pro.magicui.design/docs/templates/startup) that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n#### Customization Options\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n#### Design Philosophy\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n#### Developer Experience\n\nWith our focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n#### Premium Offering\n\nAlong with our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save you thousands of hours, create a beautiful landing page, and convert your visitors into customers with our website templates. Use our startup landing page template today.\n\n## What Are Some Common Challenges in Creating Animated Websites, and How Can You Overcome Them?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/azvh6iprke.jpg)\n\n### Performance Issues\n\nAnimations can impact website performance, leading to slow load times and reduced user experience. To overcome this, use:\n\n- Efficient animation techniques\n- Optimize assets\n- Leverage hardware acceleration to improve performance\n\nThis ensures that the animations on your website don't hinder the user experience but enhance it instead.\n\n### Cross-Browser Compatibility\n\nAnimations may not work consistently across different browsers and devices. To tackle this challenge, test animations on multiple browsers and platforms to ensure compatibility and address rendering-related issues. Ensuring your animations work seamlessly across various browsers will create a positive user experience.\n\n### Accessibility Concerns\n\nNot all users can effectively interact with or view animations. Provide options to reduce or turn off animations for users with disabilities and ensure that animations do not hinder usability. By being considerate of users with disabilities, you can create an inclusive website that caters to a broader audience.\n\n### Overuse of Animations\n\nExcessive use of animations can lead to a cluttered and distracting user experience. Use animations sparingly and purposefully to enhance the user experience without overwhelming users. You can create a visually appealing website without overwhelming your visitors by striking the right balance with animations.\n\n### Complexity of Implementation\n\nImplementing complex animations can be challenging and may require advanced coding skills. Animation libraries and tools like [MagicUI](https://magicui.design/) can simplify the implementation process and reduce development time. By leveraging such tools, you can incorporate complex animations into your website without spending excessive time on development.\n\n### Device Performance Variability\n\nDifferent devices have varying performance capabilities, which can affect animation smoothness. Optimize animations for performance and test them on various devices to ensure consistent quality. By optimizing animations for various devices, you guarantee a smooth and consistent experience for all users.\n\n### User Distraction\n\nToo flashy or distracting animations can detract from the content and user experience. Ensure that animations enhance, rather than detract from, the content and overall user experience. Integrating animations seamlessly into your website can enhance the overall user experience without causing distractions.\n\n### Load Times\n\nLarge or poorly optimized animations can increase [page load times](https://www.searchenginejournal.com/website-bounce-rate/332439/). Optimize animations and use lazy loading techniques to improve:\n\n- Initial load times\n- Overall performance\n\nBy optimizing your animations, you can enhance your website's performance and ensure quick load times for visitors.\n\n### Integration Issues\n\nIntegrating animations with other website elements can be challenging, especially when dealing with complex interactions.\n\nEnsure proper integration and test animations in various scenarios to avoid conflicts. By testing animations thoroughly, you can identify and resolve any integration issues, ensuring a seamless experience for users.\n\n### Consistency Across Platforms\n\nMaintaining consistent animation behavior across different platforms and devices can be difficult. Test animations thoroughly and make adjustments to ensure a consistent experience. By ensuring that your animations work consistently across various platforms, you can provide a seamless user experience across all devices.\n\n## How Can You Make the Most of Animation Tools and Libraries?\n\n![How To Make An Animated Website](https://cdn.magicui.design/assets/12ykq1py7n7.jpg)\n\n### Performance Issues\n\n[Animations can impact website performance](https://blog.daisie.com/maximizing-animation-software-strengths-limitations/), leading to slow load times and reduced user experience. To overcome this, use efficient animation techniques, optimize assets, and leverage hardware acceleration to improve performance.\n\n### Cross-Browser Compatibility\n\nAnimations may not work consistently across different browsers and devices—test animations on multiple browsers and platforms to ensure compatibility and address any rendering-related issues.\n\n### Accessibility Concerns\n\nNot all users can interact with or view animations effectively. Provide options to reduce or disable animations for users with disabilities and ensure that animations do not hinder usability.\n\n### Overuse of Animations\n\nExcessive use of animations can lead to a cluttered and distracting user experience. Use animations sparingly and purposefully to enhance the user experience without overwhelming users.\n\n### Complexity of Implementation\n\nImplementing complex animations can be challenging and may require advanced coding skills. Animation libraries and tools like [MagicUI](https://pro.magicui.design/docs/templates/startup) can simplify the implementation process and reduce development time.\n\n### Device Performance Variability\n\nDifferent devices have varying performance capabilities, which can affect animation smoothness. Optimize animations for performance and test them on various devices to ensure consistent quality.\n\n### User Distraction\n\nToo flashy or distracting animations can detract from the content and user experience. Ensure that animations enhance, rather than detract from, the content and overall user experience.\n\n### Load Times\n\nLarge or poorly optimized animations can increase page load times. Optimize animations and use lazy loading techniques to improve initial load times and overall performance.\n\n### Integration Issues\n\nIntegrating animations with other website elements can be challenging, especially when dealing with complex interactions. [Ensure proper integration](https://digit-sense.com/our-insights/detail/blog/animation-in-enhancing-user-experience) and test animations in various scenarios to avoid conflicts.\n\n### Consistency Across Platforms\n\nMaintaining consistent animation behavior across different platforms and devices can be difficult. Test animations thoroughly and make adjustments to ensure a consistent experience.\n\n### Statistic\n\nAccording to a report by Google, websites with well-implemented animations experience a 25% increase in user engagement and a 15% reduction in bounce rates compared to sites without animations.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers to create captivating digital experiences easily.\n\nWith over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion, MagicUI offers a collection of visually appealing and interactive elements that can be seamlessly integrated into web applications.\n\n### Customizable Elements\n\nThese highly customizable components enable easy adaptation to match desired branding and design requirements, empowering users to craft stunning user interfaces with minimal effort.\n\n### MagicUI Pro: Elevating Your Website to the Next Level\n\nMagicUI Pro takes your website design to the next level, enabling users to save thousands of hours and create a beautiful landing page. Using [MagicUI Pro's website templates](https://pro.magicui.design/docs/templates/startup), users can easily convert visitors into customers.\n\n### Pro Features\n\nThe Pro version offers many tools and resources to enhance the user experience and improve conversion rates. [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) is valuable for those looking to elevate their websites and create a lasting impression on their audience.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/how-to-make-an-interactive-website.mdx",
    "content": "---\ntitle: \"11 Best Tips on How To Make An Interactive Website\"\ndescription: \"Learn 11 essential tips on how to make an interactive website that keeps visitors engaged and coming back for more.\"\nimage: https://cdn.magicui.design/assets/0daedcf9-53c6-41bd-bd58-4177d5e2e558.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nInteractive websites are like chatty friends. Instead of just sitting there and waiting for you to figure them out, they engage you in conversation to help you find what you need. This is the magic of an interactive web design: it draws visitors in, keeps their attention, and helps them get exactly what they want. It's no wonder that interactive web design is one of the best [web design practices](https://magicui.design/blog/web-design-best-practices); it improves user experience and boosts SEO and conversion rates. Learning how to make an interactive website is a great place to start if you want to increase your website's performance.\n\nIn this guide, we'll share the top tips for creating an engaging and interactive website that will captivate your visitors and keep them returning for more. Magic UI's options trading room can help you achieve your goals by providing a fully interactive template you can customize for your business. With this simple template, you can easily create a beautiful, interactive website to engage your visitors and boost your business.\n\n## What is an Interactive Website?\n\n![How To Make An Interactive Website](https://cdn.magicui.design/assets/jgrd3dhrhmm.jpg)\n\nIn today's digital environment, where information is readily available at a user's fingertips, simply presenting content is no longer sufficient to captivate and retain audience attention. An interactive website transcends the traditional model of one-way communication, inviting users to actively participate and engage with the platform. It is a dynamic digital space that encourages exploration, interaction, and a sense of ownership.\n\nnteractive websites create a more immersive and engaging user journey by incorporating quizzes, polls, games, animations, personalized experiences, and real-time feedback mechanisms. This departure from static content fosters a deeper connection between the website and its visitors, ultimately increasing satisfaction and loyalty.\n\n### Benefits of Interactive Websites \n\n[Implementing interactive elements](https://optasy.com/blog/benefits-interactive-websites-and-how-create-them) on a website has many advantages and can significantly impact a business's online success.\n\n#### Increased User Engagement \n\nInteractive websites have the power to transform passive consumers into active participants. By incorporating elements that encourage user involvement, businesses can extend website visits, reduce bounce rates, and foster a sense of community among visitors. Studies have shown that interactive content can boost engagement by a staggering 600% (Source: Crazy Egg), highlighting the potential to captivate and retain audience attention.\n\n#### Improved Brand Recall \n\nStanding out and creating a memorable brand experience is crucial in the crowded digital marketplace. Interactive websites offer a unique opportunity to leave a lasting impression on visitors. Through engaging experiences, businesses can strengthen brand recognition, increase brand awareness, and cultivate a loyal customer base.\n\n#### Enhanced User Experience (UX) \n\nInteractive elements play a pivotal role in [enhancing the overall user experience](https://www.productplan.com/glossary/user-experience/#:~:text=The%20User%20Experience%20includes%20everything,and%20the%20steps%20before%20and). Businesses can create a more enjoyable and satisfying browsing experience by making websites more dynamic and visually appealing. Interactive features can also simplify navigation, making it easier for users to find the necessary information. A positive user experience is essential for building trust and loyalty.\n\n#### Boosted Conversions \n\nMany websites' ultimate goal is to drive conversions, whether users make a purchase, sign up for a newsletter, or fill out a contact form. Interactive elements can significantly influence user behavior and increase the likelihood of desired actions. Businesses can improve conversion rates by guiding users through the conversion funnel with engaging experiences.\n\nBy understanding the potential benefits of interactive websites, businesses can make informed decisions about incorporating these elements into their online strategy.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Why Your Website Should Be Interactive\n\n![How To Make An Interactive Website](https://cdn.magicui.design/assets/k07srflojlg.jpg)\n\n[A website should be interactive](https://www.slideshare.net/slideshow/driving-revenue-with-interactive-content/113090546#10). With their one-way communication, static websites need to be equipped to compete in this environment. Interactive elements are the antidote to this problem. They transform passive consumption into active engagement, turning visitors into participants. By involving users, you increase their time on-site and deepen your connection with them.\n\n### The Power of Interaction \n\n#### Enhanced User Experience (UX) \n\n- Intuitive Navigation: Interactive elements like clickable menus, progress bars, and tooltips guide users seamlessly through your website, reducing frustration.\n- Visual Appeal: Animations, parallax scrolling, and hover effects add depth and dynamism, creating a visually engaging experience.\n- Personalized Journeys: Interactive elements can tailor the user experience based on preferences, behavior, or demographics, making visitors feel valued.\n\n#### Increased User Engagement \n\n- Interactive Content: Quizzes, polls, and surveys encourage active participation, extending average visit duration and increasing page views.\n- Gamification: Incorporate game-like elements such as points, badges, or leaderboards to create a fun and rewarding experience.\n- User-Generated Content: Platforms for reviews, comments, or user-submitted content foster community and engagement.\n- Example: Sephora's virtual try-on tool allows users to experiment with different makeup products, significantly boosting engagement and sales.\n\n#### Improved Brand Recall \n\n- Storytelling: Interactive narratives immerse users in your brand story, creating a lasting emotional connection.\n- Memorable Experiences: Interactive elements that evoke emotions or surprise are more likely to be remembered.\n- Brand Personality: Infuse your brand personality into interactive elements to reinforce your brand image.\n- Example: Nike's customizable shoe design tool allows users to create unique products, strengthening brand loyalty.\n\n#### Boosted Conversions \n\n- Clear Calls to Action (CTAs): Interactive CTAs, such as animated buttons or progress bars, drive conversions.\n- Personalized Recommendations: Recommend products or services based on user behavior, increasing the likelihood of purchase.\n- Interactive Demos: Showcasing product features through interactive demos can significantly boost sales.\n- Example: Amazon's product recommendations based on purchase history and browsing behavior increase sales by up to 35%.\n\n#### Valuable Insights \n\n- User Behavior Analysis: Track user interactions to understand preferences, pain points, and conversion funnels.\n- Data-Driven Decisions: Use insights to optimize website content, marketing campaigns, and product offerings.\n- Customer Feedback: Gather valuable feedback through interactive surveys and polls.\n\n#### Competitive Advantage \n\n- Differentiation: Interactive elements set your website apart from competitors, making it more memorable.\n- Innovation: By embracing interactive trends, you position your brand as forward-thinking and innovative.\n- Customer Satisfaction: Superior user experiences lead to increased customer satisfaction and loyalty.\n\nThe numbers speak for themselves: [According to Rock’s survey](https://rockcontent.com/blog/what-is-interactive-content/#:~:text=According%20to%20Rock%E2%80%99s%20survey%2C%2060%25%20of%20organizations%20that%20use%20interactive%20content%20can%20better%20measure%20their%20efficiency%2C%20compared%20to%20only%2025%25%20among%20those%20that%20use%20static%20content.), 60% of organizations using interactive content can better measure their efficiency, compared to only 25% of those using static content.\n\n## How to Set Clear Goals for Your Interactive Website\n\n![How To Make An Interactive Website](https://cdn.magicui.design/assets/t0l6xer6wdp.jpg)\n\n### Define Your Site’s Purpose \n\n[A well-defined goal](https://www.linkedin.com/pulse/setting-clear-project-objectives-step-by-step-guide-beginners-t14pf) is the cornerstone of any successful project. Before diving into the world of interactive website design, it’s crucial to establish clear, measurable objectives. These goals will serve as your compass, guiding every decision from content creation to interactive element selection.\n\nThe first step is to crystallize the core function of your website. What do you want it to achieve? Are you aiming to:\n\n- Generate leads for your sales team.\n- Boost sales of products or services?\n- Enhance brand awareness and reputation?\n- Educate your audience about your industry or offerings.\n- Provide customer support and resources.\n\nEach of these objectives will influence the type of interactive elements you incorporate and the metrics you track.\n\n### Identify Your Target Audience  \n\nUnderstanding your ideal customer is paramount. Create detailed user personas that outline their demographics, behaviors, preferences, and pain points. This information will help you tailor your interactive experiences to resonate with your audience.\n\n- Who are you trying to reach?\n- What are their needs and desires?\n- How do they consume information?\n- What platforms do they use?\n\n### Set SMART Goals  \n\nOnce you have a clear picture of your website’s purpose and audience, it’s time to set specific, measurable, achievable, relevant, and time-bound [(SMART) goals](https://www.atlassian.com/blog/productivity/how-to-write-smart-goals#:~:text=What%20are%20SMART%20goals%3F,within%20a%20certain%20time%20frame.).\n\n#### Specific\n\nClearly define what you want to achieve.\n\n- Example: Increase lead generation by 20% through interactive forms.\n\n#### Measurable\n\nDetermine how you will track progress.\n\n- Example: Track the number of form submissions and conversion rates.\n\n#### Achievable\n\nSet realistic goals based on your resources and industry benchmarks.\n\n- Example: Increase average time on site by 30 seconds through interactive content.\n\n#### Relevant\n\nEnsure goals align with your overall business objectives.\n\n- Example: Boost social media engagement to increase brand visibility.\n\n#### Time-bound\n\nEstablish a deadline for achieving your goals.\n\n- Example: Improve website bounce rate by 15% within the next quarter.\n\n### Key Performance Indicators (KPIs) to Track  \n\nChoose metrics that align with your goals. Some common KPIs for interactive websites include:\n\n#### Website Traffic\n\nMeasure the number of visitors to your site.\n\n#### Bounce rate\n\nDetermine the percentage of visitors who leave after viewing one page.\n\n#### Time on site\n\nCalculate the average duration of user visits.\n\n#### Conversion rate\n\nMeasure the percentage of visitors who complete a desired action (e.g., purchase, sign-up).\n\n#### Engagement rate\n\nTrack interactions with interactive elements (e.g., clicks, plays, shares).\n\n#### Social media shares\n\nMonitor how often content is shared on social platforms.\n\nYou can create an interactive website that delivers exceptional results by carefully crafting your goals and selecting the right KPIs.\n\n#### Goal Setting for E-commerce Businesses  \n\nFor e-commerce websites, the primary objective is typically to drive sales.\n\n- Focus on conversions: Set goals to increase purchase completion rates, average order value (AOV), and customer lifetime value (CLTV).\n- Leverage interactive elements: Use product configurators, virtual try-ons, and personalized recommendations to enhance the shopping experience and drive conversions.\n- Prioritize user experience: Aim to reduce cart abandonment rates through interactive checkout processes and clear product information.\n\n#### Goal Setting for Lead Generation Businesses  \n\nLead generation websites capture potential customers’ information for future sales or marketing efforts.\n\n- Increase lead volume: Set goals for the number of leads generated through forms, contact requests, or downloads.\n- Improve lead quality: Focus on capturing detailed information about leads to qualify them effectively.\n- Nurture leads: Implement interactive content (e.g., webinars, ebooks) to engage leads and move them through the sales funnel.\n\n#### Goal Setting for Content-Focused Websites  \n\nContent-focused websites aim to inform, entertain, or educate their audience.\n\n- Build audience: Increase website traffic, social media followers, and email subscribers.\n- Enhance engagement: Measure metrics like time on site, page views, and bounce rate to assess content effectiveness.\n- Generate leads: Incorporate interactive elements (e.g., quizzes, polls) to capture leads from engaged visitors.\n\n#### Goal Setting for Service-Based Businesses  \n\nService-based businesses often aim to generate inquiries or book appointments.\n\n- Increase inquiries: Set goals for the number of contact forms, phone calls, or email inquiries.\n- Book more appointments: Track the number of appointments booked online or through the website.\n- Showcase expertise: Use interactive elements (e.g., case studies and client testimonials) to build credibility and trust.\n\n#### Goal Setting for Non-profit Organizations  \n\nNon-profit websites aim to raise awareness, generate donations, and recruit volunteers.\n\n- Increase donations: Set fundraising goals and track online donation conversions.\n- Expand reach: Measure website traffic, social media engagement, and email subscribers.\n- Engage supporters: Use interactive elements (e.g., volunteer sign-ups and donation matching tools) to foster community involvement.\n\n### Remember  \n\n#### Set SMART goals\n\nEnsure your goals are Specific, Measurable, Achievable, Relevant, and Time-bound.\n\n#### Track progress regularly\n\nMonitor your KPIs to assess performance and make adjustments as needed.\n\n#### Align goals with business objectives\n\nEnsure your website goals contribute to your overall business strategy.\n\nBy following these guidelines and tailoring your goals to your specific business, you can create an interactive website that delivers exceptional results.\n\n### Meet the UI Library That Can Help You Make Your Website More Interactive\n\n[MagicUI is a free](https://pro.magicui.design/docs/templates/startup) and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, [with MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## Build a Content Strategy For Your Target Audience\n\n![How To Make An Interactive Website](https://cdn.magicui.design/assets/t3eyl6vbrmg.jpg)\n\n### Know Your Target Audience To Build Interactive Website Content They Want\n\n[Understanding your target audience](https://www.lpcentre.com/articles/understanding-your-target-audience-the-first-step-in-successful-marketing) is crucial for creating compelling interactive experiences. By identifying your ideal customers' demographics, interests, preferences, and behaviors, you can tailor your interactive elements to resonate with their needs and desires.\n\nCritical considerations for understanding your target audience include:\n\n#### Demographics\n\nAge, gender, location, income level, education, and occupation can influence user preferences and expectations.\n\n#### Interests\n\nWhat topics, hobbies, or activities interest your target audience?\n\n#### Behaviors\n\nHow do they interact with websites? What devices do they use? What is their online behavior?\n\n#### Goals and Needs\n\nWhat are their primary motivations for visiting your website? What problems are they trying to solve?\n\n#### Challenges and Pain Points: What obstacles do they face? What frustrations do they experience? \n\nBy conducting thorough audience research, you can create interactive experiences that are relevant, engaging, and valuable to your target audience.\n\n### Crafting a Content Strategy for Interactive Website Success\n\n[A well-crafted content strategy](https://kathrynaragon.com/blog/content-marketing-strategy/#:~:text=A%20well%2Dcrafted%20content%20strategy,drive%20more%20growth%20and%20success.) is the backbone of an engaging, interactive website. It involves planning, creating, and distributing valuable content that resonates with your target audience and supports your business goals.\n\nCritical elements of a successful content strategy include:\n\n#### Content Types\n\nDetermine the most suitable content formats for your audience and objectives. This may include blog posts, articles, videos, infographics, interactive tools, quizzes, and downloadable resources.\n\n#### Content Calendar\n\nDevelop a content calendar to plan and schedule content creation and distribution. This will help maintain consistency and ensure a steady stream of fresh content.\n\n#### Content Promotion\n\nImplement a strategic content promotion plan to reach your target audience. Utilize social media, email marketing, SEO, and other channels to amplify your content's reach.\n\n#### Content Optimization\n\nOptimize your content for search engines to improve visibility and attract organic traffic. Use relevant keywords, meta descriptions, and header tags.\n\n#### Content Analysis\n\nTrack the performance of your content using analytics tools to measure engagement, conversions, and other vital metrics. Use this data to refine your content strategy.\n\nCreating high-quality, relevant, and engaging content can attract and retain visitors, build trust, and establish your website as a valuable resource.\n\n## Prioritizing User Experience (UX)\n\n[User experience](https://www.productplan.com/glossary/user-experience/#:~:text=Definition%3A%20User%20Experience%20refers%20to,the%20content%20displayed%20is%20etc.) is critical for interactive websites. Every website has a goal: increasing sales, generating leads, or building a subscriber list. Improving user experience helps achieve that objective.\n\n## 11 Best Tips on How to Make an Interactive Website\n\n![How To Make An Interactive Website](https://cdn.magicui.design/assets/rntc0b5kyb.jpg)\n\n### 1\\. Incorporate Animations to Elevate User Experience\n\n[Strategic use of animations](https://namtheartist95.medium.com/the-benefits-of-using-animation-in-web-design-2d11a5503484#:~:text=Utilizing%20animations%20to%20highlight%20key,communicate%20complex%20information%20or%20concepts.) can significantly enhance the user experience by guiding attention to essential elements or calls to action, providing visual feedback to confirm user actions or indicate progress, adding visual interest to create a more dynamic and engaging atmosphere, and enhancing brand identity by reflecting your brand's personality through motion and style.\n\n### 2\\. Leverage micro-interactions for Interactive Websites\n\nMicrointeractions are small, focused interactions that provide immediate feedback to user actions. These subtle details can significantly improve user satisfaction by creating delight by surprising and delighting users with unexpected interactions, providing clarity by offering instant visual cues about the outcome of an action, building trust by reinforcing the reliability and responsiveness of your website and enhancing engagement by encouraging users to explore and interact with your content.\n\n### 3\\. Integrate Interactive Content for Engagement\n\nInteractive content goes beyond passive consumption, inviting users to participate and engage. By incorporating elements like quizzes, polls, calculators, and games, you can increase user engagement by encouraging active participation and prolonging website visits; gather valuable data to collect user insights and preferences through interactive elements; create a sense of community to foster interaction and sharing among users; and enhance lead generation by using interactive content to capture user information.\n\n### 4\\. Utilize Visual Storytelling\n\nInteractive elements can be powerful tools for storytelling. By combining visuals, animations, and user interactions, you can create immersive experiences to transport users into a story and evoke emotions; enhance brand messaging to communicate your brand's values and story compellingly; increase engagement by capturing and maintaining user interest through a narrative-driven experience; and improve information retention to make complex information more accessible to understand and remember.\n\n### 5\\. Personalize the Experience for Users\n\nTailoring content and recommendations based on user behavior and preferences can significantly enhance user satisfaction and engagement. By personalizing the experience, you can increase relevance by delivering content that is directly relevant to the user's interests, improve conversion rates by offering personalized product recommendations or offers, build stronger relationships to create a sense of connection with your audience, and optimize marketing efforts to target specific user segments with tailored messages.\n\n### 6\\. Encourage User-Generated Content (UGC)\n\nUGC can be a valuable asset for your website, as it provides authentic content and fosters a sense of community. By enabling users to contribute content, you can build trust by demonstrating social proof and credibility, increase website engagement to encourage user interaction and sharing, generate fresh content to update your website with user-created content continuously and improve SEO to increase your website's visibility through user-generated keywords.\n\n### 7\\. Optimize for Mobile Devices\n\nWith the increasing use of smartphones, ensuring your interactive elements function seamlessly on mobile devices is essential. By optimizing for mobile, you can enhance user experience by providing a consistent and enjoyable experience across all devices, increase mobile conversions to capture mobile users and convert them into customers, and improve search engine rankings since mobile-friendliness is a ranking factor for search engines.\n\n### 8\\. Prioritize Accessibility for Diverse Audiences\n\nMaking your website [accessible to people with disabilities](https://www.shrm.org/topics-tools/employment-law-compliance/accessible-websites-disabilities) is ethical and essential for reaching a wider audience. By following accessibility guidelines, you can expand your audience to include users with disabilities in your target market, improve user experience to create a website usable by everyone and comply with regulations to adhere to legal requirements for website accessibility.\n\n### 9\\. Test Thoroughly for Website Interactivity\n\nRigorous testing is crucial to identify and address any issues with your interactive elements. By conducting usability tests, you can improve user experience by identifying and fixing usability problems, enhancing performance to optimize the performance of your interactive features, and reducing errors to minimize technical glitches and bugs.\n\n### 10\\. Analyze User Behavior for Interaction Insights\n\nTracking user interactions with your interactive elements provides valuable user behavior and preferences insights. By analyzing this data, you can optimize content to tailor it to match user interests, improve user experience by identifying areas for improvement based on user feedback, and measure ROI to evaluate the effectiveness of your interactive elements.\n\n### 11.  Maintain Consistency for Cohesive Designs\n\nConsistency is critical to creating a cohesive and professional website. Ensure your interactive elements align with your overall brand identity and website design by using consistent visual styles to maintain a consistent look and feel throughout your website; following brand guidelines to adhere to your brand's color palette, typography, and messaging; and providing a seamless user experience to create a cohesive and intuitive user journey.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI is a free](https://pro.magicui.design/docs/templates/startup) and open-source UI library specifically designed for engineers. It features over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. You can easily integrate these elements into web applications with minimal effort to create stunning user interfaces.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), so you can adapt them to match your branding and design requirements. With our focus on animation, visually appealing MagicUI aims to bridge the gap between design and development, empowering you to craft captivating digital experiences.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/how-to-make-backgrounds-for-animation.mdx",
    "content": "---\ntitle: \"How to Make Backgrounds for Animation: Complete Step-by-Step Guide\"\ndescription: >-\n  Learn how to make backgrounds for animation with our easy-to-follow guide.\n  Discover tips and techniques to create stunning animated backgrounds.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-9de4a38c-cd9a-4c60-98af-2f047f8b9622.jpg\nauthor: Dillion Verma\ntags:\n  - how to make backgrounds for animation\n  - animation backgrounds\n  - background art\n  - digital painting for animation\n  - animation workflow\npublishedOn: \"2025-09-26\"\nfeatured: true\n---\n\nLearning how to create backgrounds for animation is so much more than just filling in the space behind your characters; it's about building an entire world from scratch. The real craft is in mixing classic art principles like _composition and color theory_ with the technical know-how of digital software to create environments that genuinely **tell a story**.\n\n## The Unsung Hero: An Animation Background's True Role\n\nThink of a great background as the unsung hero of any animated scene. It sets the mood, gives the audience context for what’s happening, and subtly tells them where to look—all without stealing the spotlight. It's what turns a simple character movement into a real moment inside a living, breathing world.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0707fee1-2083-4d6b-82a9-fac7e8c57141.jpg)\n\nThis foundational piece of visual storytelling has come a long way. The leap from hand-painted cells to fully digital creation has completely changed how we work. In fact, digital workflows shortened animation production cycles by a massive **30-50%** between the late 90s and the 2010s.\n\nToday, you'll find that over **75%** of big-budget animations rely on digitally created backgrounds. It's a clear sign that the industry has embraced the efficiency and complexity digital tools offer. You can get a better sense of this shift by checking out the latest animation industry statistics and seeing how technology continues to shape production.\n\n### Building a Visual World Straight from the Script\n\nYour very first clues for designing a background are waiting for you in the script. A solid script or storyboard is usually packed with little details that will guide your artistic choices. Your job is to be a detective and translate those words and rough sketches into a believable place.\n\nTo get it right, you need to pull out the key info:\n\n- **Time and Place:** Is this a futuristic city at midnight or a sleepy countryside at dawn? The answer dictates your lighting, architecture, and the entire color palette.\n- **Emotional Tone:** A tense, dramatic scene might need sharp angles, stark contrast, and a cool color scheme. A goofy, lighthearted moment, on the other hand, would feel right at home with soft, rounded shapes and warm, bright colors.\n- **Character Interaction:** Pay close attention to where the characters will move and what objects they'll interact with. Those \"hero props\" have to be clearly defined and perfectly placed to support the action.\n\n### Guiding the Viewer's Eye Without Them Noticing\n\nComposition is easily your most powerful tool for controlling what the audience focuses on. By using some fundamental principles, you can create backgrounds that are both gorgeous and functional. For instance, using leading lines—like a winding road, a fence, or a row of trees—can physically draw the viewer's gaze right to a character or a key action.\n\n> A background should support the narrative, not compete with it. The best environments feel authentic and immersive, allowing the viewer to get lost in the story without being distracted by unnecessary visual noise.\n\nThis is a principle I come back to on every project. A background that's too cluttered or overly detailed will pull focus away from the characters and muddy the story you're trying to tell. A great technique to avoid this is using atmospheric perspective—making things in the distance lighter and less detailed. It creates a natural sense of depth and, more importantly, keeps the focus right where you want it. Once you nail these fundamentals, you’re not just painting a picture; you’re setting the stage for a truly compelling animation.\n\n## Choosing Your Digital Art Toolkit\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/bsmgbh58nNw\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nAlright, let's talk tools. Picking the right software is the very first fork in the road when you're figuring out how to make backgrounds for animation. This decision will ripple through your entire process, shaping your workflow, the styles you can pull off, and how quickly you can get from a blank canvas to a finished scene. It's less about which program has the longest feature list and more about finding one that just _clicks_ for you.\n\nFor years, the undisputed king of the castle in many professional studios has been [**Adobe Photoshop**](https://www.adobe.com/products/photoshop.html). Its painting engine is incredibly powerful and versatile. If you're aiming for a highly detailed, painterly look, the brush customization is simply on another level. For complex textures and photorealistic effects, Photoshop's massive library of tools and filters gives you ultimate control.\n\nBut it's not the only game in town. For artists who live and breathe line art and perspective, [**Clip Studio Paint**](https://www.clipstudio.net/en/) is an absolute gem. Its perspective rulers are a game-changer, and the ability to integrate 3D models can shave hours off creating complex architectural scenes. Honestly, a lot of illustrators just prefer the feel of drawing in Clip Studio—it feels a bit closer to traditional media.\n\n### Key Software Considerations\n\nThe \"best\" software really comes down to your personal needs, style, and budget. Before you commit, think about what truly matters for the kind of work you want to do.\n\n- **Workflow Integration:** Can it easily export layered files (like PSDs) that the animators downstream can actually use without a headache?\n- **Artistic Style:** Does the brush engine feel right for the painterly, cel-shaded, or line-art style you're going for?\n- **Hardware:** Are you chained to a desktop with a graphics tablet, or do you need the freedom of an iPad?\n\nSpeaking of portability, [**Procreate**](https://procreate.com/) has become a titan for artists on the go. Its touch-based interface is so intuitive you can just pick it up and start painting, but don't let that fool you—it’s more than powerful enough for professional-quality work. It might not have every single bell and whistle of its desktop cousins, but its speed and sheer ease of use are huge wins for concepting and painting.\n\nAs you weigh these options, you might also find our guide on other [web animation tools](https://magicui.design/blog/web-animation-tools) useful for getting a wider look at the modern digital toolkit.\n\n### Comparing Popular Background Creation Software\n\nTo help you decide, let's break down the main players. Each has its own strengths, so the best choice depends on what you value most in your workflow.\n\n| Software                                                             | Best For                                                      | Key Features                                                               | Price Model       |\n| -------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------- | ----------------- |\n| [**Adobe Photoshop**](https://www.adobe.com/products/photoshop.html) | Painterly styles, photo-bashing, and complex texturing        | Unmatched brush engine, extensive filters, industry-standard PSD format    | Subscription      |\n| [**Clip Studio Paint**](https://www.clipstudio.net/en/)              | Line art, perspective-heavy scenes, and comic/manga styles    | Advanced perspective rulers, 3D model integration, vector layers           | One-time Purchase |\n| [**Procreate**](https://procreate.com/)                              | Portability, intuitive painting, and rapid concepting on iPad | Touch-optimized interface, powerful brush engine, simple and fast workflow | One-time Purchase |\n\nUltimately, you're looking for a partner in creativity. The best tool is the one that empowers you to create stunning backgrounds without getting in your way.\n\n### The Rise of AI in Background Creation\n\nBeyond the traditional software, a completely new class of tools is shaking things up. Artificial Intelligence (AI) isn't just a buzzword anymore; it's becoming a practical assistant for background artists.\n\n> Think of AI tools as a creative partner that can handle the grunt work. They can generate endless texture variations, block out initial color palettes, or even suggest different compositions. This frees you up to focus on the truly artistic decisions that make a piece unique.\n\nThe impact is real. The AI animation market is projected to hit **$1.4 billion** and is growing fast. This tech can slash the manual effort for tasks like texture generation by up to **50%**, which means much faster prototyping and iteration. You can find more on [how AI is revolutionizing the animation industry](https://superagi.com/revolutionizing-animation-how-ai-motion-graphics-are-changing-the-industry-in-2025/) if you want to dive deeper.\n\n## From Sketch to Final Render\n\nAlright, this is where the magic happens. We're about to take that first spark of an idea and shape it into a living, breathing environment for your animation. This whole process is a journey, moving from a blank canvas to a polished, action-ready background. It's less about a rigid set of rules and more about a creative workflow that gets you from a rough concept to a final asset without losing your mind.\n\nThe key to this entire process is starting broad and then slowly, deliberately, narrowing your focus. If you jump into the tiny details too early, you'll get bogged down. Trust me, I've been there. The goal is to build a reliable framework you can lean on for any project, ensuring your work is both stunning and functional every single time.\n\nThis first step, the initial sketching phase, is where the foundational ideas really start to take shape.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/66e3a80c-8739-4252-b363-233e56ed66bc.jpg)\n\nAs you can see, even the most detailed, complex backgrounds start with nothing more than simple, exploratory drawings to lock in a strong visual foundation.\n\n### Start with Thumbnail Sketches\n\nBefore you even think about picking a color or rendering a single pixel, you need to start with **thumbnail sketches**. These are tiny, lightning-fast, and unapologetically messy drawings. Seriously, think business-card size or smaller. Their only job is to help you explore composition.\n\nDon't aim for perfection. The entire point is to churn out a bunch of ideas fast. Working small forces you to ignore the details and focus on what really matters at this stage: the big shapes, the visual flow, and the overall balance of the scene.\n\nAs you sketch, ask yourself some basic questions. Where's the horizon line? What's the main point of interest, and how can I frame it to draw the viewer's eye? You're hunting for the most dynamic composition. I always aim for at least **five to ten** different thumbnails before I even consider moving on. It gives you options, and options are everything.\n\n### Gather Your Visual References\n\nOnce you've locked in a composition you feel good about, it's time to gather references. And no, this isn't cheating—it's what every single professional artist does to build worlds that feel authentic.\n\nIf your scene is a moody, rain-slicked city street at night, go find photos of wet asphalt. Look for pictures of neon signs reflecting in puddles, or the specific architectural style you're imagining. These references are your secret weapon; they'll inform every decision you make, from lighting and color to the texture of a brick wall.\n\nI like to pull everything into a single mood board. It becomes my visual anchor, a single source of truth I can refer back to, ensuring the final piece stays consistent with my initial vision.\n\n### Block In Your Colors and Values\n\nWith a refined sketch and a solid bank of references, you can finally start laying down some color. This stage is all about **color blocking**. Grab a big, simple brush and just paint in the main areas of color. No detail, no texture—just big, bold shapes.\n\nThe goal here is to establish the scene's overall lighting and atmosphere. Focus on the relationship between your lights and shadows. Is it a high-contrast, sunny day with sharp, dark shadows? Or is it a soft, overcast day with more subtle, diffused light? Defining these broad value groups early on is what will give your background a real sense of depth and form.\n\n> A classic rookie mistake is jumping straight into rendering tiny details before the core lighting is figured out. If your underlying value structure is weak, your background will always feel flat, no matter how much detail you throw at it. Get the big shapes right first.\n\n### Render Details and Textures\n\nNow that your foundation is rock-solid, you can finally dive into the fun stuff: rendering the details and textures that make the scene feel real. This is where you can bring in specific elements that sell the world you're building.\n\nFor instance, adding realistic surfaces for things like brick walls, wood grain, or grassy fields can make a huge difference. Knowing [how to create seamless textures](https://virtuall.pro/blog-posts/how-to-create-seamless-textures) is an invaluable skill for this, as it allows you to cover large areas without obvious repetition.\n\nBut be strategic with your detail. Don't render everything to the same level of polish. The areas where your characters will be, or where you want the audience to look, should get the most love—more detail, higher contrast.\n\nAs things recede into the distance, they should get simpler and less contrasty. This classic technique is called **atmospheric perspective**, and it's absolutely essential for creating a believable sense of space. By carefully managing where you put your detail, you're not just painting a picture; you're guiding the viewer's eye and telling a story.\n\n## Mastering Layers for Dynamic Scenes\n\nIn animation, a background is never just a single, flat picture. It’s a carefully built set of pieces working in concert to create depth, dimension, and movement. If you want to master how to make backgrounds for animation, you have to master the art of layering—it’s the secret ingredient that makes your scenes breathe.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c938772e-1cdb-469c-a48a-d1c364e0dfbb.jpg)\n\nThis technique means strategically splitting your artwork into distinct planes: the **foreground**, **midground**, and **background**. This isn't just an artistic flourish; it's a technical necessity. When you put different elements on their own layers, you open the door for camera movements like pans and zooms without forcing the animation team to redraw entire scenes frame by painful frame.\n\nThink about a character walking through a forest. If you pop a big tree on a **foreground** layer, the character can move behind it seamlessly, creating an instant and totally believable sense of depth. The rest of the woods might live on a **midground** layer, with the distant mountains and sky chilling way back on the **background** layer.\n\n### The Power of Parallax\n\nThis separation is what gives us the magical **parallax effect**. As the camera \"moves\" across the scene, the foreground elements zip by faster than the background elements, mimicking how our eyes perceive depth in the real world. It's a simple trick, but it's one of the most powerful ways to add dynamic motion and immersion to a 2D scene.\n\nWithout good layering, a camera pan just looks like you're dragging a flat poster across the screen. With it, you’ve created a window into a world that feels real. You can see some cool, code-based examples of this principle in action with animated effects like the [warp background component](https://magicui.design/docs/components/warp-background) to get a feel for how layers generate motion.\n\n### Organizing Your Layers for Production\n\nA clean, organized layer file is a gift to your animation team. I can't tell you how many times a messy file has caused massive production headaches down the line. To avoid being _that_ person, get into the habit of using a clear and consistent naming convention from the start.\n\n> Think of your layered file as a blueprint for the animators. The more logical and clearly labeled it is, the smoother the entire production pipeline will run. A simple change like naming layers \"FG_Tree_01\" and \"BG_Mountains\" instead of \"Layer 3 copy\" can save hours of confusion.\n\nHere’s a practical structure I always follow:\n\n- **Foreground (FG):** This layer is for anything sitting closest to the camera. This could be the tree the character walks behind, a windowsill in an interior shot, or even falling rain.\n- **Midground (MG):** This is your main stage. It's where most of the character action will unfold. It includes the ground they walk on and the primary set pieces they'll interact with.\n- **Background (BG):** This layer holds everything furthest from view—the sky, distant mountains, or a far-off city skyline.\n\nThis logical separation isn't just about creating depth; it's about maintaining control. It allows different artists and animators to work on elements independently and makes the entire process ridiculously more efficient.\n\n## Getting Your Backgrounds Ready for Production\n\nA gorgeous background is only half the job done. If it’s not built for the production pipeline, it can become a massive bottleneck for the entire team. This is where the technical side of the art comes in—prepping your work so it’s seamless for animators to use. Frankly, getting this right separates the amateurs from the pros.\n\nThis handoff process is more critical than you might think. The global animation industry was valued at a staggering **$371.85 billion in 2024** and is still climbing fast. That kind of growth means workflows have to be incredibly efficient. Perfectly prepped backgrounds are a huge part of hitting those tight deadlines. You can dig into [the growth of the animation market on kasradesign.com](https://www.kasradesign.com/top-15-animation-industry-statistics-with-graphs/) if you're curious.\n\n### Nail Down Your Resolution and File Formats\n\nLet's get into the specifics. You should always, always work at a higher resolution than the final animation output. A great rule of thumb is to double it. If the project is for Full HD (1920x1080), create your background at 3840x2160 pixels. This extra real estate is a lifesaver, giving animators the room they need for camera moves like zooms and pans without the image turning into a pixelated mess.\n\nWhen you're ready to export, the file format you choose is everything. The whole point is to keep the layers and transparency intact for the animation team.\n\n- **PSD (Photoshop Document):** This is the king for a reason. It perfectly preserves every layer, folder, and effect you’ve created. It's the go-to format for handing off work to animators, especially those working in software like [Adobe After Effects](https://www.adobe.com/products/aftereffects.html), which can import PSDs flawlessly.\n- **PNG (Portable Network Graphics):** Need to export a single element with a transparent background, like a tree that sits in the foreground? PNG is your best friend. It uses lossless compression, so you don't lose a speck of quality.\n\nYes, these formats can lead to bigger files, but their flexibility in production is non-negotiable. If you're looking for ways to keep file sizes in check, many of the same ideas in our guide on [how to optimize images for web](https://magicui.design/blog/how-to-optimize-images-for-web) can be applied here.\n\n### Master Your Naming and Color Profiles\n\nA clean file is a happy animator. One of the best habits you can ever develop is a logical layer naming system. It might seem tedious, but naming your layers with simple, descriptive titles like `FG_Tree_01` or `BG_Sky` is so much better than handing over a file with a hundred layers all named \"Layer 1 copy.\"\n\n> A well-organized file is an act of consideration for your team. It removes guesswork, speeds up the animation process, and prevents costly misunderstandings. Clear communication starts with how you label your layers.\n\nFinally, double-check that your color profile matches the project's standards. Most animation workflows are built around the **sRGB** color space. If you work and export in the right profile, you can be confident that the colors you spent hours perfecting are the same ones everyone else sees—from your monitor to the final render.\n\n## Common Questions About Background Art\n\nDiving into background creation for the first time always brings up the same handful of questions. It doesn't matter if you're a seasoned pro or just getting your feet wet; figuring out the answers to these common hurdles is part of the process.\n\nLet's break down some of the questions we see pop up again and again, with some clear, practical answers to get you started on the right foot.\n\n### What Is the Best Resolution for Animation Backgrounds?\n\nHere's a solid rule of thumb that will save you a lot of headaches: **work at double the final output resolution**. If the project is going to be in standard Full HD (1920x1080), you should be creating your background files at a crisp 3840x2160 pixels.\n\nWhy so big? It’s all about flexibility. This extra real estate gives the animators room to play. They can add camera movements—zooms, pans, even slight rotations—without the image turning into a blurry mess.\n\nOf course, you should always double-check the project's specific technical requirements, but starting bigger is a simple way to make your work much more useful down the line.\n\n> Consistency is the cornerstone of a believable animated world. When the style of the backgrounds and characters align perfectly, the audience is free to become fully immersed in the story without any visual distractions.\n\n### How Do I Match the Background Style to the Characters?\n\nGetting that visual harmony right is everything. You want your characters and backgrounds to feel like they belong together, not like they were dropped in from two different universes. The best way to nail this is to establish a shared visual language right from the beginning.\n\nStart with a unified color palette that gets used for both characters and environments. Then, look closely at the line quality.\n\n- Are the characters drawn with sharp, clean lines? The background should echo that, maybe with slightly thinner lines to push it back and create depth.\n- Is the style more painterly and textural? Carry those same brush techniques and textures into the background elements.\n\nThe single best way to keep everyone on the same page is to create a detailed **style guide** before production really kicks into gear.\n\n### How Much Detail Should I Add to My Backgrounds?\n\nDetail should always serve the story, not fight it for attention. The trick is to use it strategically, guiding the viewer's eye exactly where you want it to go.\n\nThink about where the action is happening. Any area where characters will interact or a key story point unfolds should get the most detail and the highest contrast. On the flip side, things in the distance or on the edges of the frame should be simplified, with softer edges and less contrast.\n\nThis isn't just an artistic choice; it creates a natural focal point and a believable sense of depth. Before you add another tree or rock, just ask yourself: \"Does this help tell the story, or is it just visual noise?\"\n\n### Is It Okay to Use Photos in My Animation Backgrounds?\n\nAbsolutely. Using photos, a technique often called \"photobashing,\" can be a seriously powerful and efficient way to build out realistic textures and complex environments. But, and this is a big but, it takes a skillful hand to pull it off.\n\nThe secret isn't just dropping a photo in. You have to manipulate it—a lot. Adjust the colors, values, and lighting so it blends seamlessly with your scene's established art style. You'll almost always need to paint over parts of the photo to fully integrate it into the artwork.\n\nAnd the most critical part: make sure you have the proper **rights and licenses** to use any photos in a commercial project. Don't skip this step.\n\n---\n\nReady to build interfaces as stunning as your animations? **Magic UI** offers a library of 150+ free, open-source animated components and premium templates to bring your landing pages to life. [Check out our components and start building today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/how-to-optimize-images-for-web.mdx",
    "content": "---\ntitle: How to Optimize Images for Web Performance\ndescription: >-\n  Learn how to optimize images for web to boost site speed and SEO. Our guide\n  covers formats, compression, and responsive design for better performance.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-f3d3cfa2-8511-405f-8c1c-0cbd36852d36.jpg\nauthor: Dillion Verma\ntags:\n  - how to optimize images for web\n  - image optimization\n  - web performance\n  - core web vitals\n  - image seo\npublishedOn: \"2025-09-25\"\nfeatured: true\n---\n\nWhen we talk about optimizing images for the web, we're really talking about a balancing act. The goal is to shrink file sizes as much as possible without sacrificing visual quality, all to make your website load faster. This isn't just a technical tweak; it's absolutely fundamental for good SEO and a positive user experience. It directly shapes how both visitors and search engines see your site.\n\n## Why Image Optimization Is a Game Changer\n\nHave you ever bailed on a website because it was taking forever to load? We all have. More often than not, the culprit is a bunch of large, unoptimized images clogging up the works. This isn't a minor hiccup—it's a critical performance bottleneck that can seriously hamstring your site's success.\n\nEven a single poorly sized image can tack on several extra seconds to your load time. That delay is a killer, especially on mobile. One study found that **about 53% of visitors will abandon a site** if it takes longer than three seconds to load. You can read more about how performance shapes user behavior and steer clear of common mistakes in our guide on [web design best practices](https://magicui.design/blog/web-design-best-practices).\n\n### The SEO and User Experience Impact\n\nGoogle has been beating the drum about site speed for years, and it's a huge ranking factor. Their Core Web Vitals are now at the heart of how they measure user experience, and images are front and center in these metrics:\n\n- **Largest Contentful Paint (LCP):** This measures how quickly the biggest element on the screen—usually a hero image or a block of text—becomes visible. A slow-loading hero image is a one-way ticket to a poor LCP score, and that will hurt your rankings.\n- **Cumulative Layout Shift (CLS):** This tracks the visual stability of your page. You know when you try to click a button, but an image loads late and shoves everything down? That's layout shift. Images without properly defined dimensions are a common cause, creating a jarring experience and a high CLS score.\n\n> By learning how to optimize images for the web, you are directly improving these vital metrics. The result is a better user experience, lower bounce rates, and a significant boost in search engine visibility.\n\nFor anyone running an online store, the stakes are even higher. Site speed is directly tied to conversion rates. For a fantastic deep dive into how optimization can completely transform an e-commerce site, check out this [complete guide to image optimization for Shopify](https://www.ecorn.agency/blog/image-optimization-shopify-complete-guide).\n\n## Choosing the Right Image Format\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a6abe54f-b762-4403-80eb-41a33dbee5c4.jpg)\n\nBefore you even think about compression or lazy loading, your first big decision is picking the right image format. This is the bedrock of web image optimization, and honestly, it’s no longer a simple choice between JPEG and PNG.\n\nModern formats have completely changed the game, offering much better performance without any noticeable hit to quality. These new formats were developed specifically to make pages load faster. For instance, a next-gen format like **WebP** can slash file sizes by **25-30%** compared to an old-school JPEG, and that difference is huge. It's a direct boost to your page speed and, by extension, your user experience. If you want to go deeper, we cover this and more in our [deep dive into image optimization techniques](https://aibudwp.com/image-optimization-in-2025-webp-avif-srcset-and-preload/).\n\n### Modern Formats vs Traditional Staples\n\nDon't get me wrong, the classic JPEG vs. PNG debate isn't over. JPEGs are still my go-to for photographs and any complex images with lots of color gradients. And PNGs? They're unbeatable when you need that crystal-clear transparency for things like logos or icons.\n\nBut for most everyday images on the web, **WebP** is the clear winner. It strikes an incredible balance between tiny file sizes and high visual quality. Then there's **AVIF**, which takes compression to another level. It's perfect for those high-impact visuals, like a massive hero image, where every single kilobyte you can save makes a difference.\n\n> When it comes to logos, icons, or any graphic that needs to look sharp at any size, there’s only one answer: **SVG** (Scalable Vector Graphics). Because they're just code, they're incredibly lightweight and resolution-independent, meaning they stay crisp on a tiny phone screen or a massive 4K display.\n\n### Image Format Comparison WebP vs AVIF vs JPEG vs PNG\n\nTo help you decide at a glance, I've put together a quick cheat sheet. This table breaks down the most common formats you'll be working with.\n\n| Format   | Best For                                       | Compression | Browser Support |\n| :------- | :--------------------------------------------- | :---------- | :-------------- |\n| **JPEG** | Photographs, complex gradients                 | Lossy       | Universal       |\n| **PNG**  | Images requiring transparency, simple graphics | Lossless    | Universal       |\n| **WebP** | A modern replacement for JPEG and PNG          | Both        | Excellent       |\n| **AVIF** | Maximum compression for critical visuals       | Both        | Good & Growing  |\n| **SVG**  | Logos, icons, and scalable vector graphics     | N/A         | Excellent       |\n\nThink of this as your starting point. Choosing the right format upfront saves you a ton of headaches later and sets the stage for a genuinely fast website.\n\n## A Practical Workflow for Resizing and Compressing Images\n\nTurning a high-resolution photo into a fast-loading web asset really comes down to two things: resizing and compressing. Nailing this workflow is the difference between a snappy site and one that has users tapping their fingers waiting for images to load.\n\nFirst up is resizing. Before you even think about uploading, you have to know the _actual_ dimensions the image will have on your site. One of the most common performance killers I see is a massive **4000-pixel** wide image being crammed into an **800-pixel** container. This forces the user's browser to download all that extra data and then shrink the image down, wasting bandwidth and processing power.\n\n### Resizing to Fit Your Layout\n\nTake a good look at your website's layout. If your main content area is **900 pixels** wide, there's absolutely no reason for an image inside it to be any wider. For those big, full-width hero images, check your site on a large monitor to find the maximum container width and use that as your guide. The goal is to resize your image to match those final display dimensions _before_ it ever touches your website.\n\nThis single step can slash file sizes on its own. You can use pretty much any image editor for this, from Photoshop to free online tools. Many of the [best web design tools](https://magicui.design/blog/best-web-design-tools) even have these features built-in, which can really smooth out your process.\n\n### Understanding Image Compression\n\nOnce the image is the right size, it's time to compress it. This is where you shrink the file size (the kilobytes or megabytes) even further. You'll run into two main types of compression:\n\n- **Lossless Compression:** This method cleverly removes non-essential metadata from the file without touching a single pixel. The image quality stays identical to the original.\n- **Lossy Compression:** This is where the magic happens for web performance. It achieves much smaller file sizes by intelligently removing some visual data that the human eye isn't likely to notice.\n\n> For almost everything on the web, a smart **lossy compression** is the way to go. The file size savings are huge—often reducing an image's weight by **70% or more**—with a trivial impact on how it actually looks to your visitors.\n\nThis infographic breaks down how you can define breakpoints and generate different image versions for a responsive design.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b09af02e-8b4b-4e0b-bc11-6807dee359c7.jpg)\n\nAs you can see, creating multiple image versions for different screen sizes is a core part of any modern optimization strategy. On a day-to-day basis, I find myself using free online tools like TinyPNG for quick and effective lossy compression. You just drag, drop, and download the optimized file—it couldn't be simpler.\n\n## Nail Responsive Images with Srcset\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/80daf131-0dcd-4119-a308-3bff514c144d.jpg)\n\nResizing and compressing your images is a solid start, but it's really only half the battle. If you want to truly master image optimization, you have to serve the _right-sized_ image to the right device.\n\nThink about it: sending a massive, high-resolution image meant for a desktop monitor to a tiny mobile screen is a complete waste. It burns through the user's data and slows your site to a crawl for zero benefit.\n\nThis is exactly the problem the HTML `srcset` attribute was designed to solve.\n\nIt's a surprisingly powerful tool that lets you hand the browser a menu of different-sized image sources. The browser then gets to be the smart one, picking the perfect option based on the user's screen size and resolution. The result? A fast, tailored experience for everyone.\n\nThis screenshot from MDN gives you a peek at a basic `srcset` implementation. The code offers up multiple image files, each tagged with its width, giving the browser all the options it needs to make the right call.\n\n### Putting Srcset and Sizes into Practice\n\nGetting `srcset` working is more straightforward than it looks. The basic idea is to create a few versions of your image—maybe a small, medium, and large—and then list them in the attribute. You'll use a width descriptor (`w`) to tell the browser the actual pixel width of each image file you're providing.\n\nHere’s a real-world example you can adapt:\n\n<img\n  srcSet=\"product-small.jpg 480w, \n          product-medium.jpg 800w, \n          product-large.jpg 1200w\"\n  sizes=\"(max-width: 600px) 480px,\n         (max-width: 900px) 800px,\n         1200px\"\n  src=\"product-large.jpg\"\n  alt=\"A high-quality photo of the featured product.\"\n/>\n\nThe `sizes` attribute is the trusty sidekick to `srcset`. It gives the browser a heads-up about how much space the image will actually take up on the screen at different viewport sizes, helping it make an even smarter choice.\n\n> Don't forget the fallback `src` attribute. It's your safety net, ensuring that older browsers that don't get `srcset` will still show an image. It’s a simple line that guarantees backward compatibility.\n\nTo get the most out of `srcset`, it helps to [understand responsive web design in detail](https://www.baslondigital.com/post/what-is-responsive-web-design-explained) to ensure your images adapt flawlessly.\n\nThe good news for developers working with modern frameworks is that much of this can be automated. Framework-specific image components often handle `srcset` generation for you, a topic we dive into in our guides for frameworks like [Next.js](https://magicui.design/blog/next-js). This automation is a massive time-saver and cuts down on the chance of human error.\n\n## Don't Forget Alt Text and File Names for SEO\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9049750b-9e37-470b-8cc2-aa129a0b4abd.jpg)\n\nCrushing your image file sizes is a huge win, but it's only half the battle. If you're not thinking about SEO and accessibility, you're leaving traffic on the table. Every image you upload is a chance to tell Google what your page is about, turning a simple visual into a genuine SEO asset.\n\nThis process starts _before_ you even upload the file.\n\nStop using default camera names like `IMG_8472.jpg`. That tells a search engine absolutely nothing. Instead, get descriptive and think about what a real person would type into a search bar. A file named **blue-suede-running-shoes.jpg** gives Google immediate, valuable context about the image, helping it show up in relevant image searches.\n\nIt's a small change that makes a big difference.\n\n### Writing Alt Text That Actually Works\n\nOnce your image is on the site, the `alt` attribute—or **alt text**—is your most powerful tool. Its main job is accessibility; it describes the image for screen readers used by visually impaired visitors. But it's also a critical signal for search engines.\n\nGood alt text is both concise and descriptive, and it should feel natural, not stuffed with keywords.\n\n- **Bad Alt Text:** `alt=\"shoes\"`\n- **Good Alt Text:** `alt=\"A pair of blue suede running shoes with white laces on a wooden floor.\"`\n\nSee the difference? The second example is infinitely more helpful for both people and search crawlers.\n\n> Alt text is the bridge between your visual content and the text-based world of search engines. By describing exactly what's in the picture, you help Google understand the context of your page, which can give your overall rankings a nice little boost.\n\nGreat images don't just help with SEO; they keep people on your site. Content with relevant visuals gets around **94% more views** on average. Combine that with speed, and you've got a winning formula. A site's bounce rate can jump by **32%** when the load time creeps from just one to three seconds.\n\nIf you want to dive deeper into how images impact SEO and user retention, check out these [2025 optimization insights](https://www.marketmymarket.com/2025-image-optimization-guide-for-seo-social-media-performance/).\n\nEven after you've got a solid image workflow down, some practical questions always seem to pop up. Let's run through a few of the most common ones I hear, just to clear the air.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/GmlepcvmwJ4\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### \"What's the 'Perfect' File Size?\"\n\nThis is probably the number one question, and the honest answer is... there isn't one. It's all about context.\n\n> A great rule of thumb is to keep most standard images **under 150KB**. For more complex, high-impact visuals like a full-width hero image, I try to stay **under 500KB**. The real goal is always finding that sweet spot between visual quality and file weight.\n\nDon't obsess over a single number. Instead, focus on the trade-off. Does shaving off another 20KB noticeably degrade the image? If so, it's probably not worth it.\n\n### \"Should I Use WebP or AVIF for Everything?\"\n\nPeople often wonder if they should go all-in on modern formats. While WebP and AVIF offer incredible compression, you can't just forget about older browsers. Providing fallbacks is still smart.\n\nHere’s my take:\n\n- **WebP:** This format has fantastic browser support now. It's a safe, high-performance choice for replacing both your JPEGs and PNGs. It's my go-to for most things.\n- **AVIF:** This one offers even better compression, but browser compatibility isn't quite universal yet. I save it for critical, high-traffic images where every single kilobyte counts.\n\nThankfully, you don't always have to manage this manually. Many modern frameworks and build tools can serve the best format to each browser automatically. If you're rolling your own solution, the `<picture>` element is your best friend for specifying multiple sources and letting the browser choose.\n\n### \"How Does a CDN Fit Into All This?\"\n\nSo, where does a Content Delivery Network (CDN) come in? A CDN is a massive performance booster for your images. It’s not just about caching; a modern image CDN can automatically optimize your images in real-time.\n\nThink of it this way: a CDN can detect a user's browser and device on the fly. It can take the large JPEG you uploaded and serve a perfectly sized, compressed WebP image to someone on a modern browser, all without you lifting a finger.\n\nPlus, by caching your images on servers all around the world, CDNs dramatically cut down load times by delivering them from a location physically closer to your visitor. It's a total game-changer.\n\n---\n\nReady to build stunning, high-performance websites without the hassle? **Magic UI** offers a library of over 50 customizable blocks and templates built with React and Tailwind CSS, so you can create beautiful interfaces in minutes. [Explore Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/infinite-scroll-react.mdx",
    "content": "---\ntitle: Create a Flawless infinite scroll react UI\ndescription: >-\n  Learn how to implement infinite scroll react in React using Intersection\n  Observer and hooks. This guide covers performance, pitfalls, and best\n  practices.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/6df90f53-be44-468b-84f8-bdaba9c52f79/infinite-scroll-react-app-list.jpg\nauthor: Dillion Verma\ntags:\n  - infinite scroll react\n  - react hooks\n  - intersection observer\n  - react performance\n  - react ui\npublishedOn: \"2025-11-30T08:41:56.170144+00:00\"\nfeatured: true\n---\n\nImplementing infinite scroll in React is about more than just loading data—it's about transforming a static page into a dynamic, continuous feed. Content appears just in time, right as the user scrolls down. This pattern is a favorite for a reason: it creates a completely _seamless and fluid browsing experience_, getting rid of the abrupt stops of traditional pagination and keeping people locked into your content.\n\n## Why Infinite Scroll Still Wins for User Engagement\n\nInfinite scroll isn't just a trendy design choice; it's a powerful tool that taps into user psychology and smart performance optimization. When people don't have to consciously click a \"Next Page\" button, the friction to discover more content just melts away. This creates a much more natural and continuous interaction. It’s the secret sauce behind platforms like Instagram, Pinterest, and X (formerly Twitter), which all need to serve up massive amounts of content without overwhelming their users.\n\nThe benefits go way beyond just a smooth feel. Building an **infinite scroll React** component brings some very real advantages to the table:\n\n- **Faster Initial Load Times:** You're only loading the content needed for the initial viewport. This makes that first-page load significantly snappier compared to fetching dozens of items for an old-school paginated list.\n- **Increased User Engagement:** The seamless flow keeps people on the page longer. It's one of the biggest motivators for developers, as this pattern has been shown to boost time spent on an app by over **30%** versus pagination. If you want to dive deeper into this, [LogRocket has some great insights on the topic](https://blog.logrocket.com/react-infinite-scroll/).\n- **Mobile-First Friendliness:** On a phone, scrolling is everything. An infinite feed feels completely intuitive and native to the mobile experience, where trying to tap tiny pagination links can be a real pain.\n\n### The Psychology of the Scroll\n\nAt its core, infinite scroll works because it plays into our natural desire for discovery. Each new piece of content that scrolls into view delivers a tiny dopamine hit, which encourages us to keep going.\n\nUnlike pagination, which gives you a clear stopping point, the endless feed creates a \"just one more\" mentality. This subtle but powerful effect is a key reason why it's one of the most effective [user interface design patterns](https://magicui.design/blog/user-interface-design-patterns) for any app that's heavy on content.\n\n> Infinite scroll trades the deliberate action of clicking for the passive, almost subconscious act of scrolling. This shift reduces cognitive load and keeps the user in a state of flow, making the experience feel effortless and engaging.\n\nBut a truly great implementation involves more than just fetching data on a loop. To really nail user engagement and build interfaces that make an impact, you need to understand the broader principles of [mastering digital experience design](https://www.dllstudios.com/post/mastering-digital-experience-design). When you grasp those fundamentals, you can ensure your infinite scroll doesn't just work—it delights.\n\n## Building Infinite Scroll with Intersection Observer\n\nSure, you can grab a library off the shelf, but building your own infinite scroll component from scratch gives you something invaluable: complete control. By rolling up your sleeves with React Hooks and the browser-native **Intersection Observer API**, you can craft a lean, high-performance solution without bloating your project with extra dependencies.\n\nThis whole approach is about being smart and efficient. Instead of hammering the browser by constantly listening for scroll events—which can really bog things down—the Intersection Observer API just tells you when a specific element pops into the viewport. It’s the perfect, low-cost trigger for fetching the next chunk of data.\n\nThis is the kind of seamless user journey we're aiming for. It's all about keeping users locked in.\n\n![A diagram illustrating the user engagement flow: from paging content, to scrolling, resulting in user engagement.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/145bb922-2d05-4838-97e6-5ba7f0970c4f/infinite-scroll-react-user-flow.jpg)\n\nThis simple flow shows how ditching distinct \"next page\" clicks for a smooth, continuous scroll keeps people absorbed in your content.\n\n### The Sentinel Element Strategy\n\nSo, how does it work in practice? The core idea is to plant an invisible \"sentinel\" element at the very bottom of your list of items. This can be as simple as an empty `<div>` with a `ref` attached to it.\n\nYou then tell the Intersection Observer to keep an eye on _only_ that sentinel.\n\nThe moment a user scrolls down and that invisible element enters their screen, the observer fires off a callback. That callback is your command center, where you'll kick off a few key actions:\n\n- First, check if there’s actually more data left to fetch.\n- Flip a loading state to `true` to show a spinner or some feedback.\n- Fire off the API call for the next page of results.\n- Once the data arrives, append it to your existing list and turn the loading state off.\n\nThis pattern is so elegant because the browser handles all the heavy lifting of watching the viewport. Your app is free from running expensive calculations on every single scroll tick. To make things even slicker, you can pair this data-loading event with some subtle entrance animations. We actually have a great guide on how to implement [CSS animation on scroll](https://magicui.design/blog/css-animation-on-scroll) if you want to dive deeper.\n\n### Creating a Custom Hook\n\nTo keep your component logic clean and make this pattern reusable across your app, the best move is to wrap all the observer logic inside a custom React hook—something like `useIntersectionObserver`. This hook will neatly manage the observer instance, the reference to that sentinel element, and the callback function that triggers your data fetching.\n\nThis approach is especially powerful in the React world. Remember, React powers over **11 million** live websites, dominating around **45.8%** of the JavaScript library market. Its entire philosophy is built around creating modular, reusable pieces, and a custom hook for a complex UI pattern like infinite scroll is a perfect fit.\n\n> By abstracting the Intersection Observer logic into a custom hook, you create a declarative API for your components. A component simply needs to use the hook and provide a callback, without needing to know the low-level details of how the observation is managed.\n\nThe Intersection Observer API is the modern, performance-first way to handle visibility detection, making it the ideal tool for building a custom infinite scroll feature from the ground up.\n\n## Choosing the Right Library for Your Project\n\nWhile building an infinite scroll from scratch is a fantastic learning experience, let's be real: production environments demand speed, reliability, and code that's easy to maintain. This is where dedicated libraries come in, handling the tricky edge cases so you don't have to. When it comes to **infinite scroll in React**, the choice usually boils down to two paths: a simple UI component or a powerful, full-blown data-fetching library.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/4ettB5JqDps\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTwo options perfectly capture this choice: [`react-infinite-scroll-component`](https://www.npmjs.com/package/react-infinite-scroll-component) and TanStack Query's `useInfiniteQuery` hook. They both get you to the same finish line, but they take completely different routes to get there.\n\n### The Lightweight Component: `react-infinite-scroll-component`\n\nIf you just need to get a simple feed up and running fast, `react-infinite-scroll-component` is your best friend. It’s a straightforward, no-fuss component that wraps your list and takes care of all the scroll detection logic for you.\n\nYou just hand it the essential pieces, and it does the heavy lifting:\n\n- **`dataLength`**: The current number of items you've loaded.\n- **`next`**: The function it should call to fetch more data.\n- **`hasMore`**: A simple boolean telling it if the party's over or if more items are available.\n- **`loader`**: A bit of JSX to show while the next batch is on its way.\n\nThis library is perfect for simpler use cases. It's incredibly easy to drop into a project, its API is minimal, and it doesn't force you to rethink your application's entire data-fetching strategy. It focuses purely on the UI and the scroll event, leaving the state management entirely up to you.\n\n### The Data-Fetching Powerhouse: TanStack Query\n\nOn the other side of the ring, we have **[TanStack Query](https://tanstack.com/query/latest)** (you might know it as React Query). This isn't just an infinite scroll tool; it's a comprehensive server-state management solution. Its `useInfiniteQuery` hook is purpose-built for wrangling paginated data with finesse.\n\nWith `useInfiniteQuery`, you define _how_ to fetch a page of data and, most importantly, how to figure out the parameters for the _next_ page. In return, the library hands you a suite of managed states and functions that make life much easier:\n\n- **`data`**: A clean object containing all the pages you've fetched.\n- **`fetchNextPage`**: A stable function to trigger the next data pull.\n- **`hasNextPage`**: An intelligent boolean that knows if another page is available.\n- **`isFetchingNextPage`**: A dedicated loading state just for subsequent fetches.\n\nThe real magic, though, is everything that happens under the hood. TanStack Query automatically handles caching, prevents duplicate requests, and intelligently refetches data in the background. This translates directly to a smoother UI, fewer network calls, and a much more resilient app.\n\n> When you choose `useInfiniteQuery`, you're not just adding infinite scroll. You're adopting a robust data-fetching strategy that can manage complex server state across your entire React application.\n\n### Comparing Infinite Scroll Implementation Methods\n\nSo, which path should you take? It really depends on what you're building. To make the decision a little clearer, here’s a quick breakdown of the different methods we've discussed.\n\n| Method                                | Best For                                                                        | Complexity | Key Advantage                                                                |\n| :------------------------------------ | :------------------------------------------------------------------------------ | :--------- | :--------------------------------------------------------------------------- |\n| **Vanilla Intersection Observer**     | Learning the fundamentals and simple, dependency-free implementations.          | Medium     | No external libraries needed; complete control over the logic.               |\n| **`react-infinite-scroll-component`** | Quickly adding infinite scroll to an existing project with minimal setup.       | Low        | Super fast to implement; focuses only on the UI component.                   |\n| **TanStack Query `useInfiniteQuery`** | Complex applications where caching, performance, and server state are critical. | High       | Powerful caching, automatic refetching, and a full data management solution. |\n\nUltimately, your choice hinges on your project's scope. For a quick, isolated feature, `react-infinite-scroll-component` is a direct and efficient solution. But for applications where data integrity, caching, and top-tier performance are non-negotiable, investing in a tool like TanStack Query will pay dividends, providing a powerful and scalable foundation for your infinite scroll and much more.\n\n## Solving Performance Issues with Virtualization\n\nWhen your list grows from a few dozen items to a few thousand, a subtle performance bomb starts ticking. Every new item adds another node to the Document Object Model (DOM), and this ever-expanding DOM is the Achilles' heel of a simple **infinite scroll React** setup. Before you know it, your app is crawling as the browser chokes on rendering and managing a ridiculous number of elements.\n\nThe definitive fix for this is a clever technique called **virtualization**, sometimes known as \"windowing.\"\n\n![Flowchart illustrating virtualization processing a code block before rendering it in a React window.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/87a217c4-67ab-44a9-b668-6a58e837a294/infinite-scroll-react-virtualization-flow.jpg)\n\nSo, what's the magic? Instead of naively rendering every single item, virtualization only renders the items currently visible in the user's viewport, plus a small buffer on either side. As the user scrolls, items that move out of view are unmounted from the DOM, and new ones are mounted just as they're needed. This keeps the DOM incredibly light, whether your list has 100 items or 100,000.\n\n### Integrating a Virtualization Library\n\nLet's be real: for most projects, building a virtualization engine from scratch is a massive undertaking. Why reinvent the wheel when battle-tested libraries like `react-window` and `react-virtualized` have already perfected it? Between the two, `react-window` is the lighter, more modern successor, making it the go-to choice for new projects.\n\nIntegrating one of these libraries is less about rewriting your logic and more about wrapping it. Here’s the gist of how it works:\n\n- **Wrap your list:** You’ll use a component like `<FixedSizeList>` from `react-window`.\n- **Provide dimensions:** This component needs to know the total item count, the height of the list container, and the height of each individual item.\n- **Render with a function:** Instead of a simple `.map()`, you pass a function that `react-window` calls to render each visible item. It hands you the `index` and a crucial `style` prop.\n\nThat `style` prop is where the magic happens. It contains the exact `top`, `left`, `width`, and `height` values calculated by the library to position each item absolutely inside the scrollable container.\n\n> By handing off the rendering logic to a virtualization library, you're essentially telling React, \"Forget about rendering all 10,000 items. Just render the handful I need _right now_, and put them exactly where they need to be.\"\n\n### Handling Dynamic Heights and Fetching Data\n\nOf course, not all lists are made of perfectly uniform items. What if their heights are dynamic? This is a common curveball. For this, `react-window` offers `<VariableSizeList>`, where you provide a function to estimate each item's size. For even more complex, dynamic layouts, `react-virtualized` steps in with heavier but more powerful tools like `<AutoSizer>` and `<CellMeasurer>`.\n\nCombining virtualization with your infinite scroll logic is the ultimate performance power-up. You stick with your existing data-fetching strategy (whether it’s `useInfiniteQuery` or an Intersection Observer) to load data in chunks. Then, you just feed that growing dataset into your virtualized component. The outcome is a UI that can juggle massive amounts of data while feeling buttery smooth.\n\nWhile virtualization solves a huge piece of the puzzle, it's just one part of a broader performance strategy. It's always a good idea to brush up on [general website speed optimization techniques](https://www.webdesignatny.com/how-to-improve-website-speed/). For a deeper dive, our guide on [how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance) offers a more complete picture.\n\n## Navigating Common Pitfalls and Best Practices\n\nPutting infinite scroll into a React app is more than just tacking on new data at the bottom of a list. The real magic—and what makes for a great user experience—is in sweating the small details and dodging the common frustrations that can trip up users. Nailing these best practices is what separates a seamless, invisible feature from a clunky, annoying one.\n\n![A web browser shows a generic webpage with a pop-up dialog featuring an icon, text, and blue button.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/bb777e00-9772-41de-9941-396995dadb8e/infinite-scroll-react-browser-pop-up.jpg)\n\nOne of the most infamous problems is the **\"footer trap.\"** We've all been there: you're trying to get to the contact link or sitemap, but new content loads so fast that the footer keeps getting pushed just out of reach. It’s like a digital game of whack-a-mole, and it's a usability nightmare. You can find more great insights on this topic from [DesignStudioUIUX](https://www.designstudiouiux.com/blog/pagination-vs-infinite-scroll-seo-ux-comparison/).\n\nAn easy fix is to go for a hybrid approach. Let the feed auto-load a few \"pages\" of content, then stop. From that point on, show a simple \"Load More\" button. This hands control back to the user, letting them either keep exploring or finally reach that elusive footer without a fight.\n\n### Prioritizing Accessibility\n\nIf you're not careful, an infinite feed can become a black hole for anyone using assistive tech. When new items just appear on the screen, a screen reader has no idea they've arrived. To the user, it just seems like they've hit the end of the page.\n\nTo make your **infinite scroll React** component truly accessible, you need to focus on two things: announcing changes and managing focus.\n\n- **Announce New Content:** This is a big one. Use an `aria-live` region to tell screen reader users that new items have loaded. A simple, visually-hidden `div` with `aria-live=\"polite\"` that says something like, \"10 new items loaded\" makes a world of difference.\n- **Maintain Logical Focus:** Don't let the user's focus get yanked back to the top of the page when new content appears. Their focus should either stay on the last item they were on or flow naturally into the newly loaded content.\n- **Provide Skip Links:** For really long feeds, a \"skip to footer\" link near the top of the list is a fantastic accessibility aid. It’s a direct escape hatch from the content loop.\n\n### Making Infinite Scroll SEO-Friendly\n\nHistorically, search engine crawlers and JavaScript-driven content haven't been the best of friends. If Googlebot can't \"scroll\" to trigger your API calls, all that amazing content you're loading dynamically might as well be invisible. That's a huge problem for SEO.\n\n> A common misconception is that infinite scroll is inherently bad for SEO. The truth is, it just requires a more deliberate implementation. You can get the user experience benefits without sacrificing crawlability.\n\nThe key is to implement a fallback that search engines can actually understand. Make sure your infinite scroll gracefully degrades to classic pagination. You can do this by setting up distinct URLs for each \"page\" of content (like `example.com/products?page=2`) that crawlers can follow. This way, Google can discover and index every single item, while your human visitors still get that smooth, uninterrupted scrolling experience.\n\n## Common Questions (and Fixes) for Infinite Scroll\n\nWhen you're building infinite scroll in React, a few common roadblocks tend to pop up. Nail these details, and you'll end up with a much more robust and user-friendly experience. Let's walk through the problems you're most likely to hit and how to solve them.\n\n### How Do I Handle Users Scrolling Back to the Top?\n\nGood news: when a user scrolls back up, you don’t usually need special logic. All that data you fetched should still be sitting in your component's state, ready to be displayed.\n\nThe real challenge here is **performance**, especially with super long lists. This is where virtualization libraries like [react-window](https://github.com/bvaughn/react-window) are a lifesaver. They cleverly \"unmount\" items that scroll out of view, which keeps the DOM lightweight and your app feeling snappy.\n\nAnd if you need to remember the _exact_ scroll position after a user navigates away and then comes back? Just save `window.scrollY` to state or even local storage. When the component mounts again, you can use that value to restore their position instantly.\n\n### What Is the Best Way to Manage State?\n\nFor a simple list, you don't need to overcomplicate things. React's own `useState` or `useReducer` hooks are perfectly capable of managing your items, page count, and loading status. They get the job done without adding any external dependencies.\n\nBut what about more complex apps? When you start needing features like **caching**, request **deduplication**, and optimistic updates, a dedicated server-state library is the way to go. [TanStack Query](https://tanstack.com/query/latest) is the gold standard here. Its `useInfiniteQuery` hook abstracts away a ton of complexity, making your component code cleaner and far more resilient.\n\n> Choosing the right state management tool is about matching its power to your project's scale. This way, you avoid under-engineering a simple feature or, just as bad, over-engineering a complex one.\n\n### How Can I Prevent Duplicate API Calls on Fast Scrolls?\n\nThis is a classic problem, but the fix is surprisingly simple: use a loading state as a guard. Before you fire off a new fetch, just check if one is already in progress.\n\nIt looks something like this: `if (isLoading) return;`.\n\nRight before you make the API call, set your loading state to `true`. Once the fetch completes—whether it succeeds or fails—set it back to `false`. This little boolean flag acts as a lock, ensuring you only ever have one data request flying at a time. No more redundant network calls, and your UI state stays clean and predictable.\n\n---\n\nReady to build stunning, high-performance web interfaces with ease? **Magic UI** offers a massive library of over **150** free, open-source animated components and premium templates built with React, Typescript, and Tailwind CSS. Start creating beautiful landing pages in minutes at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/install-tailwind-css.mdx",
    "content": "---\ntitle: Install Tailwind CSS A Modern Guide for Any Project\ndescription: >-\n  Learn how to install Tailwind CSS in any framework, from React to Vite. Our\n  guide covers CDN, PostCSS, and framework-specific setups for a perfect build.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/242a213b-4acb-42d0-8c5b-e5d89ace338c/install-tailwind-css-software-development.jpg\nauthor: Dillion Verma\ntags:\n  - install tailwind css\n  - tailwind css setup\n  - css frameworks\n  - postcss\n  - frontend development\npublishedOn: \"2025-12-06T08:28:43.735047+00:00\"\nfeatured: true\n---\n\nGetting Tailwind CSS up and running isn't a one-size-fits-all process. The right approach really depends on what you're trying to build. Are you just kicking the tires on a new idea, or are you laying the foundation for a full-scale production app? Answering that one question will point you in the right direction.\n\n### Choosing Your Tailwind CSS Installation Path\n\nThink of it as a fork in the road. One path gets you started in seconds, perfect for quick experiments. The other is a more robust, professional route that unlocks Tailwind’s full power for serious projects.\n\nMaking the right choice early on can save you a ton of headaches later.\n\n![Tailwind CSS installation guide showing a decision tree for project needs: Simple (CDN) or Serious (CLI).](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/267acde8-c4f9-4ef4-8ec5-b4deacab181d/install-tailwind-css-install-guide.jpg)\n\nAs you can see, the path you take directly impacts your project's performance, feature set, and overall capabilities. Let's break down which one is right for you.\n\nTo make this even clearer, here's a quick rundown of the main installation methods and when you'd want to use each one.\n\n### Comparing Tailwind CSS Installation Methods\n\n| Method       | Best For                                               | Key Feature                                                         |\n| :----------- | :----------------------------------------------------- | :------------------------------------------------------------------ |\n| **Play CDN** | Quick demos, learning, and prototyping                 | Instant setup via a single `<script>` tag. No build process needed. |\n| **PostCSS**  | Production applications, frameworks (React, Vue, etc.) | Full customization, plugin support, and optimized file sizes.       |\n\nUltimately, while the CDN is great for a test drive, any real project will need the full PostCSS setup to be efficient and scalable.\n\n### The Quick Start: Using The CDN\n\nIf you want to start slinging utility classes _right now_, the [Tailwind Play CDN](https://tailwindcss.com/docs/installation/play-cdn) is your best friend. Just drop a single `<script>` tag into your HTML file, and you’re off to the races. No build steps, no command line—just pure, instant Tailwind.\n\nThis is my go-to for whipping up a quick prototype or testing out a design idea directly in the browser. It’s friction-free.\n\nBut there are trade-offs. You can't customize the `tailwind.config.js` file, you can't install any third-party plugins, and you can't purge unused CSS. That last point is a big one, as it means your users will be downloading the entire, unoptimized library. If you want to see this method in action, we have a great guide on [using the Tailwind CDN in your HTML](https://magicui.design/blog/tailwind-cdn-html).\n\n### The Professional Path: A Full Build Process\n\nFor any real, production-bound application, installing Tailwind CSS as a [PostCSS](https://postcss.org/) plugin is the way to go. This method plugs Tailwind directly into your project's build pipeline, giving you access to all its best features.\n\n> This is where you get total control. You can fine-tune your `tailwind.config.js` file, use the JIT compiler to generate styles on the fly, and—most importantly—purge all unused classes from your final CSS file. The result is a tiny, highly optimized stylesheet. It takes a few more minutes to set up, but the performance gains and customization options are non-negotiable for professional work.\n\n## Integrating Tailwind CSS into Your Build Process\n\nIf you're building a real-world application, the CDN is a great starting point, but you'll quickly outgrow it. To truly harness Tailwind's power—unlocking features like full customization and file-size optimization—you need to pull it into your project's build process.\n\nThis is where [**PostCSS**](https://postcss.org/) comes into play. Think of it as a tool that transforms your CSS using JavaScript plugins. By adding Tailwind as a PostCSS plugin, you're telling it to scan your template files, generate _only_ the classes you’re actually using, and apply any custom configurations you've defined. It’s the professional standard for a reason.\n\n### Kicking Off Your Project\n\nFirst up, every Node.js project needs a `package.json` file to manage its dependencies. If you're starting completely fresh, pop open your terminal in the project's root folder and run this:\n\nnpm init -y\n\nThat little command quickly scaffolds a default `package.json` file. Now you’re ready to install the necessary packages.\n\nYou'll need to bring in Tailwind and a couple of its essential companions: `postcss` and `autoprefixer`. **Autoprefixer** is a must-have PostCSS plugin; it automatically adds vendor prefixes to your CSS rules, saving you the headache of ensuring cross-browser compatibility.\n\nRun this command to install them all as development dependencies:\n\nnpm install -D tailwindcss postcss autoprefixer\n\n### Creating Your Configuration Files\n\nWith the packages installed, it's time to set up two crucial configuration files. The Tailwind CLI has a handy command to get you started with a `tailwind.config.js` file.\n\nJust run this in your terminal:\n\nnpx tailwindcss init\n\nThis creates a barebones `tailwind.config.js` file. This file is the heart of your project's design system—it's where you'll eventually define custom colors, tweak your spacing scale, and extend your fonts.\n\nNext, you need to tell PostCSS which plugins to use. Create a `postcss.config.js` file right in your project's root.\n\nInside that file, add this small snippet:\n\n```ts\nmodule.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n```\n\nThis is pretty straightforward. You're just telling PostCSS to run your CSS through both Tailwind and Autoprefixer during the build step.\n\n### Structuring Your Main CSS\n\nNow you need a single CSS file to act as an entry point for Tailwind. It’s a common convention to create a file like `src/input.css` for this.\n\nInside this file, you'll use three special `@tailwind` directives. At build time, Tailwind will find these directives and swap them out with its generated styles.\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nThese three lines are non-negotiable:\n\n- **`@tailwind base`**: Injects Tailwind’s foundational styles and resets.\n- **`@tailwind components`**: Adds all of Tailwind's component classes (think containers, buttons, etc.).\n- **`@tailwind utilities`**: This is the big one. It injects all the utility classes like `flex`, `pt-4`, and `text-center`.\n\nThis setup is rapidly becoming the industry standard. By **2025**, Tailwind CSS has cemented its place as a go-to framework, with giants like Netflix and GitHub adopting it. Its utility-first approach helps teams build faster, and with the performance gains in version **4.0**, it’s common for projects to ship less than **10KB** of CSS. That’s a massive win for page load speeds. You can find more insights on [Tailwind's impact over at Aynsoft.com](https://aynsoft.com/tailwind-css-trends-in-2025-revolutionizing-modern-web-design/).\n\n> With your config files and CSS entry point ready, the last piece of the puzzle is telling Tailwind which files to scan for class names. This is all handled in the `content` array inside `tailwind.config.js`—a critical step for optimizing your production build.\n\n## Framework-Specific Installation Guides\n\nOne of the best things about Tailwind is how well it plays with just about any modern tech stack. While the core ideas behind installing it are always the same, the exact commands and config files will have little quirks depending on the framework you're using. Nailing these details upfront is the key to a frustration-free workflow.\n\nWe'll walk through setting up Tailwind in the most common JavaScript environments right now: Vite, Next.js, and the old standby, Create React App. My goal is to get you up and running with the right setup for your specific project.\n\n![An illustration of a laptop showing code, surrounded by interconnected application windows and documents.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/90f5b762-2f6e-4881-adbe-4722d31070c5/install-tailwind-css-development-workflow.jpg)\n\nA huge piece of the puzzle is getting the `content` paths right in your `tailwind.config.js` file. This part is absolutely non-negotiable. It’s what tells Tailwind's JIT compiler where to hunt for class names, which is critical for keeping your final CSS build as lean as possible.\n\n### Installing Tailwind with Vite (React or Vue)\n\nVite is famous for its blazing-fast development server, and thankfully, getting it to work with Tailwind is just as quick. The process is practically identical whether you're building with React or Vue.\n\nFirst, spin up a new Vite project if you don't have one. Then, you'll need to install Tailwind and its peer dependencies.\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\nThat `-p` flag is a great little timesaver. It automatically creates both your `tailwind.config.js` and `postcss.config.js` files in one go.\n\nNext, you have to tell Tailwind where your template files live. Pop open `tailwind.config.js` and update the `content` array to point to all your source files. This is how Tailwind knows where to scan for utility classes.\n\n```ts\n/** @type {import('tailwindcss').Config} \\*/\nexport default {\n  content: [\n    \"./index.html\",\n    \"./src/**/\\*.{js,ts,jsx,tsx,vue}\", // Don't forget .vue for Vue projects!\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nLast step: create your main CSS file (I usually put it at `src/index.css`) and drop in the three main Tailwind directives. Import that CSS file into your main entry point—like `main.jsx` or `main.js`—and you're good to go. For a more detailed walkthrough, our guide on how to [install Tailwind CSS in a React project](https://magicui.design/blog/install-tailwind-react) covers this from top to bottom.\n\n### Setting Up Tailwind in a Next.js Project\n\nNext.js has taken over the React world, and its support for Tailwind is top-notch. The official `create-next-app` tool even asks if you want to install it for you right out of the box.\n\nWhen you're starting a fresh project, just run the usual command:\n\nnpx create-next-app@latest my-next-project\nWhen the prompts come up, just say \"Yes\" when it asks about using Tailwind CSS. It handles literally everything—installing dependencies, creating config files, and setting up the paths correctly.\n\nIf you need to add Tailwind to an _existing_ Next.js app, the manual route is still super simple. The main difference is that you'll need to make sure your `content` path includes the `app` and `pages` directories, along with your `components` folder.\n\n> One of the most common hangups I see with Next.js is forgetting a folder in the `content` path. If your styles aren't showing up, a misconfigured `content` array is almost always the reason.\n\n### Integrating with Create React App (CRA)\n\nEven though a lot of the community has shifted to Vite, tons of projects are still built with Create React App. Unlike Next.js, CRA doesn't have a built-in Tailwind option, so you have to do it all by hand. It's still pretty painless, though.\n\nAfter you've created your project with `npx create-react-app my-app`, run the standard installation commands for Tailwind we covered earlier.\n\nThe most important part for CRA is getting the `content` array in `tailwind.config.js` to match its file structure. It should look like this:\n\n```ts\n/** @type {import('tailwindcss').Config} \\*/\nmodule.exports = {\n  content: [\"./src/**/*.{js,jsx,ts,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis kind of seamless integration is exactly why Tailwind's popularity has exploded. By **2025**, it has become the go-to choice over Bootstrap for countless developers who value its customization and performance. Because its build process only includes the classes you \\*actually\\* use, the result is a much smaller CSS file and a faster website—a massive win in today's performance-focused world.\n\n## Customizing Your Tailwind Design System\n\nOkay, so you've got Tailwind CSS installed. That's the first step. But the real magic begins when you start tweaking the `tailwind.config.js` file. Think of this file as the command center for your project's design system. It’s where you take Tailwind from a generic utility framework and mold it into something that screams _your_ brand.\n\nThis customization is what separates a site that looks like every other Tailwind site from one that's polished, unique, and professional. You can define everything from your specific brand color palette to custom fonts and spacing units, making sure every pixel aligns with your design vision.\n\n![Logos for Vite, Next.js, React, and Vue web frameworks, each with associated file setup checklists.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/bde8f8eb-01e2-40de-bdad-52cb9a7e3414/install-tailwind-css-dev-setup.jpg)\n\n### Extending vs. Overwriting Your Theme\n\nWhen you first open up `tailwind.config.js`, one of the most important concepts to get right is the difference between adding to Tailwind's defaults and completely replacing them. This all happens inside the `theme` object.\n\n- **`theme.extend`**: Use this when you want to **add** your own values without ditching Tailwind's defaults. For example, you can add a `brand-blue` to the color palette while still having access to all the built-in `blue-500`, `red-600`, etc.\n- **Directly under `theme`**: If you define something directly inside the `theme` object (like `theme: { colors: { ... } }`), you will completely **overwrite** whatever Tailwind provides by default. This is useful for super strict design systems where you _only_ want your brand's colors available.\n\nHonestly, for most projects, sticking with `extend` is the way to go. It offers the best of both worlds: your custom design tokens are there when you need them, but you still have Tailwind's massive default library as a fallback. If you want to see how a well-configured theme looks in a real project, check out these [free Tailwind CSS templates](https://magicui.design/blog/tailwind-css-templates-free).\n\n> My advice? Always start by extending the theme. I've seen developers completely overwrite keys only to run into weird issues later because a third-party plugin they installed was trying to use a default value they'd removed.\n\n### Adding Custom Colors and Fonts\n\nLet's make this practical. Say your brand uses a specific shade of purple and the \"Poppins\" font. Here’s how you’d wire that up in your config file:\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      colors: {\n        \"brand-purple\": \"#5D3BEE\",\n        \"brand-dark\": \"#1a202c\",\n      },\n      fontFamily: {\n        sans: [\"Poppins\", \"sans-serif\"],\n      },\n    },\n  },\n  plugins: [],\n}\n```\n\nOnce you save that file and your build process refreshes, you can immediately start using classes like `bg-brand-purple` and `font-sans` in your HTML. It's that seamless.\n\nThis ease of integration is a huge reason why Tailwind's popularity has exploded. As of **2025**, it sees over **20 million** weekly downloads on NPM, dwarfing Bootstrap's **4.9 million**. And with a developer retention rate in the high 70s, it’s clear that once people start customizing Tailwind, they rarely go back.\n\n### Leveraging Plugins and Variants\n\nYour customization toolkit doesn't end with colors and fonts. Tailwind's ecosystem is rich with plugins and variants that open up even more possibilities.\n\n- **Plugins**: These are fantastic for adding new sets of utilities. The official `@tailwindcss/typography` plugin, for instance, gives you beautifully styled blog posts or articles with a single `prose` class. No more manually styling every `p`, `h2`, and `ul` tag.\n- **Variants**: These let you control _when_ a utility applies. Think `hover:`, `focus:`, or even for dark mode (`dark:`). You can enable dark mode detection by simply setting `darkMode: 'class'` in your config.\n\nBy combining a custom theme, a few key plugins, and smart use of variants, you can build an incredibly sophisticated and easy-to-maintain design system that is 100% your own.\n\n## Optimizing and Troubleshooting Your Setup\n\nGetting your dev server fired up after a fresh Tailwind install is a great first step, but the job isn't quite finished. When it's time to ship to production, you need to make sure your site is lean, fast, and efficient for every single visitor. This final step is all about transforming that potentially massive development stylesheet into a tiny file that’s ready for the real world.\n\nThis is where [Tailwind's](https://tailwindcss.com/) Just-In-Time (**JIT**) compiler becomes your best friend. It’s a brilliant piece of engineering that scans all your project files—HTML, JavaScript, JSX, you name it—and finds every single utility class you've actually used. From there, it generates a CSS file containing _only_ those classes, effectively purging anything and everything you didn't use. This process can shrink your CSS from several megabytes down to just a few kilobytes.\n\n![A web browser displaying a 'Seeding Heme' interface with color palettes and theme options, alongside an abstract illustration.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5addc43c-b1ec-47fd-93cb-163c823c8d0e/install-tailwind-css-theme-settings.jpg)\n\nThis whole optimization process hinges on getting one critical piece of your configuration perfect: the `content` array in your `tailwind.config.js` file.\n\n### Perfecting Your Content Paths\n\nNailing down your `content` paths is absolutely non-negotiable for a successful production build. If a path is missing, Tailwind simply won't scan those files, and any classes inside them will be completely purged from your final CSS. The result? A perfectly good-looking site in development that appears broken and unstyled in production.\n\nA classic mistake is forgetting to include a specific folder or file extension. For instance, if you’ve neatly organized your UI components into a `src/components` directory, you have to tell Tailwind to look there.\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx}\",\n    // Add any other directories that contain Tailwind classes\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis setup instructs Tailwind to scan for any JavaScript or TypeScript files inside both the `pages` and `components` folders. My advice? Always double-check these paths before you deploy.\n\n### Solving Common Build Issues\n\nEven with a flawless setup, you can still hit a few snags. If your styles suddenly vanish or just aren't updating as you code, it’s usually one of a few common culprits.\n\nHere’s a quick mental checklist I run through when things go wrong:\n\n- **Is the build process actually running?** The JIT compiler needs to be active and watching for your file changes. Make sure your `npm run dev` (or whatever script you use) is still chugging along in your terminal.\n- **Are your `@tailwind` directives in place?** Your main CSS entry file absolutely _must_ have `@tailwind base;`, `@tailwind components;`, and `@tailwind utilities;`. Without them, Tailwind has nowhere to inject its styles.\n- **Is another library causing a conflict?** Sometimes, a different UI library or an old-school global stylesheet can override Tailwind’s classes. Pop open your browser's dev tools, inspect the element in question, and see if there are conflicting CSS rules at play.\n\n> Honestly, the most frequent issue I run into is a simple typo in a class name. Since Tailwind generates nothing for incorrect classes, typing `bg-blac` instead of `bg-black` will fail silently. You’ll be left scratching your head, wondering why your styles aren't applying. Always, always check for typos first—it can save you an hour of debugging.\n\n## Common Questions About Installing Tailwind CSS\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/aSlK3GhRuXA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nEven with a step-by-step guide, you're bound to run into a few tricky spots. It happens to everyone. Let's walk through some of the questions I see pop up all the time so you can get past any roadblocks and back to building.\n\n### Can I Use Tailwind CSS Without a Build Step?\n\nYou absolutely can, especially if you're just kicking the tires or spinning up a quick prototype. The **Tailwind Play CDN** is fantastic for this. All you need is a single `<script>` tag in your HTML, and you can start slinging utility classes right away—no setup required.\n\nBut—and this is a big but—for any real project that's going live, a build process is non-negotiable. That's the magic that enables critical optimizations like purging unused CSS, which drastically cuts down your final file size. It's also how you unlock the full power of `tailwind.config.js` to truly make the framework your own.\n\n### Why Are My Custom Styles Not Working?\n\nIf you find your styles aren't showing up, I'd bet it's a configuration issue. Nine times out of ten, the problem lies within the `content` array in your `tailwind.config.js` file.\n\n> The most common mistake is providing an incorrect file path. If the path is wrong, Tailwind's JIT compiler isn't scanning the files where you're actually using the classes. When that happens, it assumes those classes aren't needed and purges them from the final build.\n\nTo get things working again, you'll need to make sure your paths are pointing to every single template file where you might add a class.\n\n- **Check your file extensions:** Did you include everything you're using? Think `.{js,jsx,ts,tsx,vue}`.\n- **Verify the folder paths:** Double-check that all directories containing your pages, components, and layouts are listed correctly.\n- **Confirm your build process is running:** Make sure your dev server is active and actually watching for file changes. A quick restart often helps.\n\n### How Do I Add a Custom Font Family?\n\nGetting a custom font into your project is a straightforward two-part process. You just need to link the font in your CSS and then tell Tailwind about it.\n\nFirst things first, you need to import the font into your main CSS file. Using `@import` for a service like [Google Fonts](https://fonts.google.com/) is a super common and easy way to do this.\n\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap');\n\nWith the font imported, pop open your `tailwind.config.js` and extend the `theme.fontFamily` object. This step registers your new font with Tailwind and gives it a name you can reference with a utility class.\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      fontFamily: {\n        sans: [\"Inter\", \"sans-serif\"],\n      },\n    },\n  },\n}\n```\n\nAnd that's it! Now you can apply your beautiful new font anywhere in your project just by using the `font-sans` class.\n\n---\n\nReady to build beautiful, responsive landing pages in minutes? With **Magic UI**, you get access to over **150** free, open-source animated components and premium templates built with Tailwind CSS. [Explore Magic UI today and see what you can create](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/install-tailwind-react.mdx",
    "content": "---\ntitle: \"How to Install and Configure Tailwind CSS in React and Typescript [Updated 2024]\"\ndescription: \"Learn how to install and configure Tailwind CSS in React and Typescript with this comprehensive guide.\"\nimage: https://cdn.magicui.design/assets/ae030c2c-427f-4ccf-8050-8a9d44c1d7d8.png\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\npublishedOn: \"2024-06-01\"\nfeatured: false\n---\n\nI used to juggle around 100 different CSS files for all my projects. Each had a unique name, and maintaining them was a nightmare. Then, I discovered Tailwind CSS. The standardized style names were a dream to work with. Plus, their beautifully designed site didn't hurt either.\n\nAre you struggling with CSS chaos in your React and TypeScript projects? You're not alone.\n\nIn this updated guide, I'll show you how to install and configure Tailwind CSS in a React and TypeScript setup. We'll cover everything from initializing your project to optimizing your Tailwind and TypeScript setup.\n\nReady to transform your workflow? Let's dive in!\n\n## Getting Started: Setting Up Your React and Typescript Project\n\nFirst, let's initialize a new React project using Create React App with the TypeScript template. Open your terminal and run the following command:\n\n```javascript\n    npx create-react-app my-tailwind-app --template typescript\n```\n\nThis command will set up a new React project with TypeScript pre-configured. The process may take a few minutes.\n\n![Console output from creating the React project](https://cdn.magicui.design/assets/vrszx8yz95j.png)\n\nOnce it's done, navigate to your project directory:\n\n```javascript\n    cd my-tailwind-app\n```\n\nNext, ensure you have all the necessary dependencies installed. Create React App already includes React and React-DOM, but it's good practice to check for updates:\n\n```javascript\n    npm install react react-dom typescript @types/react @types/react-dom\n```\n\nNow you are good to run your development server with:\n\n```javascript\n    npm run start\n```\n\nYour browser should open up, and the sample React page should show http://localhost:3000.\n\nNow that we have React going, let's set up Tailwind next.\n\n---\n\nSee related:\n\n- [How to create responsive Typography with React and Tailwind](/blog/tailwind-font-size)\n- [How to create a grid layout in Tailwind with React](/blog/tailwind-css-grid)\n\n## Installing Tailwind CSS: Quick and Easy Steps\n\nTo get Tailwind CSS up and running, you need to install it along with its peer dependencies. Run the following command:\n\n```javascript\n    npm install tailwindcss postcss autoprefixer\n```\n\nPostCSS lets Tailwind generate CSS using JS code. This is really handy because you as the Developer can specify custom rules and configurations to your Tailwind setup and get exactly the right utility classes built for you at runtime.\n\nAutoPrefixer applies vendor prefixes like `webkit-` and `-moz-` given a CSS file. This way you can be sure that your CSS is compatible cross-browser.\n\nNext, create and configure the Tailwind configuration files. This file will allow you to customize Tailwind to suit your project's needs.\n\n```javascript\n    npx tailwindcss init -p\n```\n\nThis command will create two new files in your project root: `tailwind.config.js` and `postcss.config.js`.\n\nEdit the `tailwind.config.js` to include:\n\n```javascript\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\"./src/**/*.{js,jsx,ts,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nNow, include Tailwind in your CSS by importing it into your main CSS file. Open `src/index.css` and replace its contents with:\n\n```\n    @tailwind base;\n    @tailwind components;\n    @tailwind utilities;\n```\n\nThis will import Tailwind’s base styles, components, and utility classes into your project.\n\nTo make sure it's included for our entire project, import it into the `App.tsx` like so:\n\n```javascript\nimport \"./index.css\"\n```\n\nNow we're ready to start playing around with Tailwind. About time right?\n\n## Create your first React component with React\n\nLet's test out our Tailwind setup and make it work. Create a new file in `components/Card.tsx`\n\n```javascript\nimport { FC } from \"react\";\nconst Card: FC<any> = () => {\n  return (\n    <div className=\"max-w-sm rounded overflow-hidden shadow-md bg-white\">\n      <div className=\"px-6 py-4\">\n        <div className=\"font-bold text-xl mb-2\">Mountain Sunset</div>\n        <p className=\"text-gray-700 text-base\">\n          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatibus\n          quia, nulla! Maiores et perferendis eaque, exercitationem praesentium\n          nihil.\n        </p>\n      </div>\n      <div className=\"px-6 pt-4 pb-2\">\n        <span className=\"inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2\">\n          #photography\n        </span>\n        <span className=\"inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2\">\n          #travel\n        </span>\n        <span className=\"inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mb-2\">\n          #winter\n        </span>\n      </div>\n    </div>\n  );\n};\nexport default Card;\n```\n\nNow, we can import this into the `App.tsx` file:\n\n```javascript\nimport \"./App.css\"\n\nimport Card from \"./components/Card\"\n\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex h-screen w-full flex-col items-center justify-center bg-gray-100\">\n      <Card />\n    </div>\n  )\n}\nexport default App\n```\n\nStart the server with `npm run start` and verify that your screen looks like below.\n\nIf yes - Congratulations! You've successfully set up Tailwind CSS for your React project. If you're running into issues, try going back to the first step to make sure you're not missing something.\n\n![A card built using Tailwind CSS](https://cdn.magicui.design/assets/kxe4a5bo3v.png)\n\n## Optimizing Your Tailwind Setup for Production\n\nTailwind typically creates many utility classes for all the available CSS properties under the hood. This is great for a Development run but not so much for a Production build since every byte sent over the wire that isn't needed is entirely wasted.\n\nWell, Tailwind lets you purge all the unused CSS so you can ship your project without any extra bloat.\n\nTo set this up, edit your `postcss.config.js` with:\n\n```javascript\nmodule.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n    ...(process.env.NODE_ENV === \"production\"\n      ? {\n          cssnano: {},\n        }\n      : {}),\n  },\n}\n```\n\nThis will purge your Tailwind classes but only in Production. In Dev, you keep all of them to make it easier to play around with styling.\n\n## Next Steps\n\nNow that you know how Tailwind works (and how much better than vanilla CSS it is), you can start migrating all your vanilla CSS with Tailwind utility classes. There's even a great [CSS to Tailwind converter tool here](https://transform.tools/css-to-tailwind) that makes this an easy job.\n"
  },
  {
    "path": "apps/www/content/blog/installing-tailwind-css.mdx",
    "content": "---\ntitle: A Developer's Guide to Installing Tailwind CSS\ndescription: >-\n  Master installing Tailwind CSS in any project with this complete guide. Learn\n  the CLI, framework-specific setups for React, Next.js, and more.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-7861b676-1e4f-4d26-a5f6-c333b17d5d19.jpg\nauthor: Dillion Verma\ntags:\n  - installing tailwind css\n  - tailwind css\n  - css frameworks\n  - frontend development\n  - react mdx\npublishedOn: \"2025-11-13T09:32:18.040657+00:00\"\nfeatured: true\n---\n\nDeciding to install Tailwind CSS is more than just adding another tool to your stack; it's a strategic shift toward a utility-first way of thinking. This approach completely changes how you build user interfaces, making the process faster and far more consistent. It also comes with a huge performance benefit: your final CSS bundle is tiny because Tailwind automatically purges any styles you don't actually use.\n\n## Why You Should Install Tailwind CSS\n\nBefore we dive into the setup commands, it's worth taking a moment to appreciate what makes Tailwind so effective. It’s not just another library—it's a fundamentally different approach to styling that puts speed, consistency, and long-term maintainability first.\n\nThe core idea is simple: you build complex, custom components by composing them from a constrained set of low-level utility classes. Instead of dreaming up a new className for a card component and then writing a bunch of custom CSS, you build it right in your HTML. You'd use classes like `p-4`, `shadow-md`, and `rounded-lg` to get the job done. This keeps you from inventing arbitrary names and one-off values, which naturally leads to a more predictable and scalable design system.\n\n### The Growth and Adoption of Tailwind\n\nTailwind's explosion in popularity is no accident. Its practical, real-world benefits have fueled its incredible adoption curve. By early 2025, Tailwind CSS was hitting over **20 million weekly downloads** on npm, blowing past established players like Bootstrap.\n\nBut downloads only tell part of the story. The developer retention rate, which hovers in the high **70%** range, is even more telling—it shows that once developers try Tailwind, they tend to stick with it for the long haul.\n\nThis infographic gives you a quick look at the metrics behind Tailwind's impressive growth in the developer community.\n\n![Infographic about installing tailwind css](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/86ae2a89-226f-4f51-8729-5289727d78bc.jpg)\n\nThese numbers don't just point to a fad; they show genuine developer satisfaction and make a strong case for bringing it into your own projects.\n\n> When you switch to a utility-first framework, you stop fighting with CSS specificity and start spending more time actually building. Your HTML becomes the single source of truth for styling, which makes your components much easier to read, refactor, and maintain down the line.\n\nIn the ever-evolving world of front-end work, picking the right tools is critical. Understanding the landscape of the [best frameworks for web development](https://getnerdify.com/blog/best-frameworks-for-web-development) helps put Tailwind's role in context. If you're already building with components, pairing it with a [Tailwind CSS component library](https://magicui.design/blog/tailwind-css-component-library) can make you even more productive.\n\n## Setting Up Your Development Environment\n\nBefore you even think about writing a single command to install Tailwind CSS, you need to get your house in order. A properly set up development environment is the unsung hero of a smooth project, helping you sidestep those frustrating errors that can pop up right at the start. Think of it as your pre-flight check.\n\n![A developer's desk with a laptop displaying code, signifying a development environment setup.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/93953e31-b86d-4db3-b5d6-f36f6ecb1c43.jpg)\n\nFirst things first: you absolutely need **Node.js** and **npm** (the Node Package Manager). Tailwind's powerful command-line interface (CLI) and its whole ecosystem of plugins run on the Node.js runtime. Without these two, you’re dead in the water—you can't install Tailwind or manage its dependencies.\n\nPop open your terminal and run these two quick commands to see if you have them installed:\n\nnode -v\nnpm -v\n\nIf your terminal spits back version numbers (something like `v20.11.0`), you're all set. If you get an error, you'll need to [install Node.js](https://nodejs.org/), which conveniently includes npm right out of the box. My advice? Always grab the latest **LTS** (Long-Term Support) version. It’s the sweet spot for stability and compatibility.\n\n### Structuring Your Project Folder\n\nWith the essentials installed, it's time to create a home for your project. A clean, logical folder structure is a lifesaver, especially as your project scales. You don't need anything fancy to begin with.\n\nFor a simple project, I usually start with a structure like this:\n\n- **/public**: This is where your public-facing files will go. Think `index.html` and, most importantly, the final compiled `output.css` file.\n- **/src**: This is your workshop. It holds all your source files, including the `input.css` where you'll be adding Tailwind's directives.\n\nThis separation is more than just good housekeeping; it's a critical practice. It draws a clear line between the files you work on and the optimized, production-ready files served to your users. The `input.css` is for you, the developer. The `output.css` is the final build artifact for the browser.\n\n> A clean separation between source (`src`) and distribution (`public` or `dist`) folders isn't just a best practice—it's essential for automating your build process. It tells your tools exactly what to process and where to place the final output, preventing messy and unpredictable builds.\n\n## Installing Tailwind CSS with the CLI\n\nWhen you're ready to get serious with Tailwind CSS, the CLI is the way to go. It's the most direct and flexible method, giving you total control over the build process. This hands-on approach is perfect for understanding how Tailwind works under the hood, and it scales from a single HTML file to a massive JavaScript application.\n\nFirst things first, let's get Tailwind and its essential companions into your project. Pop open your terminal in the project's root folder and run this:\n\nnpm install -D tailwindcss postcss autoprefixer\n\nThis single command pulls in three crucial development dependencies:\n\n- **tailwindcss**: This is the core engine—the tool that scans your files and builds your CSS.\n- **postcss**: A powerful tool that transforms CSS with JavaScript. Tailwind is actually a [PostCSS](https://postcss.org/) plugin itself.\n- **autoprefixer**: This handy PostCSS plugin automatically adds vendor prefixes to your CSS, saving you the headache of ensuring cross-browser compatibility.\n\nWith the packages installed, the next step is to generate your configuration files. Think of these as the brains of your Tailwind setup.\n\nnpx tailwindcss init -p\n\nRunning that command magically creates two files in your project:\n\n1.  **tailwind.config.js**: This is your command center for customization. Here you'll define your unique color palette, tweak spacing, set up fonts, and much more.\n2.  **postcss.config.js**: This file is pre-configured to tell PostCSS to use Tailwind and Autoprefixer. You usually don't need to touch this one.\n\n### Configuring Your Template Paths\n\nAlright, this next part is the most critical step of the entire process. Seriously. If you get this wrong, Tailwind will generate an empty CSS file, and you'll be left scratching your head. You need to tell Tailwind _where_ to look for your className names.\n\nOpen up your `tailwind.config.js` file and find the `content` array. You need to add paths to every single file that might contain a Tailwind class—HTML files, JavaScript components, you name it.\n\n```ts\n/** @type {import('tailwindcss').Config} \\*/\nexport default {\n  content: [\"./public/**/_.html\", \"./src/\\*\\*/_.{js,jsx,ts,tsx,vue}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis example uses \"glob patterns\" to find any `.html` files in the `public` folder and a variety of component files inside `src`. Make sure you adjust these paths to match your project's actual folder structure.\n\n### Setting Up Your Source CSS\n\nNow that Tailwind knows where to look, you need to give it an entry point—a source CSS file where it can inject its core styles.\n\nGo into your `src` folder (or wherever you keep your source code) and create a file. Let's call it `input.css`. Inside this new file, add these three special `@tailwind` directives.\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n> These aren't standard CSS; they're special instructions for Tailwind. `base` injects helpful browser resets, `components` handles component-level classes, and `utilities` is the magic that brings in all the utility classes like `p-4` and `flex`.\n\nWhile the CLI is fantastic for production builds, it's not the only way to use Tailwind. If you're just prototyping or learning, a simpler setup might be better. To see a lighter-weight approach, check out our guide on [using the Tailwind CDN with plain HTML](https://magicui.design/blog/tailwind-cdn-html).\n\n### Running the Build Process\n\nWe're in the home stretch! With everything configured, the final step is to kick off the CLI build process. This command will take your `input.css`, scan your template files, and compile a final, optimized stylesheet.\n\nnpx tailwindcss -i ./src/input.css -o ./public/output.css --watch\n\nLet's quickly break down what's happening here:\n\n- **-i ./src/input.css**: The **input** flag points to your source CSS file.\n- **-o ./public/output.css**: The **output** flag defines where the final, compiled CSS file should be saved.\n- **--watch**: This little flag is a lifesaver during development. It tells the CLI to continuously watch your files for changes and automatically rebuild your CSS anytime you save.\n\nOnce that's running, all you have to do is link to the `output.css` file in your main `index.html`. Go ahead and add a few Tailwind classes to your HTML, and watch them spring to life in the browser.\n\n## Framework-Specific Installation Guides\n\nWhile the Tailwind CLI gives you a universal way to get started, the truth is, most of us are building within a specific JavaScript framework. Every environment, whether it's **React**, **Next.js**, or **Vue**, has its own unique build tools and project structure.\n\nThis means that getting Tailwind up and running often requires a few framework-specific tweaks. Nailing these details from the get-go will save you a ton of headaches and debugging time down the line.\n\n![A collage of framework logos like React, Vue, Svelte, and Next.js, indicating a guide for each.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c0bdba7e-11c2-4b15-a87e-cd2f2983ddc6.jpg)\n\nThis guide will walk you through the most efficient way to integrate Tailwind with the most popular frameworks out there. We'll cover everything from installing dependencies to tweaking the necessary config files. The goal is simple: get you up and running fast, no matter your tech stack.\n\nIf you're still deciding on a framework, it can be helpful to see a comparison of [how to choose between popular JavaScript frameworks like React and Angular](https://www.cleffex.com/blog/react-vs-angular/) to figure out what best fits your project's goals.\n\nThe initial installation commands for each framework are quite similar, which simplifies the process. Here’s a quick look at what you can expect.\n\n### Framework Installation Command Comparison\n\n| Framework        | Primary Installation Command                      |\n| :--------------- | :------------------------------------------------ |\n| **React + Vite** | `npm install -D tailwindcss postcss autoprefixer` |\n| **Next.js**      | `npm install -D tailwindcss postcss autoprefixer` |\n| **Vue.js**       | `npm install -D tailwindcss postcss autoprefixer` |\n\nAs you can see, the core dependencies are identical across the board. The real differences pop up in the configuration files, which we'll dive into now.\n\n### Installing Tailwind In A React And Vite Project\n\n[Vite](https://vitejs.dev/) has quickly become a developer favorite for bootstrapping React apps, mostly thanks to its incredible speed. Luckily, integrating Tailwind into a Vite-powered React project is a clean, straightforward process.\n\nYou'll start by installing Tailwind and its peer dependencies, then generate the config files. These commands are the exact same ones you'd use in a standard CLI setup.\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\nThe real key is modifying your `tailwind.config.js`. You need to point the `content` array to your **JSX** and **TSX** files so Tailwind’s JIT compiler knows where to look for utility classes.\n\n```ts\n// tailwind.config.js\n/** @type {import('tailwindcss').Config} \\*/\nexport default {\n  content: [\"./index.html\", \"./src/**/\\*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nLastly, create a main CSS file (something like `src/index.css`) and drop in the three core Tailwind directives. Just make sure to import this CSS file at the very top of your main entry point, which is usually `src/main.jsx`.\n\nFor a more detailed walkthrough, check out our guide on how to [install Tailwind CSS in a React project](https://magicui.design/blog/install-tailwind-react).\n\n### Setting Up With Next.js\n\n[Next.js](https://nextjs.org/) is another perfect match for Tailwind, especially with its file-based routing and server-side rendering. The best part? The official `create-next-app` CLI gives you a built-in option to include Tailwind from the very beginning. This is, by far, the easiest way to do it.\n\nBut if you're adding Tailwind to an _existing_ Next.js project, the process is nearly identical to the Vite setup. You'll install the same dependencies and generate the config files.\n\nThe only significant difference is the `content` path in `tailwind.config.js`. You’ll want to configure it to scan the `pages`, `components`, and `app` directories commonly found in Next.js apps.\n\n```ts\n// tailwind.config.js\n/** @type {import('tailwindcss').Config} \\*/\nmodule.exports = {\n  content: [\n    \"./pages/**/_.{js,ts,jsx,tsx,mdx}\",\n    \"./components/\\*\\*/_.{js,ts,jsx,tsx,mdx}\",\n    \"./app/\\*_/_.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nOnce that's configured, just add the `@tailwind` directives to your `globals.css` file and make sure it’s imported in your `_app.js` or `layout.js` file.\n\n> **Pro Tip:** When using Tailwind with component-based frameworks, treat your utility classes like a local styling API. Instead of creating separate CSS files for each component, apply styles directly in the markup. This makes your components self-contained and much easier to move around or reuse.\n\n### Integrating With Vue.js\n\nFor all the [Vue.js](https://vuejs.org/) developers out there, the process is just as smooth. After running the standard installation and initialization commands, your focus will again be on the `tailwind.config.js` file.\n\nThe goal is to make sure it's scanning all your `.vue` files, along with any other HTML or JavaScript files in your project. A typical configuration for a Vue project will look something like this:\n\n- **Content Path:** `'./index.html'`\n- **Component Path:** `'./src/**/*.{vue,js,ts,jsx,tsx}'`\n\nWith that set up, add the `@tailwind` directives to your main CSS entry point (often found at `src/assets/main.css`) and import that file into `src/main.js`. This makes Tailwind's styles available globally to all of your single-file components.\n\nAs you can see, the core pattern is consistent across frameworks. The only thing that really changes is telling Tailwind which files to watch.\n\n## Customizing Your Tailwind Configuration\n\nGetting Tailwind installed is really just the first step. The real power, the thing that turns Tailwind from a generic utility library into _your_ design system, lives inside the `tailwind.config.js` file. This is where the magic happens.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/cXSMjLsF1yM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nThink of the default theme as a fantastic starting point—a solid foundation. But your project has its own identity. It has a unique color palette, specific fonts, and a precise spacing scale that makes your brand recognizable. By tweaking your configuration file, you're essentially teaching Tailwind about these custom design tokens. Once you do, they become available as utility classes you can use anywhere.\n\n### Extending The Default Theme\n\nYou don't have to throw the baby out with the bathwater. The `theme.extend` object is your best friend for adding your own flavor while keeping Tailwind's excellent defaults intact. This is the way to go when you just need to augment the existing system, not completely replace it.\n\nFor instance, here’s how you might add a couple of custom brand colors and a new display font:\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      colors: {\n        \"brand-primary\": \"#0A74DA\",\n        \"brand-secondary\": \"#F6C90E\",\n      },\n      fontFamily: {\n        sans: [\"Inter\", \"sans-serif\"],\n        display: [\"Poppins\", \"sans-serif\"],\n      },\n    },\n  },\n  plugins: [],\n}\n```\n\nJust like that, you can start using classes like `bg-brand-primary` or `font-display` right in your markup. This is how you enforce consistency and stick to your design specs, which is a huge step up from a basic installation.\n\n> The ability to extend the theme is what makes Tailwind so scalable. You can start with the defaults for rapid prototyping and then gradually introduce custom tokens as your design system matures, all without breaking your existing work.\n\n### Using Plugins For New Utilities\n\nSooner or later, you'll run into a situation where you need utilities that aren't part of the core framework. That's what plugins are for. [Tailwind CSS](https://tailwindcss.com/) has a rich ecosystem of official and community-built plugins that bolt on new capabilities with minimal fuss.\n\nA classic example is the official typography plugin. It's a lifesaver for styling blocks of prose—think blog posts or articles—with beautiful, sensible defaults. Getting it set up is a breeze.\n\nFirst, you'll need to install the package:\n\n`npm install -D @tailwindcss/typography`\n\nThen, just require it inside the `plugins` array in your config file.\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  // ...\n  plugins: [require(\"@tailwindcss/typography\")],\n}\n```\n\nNow, just by adding a single `prose` className to any container of raw HTML, it will be beautifully styled from top to bottom. This modular approach is great because it keeps your main configuration file clean and makes it simple to add or remove features as your project's needs change.\n\n## Common Tailwind Installation Questions\n\nEven with a perfect setup, installing Tailwind CSS can sometimes throw you a curveball. We've all been there: a small typo in a config file or a slight misunderstanding of the build process can lead to moments of pure frustration. Let's dig into some of the most common issues developers run into so you can get back to building.\n\n![An illustration of a question mark surrounded by code symbols, representing common installation questions.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/38d28c79-8027-41ea-aa20-7d1c591b8ec1.jpg)\n\n### Why Are My Custom Styles Not Showing Up?\n\nThis is easily the number one problem people face. You’ve added a bunch of classes to your HTML, you hit save, you refresh the page, and... nothing. Crickets.\n\nNine times out of ten, the culprit is the `content` array in your `tailwind.config.js` file.\n\nThis little array is a big deal—it tells Tailwind's JIT (Just-In-Time) compiler exactly which files to scan for class names. If your file paths are wrong or you've forgotten to add a new folder, Tailwind simply won't \"see\" the utility classes you're trying to use. The result? It doesn't generate the CSS for them.\n\nThe fix is usually simple:\n\n- Double-check your glob patterns. Make sure they accurately point to all your template files (HTML, JSX, Vue, Svelte, etc.).\n- Restart your build process after saving the config file. This ensures the compiler picks up the new paths.\n\nIf your paths are definitely correct and styles are _still_ missing, here are a few other things to check:\n\n- **Is Your Build Process Running?** Take a peek at your terminal. Is the CLI command with the `--watch` flag still active? If not, Tailwind isn't watching for your changes and won't recompile your CSS.\n- **Could It Be Your Browser Cache?** Browsers love to hang onto old stylesheets. A hard refresh (**Ctrl+Shift+R** on Windows or **Cmd+Shift+R** on Mac) forces it to grab the latest version and often solves the problem instantly.\n- **Did You Import the CSS File Correctly?** Make sure your main CSS file—the one with the `@tailwind` directives—is properly imported into your project's entry point, like `main.jsx` in a React app or your root layout file.\n\n### How Do I Add Tailwind to an Existing Project?\n\nDropping Tailwind into a project that already has a bunch of custom CSS can feel a bit like performing surgery. You want to add the new stuff without breaking everything that already works. The installation process itself is the same, but you need a smart integration strategy.\n\nThe best way I've found to do this is to start small. Use Tailwind for **new components only**, leaving your old stylesheets and components as they are for now. Over time, as you touch different parts of the app, you can refactor existing components to use Tailwind utilities.\n\nThis \"phased approach\" lets you adopt Tailwind gradually without the pressure of a massive, all-at-once rewrite. It makes the transition much more manageable.\n\n> A key tip for this process is to prevent Tailwind's base styles (called Preflight) from clashing with your existing CSS. You can easily disable them by adding `preflight: false` to the `corePlugins` object in your `tailwind.config.js` file. This gives you way more control.\n\n---\n\nReady to build stunning, production-ready interfaces without the hassle? **Magic UI** offers a massive library of over **150** free and premium components built with React, Typescript, and Tailwind CSS. Accelerate your development and create beautiful landing pages in minutes. [Explore Components on Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/interactive-landing-page.mdx",
    "content": "---\ntitle: \"The Ultimate Guide On Creating An Interactive Landing Page\"\ndescription: \"Learn how to create an engaging interactive landing page that captures attention and boosts conversions in our ultimate guide.\"\nimage: https://cdn.magicui.design/assets/7vafunwy4aw.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nReady to create a landing page that captivates your audience from the start? Interactive landing pages bring your online presence to life with every click, scroll, and hover. Learn how to design these engaging pages and watch your engagement rates soar using these [landing page examples](https://magicui.design/blog/landing-page-examples).\n\nMagic UI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup) simplifies crafting dynamic, visitor-friendly pages. With Magic UI, transform dull, static pages into vibrant, interactive experiences that keep your audience coming back for more.\n\n## What Is an Interactive Landing Page?\n\n![Interactive Landing Page](https://cdn.magicui.design/assets/f54yjd4ueib.jpg)\n\nAn interactive landing page is designed to engage users through various interactive elements, guiding them toward a specific action or goal. Unlike traditional landing pages, which may present information and include a call-to-action button, interactive landing pages incorporate dynamic features like:\n\n- Animations\n- Micro-interactions\n- User-driven experiences\n\n### The Evolution of Landing Pages\n\nThese elements create a more engaging and immersive experience for visitors. Traditionally, the term landing page refers to the homepage of a website. But since the early 2000s, it has become a standalone page tailored for a specific marketing objective. Today’s interactive landing pages go beyond these early designs. They use engaging elements to capture attention and encourage visitors to interact more deeply with the content. This could involve:\n\n- Interactive forms\n- Animated visuals\n- Interactive infographics\n\n### Engaging Visitors with Interactive Elements\n\nThese make the page more visually appealing and guide users toward desired actions, such as:\n\n- Subscribing to a newsletter\n- Downloading resources\n- Signing up for a free trial\n\nBy incorporating these interactive features, landing pages can better:\n\n- Hold visitors’ attention\n- Increase the time they spend on the page\n- Effectively drive them to complete the intended action\n\nThe goal is to create a more engaging and compelling experience that reinforces key messages and boosts conversion rates.\n\n## What Are the Benefits of an Interactive Landing Page?\n\n![Interactive Landing Page](https://cdn.magicui.design/assets/84i0pzyrayx.jpg)\n\nAn interactive landing page design is essential for a flourishing business. Interactive landing pages that aren’t compelling enough will not convert visitors into leads and eventually into paying customers, resulting in an increased bounce rate. To be safe, the top priority is to invest in making landing pages interactive, which is why marketing managers are inoculating micro-interactions.\n\nAccording to recent surveys:\n\n- Approximately 81% of digital marketers say their ability to stand out from the competition results from interactive content.\n- It has been reported that 93% of B2B companies say that interactive content [effectively increases conversion rates](https://www.linkedin.com/pulse/93-b2b-marketers-say-interactive-content-effective-heres-teicher/).\n- About 79% of marketers believe that interactive content has reusable elements.\n- FedEx saw an [82% increase in month-over-month revenue](https://rockcontent.com/cases/fedex-case-study/) after adding a freight shipping calculator to its landing page, along with other interactive tools.\n- [BloomReach achieved a 70% conversion](https://rockcontent.com/cases/bloomreach-case-study/) rate with an engaging quiz.\n\n### Reasons Why Interactive Content Converts Directly\n\n#### Increases Engagement\n\n[Engagement nurtures trust](https://contentmarketinginstitute.com/articles/interactive-content-research/) between your product and its visitors. Interactive content increases the chances of converting fully engaged visitors into customers. Interactive landing pages actively involve your viewers, causing them to appreciate your brand’s goals and make a purchase.\n\nVisitors who engage with your webpage:\n\n- Spend more time on it\n- Absorb the information\n- Perceive your brand message\n\nInteractive features keep visitors interested and enhance the possibility that they’ll buy your products, helping you create a solid relationship. Various interactions that enhance engagement include:\n\n- Clicking\n- Scrolling\n- Playing with landing page elements\n\n#### Educates Users\n\nInteractive content tells your stories through user participation. Visitors get to do something instead of just reading on-screen text:\n\n- Explore\n- Learn\n- Test\n- Receive immediate feedback\n\n#### Provides Freshness\n\nInteractive landing pages infused with your brand’s personality create an experience no other can offer. They set you apart from your competitors and help the company to:\n\n- Differentiate itself from its numerous competitors\n- Add originality to your service offerings\n- Build trust with your audience\n- Position your company as a top-tier service provider in your sector\n\n### Elevate Your Web App with MagicUI: Free Animated Components and Pro Templates\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers.\n\n#### MagicUI Component Features\n\n- Over 20 animated components were built using React, TypeScript, Tailwind CSS, and Framer Motion.\n- Visually appealing and interactive elements are easily integrated into web applications.\n- Enables the creation of stunning user interfaces with minimal effort.\n- Highly customizable components to match branding and design requirements.\n- You can save thousands of hours create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nUse MagicUI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 7 Interactive Landing Page Design Techniques\n\n![Interactive Landing Page](https://cdn.magicui.design/assets/0shq8jo7604g.jpg)\n\n### 1\\. Animations\n\nAnimations work well on interactive landing page designs like:\n\n- Enhance designs on desktop platforms\n- Make graphics, typography, and photos feel less static\n- Add subtle movement and visual interest\n\nAnimation is initiated when users hover over a target element, triggering a gentle interaction.\n\n#### Effective Use of Animations in Landing Pages\n\n- Draw attention to key elements like CTA buttons and linked text.\n- Magic UI's animated component library offers visually appealing, interactive elements.\n- Easily integrate these components into web applications.\n- Create stunning user interfaces with minimal effort.\n\n### 2\\. 3D Elements\n\nYou can enhance any interactive landing page design with 3D objects. This is an exciting way to present key graphics and information and offers a playful way for users to consume more information. Bringing instant “wow factor” to any design, 3D elements also make your landing page more memorable—when going up against the vast competition, this is the goal!\n\n### 3\\. Explainer Videos\n\nExplainer videos are among the tried (and tested) ways to engage visitors and convert. Videos establish trust and credibility and explain complex subjects better than bland text-based landing pages.\n\n### 4\\. Quizzes\n\nQuizzes provide an interactive way to get leads and filter them. Based on the answers, they help you offer custom solutions. Quizzes can be entertaining and helpful depending on what you do with them and how you implement them.\n\n### 5\\. Image Comparison Sliders\n\nThe benefits of an image comparison slider:\n\n- Allows users to click and drag to view two states of an image\n- Perfect for “before/after” storytelling\n- Showcases product or service differences effectively\n- Enhances user experience by allowing readers to interact and see results firsthand\n\nWriting isn’t enough these days—you need to help readers experience it for themselves, and this is a great design technique for doing so.\n\n### 6\\. Multi-Step Forms\n\nRemember when we said that today’s digital visitors will likely get distracted and bounce off your page? A long, tedious, impersonal form-fill can make it become a reality. That’s why multi-step forms can be a fantastic interactive element for a landing page. A multi-step form takes longer and separates it into smaller parts, increasing the chances a user will participate.\n\n### 7\\. Surveys\n\nCustomers like to know that their opinion is valued. If they are dissatisfied with their voice, customers want the opportunity to voice it and feel that they are truly being listened to.\n\n#### Enhancing Customer Engagement with Interactive Surveys\n\n- Demonstrate that customer opinions are valued.\n- Provide a platform for customers to voice dissatisfaction and feel heard.\n- Boost conversions by allowing visitors to participate and share thoughts.\n- Show customers you value their input with targeted surveys.\n\n## 6 Best Interactive Landing Page Examples\n\n![Interactive Landing Page](https://cdn.magicui.design/assets/p3iytylwdk.jpg)\n\n### 1\\. Langfuse\n\nLangfuse is a tech startup designed to enhance observability for AI applications, particularly those using large language models (LLMs). It integrates seamlessly with existing AI models to provide detailed insights into their performance, helping developers understand and improve their AI systems.\n\n#### Langfuse's MagicUI Landing Page\n\nLangfuse builds its landing page using Magic UI. Magic UI's animated components make the page engaging, and its clean design maintains a 1:1 attention ratio. Once you land on the page, the animated video in the header section and the shimmering buttons are worth noticing.\n\n### 2\\. Cognosys\n\nCognosys is a platform that leverages advanced artificial intelligence to enhance business operations and decision-making. It integrates various AI capabilities to provide:\n\n- Comprehensive data analysis\n- Automation\n- Predictive insights solutions\n\nThe platform is designed to help organizations:\n\n- [Optimize their workflows](https://magicui.design/showcase/cognosys)\n- Improve efficiency\n- Gain valuable insights from their data\n\nTheir landing page leverages Magic UI's capabilities to efficiently deliver interactive and customizable interfaces. The page is incredibly dynamic, and lots of animations and effects give the impression of action.\n\n### 3\\. Wise\n\nWise (earlier TransferWise) is a service for transferring money worldwide.\n\n#### Landing Page Features\n\n- Cost Transparency: Directly addresses the primary objection of cost.\n- Interactive Calculator: Provides real-time transaction fee calculations.\n- Video Demonstration: A large click-to-play button showcases the setup and transfer process.\n\n### 4\\. Landbot\n\nLandbot is a no-code conversational chatbot builder. Its landing page tells what it does, i.e., personalizing client journeys in real-time. But it also goes one step further by showing how. A conversational module is built right on the interface for visitors to interact. So, if you’re looking for conversational landing page inspiration, Landbot is the go-to.\n\n### 5\\. Adobe x Bowie\n\nThis interactive landing page design from Adobe is one of the most unique examples we’ve come across. Adobe x Bowie is a marketing tool to promote Adobe’s collaboration with the Bowie brand—or legacy, shall we say—in which people are encouraged to use Adobe CC to unlock their individualism and creativity as Bowie did. It also promotes its Ziggy graphics add-on pack.\n\n### 6\\. Publicis Norway\n\nPublicis Norway’s interactive landing page, made in Vev, embodies the less is more mantra yet manages to be one of the most uniquely creative pages we’ve seen. From the moment the page loads, you are met with significant typographic elements that make up the brand name Publicis. Upon scrolling, these letters scatter in every direction outside of the user’s screen.\n\n#### Vev's Scroll-Speed Magic: Instant Engagement\n\nThis use of Vev’s scroll-speed add-on is ingenious in its simplicity and significantly improves the ability to capture attention from the start.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Best Practices for Designing Your Interactive Landing Page\n\n![Interactive Landing Page](https://cdn.magicui.design/assets/ovqq4mrbar.jpg)\n\n### Every Interaction Should Be Logical\n\nMake sure the user understands why they are interacting and how they should interact with your content. Whether through labels, universally understood symbols, or the overall design, interactivity should be part of the user's natural journey.\n\n### Every Interaction Should Enhance the User Experience\n\nAvoid adding pointless interactions and ensure they contribute to the broader purpose of the landing page.\n\n### Every Added Interaction Should Be Planned Across Devices\n\nOptimize your interactive content for desktop, tablet, and mobile so that your interactive landing page is responsive across all screen sizes\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThis library provides a range of visually appealing and interactive elements that can be easily integrated into web applications. Thus, you can create stunning user interfaces with minimal effort.\n\n### Empowering Design and Development\n\n- Customizable Components: Adapt components to fit your branding and design needs.\n- Focus on Animation: Combines animation with a design-centric approach for captivating digital experiences.\n- Free Collection: Creating beautiful landing pages and converting visitors into customers is easy.\n- MagicUI Pro: Offers website templates to save time and craft impressive landing pages.\n\nSo, why wait? Use the [startup landing page template](https://pro.magicui.design/docs/templates/startup) today and embark on your journey to effortlessly create interactive and engaging digital experiences.\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-call-to-action.mdx",
    "content": "---\ntitle: \"Crafting the Perfect Landing Page Call to Action\"\ndescription: \"Craft compelling landing page call to actions with ease. Magic UI’s startup template and expert guidance help you convert visitors into customers.\"\nimage: https://cdn.magicui.design/assets/921f8f95-5d56-45f0-bed8-81aa0c52b668.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you unsure how to create effective [landing page examples](https://magicui.design/blog/landing-page-examples) for a call to action? Crafting the perfect landing page call to action can be tiring. This blog is here to guide you through the process. Whether you're new to the concept or looking to enhance your existing skills, this article offers valuable insights to help you achieve your goal of creating a compelling landing page call to action.\n\nMagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the key to unlocking the potential of your landing page call to action. With its user-friendly interface and expert guidance, you can effortlessly craft the perfect landing page call to action that engages your audience and drives conversions.\n\n## What Is a Landing Page Call to Action (CTA)?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/4ekkf247l5m.jpg)\n\nA landing page Call to Action (CTA) is a [crucial element on a webpage](https://www.semrush.com/blog/what-is-a-landing-page/#:~:text=A%20landing%20page%20is%20a%20standalone%20page%20with%20a%20single,other%20parts%20of%20your%20site.) that prompts visitors to take a specific action, such as signing up for:\n\n- A newsletter\n- Downloading an eBook\n- Making a purchase\n- Requesting a demo\n\nThe CTA is often presented as a button or a link that stands out from the rest of the page's content, guiding the visitor toward the desired conversion goal.\n\n### The Critical Role of a Landing Page CTA\n\nThe critical role of a CTA lies in its ability to direct the visitor's journey. Without a clear and compelling CTA, visitors might leave the page without taking any action, rendering the marketing efforts behind the landing page less effective.\n\nA well-crafted CTA is the final nudge that converts a potential lead into a customer or subscriber. It communicates the next step the visitor should take and highlights the value they will receive by doing so.\n\n### Importance of Optimizing CTAs\n\nThe importance of optimizing CTAs cannot be overstated. A [CTA](https://www.investopedia.com/terms/c/call-action-cta.asp) must be clear, concise, and aligned with the visitor's intent. The choice of words, color, size, and placement contribute to its effectiveness. A study by HubSpot found that personalized CTAs convert 202% better than generic ones.\n\nTesting different CTA variants can lead to insights that further optimize conversion rates. By continuously refining the CTA, businesses can improve their marketing ROI and ensure their landing pages perform at their best.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Why Is an Effective CTA Crucial for Your Landing Page?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/3q3r4gjqdj8.jpg)\n\n### Drives Conversions\n\nA compelling CTA [directly influences conversion rates](https://www.wsiworld.com/blog/the-importance-of-landing-pages) by encouraging visitors to take the desired action, whether it's:\n\n- Making a purchase\n- Signing up for a newsletter\n- Downloading an eBook\n\nResearch shows that a single, clear CTA can increase conversion rates by up to 371%.\n\n### Guides User Behavior\n\nA well-crafted CTA guides users through decision-making, clarifying what action they should take next. Without a clear CTA, visitors may leave the page without taking any action, leading to lost opportunities. 70% of small business websites need a clear CTA, which can result in lower engagement and conversion rates.\n\n### Enhances User Experience\n\nA compelling CTA contributes to a seamless and intuitive user experience. Clear guidance reduces friction and frustration, making it easier for visitors to engage with your content.\n\nA study by HubSpot found that CTAs that are easy to locate and understand can [increase click-through rates by 42%](https://blog.hubspot.com/customers/smart-ctas-personalization).\n\n### Reinforces the Value Proposition\n\nA well-designed CTA reinforces your offer's value proposition. It reminds visitors of the benefits they will receive by taking the desired action, making it more compelling for them to engage.\n\nCTAs that include the value proposition, such as _Download Your Free Guide_, can boost conversion rates by 33%.\n\n### Increases Engagement\n\nCTAs are a powerful tool for driving engagement on your landing page. Encouraging visitors to take action helps to build a connection between the visitor and your brand. According to a study by MarketingSherpa, adding a CTA to a social post can increase engagement by 80%.\n\n### Facilitates Lead Generation\n\nThe CTA is crucial in capturing visitor information on lead-generation landing pages. A clear and compelling CTA encourages visitors to provide their contact details, such as email addresses, helping to build your email list and nurture potential leads. Research shows that optimized CTAs can increase lead generation by 30%.\n\n### Aligns with Marketing Goal\n\nA compelling CTA ensures that the landing page aligns with your broader marketing goals, whether driving sales, increasing subscriptions or promoting an event. It helps to focus the visitor's attention on the action that will most benefit your business.\n\nBusinesses with focused CTAs on their landing pages are more likely to achieve their marketing objectives, with a reported 84% increase in goal achievement.\n\n### Encourages Immediate Action\n\nCTAs that create a sense of urgency, such as _Limited Time Offer_ or _Sign Up Now_, motivate visitors to act quickly rather than delaying their decision. Urgent CTAs can increase conversion rates by up to 31% as they tap into the fear of missing out (FOMO).\n\n### Supports A/B Testing\n\nCTAs are a key component of [A/B testing](https://mailchimp.com/marketing-glossary/ab-tests/), allowing you to experiment with different versions to see which performs best. This data-driven approach enables continuous optimization, ensuring your landing page delivers the highest possible conversion rates. Companies that regularly A/B test their CTAs see a 37% increase in overall sales.\n\n### Builds Trust\n\nAn effective CTA can also build trust with your audience. You reduce anxiety and increase the likelihood of conversion by clearly communicating what will happen when they take action, such as _Get Your Free Trial - No Credit Card Required_. Trustworthy CTAs can lead to a 23% increase in customer loyalty.\n\n## What Are the Key Elements of a High-Performing CTA?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/jsnouom14jg.jpg)\n\n### Clear and Actionable Language\n\nThe language used in your CTA should be clear, concise, and action-oriented. Visitors should instantly understand what they are expected to do and what they will receive in return. Phrases like _Get Started Now_, _Download Your Free Guide_ or _Claim Your Offer_ are effective because they use strong action verbs and convey a sense of immediacy.\n\n### Strategic Placement\n\nThe placement of your CTA on the landing page significantly impacts its performance. CTAs should be displayed where visitors are most likely to see them, such as above the fold or near persuasive content like testimonials or product descriptions.\n\nAccording to a study by Nielsen Norman Group, [CTAs placed above the fold](https://www.nngroup.com/articles/page-fold-manifesto/) are 84% more likely to be clicked.\n\n### Button Design and Contrast\n\nThe design of the CTA button plays a crucial role in attracting attention. It should stand out from the rest of the page, using contrasting colors and ample whitespace to make it visually distinct. The button size should be large enough to be easily clickable, especially on mobile devices.\n\nA study by HubSpot found that [buttons with contrasting colors](https://www.linkedin.com/pulse/colour-conversion-data-driven-guide-choosing-right-hues-nasser-xii2c#:~:text=%2D%20Conversion%20Rates%3A%20Red%20call%2D,call%2Dto%2Daction%20elements.) can increase conversion rates by 21%.\n\n### Creating a Sense of Urgency\n\nUrgency is a powerful motivator in CTA effectiveness. Phases like _Limited Time Offer_ or _Only a Few Spots Left_ can compel visitors to act quickly. Visual elements, such as countdown timers or scarcity indicators, can reinforce the urgency. Research shows that CTAs with a sense of urgency can boost conversion rates by up to 31%.\n\n### Reinforcing Value Proposition\n\nYour CTA should align with and reinforce your offer's value proposition. This could involve including a brief statement or benefit next to the CTA, reminding users of the value they will receive.\n\n_Start Your Free Trial Today – No Credit Card Required_ encourages action and addresses a common objection, increasing the likelihood of conversion.\n\n### Personalization\n\nPersonalizing CTAs based on user behavior or demographics can significantly enhance their effectiveness. Dynamic content that changes based on the visitor's past interactions or location can make the CTA more relevant and compelling.\n\n### Mobile Optimization\n\nWith the increasing use of [mobile devices](https://wisernotify.com/blog/mobile-call-to-action/), it is crucial to ensure that your CTAs are optimized for mobile users. This includes ensuring that the CTA button is large enough to tap easily and loads quickly on all devices. As reported by Unbounce, a mobile-optimized CTA can increase conversion rates by 27%.\n\n### A/B Testing\n\nRegularly testing different versions of your CTA is essential for optimizing its performance. A/B testing can help determine which variations—wording, colors, or placements—resonate most with your audience.\n\nAccording to a study by Hubspot, companies that regularly A/B test their CTAs see a [37% improvement in conversion rates](https://www.rollingpandas.studio/blog/how-to-use-a-b-testing-to-optimize-your-conversions).\n\n### Social Proof\n\nIntegrating social proof elements like testimonials, reviews, or trust badges near your CTA can increase its credibility and effectiveness. Visitors are more likely to take action if they see that others have benefited from the offer.\n\nAccording to a study by BrightLocal, [88% of consumers](https://searchengineland.com/88-consumers-trust-online-reviews-much-personal-recommendations-195803) trust online reviews as much as personal recommendations, making social proof a powerful addition to your CTA.\n\n### Clarity in the Next Steps\n\nExplaining what will happen after the visitor clicks the CTA can reduce friction and increase conversions. A CTA that says _Sign Up – It Only Takes 2 Minutes_ sets the expectation that the process will be quick and easy, which can encourage more visitors to take action.\n\n## How Can You Test and Optimize Your CTA for Better Results?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/semv86pi9tn.jpg)\n\n### A/B Testing Different CTA Variants\n\nA/B testing is a powerful method for determining which CTA version resonates most with your audience. By creating two or more versions of a CTA and showing them to different segments of your audience, you can measure which version leads to better results.\n\nKey elements to test include:\n\n- Wording\n- Color\n- Placement\n- Size\n\n#### Button Battle\n\nTest a red CTA button against a green one to see which color drives more clicks.\n\nA/B testing is critical because it allows you to make data-driven decisions rather than relying on guesswork. You can optimize your CTA for higher conversion rates by systematically testing different CTA elements. According to Unbounce, A/B testing can [increase your conversion rates by up to 300%](https://blogs.brighton.ac.uk/ts250/2017/05/09/how-to-effectively-employ-ab-testing-the-importance-of-effective-ab-testing-for-increasing-engagement-on-your-business-website/).\n\n### Monitoring Performance and Making Data-Driven Decisions\n\n[To optimize your CTA](https://www.usebubbles.com/blog/what-is-a-landing-page-definitions-uses-and-best-practices), it’s essential to monitor its performance using analytics tools. Key metrics to track include click-through rates (CTR) and conversion rates. By analyzing this data, you can identify trends and areas for improvement.\n\n#### Data-Driven Insights\n\nIf your CTA has a high CTR but a low conversion rate, it might indicate that the landing page isn’t delivering on the CTA's promise and adjustments are needed.\n\nMaking data-driven decisions ensures that your CTA optimization efforts are based on concrete evidence rather than assumptions. Regularly monitoring and analyzing your CTA performance allows you to make informed changes that improve effectiveness and drive better results.\n\n### Iterating Based on User Feedback\n\nGathering user feedback is another valuable approach to optimizing your CTA. You can collect feedback through surveys, usability tests, or direct customer interactions. You might ask users what motivated them to click on a CTA or what prevented them from taking action. This feedback can provide insights into how your CTA is perceived and where improvements can be made.\n\nIterating based on user feedback creates a more user-friendly and compelling CTA. By incorporating feedback into your design and messaging, you can address user concerns and enhance the overall experience, leading to higher engagement and conversion rates.\n\n### Testing Placement and Design Variations\n\nThe placement and design of your CTA are crucial factors in its effectiveness. You can experiment with different placements on the page, such as:\n\n- Above the fold\n- In the middle of the content\n- At the bottom of the page\n\nSimilarly, testing different design elements, such as button size, shape, and color, can help you determine what draws the most attention and encourages clicks.\n\n#### Design Matters\n\nTesting placement and design variations is important because even small changes can significantly impact your CTA’s performance. HubSpot found that anchor text CTAs in blogs can [increase conversion rates by 121%](https://saleslion.io/sales-statistics/anchor-text-ctas-clickable-text-in-a-hyperlink-increase-conversion-rates-by-a-whooping-121/). Optimizing the visual aspects of your CTA can make it more appealing and effective.\n\n### Utilizing Heatmaps and Click Tracking\n\nHeatmaps and click-tracking tools can provide valuable insights into how users interact with your landing page and CTA. These tools show where users click the most and how they navigate your page.\n\nBy analyzing this data, you can identify if your CTA is being noticed and clicked or if it’s being overlooked. If you notice that users are not engaging with the CTA as expected, you can experiment with repositioning or redesigning it to make it more prominent.\n\n#### User Insights\n\nUtilizing heatmaps and click tracking is an effective way to understand user behavior and optimize your CTA accordingly. By making data-driven adjustments based on these insights, you can enhance the visibility and performance of your CTA.\n\n### Segmenting Your Audience for Targeted Testing\n\nSegmenting your audience allows you to test different CTAs for different user groups. For example, new visitors respond better to a _Sign Up Now_ CTA, while returning visitors are more interested in a _Check Out Our Latest Updates_ CTA. You can create more relevant and personalized experiences for each group by tailoring your CTA testing to specific segments.\n\nSegmenting your audience is crucial because it acknowledges that different users have different needs and behaviors. By testing CTAs that cater to specific segments, you can improve the relevance and effectiveness of your calls to action, ultimately driving higher conversion rates.\n\n### Continuous Optimization\n\nCTA optimization is not a one-time task but an ongoing process. User preferences and behaviors can change over time, so revisiting and refining your CTAs regularly is essential. This might involve retesting previously optimized elements or exploring new design trends and technologies that could enhance CTA performance.\n\nContinuous optimization ensures that your CTAs remain effective in a dynamic and evolving digital landscape. By staying proactive and adaptable, you can maintain high conversion rates and keep your landing pages performing at their best.\n\n#### Personalized CTAs\n\nAccording to a study by Epsilon, personalized [CTAs can deliver a 202%](https://blog.hubspot.com/marketing/personalized-calls-to-action-convert-better-data) better conversion rate than generic ones. By testing different levels of personalization, you can identify the most effective way to tailor your CTAs to your audience segments.\n\n## What Are Some Common CTA Mistakes to Avoid?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/9141e8rvvb.jpg)\n\n### 1\\. Vague or Confusing Language\n\nUsing phrases like _Click Here_ or _Submit_ doesn’t provide enough context or motivation for the user to take action. Instead, use clear and specific language that tells the user precisely what to do and what they’ll get, such as :\n\n- Download Your Free Guide\n- Start Your Free Trial\n\n### 2\\. Lack of Contrast\n\nEnsure that your CTA button contrasts nicely with the background and surrounding elements, making it impossible to miss.\n\n### 3\\. Too Many CTAs\n\nLimit your page to one primary CTA and, if necessary, a secondary CTA that supports the primary goal.\n\n### 4\\. Poor Placement\n\nPlace your CTA where it is easily visible, such as above the fold or near key content, to ensure it gets the attention it deserves.\n\n### 5\\. Ignoring Mobile Users\n\nEnsure that your [CTA is mobile-friendly](https://landingi.com/blog/cta-on-landing-pages-playbook-examples/) by making it large enough to tap, using legible text, and placing it in a location that works well on small screens.\n\n### 6\\. Not Testing Your CTA\n\nRegularly [test different elements of your CTA](https://www.ismartcom.com/blog/6-cta-tests-for-maximizing-click-through-rates) to determine what works best for your audience.\n\n### 7\\. Overly Aggressive Language\n\nFocus on providing value and using language that encourages action without being forceful.\n\n### 8\\. Not Offering an Incentive\n\nMake sure your CTA highlights a compelling reason for users to act.\n\n### 9\\. Ignoring Trust Signals\n\nTo build trust, include privacy statements, security badges, or testimonials near your CTA.\n\n### 10\\. Using Generic CTAs\n\nBe specific about what the user will gain by clicking the CTA.\n\n### 11\\. Too Much Text\n\nKeep your CTA text short, direct, and to the point.\n\n### 12\\. Lack of Urgency\n\nAdding phrases like _Limited Time Offer_ can create a sense of urgency that encourages users to take immediate action.\n\n### 13\\. Forgetting About the User Experience\n\nEnsure that your CTA is seamlessly integrated into the user experience.\n\n### 14\\. Not Aligning the CTA with the Content\n\nMake sure your CTA is contextually appropriate and supports the overall message of the page.\n\n### 15\\. Failing to Follow Up\n\nFollowing up can nurture the relationship and encourage further engagement.\n\n### Use Our Startup Landing Page Template Today\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. With MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## How Does Visual Design Impact CTA Effectiveness?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/k0mhlqov5r.jpg)\n\n### Color Contrast\n\nColor contrast is vital for making your CTA stand out on the page. A high-contrast CTA button will effectively attract users' attention.\n\n### Button Size\n\nThe button size influences the visibility and likelihood of users clicking it. Larger buttons are generally more eye-catching but must also fit naturally within the layout.\n\n### Font Style and Size\n\nThe font should be legible and match your brand's aesthetic. A bold, easy-to-read font can make your CTA more compelling.\n\n### White Space\n\nWhite space around a CTA isolates it from other content, making it more prominent. Giving your CTA ample breathing room can draw attention to it without additional visual clutter.\n\n### Use of Shapes\n\nThe shape of the [CTA button](https://unbounce.com/landing-page-articles/what-is-a-cta/) influences how users perceive it. Rounded buttons are seen as inviting, while square buttons convey a professional tone.\n\n### Visual Hierarchy\n\nPlacing your CTA in a prominent position ensures it captures the user's attention effectively.\n\n### Iconography\n\nIncluding icons within or near your CTA can enhance its effectiveness. Icons can simplify the message and add visual interest.\n\n### Color Psychology and CTA Buttons\n\nDifferent colors evoke specific emotions and can influence user behavior. Consider the feelings you want to evoke when choosing a color for your CTA button.\n\n### Use of Animation and Visual Cues\n\nAdding subtle animations to your CTA can encourage interaction and guide users towards the CTA.\n\n### Texture and Depth\n\nAdding texture or depth to your CTA button can make it more tangible and clickable.\n\n### Alignment\n\nThe alignment of your CTA can affect its visibility and appeal. Centered CTAs are typically more prominent.\n\n### Animation Feedback\n\nProviding immediate feedback when interacting with a CTA can enhance the user experience.\n\n### Microcopy\n\nThe small text often accompanying a CTA, known as microcopy, can impact its effectiveness.\n\n### Visual Consistency\n\nMaintaining visual consistency between the CTA and the rest of the website is important for creating a cohesive experience.\n\n### Testing and Iteration\n\nVisual design is not static, and the [effectiveness of your CTA](https://encharge.io/call-to-action-effectiveness/) can improve through:\n\n- Testing\n- Iteration\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## What Role Does Personalization Play in CTA Success?\n\n![Landing Page Call To Action](https://cdn.magicui.design/assets/i485zl5dtag.jpg)\n\n### Tailoring CTAs to User Segments\n\n[Personalization in CTAs](https://abmatic.ai/blog/importance-of-personalized-calls-to-action) is crucial for capturing the attention of different user segments. By using dynamic content, you can tailor CTAs to new versus returning visitors or users based on their:\n\n- Location\n- Browsing history\n- Past interactions with your site\n\nNew visitors might see a CTA encouraging them to sign up for a newsletter while returning visitors might be enticed with a special discount offer.\n\n### Dynamic Content and Behavioral Triggers\n\nUtilizing dynamic content that adjusts based on user behavior can significantly impact CTA success. A personalized CTA like _Complete Your Purchase_ with a special offer can prompt action if a user has items in their cart but still needs to complete the purchase. These behavioral triggers are effective as they deliver the right message to the right user at the right time.\n\n### Using Data-Driven Personalization Tools\n\nData-driven tools and platforms can help create highly personalized CTAs by analyzing user data and automatically adjusting the content displayed. Platforms like AI-powered recommendation engines suggest the most relevant CTAs for each user based on their previous interactions.\n\n### Personalized Messaging\n\nIncorporating personalization within the CTA message can significantly enhance user engagement. Addressing the user by name, mentioning their recent activity, or offering something based on their interests can make the CTA more relevant and targeted.\n\n### Geo-Targeted CTAs\n\n[Geo-targeting](https://mailchimp.com/resources/what-is-geotargeting/) enables personalizing CTAs based on the user's location. For example, a retail website might showcase a CTA promoting a local store's sale, or a travel site could suggest flights from the user's nearest airport. Geo-targeted CTAs offer location-based, relevant information that can boost engagement.\n\n### Time-Sensitive Personalization\n\nDisplaying CTAs relevant to the user based on the time of day, season, or specific events can be highly effective. A food delivery service might present a CTA like Order Dinner Now during evening hours, capitalizing on the user's immediate needs or circumstances.\n\n### Personalization Based on Purchase History\n\nE-commerce sites can personalize CTAs based on a user's purchase history, increasing relevance and the likelihood of conversion. Offering a discount on the latest running shoes to a user who frequently buys running gear leverages past behavior to predict future actions, making the CTA more effective.\n\n### Content Personalization\n\nPersonalizing CTAs based on the content a user is viewing can enhance relevance and drive action. Suppose a user reads a blog post on digital marketing. In that case, a CTA offering a free eBook on advanced marketing strategies would be a natural next step, aligning with the user's interests.\n\n### Real-Time Personalization\n\nAdjusting CTAs in real-time based on user behavior can significantly impact CTA success. For instance, if a user spends a substantial amount of time on a product page, a pop-up CTA offering a limited-time discount on that product can prompt immediate action.\n\n### Testing and Optimization\n\nContinuously testing and optimizing personalization efforts are crucial to ensuring effectiveness. A/B testing different personalized CTAs can provide valuable insights into what resonates most with your audience, allowing you to refine personalization strategies over time.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. The library offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese components are visually appealing and interactive, making them easy to integrate into web applications and allowing developers to create stunning user interfaces with minimal effort.\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match desired branding and design requirements. The focus on animation and a design-centric approach helps bridge the gap between design and development, empowering designers and developers to craft captivating digital experiences that engage users effectively.\n\n### MagicUI Pro: Elevating Your Web Design Efforts\n\nIn addition to the free component library, MagicUI offers [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), a premium service that can save users thousands of hours in design and development. With MagicUI Pro, users can easily create beautiful landing pages and convert visitors into customers using pre-designed website templates.\n\nThe templates offered by MagicUI Pro are carefully crafted to capture attention and drive conversions. By utilizing these professionally designed templates, users can enhance their online presence and create a memorable user experience that encourages visitors to take action.\n\n### Start Designing with MagicUI Today\n\nMagicUI is the ideal solution for saving time and effort in creating captivating web interfaces and landing pages. By using MagicUI's free component library and MagicUI Pro's premium templates, you can elevate your design efforts and create stunning digital experiences that resonate with your target audience.\n\nStart your design journey with [MagicUI](https://magicui.design/) today and see the difference it can make in your web design projects.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-copywriting.mdx",
    "content": "---\ntitle: \"12 Landing Page Copywriting Tips To Boost Conversions (With Examples)\"\ndescription: \"Boost conversions with these 12 landing page copywriting tips, complete with examples to enhance your marketing strategy.\"\nimage: https://cdn.magicui.design/assets/ebdcab1a-4a65-4466-8289-aa113b6ca162.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nNeed help capturing your audience's attention with your landing page? Crafting compelling content that converts is essential in the competitive digital industry, where every click counts. This blog guides you to write persuasive copy, whether new or enhancing skills.\n\nCheck out Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup), a versatile tool to help you create persuasive copy that resonates with your target audience. With these [landing page examples](https://magicui.design/blog/landing-page-examples), you'll be well on your way to enhancing your landing page's copywriting skills and optimizing your conversion rates.\n\n## What Is Landing Page Copywriting?\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1667056624790-f0e8e391c086?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxjb3B5d3JpdGluZ3xlbnwwfHx8fDE3MjEzNzIwOTB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nLanding page copywriting is crafting persuasive text on a landing page to convince visitors to take a specific action. Picture yourself walking into a store where a salesperson warmly greets you with precisely the right words, guiding you toward purchasing or signing up for something. That is what landing page copywriting achieves in the online realm.\n\n### Why Landing Page Copywriting is Important\n\nWhen someone lands on your webpage, you only have a few seconds to capture their attention and persuade them to stay. The text on your landing page – encompassing headlines, subheadlines, body copy, and call-to-action buttons – plays a vital role. Effective copywriting helps rapidly and efficiently communicate the value of what you are offering.\n\n### Writing Guidelines for Landing Page Copywriting\n\nLanding page copywriting must be succinct and compelling, providing visitors with the necessary information without overwhelming them. The text on your landing page should be engaging and straight to the point, encouraging visitors to explore further and take action. Incorporating relevant keywords associated with the term 'landing page copywriting can significantly enhance the salience of your copy.\n\n#### The Tone and Style of Landing Page Copywriting\n\nMaintaining a professional and trustworthy tone in your landing page copy is crucial for building credibility and connecting with your visitors. By using [Steve DeAngelo's writing style](https://stevedeangelo.com/writings/), you can effectively engage your audience and compel them to take the desired action. Transition words and the active voice can help create a smooth flow in your copy, enhancing the overall readability of your landing page.\n\n#### Effective Keyword Usage for Landing Page Copywriting\n\nIncorporating latent semantic keywords associated with landing page copywriting can boost the relevance and visibility of your landing page. By strategically placing these keywords throughout your copy, you can enhance its SEO performance and attract more organic traffic to your website.\n\n#### Writing Style Guidelines for Landing Page Copywriting\n\nWhen writing landing page copy, it's essential to make the text engaging and straightforward without relying on clichés or overused metaphors. Using varied sentence lengths and structures can help maintain reader engagement and make your copy more dynamic. By organizing your content for smooth transitions and logical progression, you can effectively guide visitors through the information and compel them to act.\n\n### The Importance of Engaging Elements in Landing Page Copywriting\n\nIncluding interactive elements like direct questions in your landing page copy can help maintain reader engagement and encourage them to explore further. By using simple language and avoiding complex words, you can ensure that your copy is accessible to a wide audience and effectively communicates your message.\n\n### How to Create Compelling Landing Page Copywriting\n\nTo create compelling landing page copy, focus on providing value to your visitors and clearly communicating the benefits of your offering. By using concrete, physical language and analogies, you can help visitors visualize the value of your product or service and compel them to take action. Using the active voice can make your copy more dynamic and engaging, increasing the likelihood of conversion.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## The Foundational Elements of Compelling Landing Page Copy\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1649252504308-af4a8477cd2a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxpZGVhdGlvbnxlbnwwfHx8fDE3MjEzNzIxMDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCompelling landing page copy is never static; it evolves to ensure it remains impactful and engaging.\n\n### Delivering a Convincing First Impression\n\nThe first step in creating a compelling landing page copy is to provide a convincing first impression of the startup. This involves crafting direct, specific, and grammatically correct copy that sets expectations and raises the bar for future interactions with the company's product and team.\n\n### Considering Market Maturity\n\nThe market's maturity plays a significant role in determining the length and complexity of landing page copy. Companies operating in highly mature markets can utilize shorter copy, focusing on product differentiators, brand stories, and user testimonials. In contrast, emerging markets may require more detailed information to educate visitors about the solution and define the category more broadly.\n\n### Reflecting Customer Awareness\n\nCompelling landing page copy should mirror the customer's stage of awareness. This involves understanding how well customers comprehend the challenge the company addresses, the stakes involved, the changing landscape, and tools that can help. Great copy demonstrates the company's awareness of customer awareness levels, creating a connection that resonates with the target audience.\n\n### Effortless UI Development with a Design-Centric Approach\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## How To Write Effective Landing Page Copy\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1434030216411-0b793f4b4173?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx3cml0aW5nfGVufDB8fHx8MTcyMTM3MjEzNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Uncovering the Problem\n\nFirst, you need to identify the problem your audience is facing. What issues are holding them back from achieving their goals? Consider what obstacles they may be dealing with and write them down. Identifying the primary problem is crucial to creating compelling landing page copy.\n\n### Understanding Pain Points\n\nAfter identifying the problem, you need to understand its associated pain points. Dive into what's causing your audience the most distress and what's preventing them from overcoming their obstacles. List these pain points as a reference when writing your landing page copy.\n\n### Providing a Solution\n\nCreate a solution that addresses the identified pain points. Consider how your solution can alleviate these distress points and help your audience overcome their challenges. When writing your landing page copy, consider how your offer differentiates from others in the market - this is your unique selling proposition.\n\n### Communicating the Desired Outcome\n\nYour solution should help your audience reach their desired outcome. This outcome should align with their larger vision and goals for their personal life or business. When writing your copy, clearly communicate how your solution can help your audience achieve this desired outcome.\n\n## 12 Landing Page Copywriting Tips for Boosting Conversions\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1650831433364-3bbd0f2d2f01?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxpZGVhdGlvbnxlbnwwfHx8fDE3MjEzNzIxMDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Use Customer Testimonials\n\nOne of the most powerful conversion copy techniques involves no writing; it involves letting happy customers write your copy for you.\n\nTestimonials produce conversions like nothing else can. It’s impossible to write a copy as good as your customer. Why? A good copy depends on the source, not just the style and substance. Testimonials are compelling because they show the customer what she will experience if she uses your product or service.\n\n### 2\\. Emphasize the Benefits, Not the Product/Service\n\nOne of the most important lessons I've learned in online marketing is that customers don’t really care about your products or services—in other words, they don't care about the \"solution\" you're trying to sell them. A group of Harvard researchers conducted a study of 1,400 B2B customers in various fields and concluded that we've reached “the end of solution sales.”\n\n#### The Rise (and Fall) of Solution Selling\n\nTraditionally, sales were predicated on the “solution-selling method.” According to this method, “salespeople are trained to align a solution with an acknowledged customer need and demonstrate why it is better than the competition’s.”\n\n#### Why Traditional Sales Tactics Fail\n\nThat approach isn’t working anymore for one straightforward reason: Customers already know the solution they’re looking for. Thanks to the Internet and search engines, they are capable of learning virtually anything. In fact, not only do customers know the solution, but they also know the features they are looking for, the requirements the product must meet, and benchmark pricing.\n\n#### Why Focusing on Customer Value Wins\n\nIf you pitch only your solution, you’re not giving your customers what they need and want. You need to pitch benefits. It’s okay to mention your solution because that’s a signal to the customer that he or she is in the right place -- but don’t push that solution. Instead, go for the benefits.\n\n### 3\\. Write Attention-Grabbing Headlines\n\nHeadlines do the heaviest lifting on any part of your landing page. They’re the first and most visible pieces of copy—the introduction to your offer. A compelling, descriptive headline can distinguish between a visitor thinking, “I need this thing, like, yesterday,” and “how the heck did I end up here?”\n\nVisitors are more likely to bounce when your landing page header isn’t pulling its weight. On the other hand, a strong headline keeps visitors scrolling’ and ensures all the work you’ve put into getting them here doesn’t go to waste.\n\n### 4\\. Add Structure with Subheadings\n\nThese are headlines for each section of your landing page. They introduce new benefits (or counter specific objections) that tie back your value proposition.\n\nAgain, check your info hierarchy. Figure out what crucial information you haven’t included in your header and break it into topic groups. You’ll probably find that most of what you still need to communicate falls into a few categories, like unique product features or secondary benefits. Under a shared subheading, these can become your page sections.\n\n### 5\\. Make Your Copy Easy to Scan\n\nPeople don’t read web pages like they do books. Keep your landing page copy short and create an easily scannable layout so your key points stand out. The Nielsen Norman Group has studied how people read online since 1997. Their findings show consistently that web users scan text instead of reading it.\n\n#### Grab Attention and Drive Conversions\n\nThey also noticed some recurring scanning habits, like the F-Pattern. Users start by reading a heading horizontally, then skip to another prominent row of text. You can apply these findings in your landing page copywriting to maximize its impact.\n\n#### Craft Compelling Landing Page Copy\n\nPrioritize key information in headings and subheadings, which users will most likely read. Follow these headings immediately with short, simple sentences that expand on the point and deliver other important information.\n\n#### Craft Scannable Landing Page Copy for Mobile Users\n\n58.3% of internet traffic came from mobile devices in Q1 2023. Keeping your content scannable—i.e., keeping headings short and using white space—makes it easier for mobile users to consume.\n\n### 6\\. Write like a Human\n\nAnother technique that will help you crush your competition to [sound like a human being](https://theintuitivewritingschool.com/blog/youre-a-human-so-write-like-one). At some point, many copywriters decided producing copy that sounded strained and robotic would be great. Who’s writing this stuff? And who’s reading this stuff? I don’t know, but I do know that no one is converting.\n\nPeople prefer to connect with other people, not with robots. That’s why your copy needs to sound like a human wrote it. Here are some specific things you can do to make your writing more personal:\n\n#### Write the Way You Speak\n\nUse normal words, like the ones you’d use if you were talking to a ten-year old. For example, why use “convivial” if you can use “friendly?”\n\n#### Use Short Sentences\n\n- Break grammar rules if the writing still sounds good and natural.\n- Be funny.\n\n#### Use the First Person\n\nUse expressions you’d use in a normal conversation. “Seriously,” “I’m thinking…,” “Wait a second,” “It was crazy,” “Wow,” “It was pretty awesome,” “It’s like…”\n\n### 7\\. Use Numbers and Get Specific\n\nThe more specific you are, the more believable and persuasive you will be.\n\nWhich one of these claims is more persuasive to you?\n\n- \"Your conversion rates will explode!\"\n- \"In the last ninety days, customer conversions have increased by an average of 78.2%.\"\n\nThe second one is far more specific and therefore more believable. Anyone can make blanket claims about awesomeness, but not everyone can cite statistics and detailed metrics.\n\n### 8\\. Ask for Readers to Take Action\n\nThe final killer technique of a conversion pro is the call to action. You need to ask for conversions to get them. That’s why I suggest you start with the end goal in mind -- and the whole point of your landing page is that conversion. All of your copy should be building up to that conversion.\n\n##### CTA Copywriting for Maximum Impact\n\nWriting CTA button copy is just as important, if not more so, than the rest of the copy on your page. Remember how I mentioned that CTA buttons are one of the copies people read? It matters. Simple changes in wording can create huge conversion increases.\n\n### 9\\. Use Visuals to Complement Your Copy\n\nImages and videos can help your landing pages grab attention. They also play a key role in explaining your product to users. A comprehensive study on the effects of video in marketing by [Wyzowl found that 96%](https://www.wyzowl.com/sovm-results-2023/#:~:text=%F0%9F%A7%A0%2096%25%20of%20video%20marketers,of%20their%20product%20or%20service.&text=%F0%9F%93%88%2095%25%20say%20video%20marketing%20has%20helped%20them%20increase%20brand%20awareness.) of marketers think videos improve users' understanding of their product.\n\nThe same study also found that 90% of marketers think videos have helped them generate leads, while 87% think videos increased sales and website dwell time. Google data shows images can be just as useful, with results from a consumer survey showing 50% of online shoppers use images to decide what to buy.\n\n##### The Power of Visuals in Landing Page Design\n\nThe best landing pages aren’t just text-based. They merge landing page copywriting with visual assets to create a mixed-media experience that suits all users.\n\nAs you develop your landing page copy, consider where images or videos can draw attention, demonstrate features, or act as social proof.\n\n### 10\\. Maintain Message and Visual Continuity From Ad to Landing Page Copy\n\nEnsure you maintain consistency in messaging through all elements of your digital marketing campaign, from ad impressions and email openings to the landing page and lead generation form. It drives more profound engagement with buyers and compels them to move further in their buying journey. Create a cohesive experience for visitors with two simple rules:\n\nFocus on the right audience. While crafting your message, remember your audience persona and talk to that audience throughout your campaign.\n\n##### Consistent Branding for Effective Marketing\n\n- Use common elements like graphic style, fonts, slogans, and logos\n- Ensure prospects can identify your brand across engagements\n- Create a seamless transition between ad copy and landing pages\n\n### 11\\. Optimize for Organic Search\n\nLanding pages are most associated with paid advertising campaigns, but they can contribute to organic traffic, too. Follow SEO copywriting best practices to maximize your chances of unlocking additional traffic opportunities.\n\n##### Optimizing with Relevant Keywords\n\nFor a landing page, this includes identifying the keywords your ideal customers type into search engines. Once you’ve done this, you’ll want to use these keywords on your landing page, including in the header and body of the text. You’ll also want to use them in the page’s title tag and meta description.\n\n### 12\\. Test Run Before Launch\n\nCreating an outstanding landing page is not a one-and-done process; it’s an ongoing journey of refinement and optimization. Before settling on a given landing page design and copy, embark on a [test run using A/B testing](https://blog.hubspot.com/marketing/how-to-do-a-b-testing#:~:text=To%20run%20an%20A%2FB%20test%2C%20you%20need%20to%20create,better%20over%20a%20specific%20period.).\n\nExperiment with different variations of your landing page elements such as:\n\n- Headlines\n- CTA buttons\n- Color schemes\n- Length of your copy\n\nAnalyze the performance of each version to gain valuable insights into what resonates most with your audience. Then, make data-driven decisions, improving your landing page until you see better results.\n\n## 6 Examples of Landing Pages With Great Copy\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1494778752932-64ee27ba2a37?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjEzNzIxNTh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. HighriseHQ's Landing Pages\n\nHighriseHQ’s landing pages are significant use cases of these customer testimonials. A key to their successful, high-converting landing pages is placing testimonials front and center, featuring a picture of the customer alongside a quote.\n\n### 2\\. Mixmax's Landing Page: Defined Value Propositions\n\nMixmax has devoted a section of this page to all the features that improve productivity, marked by a subheading that clearly states the value for customers: “Mixmax accelerates email productivity.” But they’ve also got a bunch of cool features that don’t necessarily support that benefit, so they’ve bucketed them under another subheading: “More reasons to love Mixmax.”\n\n### 3\\. ExpressVPN's Landing Page\n\nThe header is simple, with a headline and subheading featuring [easy-to-scan phrases](https://www.expressvpn.com/) like “VPN,” “just works,” and “#1.”\n\nFurther down the page, there’s a guide to getting started with a VPN that’s laid out in three simple steps:\n\n1\\. Sign up for ExpressVPN\n\n2\\. Download a VPN app\n\n3.Connect to a VPN server location.\n\nThere’s a list of persuasive, scannable benefits like 24-hour live chat support and best-in-class encryption. Plenty of subheadings and bold text ensure users can see the most important points quickly.\n\n### 4\\. TeamGantt's Landing Page\n\nTeamGantt uses a specific number to promote the benefits of their product: How effective would it be if they claimed to have millions of tasks scheduled? The number makes a big difference. Customers want specific information about the benefits and specific examples of what they will experience. Specificity is a powerful tool.\n\n### 5\\. Wistia's Landing Page: Engaging Users with Videos\n\nThe video on this Wistia landing page auto-plays to demonstrate the product features as soon as users land. The video immediately captures your attention, allowing Wistia to support its introductory copy with practical visuals.\n\n### 6\\. Good Eggs Landing Page: Turning Features Into Benefits\n\nGood Eggs frames the features of their service as benefits. They don’t just offer delivery—they ensure you’ve got everything you need delivered to your door. It’s not just customer service; it’s customer service you can count on when you need them. Good Eggs speaks to the value these features provide.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 7 Mistakes To Avoid in Landing Page Copywriting\n\n![Landing Page Copywriting](https://images.unsplash.com/photo-1518644730709-0835105d9daa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHx0aGlua2luZyUyMGFib3V0JTIwbWlzdGFrZXxlbnwwfHx8fDE3MjEzNzIxNzh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Vague Headlines\n\nVagueness confuses visitors and causes them to lose interest quickly.\n\nFor example, instead of telling visitors you’ll help them “save money,” you might have a headline that says, “Cut Operational Expenses by 25%.” State your main promise or value proposition immediately, and use your audience research to write resonate headlines.\n\n### 2\\. Overusing Jargon\n\nAvoid relying too much on niche industry-speak your average visitor may not grasp.\n\nFor instance, as a business, you may have “core competencies,” but there’s not much substance behind that phrase. State the specifics instead and share what you do best. Use plain, conversational language that visitors intuitively understand.\n\n### 3\\. Mismatched Messaging\n\nNot all visitors will be interacting with your brand for the first time.\n\nB2B decision-makers, for example, are using 10 different channels throughout their buyer’s journey, including:\n\n- Social media\n- Email\n- In-person or digital events\n\nCreate a cohesive user experience on each channel to build brand recognition and ensure consistent messaging. For example, use a similar tone and language across your LinkedIn company page, marketing campaigns, and web pages. Get more tips for your B2B landing page here.\n\n### 4\\. Including Multiple Offers\n\nStick to promoting one core product/service per page.\n\nFor instance, if your company offers a suite of software products, create a separate landing page for each one. Too many competing offers overwhelm visitors and cause confusion that leads them to leave the page. Simplify and direct attention strategically.\n\n### 5\\. Overpromising\n\nMake genuine claims backed by results and avoid exaggerated promises.\n\nFor example, don’t write in absolutes, like saying a customer will “never” experience a particular problem again. Everything you talk about on your landing page should align with the reality of what the potential customer can expect.\n\n### 6\\. Weak Call to Action\n\nYou know what you want your target audience to do on your landing page, but if you don’t clarify what’s in it for them, they won’t click. Try tapping into language that promotes urgency and highlighting your unique value proposition.\n\nFor example, “Download Report” isn’t as compelling as inviting visitors to click by having a CTA like “Get Your Free Report Now.”\n\n### 7\\. Failing to Optimize\n\nCreating a landing page doesn’t end with copy and design. Make sure the page looks good across all devices and screen sizes to provide an experience that aligns with conversion rate optimization trends like personalization and fast loading times. Then, CRO audits should be conducted regularly to find opportunities for improvement.\n\nFor example, if people drop off once they get to a form, try changing or shortening the fields.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nThis library provides a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing users to create stunning user interfaces with minimal effort.\n\n### Build Brand-Perfect UIs with Ease\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match desired branding and design requirements. With a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Pro Templates for High-Converting Landing Pages\n\nAlong with the free component library, MagicUI Pro offers a solution to save time and create beautiful landing pages that convert visitors into customers. By leveraging their templates, users can effortlessly create a professional website that attracts and retains visitors.\n\nDiscover MagicUI’s [startup landing page template](https://magicui.design/) and elevate your online presence. Start converting visitors into customers with MagicUI Pro.\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-design-templates.mdx",
    "content": "---\ntitle: Using Landing Page Design Templates to Boost Conversions\ndescription: >-\n  Discover how landing page design templates can transform your marketing. Learn\n  to select, customize, and optimize templates for maximum conversion impact.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-471fae90-d008-4a87-89b1-6f742313f07d.jpg\nauthor: Dillion Verma\ntags:\n  - landing page templates\n  - conversion design\n  - web design templates\n  - ui kits\n  - page optimization\npublishedOn: \"2025-10-23T09:45:35.33478+00:00\"\nfeatured: true\n---\n\nLanding page design templates are essentially pre-built layouts laser-focused on a single goal, like grabbing a lead or closing a sale. They give you a proven framework right out of the box, saving you a ton of time while baking in conversion best practices from the very beginning. For marketers, they're an absolute game-changer.\n\n## What Are Landing Page Templates and Why Do They Work?\n\nThink of a landing page template less like a shortcut and more like a professional blueprint. It’s like getting the chassis of a high-performance race car—you get the proven, aerodynamic structure you need to win the race. With that solid foundation handled, you can pour all your energy into the engine (your offer) and the paint job (your branding). It's a smarter way to build powerful, effective pages without reinventing the wheel every single time.\n\nBut these templates are so much more than just pretty designs. They are strategic tools, built on a deep understanding of conversion rate optimization. The placement of a headline, the color of a call-to-action button, the flow of information—none of it is accidental. It's all based on piles of data and testing on real user behavior. When you use a template, you're tapping into a massive well of knowledge about what actually gets people to click.\n\n### The Strategic Value of a Proven Blueprint\n\nOne of the biggest wins you get from using **landing page design templates** is the sheer amount of development time they save. Instead of your team being bogged down for weeks designing, coding, and testing a page from scratch, you can get a new campaign live in a tiny fraction of the time. In fast-moving markets, that speed is a serious competitive edge.\n\nTemplates also bring a welcome dose of brand consistency across all your campaigns. When every landing page shares a similar structure and visual feel, it strengthens your brand identity and builds a subtle layer of trust with your audience. This isn't just about looking good; it's about creating a predictable and reliable experience for your users.\n\n> A well-designed landing page template acts as a silent salesperson. It expertly guides visitors from initial curiosity to decisive action by stripping away friction and focusing their attention on one clear objective.\n\n### Driving Conversions with Intentional Design\n\nAt the end of the day, a landing page exists for one reason: to turn visitors into leads or customers. When you understand [the fundamentals of lead generation marketing](https://cherubinicompany.com/what-is-lead-generation-marketing/), you see why these focused pages are such powerful tools. They are purpose-built conversion machines, plain and simple.\n\nAnd the data backs this up in a big way. According to industry benchmarks for **2024–2025**, it's common for well-optimized templates to hit conversion rates between **21% and 50%**, depending on the industry. That completely blows away the average e-commerce website conversion rate, which hovers around a meager **2.5% to 3%**. In fact, strategic redesigns using optimized templates have been shown to boost conversions by up to a staggering **300%** compared to generic pages. You can read more about these [web design statistics and their impact](https://www.hostinger.com/tutorials/web-design-statistics) to see just how powerful this is.\n\nTo wrap it up, using a pre-built template offers a potent mix of benefits.\n\n| Core Benefits of Using Landing Page Templates |\n| :-------------------------------------------- | :--------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- |\n| **Benefit**                                   | **Impact on Your Project**                                             | **Why It Matters**                                                                             |\n| Speed and Efficiency                          | Drastically reduces the time from idea to launch.                      | Enables you to capitalize on market opportunities faster and outpace competitors.              |\n| Proven Layouts                                | You start with a design that's already optimized for user behavior.    | Eliminates guesswork and costly A/B testing on basic layouts, improving your odds of success.  |\n| Brand Cohesion                                | Ensures a consistent look and feel across all marketing touchpoints.   | Builds brand recognition and trust, creating a more professional and reliable user experience. |\n| Cost-Effectiveness                            | Lowers the need for extensive custom design and development resources. | Frees up budget and team capacity to focus on strategy, content, and promotion.                |\n\nBy starting your projects with such a solid foundation, you empower your team to stop worrying about the nuts and bolts and instead focus on what truly moves the needle—crafting a compelling offer and making a real connection with your audience.\n\n## The Anatomy of a High-Converting Landing Page\n\nBreaking down a high-converting landing page is a bit like studying the blueprint for a finely tuned engine. Every single component has a specific job, and they all have to work together perfectly to hit one, focused goal. It’s not just about slapping some pretty elements on a page; it’s a masterclass in persuasion, psychology, and strategic design.\n\nUnderstanding this anatomy is the first step, even before you start browsing **landing page design templates**. A great template isn't just about looking good—it's a pre-built structure that already nails these essential, high-impact components, giving you a massive head start.\n\nThis infographic shows you the core benefits of using a template that already has these critical elements baked right in.\n\n![Infographic about landing page design templates](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/55538f1b-fca6-4fc6-89d9-a32cda33fc75.jpg)\n\nAs you can see, the advantages stack up to make your marketing process way more efficient and effective, ultimately leading to higher conversions.\n\n### The Irresistible Headline\n\nLet's be real: your headline is the first—and sometimes _only_—thing a visitor reads. You’ve got about three seconds to stop their scroll and convince them to stick around. A powerful headline doesn’t just describe your offer; it shouts a clear benefit and sparks immediate curiosity.\n\nIt needs to speak directly to your audience's pain point or biggest desire. For instance, \"Our New CRM Software\" is flat. But \"Stop Juggling Tabs and Close More Deals\"? Now that promises a solution, making it infinitely more compelling.\n\n### The Persuasive Value Proposition and Copy\n\nOnce the headline hooks them, the body copy reels them in. This is where you make your case with a crystal-clear **value proposition**. Your copy must answer the visitor’s biggest unspoken question: \"What's in it for me?\"\n\nDitch the technical jargon and focus on benefits, not just features. A feature is what your product _does_; a benefit is how it makes the customer's life _better_. Good copy guides the reader on a journey, building trust and desire with every sentence.\n\n> A high-converting landing page makes the decision to act feel like the most natural and obvious choice. It achieves this by aligning every word, image, and element with a single, compelling purpose.\n\nIf you want to go deeper on how individual pieces fit into the puzzle, you can learn more about the different types of [landing page sections](https://magicui.design/blog/landing-page-sections) and the specific roles they play in getting people to act.\n\n### The Compelling Visuals\n\nWe’re visual creatures. A strong hero image or video can communicate value much faster than text ever could. A great visual doesn't just decorate the page; it creates an instant emotional connection and helps the visitor imagine themselves benefiting from your offer.\n\nThe best landing page visuals are:\n\n- **Relevant:** They have to directly relate to what you're offering.\n- **High-Quality:** Grainy, unprofessional images will kill trust in a heartbeat.\n- **Emotionally Resonant:** They should stir the feeling you want your brand to be associated with, whether that’s relief, excitement, or security.\n\n### The Trust-Building Social Proof\n\nPeople are far more likely to do something if they see that others have already done it and had a good experience. **Social proof** is the element that dissolves doubt and builds credibility. Think of it as the digital version of a trusted friend’s recommendation.\n\nThis can show up in a bunch of different ways:\n\n- **Testimonials:** Direct quotes from happy, real customers.\n- **Case Studies:** In-depth stories of customer success.\n- **Logos:** Showing off logos of well-known companies you've worked with.\n- **Reviews and Ratings:** Star ratings from third-party sites.\n\nBy showing off real-world validation, you lower the perceived risk for new visitors and make them feel much more confident in their decision to convert. This is an absolutely critical component that the best landing page design templates always make room for.\n\n## How to Choose the Right Landing Page Template\n\nStaring at thousands of **landing page design templates** can feel like trying to find a needle in a haystack. It’s overwhelming. But picking the right one doesn’t have to be a guessing game. A little strategy goes a long way, ensuring you choose a template that doesn’t just look sharp, but is actually built to deliver results.\n\nThink of it like choosing the right tool for a job. You wouldn't use a hammer to tighten a screw, right? The same logic applies here. A template designed for e-commerce won’t be the best fit for getting webinar sign-ups. The absolute first step is matching the template’s core purpose with your specific campaign goal.\n\n![A person comparing different landing page design templates on a screen](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fc2ebee2-c720-4d78-9130-7d954332aae6.jpg)\n\nThis single decision influences the entire structure of the page. A lead generation page needs a big, obvious form. A sales page needs plenty of room for product shots and glowing reviews. An event sign-up page has to put the date, time, and speakers front and center. If you start with a goal-aligned template, you won’t have to fight a design that’s working against you.\n\n### Define Your Campaign Goal\n\nBefore you even glance at a single template, get laser-focused on what you want to achieve. What is the one action you need a visitor to take? This clarity is your north star.\n\nYour primary goal will likely fall into one of these buckets:\n\n- **Lead Generation:** Your main aim is to capture contact info, like names and emails. You’re usually offering something valuable in return, like an ebook or a newsletter subscription.\n- **Direct Sales:** You’re guiding visitors straight to a purchase. This requires space for features, pricing tables, and social proof to seal the deal.\n- **Webinar or Event Registration:** The goal is getting sign-ups. The design needs to build excitement by highlighting the event’s value, the speakers, and what attendees will learn.\n- **Appointment Booking:** You’re trying to get people on your calendar for a demo, consultation, or service. The flow should be seamless and direct.\n\nOnce you know your goal, you can instantly filter out all the noise and focus only on templates built for that exact purpose.\n\n### Prioritize Critical Technical Features\n\nA gorgeous design is completely worthless if the page doesn't work. A few technical features are non-negotiable in today's world, forming the bedrock of a good user experience and directly impacting whether people convert or bounce.\n\nThe sheer volume of templates is staggering—a major marketplace like [Envato](https://themeforest.net/) lists over **3,200** landing page templates alone. But here's the good news: creators are getting the message about modern standards. An incredible **94.22%** of these templates are fully responsive, meaning they look great on any screen. This reflects the reality that most of your traffic is probably coming from a phone. You can dig into more of this data on [current website template statistics](https://mycodelesswebsite.com/website-template-statistics/) if you're curious.\n\n> Your template’s technical performance is just as important as its visual appeal. A slow, clunky, or broken experience will send potential customers running, no matter how great your offer is.\n\nWhen you’re vetting templates, keep an eye out for these three technical must-haves:\n\n1.  **Mobile Responsiveness:** The page has to look and function perfectly on smartphones, tablets, and desktops. No exceptions.\n2.  **Fast Load Speed:** Slow pages kill conversions. Look for templates advertised as lightweight or optimized for speed.\n3.  **Customization Potential:** A good template is a starting point, not a straitjacket. It should be easy to change colors, fonts, and layouts to match your brand without having to wrestle with the code.\n\n### Use a Checklist for Objective Evaluation\n\nTo avoid getting swayed by flashy designs that don't actually serve your goals, it helps to use a simple checklist. This pulls you out of the subjective \"I like how this looks\" mindset and forces you to evaluate each option against a consistent, strategic set of criteria.\n\nThis quick sanity check ensures you're picking a template that is not only visually appealing but also strategically sound.\n\n### Template Selection Checklist\n\n| Evaluation Criteria       | Why It's Critical                                                          | What to Look For                                                          |\n| :------------------------ | :------------------------------------------------------------------------- | :------------------------------------------------------------------------ |\n| **Goal Alignment**        | Ensures the page structure supports your specific conversion action.       | Does it have a layout built for lead gen, sales, or event sign-ups?       |\n| **Visual Hierarchy**      | Guides the user's eye naturally toward the call-to-action.                 | Clear headlines, subheadings, and a CTA button that stands out.           |\n| **Brand Fit**             | The design's aesthetic should feel like a natural extension of your brand. | Check if the typography, color scheme, and overall vibe match your style. |\n| **Social Proof Sections** | Builds trust and credibility, which is essential for conversions.          | Are there pre-designed sections for testimonials, logos, or case studies? |\n\nUsing this framework, you can move past the initial paralysis of too many choices and confidently select a template that’s engineered to help you win.\n\n## Customizing Your Template for Maximum Impact\n\nPicking the right landing page design template is a huge head start, but the real magic happens when you start customizing. This is where you take a solid, proven blueprint and shape it into a unique conversion machine—one that speaks directly to your audience and feels like _your_ brand. It’s less about reinventing the wheel and more about adding your own signature style.\n\nThink of it like this: the template is a beautifully designed, functional house. Customization is you painting the walls in your brand colors, hanging your art, and arranging the furniture to create a welcoming experience that feels unmistakably yours. It’s the essential step to turn a generic layout into a high-impact experience that actually drives people to act.\n\nThis screenshot of the [Magic UI](https://magicui.design/) homepage, for example, shows a clean, modern design that perfectly balances beautiful aesthetics with clear information. It's a great look at how customized components can come together.\n\n![Screenshot from https://magicui.design/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/80c7ce79-071f-437e-b177-713b4e71189b.jpg)\n\nThe smart use of whitespace, consistent typography, and subtle animations all work together to create a professional and engaging user experience. That’s the end goal of any good customization effort.\n\n### Aligning Visuals with Your Brand Identity\n\nYour first and most important job is to make sure the template perfectly matches your brand's visual identity. This is about so much more than just slapping your logo at the top of the page. You’re aiming to create a cohesive and instantly recognizable experience for every visitor.\n\nStart with the core pieces from your brand’s style guide:\n\n- **Color Palette:** Swap the template’s default colors for your primary and secondary brand colors. Use your main color on key elements like headlines and call-to-action buttons to grab attention.\n- **Typography:** Change the fonts to match your brand's typography. Consistent fonts build brand identity and make your content easier to read.\n- **Imagery:** Get rid of all placeholder images. Replace them with high-quality photos, videos, or graphics that are actually relevant to your offer and connect with your target audience.\n\nThese changes make sure that when someone clicks over from an ad or a social media post, the visual experience feels seamless. That consistency builds trust from the very first second.\n\n### Implementing Your Changes with Code\n\nFor developers working in modern frameworks, tools like **Magic UI** make this whole process incredibly simple. You can easily tweak components using props and Tailwind CSS classes.\n\nLet's say you want to customize a call-to-action button. Instead of fighting with complex CSS files, you can just make the changes directly in your React component. Here’s a quick React MDX snippet showing how you might change a button's color and add a hover effect.\n\n```jsx\nimport React from \"react\"\n\nimport { Button } from \"@/components/ui/button\" // Assuming a Magic UI button component\n\nconst CustomCTAButton = () => {\n  return (\n    <Button\n      className=\"bg-blue-600 text-white hover:bg-blue-700\"\n      style={{ padding: \"1rem 2rem\", fontSize: \"1.1rem\" }}\n    >\n      Sign Up Now\n    </Button>\n  )\n}\n\nexport default CustomCTAButton\n```\n\nThis snippet creates a branded button with a specific background color (`bg-blue-600`), white text, and a slightly darker shade when you hover over it. This level of fine-tuned control lets developers quickly turn a brand's style guide into functional, beautiful components.\n\n### Elevating Engagement with Advanced Components\n\nOnce your core branding is dialed in, you can take your page to the next level by weaving in advanced components and subtle animations. These aren't just for show; they can seriously boost user engagement and guide visitors toward your conversion goal.\n\n> Thoughtful customization isn't about adding flashy distractions. It’s about enhancing the user experience and reinforcing your core message to make taking action feel effortless and intuitive.\n\nModern UI libraries are packed with components designed to capture and hold attention. You might want to add things like:\n\n- **Animated Text:** Use subtle animations to reveal your headline or key value props, drawing the user's eye exactly where you want it.\n- **Interactive Features:** Bring in elements like sliders or interactive testimonials that encourage people to actually engage with the page.\n- **Micro-interactions:** Add small animations to buttons or form fields. This provides visual feedback when a user interacts with them, making the whole experience feel more responsive and polished.\n\nOf course, the most important part of your page is the words. Strong visuals and slick components fall flat without compelling copy to back them up. To make sure your message is just as powerful as your design, check out our in-depth guide to [mastering landing page copywriting](https://magicui.design/blog/landing-page-copywriting).\n\nUltimately, customizing your **landing page design template** is a balancing act. You want to keep the proven, conversion-focused structure of the template while breathing your own unique brand personality and message into it. By thoughtfully tweaking colors, typography, and imagery—and by strategically adding advanced components—you create a powerful and persuasive experience that doesn't just look great, but also gets incredible results.\n\n## Optimizing Your Landing Page for Peak Performance\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/eiIhTbFP0ls\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nGetting your landing page live is a huge milestone, but it's just the starting line. The real work—and the real results—come from what you do next. Think of your new page like a race car fresh off the assembly line. It looks great, but you won't know how fast it can really go until you get it on the test track and start fine-tuning the engine.\n\nPeak performance isn't about guesswork; it’s about listening to your audience through their actions. You need a system to test, measure, and tweak every crucial element to find out what truly gets visitors to click that button. This is how you turn a static page into a dynamic conversion machine that gets better over time.\n\n### Unlocking Insights with A/B Testing\n\nYour most powerful tool for this is **A/B testing**, also known as split testing. The idea is wonderfully simple: you create two versions of your page (an 'A' and a 'B'), change just one thing between them, and show each version to different groups of visitors. Then you see which one gets better results.\n\nThis approach takes all the assumptions out of the equation and lets actual user behavior be your guide. You'd be amazed at how tiny changes can lead to massive wins.\n\nHere are the essential elements you should start testing right away:\n\n- **Headlines:** Try a benefit-focused headline against one that piques curiosity. Does \"Save 50% on Your First Order\" outperform \"The Secret to Effortless Mornings\"? Only one way to find out.\n- **Hero Images:** Test a clean product shot against a lifestyle photo of someone enjoying your product. Visuals trigger immediate emotional responses, making them a goldmine for testing.\n- **Call-to-Action (CTA) Button:** Play around with the button's color, size, and especially the words on it. Swapping a generic \"Submit\" for an action-oriented \"Get Your Free Guide\" can boost clicks significantly.\n- **Form Length:** How much is too much? Test a form that only asks for an email against another that also asks for a name. Often, the less friction you create, the higher your conversion rate.\n\n> The point of A/B testing isn't just about finding a one-time winner. It's about building a deep, continuous understanding of what makes your audience tick. Every test is a lesson.\n\n### Fine-Tuning Technical Performance\n\nBeyond the pretty pictures and clever copy, the technical guts of your landing page are a huge deal. Nothing kills conversions faster than a slow, clunky page. In fact, just a **one-second delay** in page load time can slash conversions by up to **7%**.\n\nTo keep things running smoothly, focus on these two technical pillars:\n\n1.  **Page Speed Optimization:** Compress your images, minify your code (CSS, JavaScript), and use quality hosting. Even if your landing page template is built on lean code, the content you add can weigh it down if you're not careful.\n2.  **On-Page SEO:** Many landing pages are tied to paid ads, but why not capture some free organic traffic too? Make sure your page has a clear title tag, a compelling meta description, and uses your main keyword naturally in the headline and body copy.\n\nNailing these technical details ensures your page is not only persuasive but also fast and easy for everyone to access.\n\n### Making Data-Driven Decisions\n\nOptimization is a loop, not a one-and-done task. Get comfortable with your analytics tools and keep a close eye on key metrics like conversion rate, bounce rate, and time on page. This data tells the story of how people are actually using your page and points you directly to what needs fixing.\n\nThis constant feedback loop of testing, measuring, and refining is the secret to turning a good landing page into a truly great one. To build on these fundamentals, learning [how to improve website conversion rates](https://mick-mar.com/blog/how-to-improve-website-conversion-rates/) in a broader sense will give you a powerful framework for success.\n\nIf you want to dive deeper into specific tactics, check out our complete guide on [how to improve website conversion rates](https://magicui.design/blog/how-to-improve-website-conversion-rates) for more actionable tips. By embracing this mindset of constant improvement, you'll ensure your landing page keeps working harder for you over the long haul.\n\n## Common Questions About Landing Page Templates\n\nEven with a solid plan, jumping into the world of **landing page design templates** can kick up a few questions. It doesn't matter if you're a seasoned marketer or a developer who's new to the game; it’s totally normal to wonder about the finer details. This section is here to tackle the most common questions we get, with clear, direct answers to help you move forward with confidence.\n\nThink of this as your quick-reference guide. It’s designed to clear up any lingering confusion and hammer home the core ideas that make templates such a powerful part of your marketing toolkit.\n\n### What Is the Difference Between a Landing Page Template and a Website Theme?\n\nThis is a classic point of confusion, but the difference is night and day. Imagine a website theme as the master blueprint for an entire house. It sets the style for every single room—the living room, kitchen, bedrooms—to make sure everything feels consistent and connected. It’s built for exploration, with navigation menus, footers, and sidebars.\n\nA landing page template, on the other hand, is the blueprint for a single, high-stakes room, like a home theater built for one thing and one thing only: watching movies. It intentionally strips away all the usual distractions like site-wide navigation to laser-focus a visitor's attention on a single action. The whole design is engineered for one specific conversion goal, making it a specialized tool for focused campaigns.\n\n### Can I Use a Landing Page Template Without Knowing How to Code?\n\nAbsolutely, you can. The great news is the market is flooded with options for every skill level. Many templates are built specifically for no-code or low-code platforms like [Webflow](https://webflow.com/), [Framer](https://www.framer.com/), or WordPress page builders. These tools give you a visual, drag-and-drop interface so you can build and tweak pages without ever looking at a line of code.\n\nAnd for developers, templates built for frameworks like React—like the ones we offer at [Magic UI](https://magicui.design)—give you a solid, pre-built foundation. You get to skip all the boring setup and jump right into the fun part: customization and logic. The trick is just to pick a template that’s built for the platform or tech you’re most comfortable with.\n\n> The best template for you is one that lines up with both your campaign goal and your technical comfort level. The modern template ecosystem ensures there's a perfect fit for everyone, from visual builders to expert coders.\n\n### How Much Customization Does a Template Really Need?\n\nThe sweet spot is finding the right balance. You need to customize it just enough to make the page feel unmistakably yours, but not so much that you accidentally break the strategic layout that made the template effective in the first place.\n\nHere’s a simple checklist to get the essentials right:\n\n- **Brand Identity:** This is non-negotiable. Always swap in your logo, color palette, and fonts to match your brand guidelines. This creates a smooth, trustworthy experience for people coming from your ads or emails.\n- **Content and Imagery:** Rip out all the placeholder text and stock photos. Replace them with your own compelling copy and visuals that speak directly to your audience and your offer.\n- **Call-to-Action:** Double-check that the CTA button text is clear and the link goes exactly where it needs to.\n\nBe careful about making huge structural changes, though. The core layout of a premium template—the visual hierarchy, the spacing, the section flow—is usually based on design principles proven to convert. Your job is to pour your brand into that proven container, not rebuild the container itself.\n\n### Should I Choose a Free or a Premium Template?\n\nThis decision really boils down to how high the stakes are for your campaign. Free templates are great for quick experiments, personal projects, or campaigns on a shoestring budget. They let you get something live fast to test an idea without spending a dime.\n\nFor most business-critical campaigns, however, a premium template is a smart investment. Here’s why:\n\n- **Higher Quality:** Premium templates almost always have more polished design, cleaner code, and better attention to the little UX details that make a big difference.\n- **Better Support:** They often come with dedicated customer support, which can be an absolute lifesaver when you hit a technical snag.\n- **Advanced Features:** You’re far more likely to get advanced components, better documentation, and more robust customization options.\n\nWhile it costs a little something upfront, the investment in a premium **landing page design template** usually pays for itself many times over through higher conversion rates, a more professional brand image, and hours of saved development time. It just sets a stronger foundation for success.\n\n---\n\nReady to stop building from scratch and start launching beautiful, high-converting pages in minutes? With **Magic UI**, you get access to a massive library of over 50 professionally designed, fully customizable templates and components. Built with React, Typescript, and Tailwind CSS, our tools empower you to create stunning user interfaces that drive results.\n\n[Explore Magic UI Templates and Build Your Next Landing Page Today](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-examples.mdx",
    "content": "---\ntitle: \"43 Best Landing Page Examples For Design Inspiration\"\ndescription: \"Need ideas for your landing page design? These 43 best landing page examples are for inspiration and guidance. Start crafting your perfect page.\"\nimage: https://cdn.magicui.design/assets/c51ae0fd-501a-4ec4-8659-5c741c3dea17.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nLanding page examples are vital resources for your toolkit, illustrating strategies and designs to elevate your projects. Whether you're seeking to refine your approach or kick-start new initiatives, exploring landing page examples can significantly fuel your creative journey and development skills.\n\nIn your quest to level up your landing pages, have you encountered MagicUI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup)? This dynamic resource streamlines your web development process and offers inspiration to enhance your landing pages.\n\n## What Is A Landing Page?\n\n![Landing Page Examples](https://images.unsplash.com/photo-1527689368864-3a821dbccc34?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHx3ZWJzaXRlfGVufDB8fHx8MTcyMDUxMTI2Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nLanding pages are crucial for website owners, marketers, and businesses who want to:\n\n- Generate leads\n- Sell products\n- Encourage specific actions from visitors\n\nThey are vital for converting web traffic into leads and customers. By guiding visitors toward the desired action, [landing pages](https://blog.hubspot.com/blog/tabid/6307/bid/32566/why-landing-pages-are-an-indispensable-part-of-marketing.aspx) prevent prospects from navigating away from the website without taking that action. Examples of things landing pages can persuade visitors include:\n\n- Signing up for a webinar\n- Downloading a guide\n- Requesting a quote\n\nEach action calls for a specific set of landing pages to be created.\n\n## What Makes A Landing Page Optimized And Effective?\n\n![Landing Page Examples](https://images.unsplash.com/photo-1581291518633-83b4ebd1d83e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWJzaXRlJTIwZGVzaWdufGVufDB8fHx8MTcyMDUxMTI5Nnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nCrafting an effective landing page is about blending appealing design and clear content. The top-notch ones grab attention with the following:\n\n- Enticing visuals\n- Persuasive text\n- Layout that is smooth to navigate\n\n### Captivate and Convert\n\nStriking images and videos are essential to hook users quickly. Equally crucial is straightforward writing that conveys the page's message and addresses user needs. The balance between captivating visuals and compelling words is the formula for a standout landing page, creating a harmonious combination of design and content.\n\n### Clarity and User Journey\n\nYet, it is incomplete without a user-friendly layout. That means a clean, easy-to-follow design with a well-placed call to action (CTA). A strategically positioned CTA is a roadmap, effortlessly guiding visitors toward the page's goal. A successful landing page combines visuals, writing, and layout to capture attention and deliver a crystal-clear message, smoothly guiding visitors toward the intended action.\n\n### Effortless UI Design with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 43 Best Landing Page Examples For Design Inspiration\n\n![Landing Page Examples](https://images.unsplash.com/photo-1567606404787-ebd010176fdf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxuZXRmbGl4fGVufDB8fHx8MTcyMDUxMTI3N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Netflix\n\nNetflix has a straightforward landing page that makes it easy for users to sign up for a membership. The copy is concise, stating the brand’s value proposition and clarifying that users can cancel anytime. Basic pricing details are displayed upfront, saving users from having to search for them.\n\n### 2\\. Salt & Straw\n\n[Salt & Straw's landing page](https://saltandstraw.com/pages/flavors) offers a simple, memorable, and visually appealing layout. It rewards lead capture with a monthly newsletter subscription and 10% off the first order. The visual of scoops of ice cream flanked by rows of ripe summer berries is enticing and visually appealing.\n\n### 3\\. Herb & Wood\n\nThe landing page for Herb & Wood Private Events is designed to funnel traffic looking to host private events near their venue in San Diego. The landing page offers one clear action for visitors to click on the Private Events link, driving them towards hosting an event at Herb & Wood's venue.\n\n### 4\\. REI Co-Op\n\nREI Co-Op utilizes a carousel of messages to encourage immediate shopping actions from landing page visitors. The page features a variety of links, all leading visitors to shop now or save on various merchandise categories.\n\n### 5\\. St. Jude's Children's Research Hospital\n\nSt. Jude's Children's Research Hospital inspires monthly giving with heartwarming stories of the children it helps. The landing page features emotive stories and testimonials of successful childhood cancer treatment to inspire visitors to contribute.\n\n### 6\\. Philosophy\n\nPhilosophy's landing page is designed to provide multiple opportunities for visitors to shop for skincare products and fragrances. Scrolling down the page reveals additional shopping links, catering to visitors interested in skincare or fragrances.\n\n### 7\\. Slack\n\nSlack's landing page stands out with its messaging, emphasizing that it's more than just a tool. The page keeps the navigation bar simple and focused, with only essential elements included for current users to log in and prospective users to contact sales.\n\n### 8\\. ExpressVPN\n\nExpressVPN's landing page communicates safety and simplicity, promising visitors a seamless online experience. The page features simple graphics and prominent TrustPilot and app store reviews to establish credibility and trust with visitors.\n\n### 9\\. Blue Apron\n\nBlue Apron's landing page emphasizes the variety of menu options available, using high-quality food photography to entice visitors. The CTA remains consistent throughout the page, encouraging visitors to explore the available plans and customize a subscription based on their preferences.\n\n### 10\\. LinkedIn Ads\n\n[LinkedIn Ads' landing page](https://business.linkedin.com/marketing-solutions/cx/17/06/advertise-on-linkedin) outlines the benefits of advertising on LinkedIn, with a fixed header menu and a concise description of the three-step ad launch process. The page presents a carousel of key benefits and ensures visitors won't waste time with a cumbersome backend system.\n\n### 11\\. Hootsuite\n\nHootsuite's landing page aligns with the concept of social media as a fun but legitimate marketing tool. The page includes a 30-day free trial CTA and provides granular information on pricing and product benefits as users scroll down.\n\n### 12\\. Wondrium\n\nWondrium's landing page uses tiled movie title graphics as a background to showcase the service's breadth of offerings. The page highlights a 14-day free trial offer and features well-known Internet creators' testimonials to prove the service is worth exploring.\n\n### 13\\. Uber for Business\n\nUber for Business's landing page offers a fast track for businesses looking to set up an Uber account for various services. The page offers a clear headline, a succinct description, and three benefits to persuade visitors to take action towards setting up an Uber account.\n\n### 14\\. Skillshare\n\nSkillshare's landing page design features a navy blue background with tiled photos showcasing various course types. The page uses an F-pattern layout to detail three key differentiators and a simple signup form requiring a name and email address.\n\n### 15\\. Snowflake\n\nSnowflake's event page demonstrates a commitment to mingling informative content with fun and networking, providing detailed descriptions and an interactive event finder. The page features minimal graphics and plenty of text to cater to a data analytics audience.\n\n### 16\\. Spatium\n\nSpatium's landing page features shades of purple and captivating images of outer space, making it visually appealing. The page uses abundant blank space to accentuate limited text and create an attractive, straightforward design.\n\n### 17\\. Beats by Dre\n\n[Beats by Dre's landing page](https://www.beatsbydre.com/headphones/studio3-wireless) dedicates ample space to elaborate on their wireless headphones' style elements, technical features, and craftsmanship. The page uses large visuals, concise text, and a direct \"buy\" button to shorten the path to purchase.\n\n### 18\\. Inbound by Hubspot\n\nInbound by Hubspot's conference landing page offers a focused CTA and persuasive content to convince visitors to attend the event. The page showcases videos, photos, and speaker bios while clearly delineating ticket types for easy selection.\n\n### 19\\. Masterclass\n\n[Masterclass's landing page](https://www.masterclass.com/classes/aaron-sorkin-teaches-screenwriting?campaignid=17057064857&adgroupid=139639039607&adid=594729885738&utm_term=&utm_campaign=%5BMC%5C+%7C+Search+%7C+NonBrand+%7C+Category_DSA+%7C+USA+%7C+EN+%7C+tCPA+%7C+EG%7CPP+%7C+BRD+%7C+US&utm_source=google&utm_medium=cpc&utm_content=594729885738&hsa_acc=9801000675&hsa_cam=17057064857&hsa_grp=139639039607&hsa_ad=594729885738&hsa_src=g&hsa_tgt=dsa-19959388920&hsa_kw=&hsa_mt=&hsa_net=adwords&hsa_ver=3&gclid=CjwKCAjw8-OhBhB5EiwADyoY1WTI56QAIC0IgKN-KLGC8R7A1JhE3_JbLj7cxeiYHM2DUdbMyHhuORoCe9QQAvD_BwE) for a screenwriting course features marquee instructor Aaron Sorkin, with a simple red CTA, making it straightforward for visitors to claim a class spot. Video preview clips and a course outline help visitors decide whether the content meets their needs.\n\n### 20\\. Calm\n\nCalm's landing page practices what it preaches by focusing on tranquility and relaxation. The page is clean and straightforward and invites visitors to join millions around the globe on a wellness path. The headline \"Meet Calm\" creates a feeling of harmony and peace for visitors.\n\n### 21\\. Zola\n\nZola's landing page makes wedding planning easy for couples by offering a one-stop shop for everything from invitations to the honeymoon. The page starts with a powerful word \"free\" attracting couples wanting to plan a polished wedding while saving on costs.\n\n### 22\\. CD Baby\n\nCD Baby's landing page points out the benefits for musicians using their services, offering clear pricing to ensure transparency and clarity upfront. The page follows a direct approach, showcasing what musicians get for their investment.\n\n### 23\\. Goby\n\nGoby's landing page promises \"Brushing perfected\" at the top, instilling confidence and curiosity in visitors. The page breaks down every element of the toothbrush visually, offering visitors a clear understanding of what they're getting.\n\n### 24\\. DoorDash\n\nDoorDash's landing page targets potential drivers, showcasing the benefits of becoming a food delivery person. The page highlights the freedom of working your hours and being your boss, appealing to those seeking a flexible side hustle.\n\n### 25\\. SEM Rush\n\nSEM Rush's landing page narrows its focus on competitor analysis, tapping into marketers' desire to spy on the competition. The page features a simple, one-field form entry and offers real-life success stories, testimonials, and social proof for visitors needing more information.\n\n### 26\\. Coco Village\n\nCoco Village's page showcases a collection of products, focusing on a sale or discount. The page makes it impossible for visitors to miss the \"50% off beds and bedding sets offer,\" emphasizing the savings through visuals and clear CTAs.\n\n### 27\\. Grass Roots\n\nGrass Roots' landing page takes a modern and adult approach to wholesale hemp oil extracts, catering to a professional crowd. The page uses a colorful and friendly design to make the subject matter approachable and engages visitors with clear benefits and value propositions.\n\n### 28\\. Amazon\n\nAmazon's landing page breaks the rules to emphasize Amazon Prime's unbeatable offer. The page features multiple links and exit points, but the offer of free shipping and access to Prime Video is highlighted in the top half for quick consumption by visitors.\n\n### 29\\. Branch Furniture\n\nBranch Furniture's landing page reassures office managers that they're in the right place by offering a fast and easy office furniture design, shipping, and installation process. The page emphasizes \"Office Furniture Made Easy,\" appealing to those looking to simplify their office furnishing process.\n\n### 30\\. Western Rise\n\nWestern Rise's landing page quickly establishes the appeal of its product, the AT Slim Rivet Pants, through visuals and compelling copy. The page evokes a lifestyle aesthetic that appeals to urban professionals seeking high-quality and stylish pants.\n\n### 31\\. Athabasca University\n\nAthabasca University uses landing pages to boost online enrollment for its certificate programs. The landing page showcases a clear headline and copy targeting people who want to further their education. The page's sharp copy and image perfectly convey the message to visitors.\n\n### 32\\. Bariatric Eating\n\nBariatric Eating's landing page infuses personality and style to make the subject matter approachable. The colorful and friendly design encourages visitors to explore and engage with the content, leading to an impressive conversion rate.\n\n### 33\\. Blow LTD.\n\nBlow LTD.'s landing page cleverly presents a genuine solution to a common problem. The page clearly states the offer, relying on value and novelty to win over prospective customers interested in in-home eyelash extensions.\n\n### 34\\. Blue Forest Farms\n\nBlue Forest Farms' landing page takes a modernized and adult approach to wholesale hemp oil extracts, catering to a professional crowd. The page conveys a strong case for the industry's seriousness with a clean design and persuasive copy.\n\n### 35\\. Border Buddy\n\nBorder Buddy's landing page starts with the painpoints and insecurity visitors may feel when importing or exporting. The page offers a clear solution and promises to handle the complicated parts for visitors, keeping the landing page clean and focused on essential information.\n\n### 36\\. Airbnb\n\nAirbnb's landing page is a one-stop shop for visitors looking to book a holiday rental. The page offers various options like beachfront, cabins, and amazing views and allows users to select a date to book directly on the page.\n\n### 37\\. Wix\n\nWix's landing page features captivating digital illustrations that follow visitors as they scroll down. The page uses design to emphasize touchpoints and highlights the main CTA at the mountain peak in the illustration.\n\n### 38\\. Row House\n\nRow House's landing page offers free first-class classes and targets new and experienced fitness pros. The page provides access to a fitness community to keep customers accountable for their fitness goals, with a clear and focused design to drive sign-ups.\n\n### 39\\. Codecademy\n\nCodecademy's landing page offers a simple signup form requiring an email address and password or integration with existing social media logins. The page also includes real-life success stories, testimonials, and social proof to make coding easier for beginners.\n\n### 40\\. Sunbasket\n\nSunbasket's landing page communicates challenges and solutions concisely, catering to an audience looking for organic and high-quality meal options. The page emphasizes convenience, quality, and autopilot meal preparation, making it highly appealing to visitors.\n\n### 41\\. Curology\n\nCurology's landing page features a clean layout with concise copy that is less than 50 characters long. The page offers a custom solution for various skin issues and emphasizes a hassle-free user experience, catering to those seeking skincare solutions.\n\n### 42\\. Breather\n\nBreather's landing page offers instant access to finding a space, using location services to provide instant options nearby. The page uses simple, to-the-point copy and soothing color schemes to align with the product, offering room to breathe for visitors.\n\n### 43\\. Paramount Plus\n\nParamount Plus' landing page is visually appealing and interactive and offers scannable yet descriptive headers. The page features repeatable CTAs and strategically placed content offers, providing multiple touchpoints for visitors to convert.\n\n## Tips For Creating An Amazing Landing Page\n\n![Landing Page Examples](https://images.unsplash.com/photo-1587440871875-191322ee64b0?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx3ZWJzaXRlJTIwZGVzaWdufGVufDB8fHx8MTcyMDUxMTI5Nnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Use Engaging Headlines and Well-Crafted Copy\n\nWhen designing a landing page, remember to incorporate compelling headlines and subheads. This will make your page easy to scan and speak directly to visitors, using “you” and “your.” Ensure the headlines are direct and the copy is precise to showcase your business’s value proposition. Include visuals that emphasize your value to give visitors a clear picture of what your offering entails.\n\n### Write a Compelling Call to Action (CTA)\n\nEntice visitors to take action by including clear call-to-action buttons that guide them on what to do next. Positioning these buttons visibly on the page, particularly above the fold, will ensure they catch the visitor's eye as soon as they land on the page. Use action-oriented words like:\n\n- Sign up\n- Get Started\n- Download\n- Start free trial\n- See live demo\n- Get a free audit\n- Register Now\n\n### Embed a Lead Capture Form\n\nTo generate leads from your landing page visitors, include a lead capture form that collects the necessary information for your sales team. While you can request as much information as desired, using forms with fewer fields, such as first name and email address or phone number, is recommended to increase the completion rate.\n\n### Add Social Proof\n\nBoost your landing page's credibility by including:\n\n- User reviews\n- Testimonials from companies\n- Customer logos\n- Industry badges\n- Awards\n- Accreditations\n\nThis social proof demonstrates your business or product’s popularity and quality, convincing website visitors to try your products or services.\n\n### Optimize for Organic Search\n\nEnsure your landing pages are optimized for organic traffic by focusing on keyword-rich content from the headline to the text. By doing this, your landing page will appear whenever a user searches for a relevant keyword or phrase on a search engine.\n\n### Make Your Page Responsive\n\nDesign your landing pages responsive across various viewing experiences, ensuring a seamless user experience on mobile and desktop devices. Creating mobile-optimized landing pages eliminates any issues that might arise from different devices.\n\n### Test and Refine Your Landing Pages\n\nConduct regular tests on your landing pages and experiment with diverse content to enhance their effectiveness. Through data analytics and A/B or heat map tests, observe how visitors interact with your landing pages to refine and optimize them for maximum conversion rates.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThe library provides a range of visually appealing and interactive elements that can be easily integrated into web applications. These elements allow for the creation of stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to meet desired branding and design requirements.\n\n### MagicUI Pro: A Shortcut to Stunning Landing Pages\n\nBesides offering a free component library, MagicUI Pro enables users to save countless hours and effortlessly create beautiful landing pages that can convert visitors into customers. With [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), users can access premium website templates that embody stunning design while maintaining high functionality. The templates are crafted to help users captivate their audience and achieve their conversion goals.\n\nReady to transform your online presence? Explore our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-sections.mdx",
    "content": "---\ntitle: \"13 Essential Landing Page Sections For A High Converting Design\"\ndescription: \"Learn how to structure your landing page to drive conversions with Magic UI's startup template.\"\nimage: https://cdn.magicui.design/assets/ll1di26a0r.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nHave you stumbled on structuring your landing page sections to drive conversions? Whether launching a new product, offering a service, or looking to capture leads, the sections on your landing page can make or break your campaign. Even the most beautifully designed landing page can only succeed if the sections are in order or flow logically. You're in the right place if you're looking for [landing page examples](https://magicui.design/blog/landing-page-examples) and wondering what sections to include on a high-converting landing page.\n\nLooking for a way to seamlessly structure your landing page sections for maximum impact without starting from scratch? Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the solution you've been looking for.\n\n## What is A Landing Page?\n\n![Landing Page Sections](https://cdn.magicui.design/assets/at7jg0lnlcl.jpg)\n\nA landing page is a web page designed to coax visitors toward a specific action. It usually attracts traffic drawn from search engines, email marketing, or social media campaigns. Visitors typically approach a [landing page](https://blog.hubspot.com/blog/tabid/6307/bid/7177/what-is-a-landing-page-and-why-should-you-care.aspx) in two parts.\n\n- The content at the top of the page sparks interest, concisely communicating the benefits or offers, and provides a [call-to-action (CTA)](https://www.investopedia.com/terms/c/call-action-cta.asp). This content typically fits on the screen above the fold, meaning no scrolling is required to read it.\n- As visitors scroll down, they can access detailed information, such as product features and social proof, to support their decision-making.\n\n## Benefits of Landing Pages\n\n![Landing Page Sections](https://cdn.magicui.design/assets/kpnzwmyc71c.jpg)\n\nWhen tailored to the audience and purpose of a specific campaign, landing pages increase the chances of capturing the attention of the target audience. They play a critical role in converting visitors into leads or customers. These pages provide an opportunity for re-engagement. Users can establish a long-lasting relationship with the brand by making a positive impression on users and encouraging them to subscribe and eventually purchase more.\n\nLanding pages offer a direct entry into the marketing funnel. The email addresses and other user information obtained from the landing page can be used to establish a profitable relationship with these customers.\n\n### Empowering Design with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Types of Landing Pages\n\n![Landing Page Sections](https://cdn.magicui.design/assets/qep5jo45sla.jpg)\n\n- Lead capture landing page\n- PPC (Pay-PerClick) landing page\n- Product landing \\[age\n\n### Lead Capture Landing Page\n\nLead capture landing pages are designed to gather visitor information, such as names and email addresses, in exchange for:\n\n- Valuable content or offers like eBooks\n- Whitepapers\n- Webinars\n\nThe primary objective is to build an email list and nurture leads for future marketing efforts. These landing pages typically feature a headline that communicates the offer's value proposition, a form to collect visitor information, and a compelling CTA button encouraging visitors to submit their details.\n\n### PPC (Pay-Per-Click) Landing Page\n\nPPC Landing Pages are explicitly created for paid advertising campaigns (e.g., [Google Ads](https://support.google.com/google-ads/answer/6146252?hl=en) or [Facebook Ads](https://buffer.com/resources/facebook-ads-beginners-guide/)) and aim to maximize the conversion rate by providing a seamless and relevant experience for visitors who click on the ad.\n\nThese pages are optimized to match the ad's messaging, with a headline and copy that align closely with the ad content. They include a prominent CTA button that mirrors the ad's call-to-action and are designed to minimize distractions to keep visitors focused on converting.\n\n### Product Landing Page\n\nProduct Landing Pages showcase and promote a specific product or service to drive conversions and sales. They highlight the product’s key features, benefits, and value propositions to persuade visitors to purchase or take another desired action. These pages typically include:\n\n- Captivating headline\n- High-quality product images or videos\n- Detailed product descriptions\n- Customer testimonials or reviews\n- Pricing information\n- Clear CTA button\n\n## 13 Essential Landing Page Sections: Anatomy Of A High-Converting Landing Page\n\n![Landing Page Sections](https://cdn.magicui.design/assets/bsrsyr8h3y8.jpg)\n\n### 1\\. Attention Grabbing Hero Section\n\nMany of your customers will access your landing page using their mobile devices, and the first thing they will see is the above-the-fold or hero section of your page.\n\nYou must be able to convey your [USP (unique selling proposition)](https://www.optimizely.com/optimization-glossary/unique-selling-point/) in that section of your page and convince them to keep scrolling. The above-the-fold section includes multiple components that persuade the site visitor to consider your offer. Elements will be found in the hero section like:\n\n- Logo\n- Headline\n- Supporting headline\n- Hero image\n- CTA button or form\n\nHero section features to consider:\n\n#### A Compelling Headline\n\nYour landing page headline must grab visitors' attention and communicate what your company offers using as few words as possible. You will also ideally insert keywords here for SEO purposes.\n\n####  An Easily Digestible Supporting Message\n\nThe supporting headline follows the main headline and aims to persuade the site visitor to take the desired step. It is usually written in a smaller font than the main headline.\n\n#### A Hero Image\n\nYour hero shot can be a high-quality image or video that helps the site visitor visualize your product or offer. It must make the customer empathize with the emotion and message you are trying to convey in your web copy.\n\n#### CTA Button\n\nThe CTA is one of the most important elements in the hero section of your landing page, and all the other elements build towards it. Your landing page will have fulfilled its purpose once the site visitor clicks on it and completes the desired action.\n\n### 2\\. Unique Value Proposition\n\nA compelling, unique value proposition addresses the visitor’s question, \"Why should I choose your product or service over others?\" This part of the landing page is your chance to display your product in action and how the features create a solution for your target customer. To accomplish this outcome, highlight unique features or solutions, address customer pain points and fears, and emphasize what sets your offer apart.\n\nWhen it comes to formatting your unique value proposition on a landing page, you can take a few different routes:\n\n- Bullet points\n- Graphics/infographics\n- Statistics\n- Testimonials/reviews\n- Product demos, screenshots, or gifs\n\n### 3\\. Persuasive and Benefit Driven Copy\n\nOnce you get the site visitor to scroll past the hero section, you must drive your message home with the rest of your text. Your body copy must effectively describe the features and benefits of your product or offer clearly and concisely.\n\nEach sentence needs to convince the visitor that your product or service is exactly what they need and answer any questions they may have. Outsourcing service provider SupportNinja's landing page is an excellent example of a well-planned page content layout.\n\nConsiderations with body copy:\n\n#### Numbered List or Features List\n\nYour site visitors will find scanning through bullet points and numbered lists easier than text-heavy content. A list forces you to break down your content into concise, simple benefits.\n\n#### Use Subheadlines\n\nBreaking down your landing page into sections using subheadlines is a great way to enhance the readability of your content and help visitors \"scan\" your page for the content that interests them.\n\n### 4\\. Call to Action\n\nA well-crafted CTA guides visitors toward the desired conversion goal — and is, of course, one of the most crucial parts of a landing page. When done correctly, a CTA prompts visitors to take a specific action, such as:\n\n- Signing up\n- Making a purchase\n- Downloading content\n\nDepending on your goals and organization, you might use one of the following common formats for your CTA(s):\n\n- _Button:_ These clickable elements typically have text that prompts visitors to take action, such as \"Sign Up,\" \"Buy Now,\" or \"Learn More.\" Buttons can vary in size, shape, color, and style, but they should always stand out and be easily clickable.\n- _Text link:_ Format these links differently from regular text to make them more noticeable and clickable.\n- _Form submission:_ For lead generation landing pages, the CTA may be a form submission field where visitors can enter their information and submit it to access a resource or request more information.\n- _Popup:_ CTAs can also appear in popups or modals at the top or bottom of the landing page content. You can use popups for special offers and promotions or to capture email sign-ups.\n\n### 5\\. Social Proof\n\nOne of the best ways to tell a story on your landing page is to provide evidence of real people who have benefitted from your product. The goal is to:\n\n- Inspire your visitors\n- Build credibility\n- Create trust\n\nTo accomplish this goal, you can include a variety of different types of content, including:\n\n- [_Customer testimonials_](https://www.linkedin.com/pulse/importance-customer-testimonials-south-coast-social#:~:text=Research%20shows%2072%25%20of%20customers,trust%20with%20your%20social%20audience.)_:_ Quotes or reviews from satisfied customers who have had positive experiences with your product or service can be highly persuasive. Testimonials should be authentic, specific, and ideally accompanied by the customer's name, photo, and affiliation (if relevant).\n- _Case studies:_ Detailed accounts of successful customer experiences or use cases to demonstrate real-world results and provide evidence of your product or service's effectiveness.\n- _User ratings and reviews:_ Display star ratings or numerical scores.\n- _Customer logos:_ Showcase recognizable logos or badges of well-known customers, partners, or industry affiliations.\n- _Social media mentions:_ Highlight social media mentions, shares, or endorsements from influencers or industry leaders.\n- _User-generated content (UGC):_ Share user-generated content, such as photos, videos, or testimonials your customers create related to your product or service.\n- _Trust badges:_ Include badges, such as security seals or industry certifications, that prove your website's reliability and authority.\n\nEach piece of content adds credibility to your offer and reassures visitors that others have had positive experiences.\n\n### 6\\. Great-looking, Supporting Imagery\n\nEvery image on the page should support the surrounding text or provide additional context about your story. If it doesn’t, you don't need it on your landing page. When creating your own landing page, carefully consider how best to convey your offer through imagery.\n\n### 7\\. The Team \n\nOkay, so you have a great product, and people understand how it works, but do they know who you are? As we’ve discovered, converting visitors is about creating trust. To solidify that trust, it’s often advantageous to provide insight into the human faces behind your company. This approach helps assuage fears about whether or not visitors can rely on you to support their needs over the long term.\n\nAnyone investing their hard-earned money into a new solution most likely wants to know who they’re getting involved with. While this isn’t always the case, showcasing how awesome your team is may set you apart from the competition.\n\n### 8\\. Contact Information\n\nContact information on a landing page aims to establish trust, offer support, encourage communication, and provide a means for visitors to take the next steps. It makes your business more accessible to visitors, offers transparency, and shows that you are open to communication.\n\n#### Prioritizing Contact Information for Accessibility and Trust\n\nIn some cases, visitors may prefer to contact you directly for more detailed information that may not be addressed on the landing page. Multiple contact methods, such as phone numbers and email addresses, ensure visitors can reach out with queries. In certain regions or industries, providing contact information is a legal requirement. This information should be easily accessible, instilling confidence in the visitor.\n\nContact information also adds a human touch to your business. It shows that real people are behind the products or services, making the interaction more personal.\n\n### 9\\. Doubt-busting FAQs\n\nProvide a [Frequently Asked Questions](https://blog.hubspot.com/service/faq-page) section to make your argument and remove any remaining doubts before any on-the-fence visitors reach the end of the page. The FAQs can demonstrate brand empathy. By listening to your users’ concerns, you can proactively address them while they're making a decision.\n\n### 10\\. Minimalist Footer\n\nAs with the header, the best landing pages include only essential information and links in the footer. Some comment elements to include are:\n\n- Link to Privacy Policy page\n- Link to Terms of Use page\n- Brand logo\n- Copyright Statement\n\nAnything more than that in your landing page’s footer risks distracting your visitors with other calls to action. Remember, the goal of a landing page is to convert as many users as possible.\n\n### 11\\. Pricing \n\nPrice is one of the most significant objections new leads will have as they are near the closing stage of the buying cycle. If you are in the SaaS or e-commerce industry, handling those objections up-front will save you a lot of time.\n\nIt includes a clear, transparent pricing section that breaks down the specs for visitors who are ready to buy. If you detail exactly what they're paying for, you should be able to converse with them even if they still have a few lingering questions.\n\n### 12\\. Interactive Elements\n\nYou can use interactive elements like animations, videos, or quizzes to enhance your storytelling. It's all about creating an engaging landing page that provides a fun experience that can boost your chances of convincing the prospective customer to make a purchase.\n\nInteractive landing pages are perfect for complex products that may require a demo to help the site visitor better understand how the product can be used to solve problems in real-life scenarios. For instance, [Magic UI's animated components](https://magicui.design/) are perfect for tech startups to demonstrate how their products work or integrate with other tech stacks.\n\n### 13\\. Forms\n\nForms usually serve one primary purpose: they aim to convert visitors into leads, which is also the ultimate goal of your landing pages. This is why forms are an integral component of effective landing pages and why you should pay particular attention to creating lead capture forms.\n\nWell-crafted forms optimize the user experience, making it easy, intuitive, and efficient for visitors to complete the form, increasing the likelihood of conversion. An effective form should be user-friendly, which means it should be clear and straightforward.\n\n- You should avoid unnecessary complexity and use simple language.\n- Use clear and concise labels for form fields.\n- Use placeholder text within fields to guide users on what information to enter.\n- Clearly state what information is required and why.\n\n## Landing Page Design Best Practices\n\n![Landing Page Sections](https://cdn.magicui.design/assets/6oxra43tfbo.jpg)\n\n### Clear and Persuasive Copywriting\n\nTo create a persuasive landing page, utilize clear and concise language that focuses on benefits rather than features. Address common objections and provide reassurance to alleviate doubts that visitors may have. A well-crafted copy can effectively guide visitors towards the desired action.\n\n### Leverage Urgency and Scarcity\n\nUsing countdown timers, limited-time offers, or limited availability messages can create a sense of urgency that motivates visitors to act promptly. Urgency and scarcity elements can convey that an offer is time-sensitive or in high demand, compelling visitors to take action quickly.\n\n### Get Personal\n\nPersonalized content can significantly improve conversion rates. Implement dynamic content or targeted messaging based on visitor demographics, behavior, or preferences. Personalizing content can enhance user experience and drive conversions.\n\n### Optimize Performance and Loading Speed\n\nOptimizing landing page performance and loading speed is essential for conversion rates. Page speed is crucial, as [faster loading times](https://wp-rocket.me/blog/website-load-time-speed-statistics/) result in higher conversion rates. Employing techniques to optimize images and reduce loading times can enhance user experience and prevent visitor frustration.\n\n### Abide by UX Design Best Principles\n\nThoughtfully designed landing pages with carefully chosen:\n\n- Visuals\n- Interactive elements\n- Layouts\n- Typography\n- Fonts\n- Colors\n\nEnsure these elements align with your brand and resonate with your target audience. Following UX design best practices can enhance user engagement.\n\n### Prioritize Mobile-Responsive Design\n\nImplement responsive design techniques to accommodate mobile device users. Utilize flexible layouts, scalable images, and touch-friendly navigation to maximize engagement and conversions across all platforms. Prioritizing mobile responsiveness can improve user experience and drive conversions.\n\n### Design with Structure in Mind\n\nThe structure and layout of a landing page play a significant role in driving conversions. Employ visual hierarchy, whitespace, and directional cues to highlight key elements and reduce distractions. A [well-structured landing page](https://www.semrush.com/blog/landing-page-copywriting/) can effectively guide visitors towards the desired action.\n\n### Experiment with A/B Testing\n\nA/B testing different variations of landing pages can help identify the most effective elements. Testing elements such as headlines, visuals, and CTAs allows you to optimize your landing page for improved conversion rates. [A/B testing](https://webflow.com/blog/a-b-testing-tools) helps understand visitor preferences and optimize landing pages for performance.\n\n### Focus on Responsive Forms\n\nOptimize forms on landing pages for usability and conversion across all devices. Use clear labels, input validation, and error messages to guide visitors through the form submission. Keep forms short and simple by only asking for essential information to reduce friction and improve conversion rates.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Best Landing Page Design Examples\n\n![Landing Page Sections](https://cdn.magicui.design/assets/9bnvx33n39.jpg)\n\n### [langfuse.com](http://langfuse.com)\n\nLangfuse is a tech startup designed to enhance observability for AI applications, particularly those using [large language models (LLMs)](https://www.ibm.com/topics/large-language-models). It integrates seamlessly with existing AI models to provide detailed insights into their performance, helping developers understand and improve their AI systems.\n\n- Langfuse uses Magic UI to build its landing page.\n- The landing page engages with animated components offered by Magic UI, and its clean design maintains a 1:1 attention ratio.\n- Once you land on the page, the animated video in the header section and the shimmering buttons are worth noticing.\n\n### Cognosys\n\nCognosys is a platform that leverages advanced artificial intelligence to enhance business operations and decision-making. It integrates various AI capabilities to provide:\n\n- Comprehensive data analysis\n- Automation\n- Predictive insights solutions\n\nThe platform is designed to help organizations:\n\n- Optimize their workflows\n- Improve efficiency\n- Gain valuable insights from their data\n\nTheir landing page leverages Magic UI's capabilities to deliver interactive and customizable interfaces easily. The page is incredibly dynamic, and lots of animations and effects give the impression of action.\n\n### ClickUp\n\nClickUp is in direct competition with [Monday.com](http://Monday.com) as a project management software, so its landing page highlights how its features stand out against Monday’s offerings. This is done through a neatly organized comparison table that’s informative and easy to navigate.\n\n- Simple imagery and very little text crowd the page, while the customer testimonials and award badges boost their credibility.\n- A standout feature is the practical CTA button that offers a seamless transition for users to import their [Monday.com](http://Monday.com) account to ClickUp.\n\n### Zapier\n\nZapier is an application that allows workflow automation and makes various integrations possible. They’ve strategically created a landing page for each specific integration so that users can find the exact information they need. This landing page is particular to the Zapier integration for Keap, a platform for managing customer relationships.\n\nNaturally, anyone searching for Keap integrations will come across this landing page. It effectively showcases how Zapier enhances Keap’s functionality and details the range of integrations available.\n\n### SurveyMonkey\n\nSurveyMonkey is a tool designed for conducting and gathering survey results from a target audience. Unlike many landing pages, this page includes dropdown menus for additional pages in the header.\n\n- It keeps the page's content focused so the reader doesn’t get distracted.\n- It jumps straight into the pricing plan options and a form to contact sales, efficiently guiding visitors toward making a decision.\n- The page comprehensively details what you can do with SurveyMonkey tools and the various scenarios and situations you could use them for.\n\n### Leadpages\n\nLeadpages is a small website and landing page builder. While its main website has a lot of information, this landing page provides a more streamlined approach. The main selling point is that you can build a landing page in 30 minutes or less using a combination of templates and AI technology.\n\n- They include a short video explaining the product and brief written content explaining what it enables you to do.\n- They cover how Leadpages can resolve your problems and increase leads and sales. There are a couple of customer testimonials and a good distribution of CTA buttons.\n\n### PandaDoc\n\nPandaDoc is a corporate document management system streamlines organizing, sending, and tracking documents for e-signatures. This landing page is specifically built to request a demo. It includes:\n\n- Demo request form\n- Short explanation of what you can do with PandaDoc\n- Some trust badges\n\nIt is plain and simple but very effective for users at a point in the sales funnel where they’re ready to commit just a little bit more.\n\n### Wix\n\nWix is a well-known drag-and-drop website builder that gives almost infinite possibilities for website design. Of course, there’s some fierce competition in the world of [no-code website builders](https://www.techtarget.com/searchsoftwarequality/definition/no-code), so the Wix team has created this landing page to help boost conversions. You first see a bold CTA, which allows you to enter your email address and get started.\n\nSome sleek information blocks outline how Wix can help you achieve your goals as you scroll down. The landing page:\n\n- Minimalistic\n- Few images and CTA buttons\n- Accessible from excess dropdown menus or unnecessary buttons\n\n## Landing Page vs Homepage\n\nLanding pages and home pages are both fundamental elements of a website. They serve different purposes and cater to distinct audiences. A landing page is a standalone page created for a specific marketing campaign. Its primary function is to [convert visitors into leads](https://evolving-digital.com/resources/convert-website-visitors-into-leads-and-customers/). Landing pages eliminate distractions and encourage visitors to focus on a single action, such as filling out a form or purchasing.\n\nA homepage provides a general overview of a website. It gives visitors an idea of what to expect and offers various navigation options. Unlike a landing page, a homepage aims to [engage visitors](https://www.qualified.com/blog/blog-posts/how-to-proactively-engage-website-visitors-like-a-pro) and direct them to different parts of a website. While landing pages are more targeted and conversion-focused, homepages are designed to showcase the breadth of a website's offerings.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Versatile and Customizable UI Components\n\nThe library provides a range of visually appealing and interactive elements that can be easily integrated into web applications, enabling the creation of stunning user interfaces with minimal effort. MagicUI components are highly customizable, allowing seamless adaptation to match desired branding and design requirements.\n\n### Bridging the Gap Between Design and Development\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences. With the free component library, [MagicUI Pro](https://pro.magicui.design/) can save time and create beautiful landing pages that convert visitors into customers with its website templates.\n\nInterested users can take advantage of the [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/landing-page-ui.mdx",
    "content": "---\ntitle: \"How To Design a User-Friendly Landing Page UI & Useful Tips\"\ndescription: \"Learn essential tips for designing a user-friendly landing page UI that captivates visitors and enhances engagement effectively.\"\nimage: https://cdn.magicui.design/assets/264ac004-454a-4436-ba2d-c64e89a83d10.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nEver stare at a blank page, not knowing where to start? This blog explores landing page UI design and creating a standout, user-friendly, and engaging design inspired by [landing page examples](https://magicui.design/blog/landing-page-examples).\n\nWith Magic UI's startup landing page template, achieve a user-friendly design that drives results. Ready to learn the secrets? Let's dive in!\n\n## What Is Landing Page UI?\n\n![Landing Page UI](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx1aXxlbnwwfHx8fDE3MjEyNjQxMTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nA landing page UI, or user interface, is a webpage's [strategic design and layout](https://www.interaction-design.org/literature/topics/ui-design) that aims to capture visitors' attention and guide them toward a specific action.\n\n### Purpose of a Landing Page UI\n\nThe main goal of a landing page is conversion. Unlike a general webpage, which might have multiple purposes, a landing page is highly focused.\n\n#### Designed for Action\n\n- Optimize for newsletter sign-ups\n- Drive resource downloads\n- Facilitate purchases\n- Focus on specific actions\n\nThe UI plays a crucial role in achieving this by creating an intuitive and engaging experience that directs the visitor's attention to the desired outcome.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Why Is Your Landing Page UI Important\n\n![Landing Page UI](https://images.unsplash.com/photo-1463717993767-4ded88224b61?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMG1vYmlsZXxlbnwwfHx8fDE3MjEyNjQxMzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nThe [UI (user interface) of a landing page](https://www.uxpin.com/studio/blog/landing-page-ui/#:~:text=They%20are%20often%20the%20first,gives%20visitors%20a%20unique%20feel.) is crucial for several reasons, all of which contribute to the overall effectiveness of the page in achieving its primary goal: converting visitors into leads, customers, or subscribers. Here’s why the UI of a landing page is so vital:\n\n### First Impressions Matter\n\nThe UI is often the first thing visitors notice when they land on your page. A well-designed UI creates a positive first impression, encouraging users to stay and explore further. Visitors may quickly leave if the UI looks outdated, cluttered, or unprofessional, resulting in a high bounce rate.\n\n### Guiding User Behavior\n\nA clear and intuitive UI guides users toward the desired action, whether it's signing up for a newsletter, downloading a resource, or making a purchase.\n\n#### Key Elements for Accessibility\n\n- Clear headlines\n- Prominent call-to-action (CTA) buttons\n- Easily accessible forms\n\nEffective UI design uses visual hierarchy to direct attention to these critical elements.\n\n### Enhancing User Experience\n\nThe UI significantly impacts the overall user experience (UX).\n\n#### Enhancing Visitor Experience\n\n- Easy-to-use design\n- Visually appealing layout\n- Responsive interface\n\nPoor UI design, on the other hand, can frustrate users and drive them away.\n\nBuilding Trust and Credibility\n\nA professional and polished UI helps build trust and credibility with visitors.\n\n#### Integrating Trust Signals\n\n- Customer testimonials\n- Security badges\n- Company logos\n\nA cohesive and visually appealing UI reinforces the brand's reliability and professionalism.\n\n### Reducing Friction\n\nFriction in the user journey can prevent conversions. A well-designed UI minimizes friction by making it easy for visitors to understand what is offered and how to obtain it.\n\n#### Improving UI for Conversion\n\n- Simplified forms\n- Clear instructions\n- Fast load times\n\n### Optimizing for Different Devices\n\nWith a significant portion of web traffic coming from mobile devices, it’s essential that the UI is responsive and looks good on all screen sizes. A responsive design ensures that the landing page is accessible and functional, whether viewed on a desktop, tablet, or smartphone, thereby increasing the chances of conversion across all devices.\n\n### MagicUI: Designed for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## 7 Essential UI Design Elements of Landing Pages\n\n![Landing Page UI](https://images.unsplash.com/photo-1502945015378-0e284ca1a5be?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3ZWJzaXRlfGVufDB8fHx8MTcyMTI2NDE1OHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Headline and Subheadline\n\nCreating an effective landing page UI involves incorporating several key elements, each designed to capture visitors'' attention and drive them toward a specific action. Here’s a detailed look at these essential components:\n\n#### Headline\n\n- Compelling and Clear: The headline is the first thing visitors see and should immediately grab their attention. It needs to convey the primary benefit or offer of the page succinctly. For example, instead of \"Welcome to Our Site,\" a more compelling headline might be \"Boost Your Productivity with Our Time-Saving Tools.\"\n- Primary Benefit: Focus on what the visitor will gain. A headline like \"Increase Your Sales by 50% in Just 30 Days\" directly appeals to the visitor's goals and needs.\n\n### Subheadline\n\n- Additional Context: The subheadline provides supporting information that complements the headline, offering more detail or context. For instance, \"Our easy-to-use tools help streamline your workflow, so you can focus on what matters most.\"\n- Enticing Visitors: It should entice visitors to read further by offering additional value or explaining the headline’s claim more thoroughly.\n\n### 2\\. Call to Action (CTA)\n\n#### Button or Link\n\n- Prominently Placed: The CTA should be obvious and stand out from the rest of the page, often achieved through contrasting colors or bold fonts.\n- Visually Distinct: Common CTAs include \"Sign Up,\" \"Get Started,\" or \"Learn More,\" but the key is to make the button or link unmistakable and inviting to click.\n- Encourages Action: Use verbs that prompt immediate action, such as \"Download Now,\" \"Join Today,\" or \"Claim Your Free Trial.\"\n- Sense of Urgency or Benefit: Phrases like \"Limited Time Offer\" or \"Start Saving Now\" create urgency, encouraging visitors to act quickly.\n\n### 3\\. Visuals\n\n#### Images and Videos\n\n- High-Quality Visuals: [Use professional images](https://www.searchenginejournal.com/why-content-needs-amazing-images-videos-visuals/268911/) and videos to capture attention and illustrate the benefits of your product or service. Visuals can make abstract concepts more tangible and engaging.\n- Illustrate Benefits: Show the product in use or highlight key features and benefits through visuals to help visitors understand the value proposition quickly.\n\n#### Relevance\n\n- Alignment with Message: Ensure all visuals directly relate to the page's content and reinforce the CTA. Irrelevant images can distract or confuse visitors.\n- Supporting the CTA: Visuals should help guide the visitor’s eye towards the CTA through directional cues or by illustrating the benefits mentioned in the headline and subheadline.\n\n### 4\\. Form\n\n#### Data Collection\n\n- Essential Information Only: If the goal is to collect user information, keep the form simple. Ask only for essential details to avoid overwhelming visitors. For instance, an email sign-up form should ideally just ask for an email address and a first name.\n- Ease of Use: Design the form to be straightforward and user-friendly, reducing friction and encouraging completion.\n\n#### Placement\n\n- Strategic Positioning: Place the form near the CTA, ensuring it is easily accessible without requiring excessive scrolling.\n- Visibility: Ensure the form is visible and stands out within the design layout.\n\n### 5\\. Benefit-Oriented Copy\n\n#### Focus on Benefits\n\n- Solving Visitor Problems: The copy should highlight how the product or service addresses the visitor’s needs or solves their problems. Instead of listing features, explain the benefits. For example, \"Our tool automates repetitive tasks, freeing up your time for more important work.\"\n- Clarity and Persuasiveness: Use clear, concise, and persuasive language to convey the value. Address potential objections and emphasize the benefits of keeping the visitor engaged.\n\n### 6\\. Trust Signals\n\n#### Testimonials and Reviews\n\n- Building Credibility: Displaying customer testimonials and reviews can build trust by showing that others have had positive experiences with your product or service. Real quotes with names and photos are particularly effective.\n- Social Proof: Include ratings, customer stories, or case studies to reinforce the credibility of your offering.\n\n#### Certifications and Awards\n\n- Enhancing Trustworthiness: To enhance the page's trustworthiness, display logos of certifications, awards, or media mentions prominently.\n- Third-Party Endorsements: Recognizable logos from well-known organizations can significantly boost trust.\n\n### 7\\. Layout and Design\n\n#### Clean and Uncluttered\n\n- Focus on Key Elements: A simple, clean design helps focus visitors' attention on the most essential elements, like the headline, CTA, and key benefits.\n- Avoid Clutter: Remove unnecessary elements that distract or confuse visitors, ensuring a seamless user experience.\n\n#### Consistent Branding\n\n- Reflecting Brand Style: Ensure the design reflects your brand’s style and maintains consistency with other branding elements. This helps create a cohesive user experience and reinforces brand identity.\n- Professional Appearance: A well-designed, professional-looking landing page instills confidence and trust in visitors.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How To Design a User Friendly Landing Page UI\n\n![Landing Page UI](https://images.unsplash.com/photo-1609921141835-710b7fa6e438?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxmaWdtYXxlbnwwfHx8fDE3MjEyNjQxNzB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Trigger the Right Emotions by Using the Right Color, Typography, and Images\n\nBranding is essential in creating a user-friendly landing page UI.\n\n#### Aligning Design Elements with Your Brand\n\n- [Cohesive color palette](https://www.canva.com/learn/choose-right-colors-brand/)\n- Consistent typography\n- Brand-aligned imagery\n- Emotion-triggering visuals\n\nAccording to Canva, up to 85% of consumers believe color is the biggest motivator when choosing a product, and 92% consider visual appearance the most persuasive marketing factor.\n\n### Make Sure It’s Both Desktop and Mobile-Friendly\n\nA responsive design is crucial with the increasing number of connected devices worldwide. Whether users access your landing page on desktop or mobile, it should work seamlessly. A responsive, mobile-friendly design ensures a positive user experience across all devices, enhancing customer satisfaction.\n\n### Acknowledge the Power of Images on User’s Attention\n\nImages play a vital role in capturing user attention. Our brains are naturally drawn to images, especially those of faces and moving objects. Leveraging this innate response can help direct users' focus to specific areas of your landing page, such as a call-to-action (CTA).\n\n### Use Common UI Elements\n\nConsistency in UI design is critical to user-friendly landing pages. Utilizing familiar UI elements across your website makes navigation easier, enhancing the overall user experience. Maintaining a consistent design language can educate users on how to interact with various elements on your site.\n\n### Choose the Right Interface Elements\n\nSelecting the appropriate interface elements is crucial for a user-friendly landing page UI.\n\n#### Ensuring Intuitive User Interaction\n\n- User-friendly input controls\n- Clear navigational aids\n- Accessible informational elements\n\nFamiliar elements like search bars and hamburger menus enhance usability and streamline navigation.\n\n### Use the Right UI Design Tools\n\nUtilizing the right UI design tools can [streamline the design](https://www.coursera.org/articles/ui-design) process and help you create visually appealing interfaces. Tools like MagicUI offer a wide range of interactive elements that can be easily integrated into web applications, allowing you to craft stunning user interfaces with minimal effort. These tools enable seamless customization to match your branding and design requirements.\n\n## 5 Useful Tips for Landing Page UI Design\n\n![Landing Page UI](https://images.unsplash.com/photo-1616628188859-7a11abb6fcc9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxzdGlja3klMjBub3Rlc3xlbnwwfHx8fDE3MjEyNjQxODJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Clean Design\n\nWhen users land on our page, the most important thing they see is the layout and how clean the web page looks. They do not stay on a chaotic page with a lot of text or images for longer. All the components on the landing page should co-relate while ensuring the message is delivered in the proper sense.\n\n### 2\\. Headlines that grab attention\n\nHeadlines are the central part of any website's content. They are the starting point that creates:\n\n- Understanding\n- Interest\n- Attention\n\nOnce your headline grabs the visitor’s attention, the next thing is to explain the product/service. [Create killer headlines](https://neilpatel.com/blog/powerful-headlines/) that do not exceed more than 10 words.\n\n### 3\\. Mobile-friendly\n\nNowadays, making a mobile-friendly landing page is essential. Your landing page should look great even on mobile devices, be easy to navigate, and load quickly.\n\n### 4\\. Attractive & Colorful Images\n\nColors induce an aesthetic appeal that is attention-seeking. An attractive and colorful image carries a statement that will attract users and extend their visit to your landing page.\n\n### 5\\. Less is more\n\nA landing page should contain only what is necessary. Too much text, call-to-action, and images clutter the web page. It’s not crucial to have more content as ‘Less is More’. The main aim of a landing page is to guide the user to the offer and convince them to take action.\n\n## 2 Tips for Landing Page Testing\n\n![Landing Page UI](https://images.unsplash.com/photo-1519336367661-eba9c1dfa5e9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxhcHAlMjB0ZXN0aW5nfGVufDB8fHx8MTcyMTI2NDE5MHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Run A/B tests\n\nAfter launching your landing page, it's time to see how user-friendly your design is. A great way to do this is by [conducting A/B tests](https://blog.hubspot.com/marketing/how-to-do-a-b-testing#:~:text=To%20run%20an%20A%2FB%20test%2C%20you%20need%20to%20create,better%20over%20a%20specific%20period.), creating two versions of your page and comparing which performs better in conversions. This can help you identify what elements of your landing page UI may hinder its success.\n\n### 2\\. Use Heatmaps and Session Recordings\n\nHeatmaps and session recordings can offer valuable insights into how users interact with your landing page. By analyzing this data, you can identify trends or patterns that reveal areas for improvement. For example, if users need help finding the call-to-action button or need to be more engaging with key elements of your page, this information can guide you in making the necessary adjustments.\n\nThese tools can help you identify the root causes of poor performance and provide actionable steps to enhance the user experience and boost conversions.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers, offering a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nThis innovative library provides a range of visually appealing and interactive elements that can be easily integrated into web applications. It enables users to create stunning user interfaces with minimal effort.\n\n### Customize MagicUI to Match Your Unique Style\n\nWith highly customizable components, MagicUI allows seamless adaptation to match desired branding and design requirements. Combining a focus on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Boost Conversions With MagicUI's Engaging Animations\n\nThe MagicUI library includes various components to enhance user experience and engagement on landing pages. These components feature eye-catching animations and visual effects that can significantly improve a website's overall aesthetic. By incorporating MagicUI components into a landing page, users can create a more dynamic and engaging experience for visitors, increasing the likelihood of conversion.\n\n### Get Thousands of Hours Back with Our Conversion-Optimized Landing Page Template\n\nWith MagicUI Pro, users can access a startup landing page template that can save thousands of hours and help create a beautiful landing page to convert visitors into customers. This template offers a seamless solution for businesses looking to enhance their online presence and drive conversions through an optimized landing page.\n\n### Benefits of Using MagicUI Pro and Startup Landing Page Template\n\n- Streamline design process\n- Achieve a professional look and feel\n- Create a compelling user experience\n- Drive impactful results\n\nThe [MagicUI](https://magicui.design/) startup landing page template is invaluable for businesses creating a high-converting landing page without extensive design and development resources. This template allows users to quickly and effectively establish an online presence that resonates with their target audience and drives action. With MagicUI Pro, businesses can unlock the full potential of their online marketing efforts and achieve tangible results through a well-designed and optimized landing page.\n\nElevate your online presence with MagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup). Start using MagicUI Pro today and effortlessly create a compelling, high-converting landing page.\n"
  },
  {
    "path": "apps/www/content/blog/mantine-vs-chakra.mdx",
    "content": "---\ntitle: \"A Straightforward Comparison Of Mantine Vs Chakra\"\ndescription: \"Mantine vs Chakra: Which one is right for you? This comparison will help you weigh deeper, making your decision-making process much easier.\"\nimage: https://cdn.magicui.design/assets/8tvl8v3rzsd.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-22\"\nfeatured: false\n---\n\nAre you tired of navigating the complexities of [UI frameworks](https://magicui.design/blog/ui-frameworks)? Ever found yourself torn between Mantine vs. Chakra, wondering which is best for your React development projects? If so, you could need a comparison of Mantine and Chakra UI libraries for React development! This blog will discuss the intricacies of these libraries, helping you make the best decision for your projects.\n\nMagic UI’s [React component library](https://magicui.design/) is designed to simplify your development journey by offering many options to suit your specific needs. Let Magic UI craft your next awesome project.\n\n## What Is Mantine?\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/yr6sx3x5l9l.jpg)\n\nMantine is a powerful and easy-to-use library that provides developers with various components and hooks suitable for building high-performance web applications. This React components library is designed to deliver a superior user and developer experience while offering native dark theme support.\n\n### Why Choose Mantine Over Chakra?\n\nWhen comparing Mantine vs Chakra, Mantine stands out as a lightweight and feature-rich option that can streamline and enhance your web development process. It offers a comprehensive collection of 134 responsive components, making it an ideal choice for developers looking for a robust UI framework. Mantine is built on React and TypeScript, ensuring you have the tools to create modern web applications that perform exceptionally well.\n\n### Key Features of Mantine\n\n#### Lightweight and Accessible\n\nOne of Mantine's key features is its lightweight nature, which makes it easy to use and ideal for developers of all skill levels. Mantine is built on React and TypeScript, making it a powerful choice for modern web applications.\n\n#### Pre-built Components and Hooks\n\nMantine also includes a wide range of components and hooks that can be used to create high-performance web applications quickly and easily.\n\n#### Native Dark Theme Support for Design Flexibility\n\nMantine comes with native dark theme support, providing developers with the flexibility to create great applications in any environment.\n\n### A Streamlined UI Framework for Building Modern Web Apps\n\n[Mantine](https://github.com/mantinedev/ui.mantine.dev) is a powerful UI framework that offers a wide range of components and hooks for building high-performance web applications. Mantine is lightweight and easy to use, making it an excellent choice for developers of all skill levels. Built on React and TypeScript, Mantine provides developers the tools to create modern web applications that perform exceptionally well. Mantine comes with native dark theme support, enabling developers to create applications that look great in any environment.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## What Is Chakra?\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/5uv3ckn2zua.jpg)\n\nChakra UI, a relatively newer player in the market than Material UI, is a React UI library emphasizing simplicity, modularity, and accessibility. It's designed to be simple to use, yet it offers a high degree of customization. Chakra UI's unique style props approach not only makes the development process highly intuitive and efficient but also opens up a world of possibilities for developers and designers.\n\n### Why Choose Chakra Over Mantine?\n\nChakra UI aims to provide a robust set of accessible and reusable UI components for your React applications. It's built on styled-components and emotion for a seamless developer experience. The library is highly customizable, allowing developers to tweak components using the style prop. You can inspect and modify Chakra UI components via developer tools, ensuring it's easy to customize things whenever necessary.\n\nUnlike Material UI, which defines its own design system, [Chakra UI](https://javascript.plainenglish.io/tech-hot-takes-chakra-ui-review-6fcce4d8dc66) is designed to be unopinionated. This means you can use Chakra UI to build your own design system or tweak it to fit your existing design system. It provides a palette of components that can be easily mixed and matched to suit your application's needs.\n\nKey Features of Chakra\n\n#### Effortless Onboarding\n\nOne of the standout features of Chakra UI is its comprehensive documentation, which makes it extremely easy to get up and running with the library. The documentation provides clear and concise examples of how to use each component and detailed explanations of all the available props. This makes it easy to hit the ground running with Chakra UI and build beautiful interfaces quickly.\n\n#### Building Inclusive Interfaces\n\nAnother key feature of Chakra UI is its focus on accessibility. All components come with default styles that are accessible out of the box, so you don't have to worry about your app's accessibility if you're using Chakra UI components. The library encourages developers to follow best practices regarding accessibility, making it easier to build accessible applications.\n\nChakra UI also provides a theming system that allows you to customize the appearance of your app globally. You can define a theme object using your own colors, fonts, and other styles and pass it to the ChakraProvider component to apply your custom theme to all components in your app. This makes it easy to maintain a consistent look and feel across your app without manually styling each component.\n\n#### Tailored Aesthetics\n\nChakra UI is a fantastic choice for developers who want a flexible, accessible, and customizable UI library for their React applications. Its simplicity and ease of use make it a great option for beginners and experienced developers. Whether you're building a simple portfolio site or a complex web application, Chakra UI is your pick.\n\n## How Is Mantine Different From Chakra\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/q6hn1xwazql.jpg)\n\nMantine and Chakra UI are popular React UI libraries catering to different design needs.\n\n### Rapid UI Development\n\nThe Mantine library provides a wide range of pre-styled UI components, including form utilities and hooks, enabling swift development of intricate interfaces. For instance, it offers ready-to-use components to simplify tasks such as form validation and data fetching. On the other hand, [Chakra UI](https://www.adebayosegun.com/blog/the-future-of-chakra-ui) centers on flexible and composable layouts, making creating scalable projects with custom designs easier.\n\n### Customization and Scalability\n\nIt offers built-in responsive styling, reducing the need for additional CSS classes or media queries. Although Mantine may involve a steeper learning curve due to its extensive component library, [Chakra UI](https://dev.to/iamabdulazeez/why-you-should-start-using-chakraui-part-1-57f1) shines with its ease of customization and scalability, as demonstrated by its minimal base styles and built-in layout tools.\n\n### Bridging the Gap: Design-Focused Animation Library for Streamlined UI Development\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Mantine Vs Chakra: Detailed Comparison\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/36yl1zvirha.jpg)\n\n### Customizability\n\nChakra UI and Mantine differ in their customizability. Chakra UI is highly customizable through its theme system and CSS-in-JS approach, allowing users to override styles and create custom components without hassle. Chakra UI keeps its class names simple and clean, enhancing ease of customization. Mantine, on the other hand, offers customizability with a more straightforward and less complex approach using a theme system and more pre-built components.\n\n### Component Library\n\nChakra UI boasts a smaller yet more focused component library, providing a solid groundwork for building UIs. Users might need to create custom components for more intricate layouts. On the other hand, Mantine offers a more extensive library of components, including form utilities and hooks, which can be both a strength and a weakness due to the potential for a steeper learning curve.\n\n### Ease of Modification\n\nChakra UI excels in its clean class name structure, which is evident in its HTML source code. Chakra UI adds fewer classes than Material UI, allowing for easy manual manipulation of CSS classes. Conversely, Mantine UI has more components than Chakra UI, offering more features and properties that make the components more flexible for users.\n\n### Documentation and Community\n\nChakra UI has a larger user base and impressive documentation, making navigating the UI easier for new users. Mantine, while having a smaller but growing community, boasts extensive and straightforward documentation, aiding users in exploring the UI efficiently.\n\n### Performance\n\nChakra UI is optimized for performance with a lightweight styling approach. The library uses CSS-in-JS, offering customization at a slight performance cost due to runtime style computations and className generation. While optimized for performance, Mantine may have a slightly higher overhead due to its more extensive component library.\n\n### Integration\n\nChakra UI integrates well with other libraries and frameworks, especially those using Emotion for styling. It seamlessly integrates with Theme UI, Tailwind CSS, and Material UI, albeit with certain limitations for advanced components. Mantine also integrates well with other libraries but may require more configuration for specific setups.\n\n## Common Issues With Mantain And Chakra UI\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/43v0xxgz7tk.jpg)\n\n### Steep Learning Curve\n\nBoth Mantine and Chakra UI are feature-rich frameworks that pack a punch in terms of functionality. However, this can also be a double-edged sword, as it often leads to a steep learning curve. Mantine and Chakra UI have extensive feature sets that can take time for users, especially beginners, to understand fully. This steep learning curve can be a roadblock to efficiently utilizing the frameworks for some users.\n\nUsers may have to navigate the complexities of various features and functionalities as they go into the libraries, which can sometimes be overwhelming. The vibrant ecosystem of Mantine and Chakra UI is a testament to their potential, but it's important to consider that mastering these UI frameworks may require a significant time investment. Both libraries offer various options for creating visually appealing and functional user interfaces. Still, it's crucial to remember that users may need to dedicate time and effort to become proficient in using them.\n\n### Compatibility Issues\n\nIntegrating third-party libraries or plugins into projects built with Mantine or Chakra UI could potentially lead to compatibility issues. When working on projects that require the use of additional libraries or plugins, users may encounter compatibility concerns that could impact the overall functionality of their applications. Compatibility issues could arise from the intricate dependencies underpinning these UI frameworks.\n\nUsers must exercise caution when integrating external tools with Mantine or Chakra UI to avoid potential conflicts. Navigating the complexities of ensuring that all components, libraries, and plugins work seamlessly together is vital for Mantine or Chakra UI developers. Users must have a solid understanding of the dependencies and requirements of these frameworks to address compatibility issues when they arise preemptively.\n\n### Keeping Up with Updates\n\nMantine and Chakra UI are actively maintained libraries, with developers regularly releasing updates. Staying up-to-date with the latest versions of these frameworks is essential to benefit from bug fixes, new features, and performance enhancements. Keeping up with a rapidly evolving framework can be a challenge in itself.\n\nUsers need to stay alert and allocate time to update their projects to the latest Mantine or Chakra UI versions. Overlooking updates could result in missing crucial features or exposing projects to potential security vulnerabilities. Users must ensure they are well-versed in updating their projects with the latest versions of these frameworks to harness their full potential effectively.\n\n### Performance Concerns\n\nMantine and Chakra UI are powerful tools for creating UIs, but they come with additional dependencies that can affect performance. Users may encounter performance concerns when building applications using these frameworks due to increased bundle sizes resulting from the additional dependencies.\n\nWhile both frameworks offer a host of features and components to streamline UI development, users must be mindful of the impact on their applications' overall performance. Balancing functionality and performance is vital when working with Mantine and Chakra UI. Developers must carefully evaluate the trade-offs between improved functionality and potential performance bottlenecks to ensure optimal user experiences.\n\n### Related Reading\n\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Choosing Between Mantine And Chakra For Your React UI\n\n![Mantine Vs Chakra](https://cdn.magicui.design/assets/u43y8pid5u.jpg)\n\nWhen deciding between Mantine and Chakra UI for your React development project, several factors come into play. Let's dive into the details to help you make an informed decision.\n\n### Customizability and Component Library\n\nMantine offers high customizability and a more extensive component library, making it a favorable choice for projects requiring a high level of customization and a broader range of components. On the other hand, Chakra UI leans towards simplicity and a more lightweight approach with a larger community support system, which can benefit certain projects.\n\n### Complexity and Development Team Size\n\nThe complexity of your UI and the size of your development team can influence your decision. If you are working on a complex UI that requires a lot of customization and your team is well-versed in React development, Mantine might be the way to go. Chakra UI could be the better option if you prefer a more straightforward approach and have a larger development team that can benefit from a library with good community support.\n\n### Documentation, Community Support, and Integration\n\nEvaluate the documentation, community support, and integration capabilities of both Mantine and Chakra UI. Strong documentation and community support can significantly impact your development process. Chakra UI might be a better fit for your project if you value strong community support and well-documented libraries.\n\n### Finding the Right Fit\n\nIt's essential to consider how each library fits within your development workflow and ecosystem. Explore Mantine and Chakra UI to see which aligns better with your specific project requirements. Testing out both libraries can help you better understand how they work and which one would be more suitable for your project.\n\nThe decision between Mantine and Chakra UI depends on your project requirements and personal preferences. Both libraries have strengths and weaknesses, so it's vital to evaluate them in the context of your project.\n\nChoosing between Mantine and Chakra UI is crucial in your React development journey. By considering factors like customizability, complexity, team size, documentation, and community support, you can make an informed decision that aligns with your project needs.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. This cutting-edge UI library offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith [MagicUI](https://magicui.design/), design engineers can access various visually appealing and interactive elements that can be effortlessly integrated into web applications. This enables the creation of stunning user interfaces with minimal effort. MagicUI's highly customizable components allow for seamless adaptation to match specific branding and design requirements, making it a valuable tool for design-centric projects.\n\n### Empowering Design and Development\n\nMagicUI aims to bridge the gap between design and development by strongly focusing on animation and a design-centric approach. This empowers users to craft captivating digital experiences that leave a lasting impression.\n\nMagicUI offers a free component library, while MagicUI Pro allows users to save thousands of hours and create beautiful landing pages that effectively convert visitors into customers. If you want to enhance your web design projects and create memorable digital experiences, MagicUI is the perfect tool for you.\n\nTake advantage of our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/material-ui-alternatives.mdx",
    "content": "---\ntitle: \"15 Material UI Alternatives & Companions To Complement Your Project\"\ndescription: \"Enhance your project with these Material UI alternatives, which offer different design styles and functionalities to meet your needs.\"\nimage: https://cdn.magicui.design/assets/0fcce19a-ccf6-4ba4-ad17-1b5a2ffccb98.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-17\"\nfeatured: false\n---\n\nAre you tired of the same old Material UI experience for your projects? You know, that feeling when you crave something fresh and exciting but aren't sure where to look? Well, look no further, dear reader! We've got a nifty guide to show you some fantastic alternatives to Material UI that'll make your projects pop with amazing [UI frameworks](https://magicui.design/blog/ui-frameworks)! Perhaps you're seeking something new and snazzy for your project but are unsure where to start. No worries; we've got your back!\n\nEver heard of Magic UI? It's like the secret ingredient that'll level up your projects quickly! Dive into our article for all the insights on spicing up your user interfaces with [React component library](https://magicui.design/). So go on, give it a whirl! The possibilities are endless.\n\n## What Is Material UI?\n\n![Material UI Alternatives](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxtYXRlcmlhbCUyMHVpfGVufDB8fHx8MTcxOTA2MDYyNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is a React UI framework that provides predefined components for implementing Google’s Material Design. Material UI is a design language built by Google in 2014 and works with various JavaScript frameworks apart from React, such as Angular.js and Vue.js. Material UI offers a comprehensive set of reusable and customizable components, such as buttons, cards, menus, form elements, predefined styles, and themes.\n\nThe library promotes a modular and structured approach to building user interfaces, enabling developers to create visually consistent and responsive designs. With [Material UI](https://www.geeksforgeeks.org/react-material-ui/), developers can streamline their front-end development process and deliver intuitive and visually appealing web apps.\n\n## Why Some Developers Prefer Material UI Alternative Or A Companion\n\n![Material UI Alternatives](https://images.unsplash.com/photo-1605379399642-870262d3d051?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzE5MDU4NDAyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nRegarding UI frameworks, Material Design may be the king of the hill, but that doesn't mean it's the only player in the game. Designers and developers frequently explore alternative or complementary design languages to create fresh, distinctive interfaces. The dominance of Material Design has led to a more homogenous online experience where every button shares the same drop shadow and every toggle exhibits a similar design. This homogeneity can stifle creativity and innovation, pushing some designers to seek alternatives to Material UI.\n\n### Beyond Material Design\n\nDesigners well-versed in UX recognize the importance of leveraging various design languages to tailor the user interface to specific projects or use cases. Stepping away from ubiquitous Material Design can bring new life into [UI designs](https://www.programwitherik.com/starting-out-with-the-amplify-ui-component-library/) and make them stand out. By embracing alternative design languages, designers can break free from the constraints of uniformity and inject personality and uniqueness into their creations.\n\n### Innovation Through Exploration\n\nExperiencing design languages beyond Material UI fosters innovation, experimentation, and growth within the design community. It pushes designers out of their comfort zones, encouraging the exploration of new design principles, interactions, and visual styles. This exploration can create fresh, engaging interfaces that captivate users and set projects apart from the crowd.\n\n### The Adaptable Designer\n\nBy diversifying design languages in their toolkit, designers expand their creative horizons and become adept at selecting the best design language for each project's requirements. This adaptability and flexibility enable designers to craft interfaces that resonate with users, offer delightful experiences, and stand out in the saturated digital landscape.\n\n### MagicUI: A Free and Open-Source UI Library for Captivating User Interfaces\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## 15 Material UI Alternatives To Take Your Project To The Next Level\n\n![Material UI Alternatives](https://images.unsplash.com/photo-1607459726370-d1abfcda1370?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxvbiUyMGNvbXB1dGVyfGVufDB8fHx8MTcxOTA1ODgyOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Tailwind CSS\n\nThe Tailwind CSS library enables developers to build custom user interfaces using a utility-first CSS framework rapidly. It provides a comprehensive set of pre-defined utility classes, eliminating the need to write custom CSS styles.\n\nThe Tailwind CSS library, a utility-first CSS framework, is a tool that inspires creativity. It supports React, Vue, and HTML, and allows you to easily apply utility classes to HTML elements, giving you granular control over the appearance and behavior of your UI components. Tailwind CSS promotes a modular approach to styling, where you can combine classes to create unique and responsive designs. It offers utilities for layout, typography, colors, spacing, and more, allowing you to create consistent and visually appealing interfaces with minimal effort. With Tailwind CSS, your creativity is the limit.\n\n### 3\\. Ant Design\n\nAs a comprehensive UI component library, Ant Design offers a wide array of reusable and well-documented components for constructing high-quality applications. It offers robust features such as internationalization support, theming capabilities, and responsive design. Developers can efficiently create uniform and visually appealing interfaces with forms, tables, navigation menus, and others.\n\nAnt Design is well-suited for web applications, cross-platform applications, and native apps. So whether you’re building a web app or a native app, Ant Design has you covered with its comprehensive range of components and features\n\n### 4\\. Flat Remix\n\nLike MUI, Flat Remix brings a light, no-frills design language to the table. It is so light that no JavaScript code is needed, making it ideal for rapid development use cases. As its name suggests, Flat Remix’s look pulls from Material Designs’ forerunner, flat design, reworking the language for more modern sensibilities. Flat design has (sometimes deservedly), gotten quite a bit of flak, but Flat Remix’s refresh alleviates some of those critiques.\n\n### 5\\. Semantic UI\n\nSemantic UI is a versatile front-end framework that offers a wide range of semantic and intuitive components for creating user interfaces. It provides a comprehensive collection of pre-designed UI elements for web applications, including buttons, forms, menus, cards, and modals.\n\nThe framework follows a natural language naming convention, making it user-friendly and easy to understand. Developers can leverage Semantic UI’s extensive set of CSS classes to build visually appealing and responsive designs quickly. The library supports React, Meteor, Ember, and Angular front-end frameworks. Semantic UI supports theming and customization, allowing developers to customize the appearance of their UI components to align with their project’s branding. With its intuitive syntax and detailed documentation, Semantic UI is a valuable tool for designing and developing modern web interfaces.\n\n### 6\\. React-Bootstrap\n\nReact-Bootstrap is a popular React UI library for creating responsive web applications with React. It leverages the component-based structure of React and the flexible styling capabilities of Bootstrap to provide a wide range of pre-designed and customizable components. It offers a variety of UI elements.\n\nEach component is designed with accessibility in mind, resulting in a collection of accessible components by default. The library streamlines web development through its comprehensive documentation and engaged community support, which allows developers to concentrate on creating resilient and user-friendly applications.\n\n### 7\\. Grommet\n\nAnother stark contrast from Material Design, Grommet describes itself as “part design system, part framework.” It thus provides a vibrant, eye-catching feature toolkit and the code supporting it. With CSS grid and Flexbox compatibility, it is one of the more customizable design languages on this list, and it also boasts a full suite of components for making your interfaces more accessible.\n\n### 8\\. Materialize\n\nMaterialize is a contemporary and adaptable CSS framework that adheres to the principles of Material Design. Its responsive foundation ensures seamless performance across various platforms.\n\nThe key characteristics of the Materialize CSS framework include a sophisticated and opulent design, an emphasis on typography and fonts, and a fusion of traditional design principles with innovation and technology. To start your journey with the Materialize CSS framework, you can access its comprehensive guidance tailored to different proficiency levels on its official documentation.\n\n### 9\\. Foundation\n\nFoundation is a responsive front-end framework with CSS and JavaScript components for building modern, mobile-friendly websites. It offers a comprehensive toolkit with a modular approach, allowing developers to customize and tailor their designs to meet specific project requirements.\n\nDevs can easily create responsive grids, navigation menus, forms, buttons, and other UI elements that adapt seamlessly across different screen sizes. The framework also includes a powerful JavaScript library that enables interactive features and smooth animations. With its extensive documentation and active community support, the Foundation empowers developers to create visually appealing and highly functional web interfaces.\n\n### 10\\. Chakra UI\n\nChakra UI is a modern and accessible React component library for streamlining user interface development. The library supports several frameworks, including React, Next.js, Meteor, and Gatsby. Segun Adebayo of Nigeria founded the project, making it one of Africa's most prominent open-source component libraries.\n\n### Effortless UI Design\n\nChakra UI provides pre-designed components and utility functions, allowing developers to create visually appealing and responsive websites. Developers can leverage Chakra UI’s customizable and reusable components, such as buttons, forms, cards, and navigation elements, to design intuitive and accessible user interfaces.\n\n### Accessibility at Its Core\n\nThe library also focuses on accessibility by adhering to WCAG standards, ensuring that the created interfaces are usable by individuals with disabilities. Chakra UI’s simplicity, flexibility, and robust documentation make it a popular choice among developers looking to build efficient and visually stunning React applications.\n\n### 11\\. YUI\n\nCreated by Yahoo, YUI is a popular front-end framework. The project is open-source and accessible on GitHub for free. It has features for a variety of circumstances, including DOM manipulation and event handler association. It can also create complex layouts using a grid system, animations, widgets, and skins, among other resources.\n\n### 12\\. Bulma\n\nBulma is a lightweight and modern CSS framework based on Flexbox, providing a flexible and responsive grid system and a set of ready-to-use UI components. The framework’s intuitive class naming convention supports quick and efficient styling, while its modular architecture ensures scalability and customization.\n\nBulma’s simplicity, extensive documentation, and community support make it a popular choice for projects of all sizes. Whether you’re building a landing page, a dashboard, or an eCommerce site, Bulma provides a solid foundation for building aesthetically pleasing and functional interfaces.\n\n### 13\\. Topcoat\n\nTopcoat is an open-source component library built purely on web standards CSS and HTML rather than a framework. Topcoat's library works with any JavaScript framework, including Backbone, Angular, etc. It's nothing more than a jumble of CSS and HTML files. It comes with many pre-designed user interface components that may be used in any web design project.\n\n### 14\\. Styled Components\n\nStyled Components is a popular JavaScript library that allows developers to write CSS directly in their JavaScript code using tagged template literals. It provides a way to encapsulate styles within components, making them more maintainable and reusable.\n\nStyled Components is widely used in the React ecosystem and offers seamless integration with popular UI frameworks and libraries. Developers can create dynamic and responsive styles by leveraging the power of JavaScript, including the ability to access component props and states. The library offers many features, including support for CSS-in-JS, automatic vendor prefixing, and theme management.\n\n### 15\\. PrimeReact\n\nPrimeReact is a comprehensive UI component library for React applications, offering ready-to-use components and advanced features. It provides a wide range of UI elements, including buttons, inputs, tables, modals, and charts, for various digital products.\n\nPrimeReact follows a responsive design approach, ensuring components adapt well to different screen sizes and devices. The library also offers powerful features, such as data binding, filtering, sorting, and pagination, making it suitable for building data-intensive applications.\n\nBy leveraging PrimeReact’s pre-built components and features, developers can save time and effort, resulting in faster development cycles and improved user experiences. The library is regularly updated, ensuring compatibility with the latest React versions and providing ongoing support and bug fixes.\n\n## Tips For Choosing An Alternative And Transitioning From Material UI\n\n![Material UI Alternatives](https://images.unsplash.com/photo-1623652554515-91c833e3080e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxpZGVhdGlvbnxlbnwwfHx8fDE3MTkwNjA2NzR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen selecting a Material UI alternative or companion, you must weigh your preferences and project requirements. Whether you opt for Magic UI's animated component library, Ant Design’s comprehensive component library, Tailwind CSS’s utility-first approach, Chakra UI’s accessibility focus, or React-Bootstrap’s seamless integration with the Bootstrap framework, each alternative has unique benefits.\n\n### Choosing the Right Tool\n\nDistinguishing between Material UI's design patterns and alternatives like Chakra UI involves considering factors like responsive styling support, customization, and [CSS handling](https://www.freecodecamp.org/news/learn-how-to-manipulate-css-with-javascript-by-coding-a-dynamic-picture-frame/). Transitioning from Material UI to React-Bootstrap involves substituting Material UI components with their React-Bootstrap counterparts, updating import statements, and modifying props and styling to align with React-Bootstrap’s component usage and customization choices.\n\n### Navigating the Switch\n\nIn shifting to Ant Design, acquaint yourself with its design principles and usability features, understand customization differences, and tweak existing custom styles. Semantic UI's broad range of components and ability to integrate with various CSS frameworks can offer a distinctive user experience.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/material-ui-react.mdx",
    "content": "---\ntitle: \"The Complete Material UI React Guide\"\ndescription: \"Discover Material UI React with this guide, packed with tips, tutorials, and examples to help you master this popular framework.\"\nimage: https://cdn.magicui.design/assets/6b19a8eb-ce79-47ff-a3cd-35651cfb90c5.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-28\"\nfeatured: false\n---\n\nMaterial UI React brings the modern design principles of material design to your web applications, offering a sleek and consistent look that users love. Picture this: you're a developer wanting to create a user-friendly interface that stands out. You're on the search for [UI frameworks](https://magicui.design/blog/ui-frameworks) that channel the elegance of your design, making your app a standout. Look no further - Material UI React has you covered.\n\nMaterial UI's solution is a [React component library](https://magicui.design/) that seamlessly integrates with your React app to provide components that embody the material design ideology. Ideal for those who want an appealing and user-friendly interface, this tool can enhance your app's aesthetic and make it a user favorite.\n\n## What Is Material UI\n\n![Material UI React](https://images.unsplash.com/photo-1499673610122-01c7122c5dcb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxtYXRlcmlhbCUyMHVpJTIwY29kZXxlbnwwfHx8fDE3MTk2NDg5MTB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is the most powerful and efficient React UI framework for building an application by adding designs and animations and using it with technical and scientific innovation. It is a design language that was developed by Google in 2014. It uses more:\n\n- Design and animation\n- Grid-system\n- Shadows and lighting effects\n\n### Compatibility with JavaScript Frameworks and Libraries\n\nMaterial UI can be used with all the JavaScript frameworks like AngularJS, VueJS, and libraries like ReactJS, to make the Application more amazing and responsive. With over 35,000 stars on the GitHub, Material UI is one of the top User Interface libraries for React.\n\n### Streamlining Development Process\n\nReact Material streamlines your development process by providing high-quality components that can be easily integrated into your project. The library’s modular nature lets you cherry-pick the necessary components, making it a lightweight addition to your application.\n\n### Responsive UIs Made Easy\n\n[Material UI](https://magicui.design/) is ideal for developers looking to enhance their React applications with beautiful, responsive, and intuitive user interfaces. Its compatibility with various JavaScript frameworks and libraries and its comprehensive set of components make it a top choice for modern web development projects.\n\n## Features Of Material UI\n\n![Material UI React](https://images.unsplash.com/photo-1524508762098-fd966ffb6ef9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTk2NDkwNTV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is a known UI framework boasting many features designed to streamline the UI/UX design process. Let’s get into the features that make Material UI a standout choice for web developers:\n\n### Highly Customizable\n\nMaterial UI provides several highly customizable templates, allowing developers to make changes with minimal coding. This feature facilitates effortless modifications to existing templates to align with specific project requirements. The customization capabilities of Material UI enhance developers' efficiency, enabling them to accelerate the design and development process.\n\n### Responsive\n\nThe components offered by Material UI are inherently responsive, ensuring that web applications are adaptive across varying screen widths. This responsive design feature eliminates the need for developers to create separate interfaces for different devices, simplifying the development process and ensuring a consistent user experience across all platforms.\n\n### Fast Loading\n\nLoading speed is a critical aspect that can significantly impact user experience. Material UI stands out for its fast-loading components, contributing to swift rendering and optimal performance. By leveraging the fast-loading capabilities of Material UI, developers can enhance the overall speed and responsiveness of web applications.\n\n### Themes\n\nMaterial UI boasts an extensive library of themes that enable developers to effortlessly customize the visual aspects of their applications. This feature allows for seamless theme integration, ensuring developers can align the UI design with the brand identity or specific project requirements.\n\n### Backend-Friendly\n\nIntegrating Material UI with the backend is seamless, enhancing the [framework's interoperability](https://www.techtarget.com/searchapparchitecture/definition/interoperability) with various backend technologies. This backend-friendly feature simplifies the integration process, enabling developers to build robust web applications that seamlessly communicate with the backend infrastructure.\n\n### Depreciation Policy\n\nMaterial UI facilitates easy upgrades for deprecated methods, ensuring developers can seamlessly incorporate the latest features and enhancements. This depreciation policy underscores the framework's commitment to continuous improvement and ensures developers can leverage the latest capabilities without hassle.\n\n### MagicUI: React Component Library\n\nLooking to take your UI development to the next level? [MagicUI](https://magicui.design/), a free and open-source React component library, offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI simplifies the UI development process, providing visually appealing and interactive elements that can be easily integrated into web applications. With highly customizable components, MagicUI empowers developers to effortlessly adapt elements to match branding and design requirements.\n\nReady to explore the diverse range of components offered by MagicUI? Elevate your UI design game with MagicUI's free [React component library](https://magicui.design/) today at \\[MagicUI\\]([https://magicui.design/docs](https://magicui.design/docs)).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Material UI Components\n\n![Material UI React](https://images.unsplash.com/photo-1689267166689-795f4f536819?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxidXR0b24lMjB1aXxlbnwwfHx8fDE3MTk2NDg5NDR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI boasts a vast collection of reusable components that cater to a wide range of UI needs. Let’s get into some of the most commonly used ones:\n\n### 1\\. Buttons\n\nGenerate interactive buttons in various styles (contained, outlined, text) and sizes.\n\n### 2\\. Typography\n\nCraft visually appealing and well-structured text elements using typography components.\n\n### 3\\. Cards\n\nPresent content in a clear and organized manner by utilizing cards.\n\n### 4\\. Lists\n\nCreate ordered or unordered lists with enhanced styling and functionality.\n\n### 5\\. Forms\n\nConstruct complex forms with validation capabilities and input elements like:\n\n- Text fields\n- Dropdowns\n- Checkboxes\n- Radio buttons\n\n### 6\\. Dialogs\n\nImplement modal dialogs for popups and alerts.\n\n### 7\\. Grid System\n\nEstablish a responsive layout foundation using the grid system.\n\n## Why Choose Material UI? Benefits Of Material UI\n\n![Material UI React](https://images.unsplash.com/photo-1531498001693-66235ecacf14?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxoYXBweSUyMGNvZGVyfGVufDB8fHx8MTcxOTY0ODk1OXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is popular among developers for its quality inbuilt designs that enhance user experience. The pre-built components make it easy to implement and customize, allowing developers to recreate designs effortlessly.\n\nThe material design provided by Material UI is also SEO-friendly, ensuring the application's visibility and accessibility on search engines. With Material UI, developers can improve their applications' overall user interface and experience, making them more visually appealing and user-friendly.\n\n### Customizable components for easy redesign\n\nOne significant advantage of Material UI is its customizable components, which allow developers to easily redesign existing components. This flexibility enables developers to tailor the components to suit their specific design requirements, ensuring a unique and personalized look for their applications. With Material UI, developers can create distinct, innovative user interfaces that stand out.\n\n### Easier maintenance and debugging\n\nMaterial UI also offers benefits in terms of code maintenance and debugging. The codes generated with Material UI are easier to maintain, reducing the time and effort required for ongoing updates and modifications. Debugging is also simplified with Material UI, as developers can quickly identify and resolve issues within the components. This streamlined development process ensures the application's reliability and stability, delivering a seamless user experience.\n\n### Improvement in functionality and accessibility\n\nApart from enhancing styles and designs, Material UI also focuses on improving the functionality and accessibility of components. The components provided by Material UI not only look good but also perform well, offering users a smooth and efficient experience.\n\nThe accessibility features ensure that the application is usable by a wide range of users, including those with disabilities. Material UI's commitment to aesthetics and performance makes it a comprehensive and reliable choice for UI development.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Getting Started With Material UI React Development\n\n![Material UI React](https://images.unsplash.com/photo-1483546416237-76fd26bbcdd1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxub3Rlc3xlbnwwfHx8fDE3MTk2NDg5NzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Installing Material UI in React Projects\n\nTo [integrate Material UI](https://dev.to/janvierjr/a-quick-start-into-material-ui-30ba) into your React projects, you can start by utilizing npm or yarn. By running the following command, you can install all the necessary packages for Material UI easily:\n\n    bash\n    npm install @mui/material @emotion/react @emotion/styled\n\n### Importing and Using Material UI Components\n\nOnce you've successfully installed Material UI, you can start importing and using the components in your React application. For example, you can import a button component like this:\n\n    javascript\n    import Button from '@mui/material/Button';\n\nOnce you've imported the component, you can incorporate it into your React application and utilize the vast array of Material UI components available. Material UI offers many components, from buttons and inputs to complex components like tables, data pickers, and more. Integrate the components seamlessly into your React application to enhance the user interface and provide an extraordinary user experience.\n\nMaterial UI is a powerful tool that can transform your React application and provide a sleek, modern, and user-friendly interface for your users. Start utilizing Material UI in your React projects to take advantage of its benefits.\n\n## 7 Best Practices For Using Material UI\n\n![Material UI React](https://images.unsplash.com/photo-1613759612065-d5971d32ca49?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxpZGVhdGlvbnxlbnwwfHx8fDE3MTk2NDg5ODh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Follow the Documentation\n\nAlways start by reading the Material-UI documentation before using any component. This will give you a comprehensive understanding of each component's features, props, and usage. The documentation also provides examples and demos to help you get started quickly.\n\n### 2\\. Use Theme Customization\n\nTake advantage of the theming API in Material-UI to customize the appearance of your components and align them with your brand or design specifications. You can create a custom theme object using the `createMuiTheme` function and apply it to your app through the `ThemeProvider` component.\n\n### 3\\. Design Responsively\n\nMaterial-UI components are designed to be responsive out of the box, automatically adjusting to different screen sizes and devices. Utilize the `Grid` component to create a flexible and responsive layout for your app.\n\n### 4\\. Avoid Unnecessary Overrides\n\nWhile you can override the styles of Material-UI components using functions like `makeStyles` or `withStyles,` it's best to avoid unnecessary overrides. Instead, use the provided props to customize the components without compromising their default styles.\n\n### 5\\. Use Component Composition\n\nCombine pre-existing Material-UI components to create intricate and reusable UI elements without starting from scratch. This approach can simplify development and help you build complex UIs efficiently.\n\n### 6\\. Optimize Performance\n\nTo enhance your app's performance, consider using `React.memo` to memoize your components and prevent unnecessary re-renders. Although Material-UI components are performant by default, optimizing your code further can lead to better performance.\n\n### 7\\. Stay Up-to-Date\n\nMaterial-UI is regularly updated by the development team, introducing new features and improvements. Keeping your version of Material-UI up-to-date ensures compatibility with other dependencies in your app and allows you to benefit from the latest enhancements.\n\nBy following these best practices, you can create high-quality and performance UIs using Material-UI.\n\n## React Native Material UI: Taking It to Mobile\n\n![Material UI React](https://images.unsplash.com/photo-1694878981905-b742a32f8121?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxtb2JpbGUlMjB1aXxlbnwwfHx8fDE3MTk2NDg5OTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact Native Material UI provides an easy and powerful way to build native mobile apps with a consistent and modern design. It leverages the robust Material Design language. Combined with React Native, it helps improve your development speed and gives you access to native device features.\n\nHere are the highlights of using React Native Material UI for mobile app development:\n\n### Material Design Components\n\nIt provides UI components styled according to Google’s Material Design specification, giving your app a modern, clean, mobile-first design.\n\n### Native Performance\n\nSince the components are built with native React Native, they have native performance and feel on mobile devices.\n\n### Platform-Specific Styling\n\nThe UI components automatically style themselves according to the platform (Android vs iOS) design guidelines.\n\n### Easy to Use\n\nThe API is very similar to the web Material-UI library, so it’s easy for web developers to pick up and use.\n\n### High Component Coverage\n\nIt has many UI components like buttons, tabs, lists, cards, menus, etc. This covers most of the basic UI elements you’ll need for an app.\n\n### Theming Support\n\nYou can create custom color themes and apply them globally to all components, ensuring a consistent look across your app.\n\n### Constantly Improving\n\nThe library is actively maintained with frequent new releases and improvements.\n\nBy integrating Material UI with React Native, developers can streamline the mobile app development process and achieve a modern, clean design that automatically adjusts to different platforms while providing native performance.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n### The MagicUI Experience: Elevating Your UI Design GlobalKey Takeaways\n\n- Storytelling with OrbitUI Design\n- Tailwind CSS in OrbitUI Design\n- How to Access MagicUI Design?\n"
  },
  {
    "path": "apps/www/content/blog/material-ui-vs-joy-ui.mdx",
    "content": "---\ntitle: \"The Ultimate Comparison Between Material UI Vs Joy UI\"\ndescription: \"Material UI vs Joy UI: Which one is right for you? Explore the pros and cons of each UI framework to determine the best fit for your design needs.\"\nimage: https://cdn.magicui.design/assets/8e4763f5-26c8-4c0c-965d-cb49be926d83.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-26\"\nfeatured: false\n---\n\nAre you struggling between Material UI and Joy UI for your next React project? With the abundance of [UI frameworks](https://magicui.design/blog/ui-frameworks) available, choosing the right one can be daunting. This article will compare Joy UI vs Material UI to help you find the best option for your React developments.\n\nIf you are looking for a user-friendly interface with easy navigation and customization options that make your development process smoother, MagicUI is the tool for you. MagicUI is a user-friendly [React component library](https://magicui.design/), making it ideal for users looking to compare Joy UI with Material UI to find the best option for their React developments.\n\n## What Is Material UI?\n\n![Material UI Vs Joy UI](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxtYXRlcmlhbCUyMHVpfGVufDB8fHx8MTcxOTQ2Nzk1MXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is another popular open-source library for building React applications. It was launched in 2014 and has since become one of the most widely used UI libraries for React. Material UI provides a set of pre-built components based on Google's Material Design guidelines. These customizable components can be used to create modern and responsive user interfaces.\n\nOne of the benefits of using [Material UI](https://mui.com/material-ui/getting-started/) is its focus on accessibility. The library offers a range of accessibility features, such as support for screen readers and keyboard navigation. Material UI has excellent documentation and a large community of developers contributing to its development.\n\n## What Is Joy UI?\n\n![Material UI Vs Joy UI](https://images.unsplash.com/photo-1522252234503-e356532cafd5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb2RlfGVufDB8fHx8MTcxOTQ2Nzk2NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nJoy UI is a sister library to Material UI, offering a set of UI components focusing on mobile development. Joy UI complements Material UI by providing additional components that adhere to the same design principles. These components are designed specifically for mobile products to optimize the user experience for smaller screens.\n\n[Joy UI components](https://mui.com/joy-ui/getting-started/) are tailored for mobile development, providing widgets and tools that simplify mobile-friendly web applications. The library includes various UI components optimized for touch interactions and smaller screen sizes, addressing the unique challenges of mobile development.\n\n### Focus and Design Principles\n\nMaterial UI, on the other hand, is a widely used UI library for React applications. It provides a set of components that follow Google's Material Design principles. While Material UI offers components suitable for web and mobile development, Joy UI focuses exclusively on mobile applications, ensuring that all components are designed with mobile-specific considerations.\n\n### A Mobile-First Companion to Material UI\n\nJoy UI's focus on mobile development makes it a valuable addition to Material UI, catering to the growing demand for mobile-friendly web applications. By leveraging Joy UI's components alongside the existing Material UI library, developers can create cohesive user interfaces seamlessly transitioning between desktop and mobile platforms.\n\n###  A Mobile-First Companion to Material UI\n\nWhile Material UI remains a popular choice for React developers, Joy UI's specialized focus on mobile development offers a refined set of components tailored specifically for mobile interfaces. By combining these two libraries, developers can create versatile applications that deliver exceptional user experiences across various devices and screen sizes.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Material UI Vs Joy UI: Detailed Comparison\n\n![Material UI Vs Joy UI](https://images.unsplash.com/photo-1517817748493-49ec54a32465?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8bm90ZXN8ZW58MHx8fHwxNzE5NDY3OTc5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen comparing Material UI vs. Joy UI, component parity and design flexibility are critical considerations. Joy UI components may not offer the same level of parity as Material UI, which implies possible discrepancies in the components available from each library. Joy UI has unique features and design flexibility that are suited to particular projects. Joy UI brings novel features and design flexibility that can enhance the appeal and functionality of specific projects.\n\n### Design Philosophy\n\nJoy UI's design philosophy centers on mobile development, whereas Material UI Base delivers a broader range of web development components. Joy UI specializes in offering components tailored explicitly for mobile products, while Material UI Base caters to a broader spectrum of components suitable for various types of web applications.\n\n### Component Styles\n\nMaterial UI adheres to the Material Design guidelines by providing a collection of pre-designed components with a consistent appearance. These components sport a distinctive Material-style aesthetic. In contrast, Joy UI adopts a more flexible approach, allowing greater customization of component styles. Joy UI delivers a set of components that can be easily styled to align with your design requirements.\n\n### Customization Flexibility\n\nMaterial UI boasts a robust theming system that empowers users to customize global styles and override default styles on individual components. Due to the opinionated nature of the Material Design system, customization in Material UI can prove more intricate. Joy UI, on the other hand, prioritizes customization and flexibility. It features a simpler and more straightforward theming system that simplifies the application of custom styles and creates distinct designs.\n\n### Documentation\n\nMaterial UI shines with its extensive and well-organized documentation, ranging from the basics to advanced usage, making it one of the best resources in the React UI library ecosystem. Joy UI's documentation is also thorough and user-friendly, offering clear explanations and examples for each component and feature.\n\n### Community and Ecosystem\n\nMaterial UI thrives with a large and active community, providing a wealth of resources, third-party libraries, and integrations, making it one of the most popular React UI libraries globally. Conversely, Joy UI remains a newer entrant, meaning its community and ecosystem aren't as established as Material UI's. Nevertheless, Joy UI gains momentum with a growing contributor base and resources.\n\n### Free and Open-Source Animated UI Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Comparing Pros & Cons Of Material UI Vs Joy UI\n\n![Material UI Vs Joy UI](https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkaXNjdXNzfGVufDB8fHx8MTcxOTQ2Nzk5M3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Pros and Cons of Material UI\n\n- Adherence to Google's Material Design principles.\n- Solid foundation for building user interfaces that align with modern design concepts.\n\n#### Pros\n\n- A comprehensive suite of pre-built components that align with Material Design principles.\n- The go-to choice for developers creating web applications that follow the latest design trends.\n- A wealth of customization options.\n\n#### Cons\n\n- Due to the breadth of its offerings, the framework's bundle size can be larger than that of other libraries.\n- Slower load times, especially on projects that do not require every component.\n- Imposes certain design constraints that clash with their custom design systems.\n\n### Pros and Cons of Joy UI\n\n[Joy UI](https://console.dev/tools/joy-ui) is a newer addition to the UI framework scene, but it has quickly gained attention for its unique features and robust offerings. When comparing Material UI vs Joy UI, understand the strengths and weaknesses of both options.\n\n#### Pros\n\n- Free and open-source library of UI components that includes form fields, navigation elements, data display components, and various layouts.\n- A solid choice for developers seeking a one-stop solution for their UI needs.\n- Stands out for its visual appeal, with components that look good out of the box and even offer an auto-dark mode.\n- Extensive customization on a per-component basis or through global themes, providing flexibility in design.\n- Accessibility features emphasize inclusivity in design efforts.\n- Extensive documentation and examples make it easier for developers to get started and troubleshoot issues.\n\n#### Cons\n\n- Still in the pre-v1 stage of development.\n- Some components that users might expect, such as full app containers and specific UI containers, are missing.\n- Frustrating for developers working on projects that require these components, as they may need to seek alternative solutions to fill these gaps.\n\n## Using Material UI And Joy UI Together\n\nMixing Joy UI and Material UI in the same project can lead to complexities.\n\n- Developers must be careful to ensure that both libraries' design language and theme structure are harmoniously integrated, which can be challenging.\n- Joy UI prioritizes customization and extensibility, while Material UI aims to provide a high level of predefined components following Google's Material Design principles.\n- This conflict in design paradigms can result in inconsistencies in the application's visual appearance and user experience.\n\n### Leveraging Strengths While Ensuring Cohesive Design\n\nUsing Material UI and Joy UI together can also offer some benefits, such as:\n\n- Leveraging the unique features of both libraries.\n- Joy UI's flexible and highly customizable components can complement Material UI's rich pre-built components, allowing developers to create a more diverse range of user interfaces.\n- By carefully managing and organizing the integration of both libraries, developers can also take advantage of their strengths without compromising the overall user experience.\n- Reconciliating the differences in design patterns and themes between Material UI and Joy UI requires a significant effort.\n\nWhile it is possible to use Joy UI and Material UI together, developers must consider the potential complexities and conflicts that may arise. Careful planning and attention to detail are essential to ensure seamless integration of both libraries and deliver a consistent and visually appealing user interface.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Choosing Between Material UI Vs Joy UI For Your React UI\n\n![Material UI Vs Joy UI](https://images.unsplash.com/photo-1607798748738-b15c40d33d57?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxjb2RlciUyMGhlbHB8ZW58MHx8fHwxNzE5NDY4MDE1fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nBoth libraries offer unique advantages and cater to different aspects of UI development in the debate over Material UI and Joy UI. Material UI provides a comprehensive suite of components for building a faster and easier web experience, while Joy UI offers specialized components for mobile development. This newer library is designed to be more flexible and customizable than Material UI. It provides a smaller set of components, but they are more modular and can be styled to match any design system.\n\n### Choosing the Right Tool\n\nThe decision to use Material UI or Joy UI should be based on the project's requirements. Joy UI could be the better choice if the project is focused on mobile products and requires a library designed strictly for mobile interfaces. On the other hand, if the project needs a more comprehensive collection of components for web development, Material UI might be more appropriate.\n\nDevelopers must weigh the pros and cons, such as the potential for unnecessary complexities and the need for custom UI components, to decide which library best fits their project.\n\n### Project Needs, Design Language, and Team Expertise\n\nThe choice between Joy UI and Material UI should be informed by the project's specific needs, the desired design language, and the development team's familiarity with the libraries. Whether you choose Joy UI for its mobile-centric design or Material UI for its extensive widget library, both powerful tools can help you build high-quality UIs for your products.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nSo, why not use our [React component library](https://magicui.design/) for free today and start creating breathtaking user interfaces? Visit [https://magicui.design/docs](https://magicui.design/docs) to explore MagicUI right away!\n"
  },
  {
    "path": "apps/www/content/blog/mui-box.mdx",
    "content": "---\ntitle: \"A Complete Guide On Working With MUI Box Component\"\ndescription: \"The MUI Box component is a versatile tool for creating layout designs in Material-UI. Learn how to use it with this detailed guide!\"\nimage: https://cdn.magicui.design/assets/03qkgumr9u02.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-06\"\nfeatured: false\n---\n\nDo you find yourself overwhelmed by the numerous [UI frameworks](https://magicui.design/blog/ui-frameworks) available, each with its own complex set of components and libraries? We'll explore the versatile Box component of MUI, a crucial element of UI frameworks. Equip and utilize the Box component to achieve professional-grade UI results for your MUI projects.\n\nLooking to level up your UI design quickly and efficiently? MagicUI's [React component library](https://magicui.design/) might just be the answer. With MagicUI, understanding the Box component in MUI becomes a breeze, helping you meet your goal of mastering this essential tool in the UI design realm.\n\n## What Is Material UI?\n\n![MUI Box](https://cdn.magicui.design/assets/xeoct1p35wk.jpg)\n\nMaterial UI is a React-based UI framework designed to create consistent user interfaces across web and mobile applications. It includes many components and tools to help developers easily create modern user interfaces. Material UI is a one-stop solution for developers, providing a comprehensive library of components and tools to create modern user interfaces easily.\n\nIt has everything you need, from input to layout components. The Material UI Box component is a wrapper for most CSS utility needs. Material UI for React has this component and is very easy to integrate.\n\n## What Is The MUI Box Component\n\n![MUI Box](https://cdn.magicui.design/assets/cg7wflwyso.jpg)\n\nThe Box component in Material UI is a crucial tool for styling elements in a React application. It provides a convenient way to apply styling, manage spacing, and ensure responsiveness without needing separate CSS files or the `makeStyles` hook commonly used in React development.\n\n### A Foundation for Building User Interfaces\n\nThe Box component is a wrapper for structuring and organizing your application’s layout. It allows you to create containers, apply styling, manage spacing, and ensure responsiveness, making it a foundation for constructing visually appealing user interfaces.\n\n### Versatile Building Block for MUI\n\nThe Box component is a generic building block for grouping other components. It’s a fundamental building block when building with MUI component libraries. You can think of it as a `<div>` with special features (like access to your app’s theme and the sx prop).\n\nFor instance, the display prop can indicate the display property type, such as flex or inline block, that should be applied to the included items. The width and height values of the container’s or div component may be set using the width and height props, and the space surrounding the components it contains can be increased using the “margin” and “padding” props.\n\n### Achieving Design Flexibility with Custom Styles and Theming\n\nThe Material-UI Box component also enables the application of extra custom styles and style functions to the container and enclosed items via inline and CSS classes. This enables designers to quickly tweak the look of their user interfaces and produce distinctive designs that distinguish themselves from the competition.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Implementing Material UI Box Component In A React App\n\n![MUI Box](https://cdn.magicui.design/assets/cykbbggsnvc.jpg)\n\nTo create MUI tabs, you need to have NPM installed on your machine and a basic understanding of JavaScript and React. To set up a React app, you can use the following commands to create a new React application and navigate to the app directory:\n\n```bash\nnpx create-react-app my-app && cd my-app\n```\n\nOnce your app is set up, you can start the application by running either of the following commands:\n\n```bash\nyarn start\n```\n\nOr using npm:\n\n```bash\nnpm start\n```\n\nFollowing these steps, your server should launch in your browser at [http://localhost:3000/](http://localhost:3000/)[.](http://localhost:3000/.￼￼Next)\n\n[Next](http://localhost:3000/.￼￼Next), you can install [Material UI](https://www.npmjs.com/package/@mui/material) as an NPM package or by using Yarn.\n\nTo install with NPM, use:\n\n```bash\nnpm install @material-ui/core\n```\n\nAlternatively, you can use Yarn:\n\n```bash\nyarn add @material-ui/core\n```\n\nOnce the MUI library is installed successfully, you can utilize Material UI components in your React application.\n\nTo import the Material-UI Box component, you can use the following code snippet:\n\n```javascript\nimport { Box } from \"@mui/system\"\n\nexport default function BoxExample() {\n  return (\n    <Box component=\"section\" m={1}>\n      This is a box\n    </Box>\n  )\n}\n```\n\nIn the following example, a Box component is imported from the Material-UI library, and a basic function component is created that renders a box with the component prop set to section. The box includes some margin around it.\n\n```jsx\nimport React from \"react\"\nimport { Box } from \"@material-ui/core\"\nimport ReactDOM from \"react-dom\"\n\nimport \"./styles.css\"\n\nfunction App() {\n  return (\n    <Box component=\"section\" sx={{ p: 20, border: \"1px dashed grey\" }}>\n      This is an MUI Box\n    </Box>\n  )\n}\n\nconst rootElement = document.getElementById(\"root\")\nReactDOM.render(<App />, rootElement)\n```\n\nIn this example, a functional component called App is created, and an MUI Box is rendered with custom styling, such as padding and a dashed border.\n\nFollowing these steps, you can efficiently implement MUI Box components in your React application.\n\n## Applying Custom Stylings With The sx Prop\n\n![MUI Box](https://cdn.magicui.design/assets/7y1rgm2l0xe.jpg)\n\nThe Box component in Material-UI can be styled using a shortcut prop called sx. It enables the use of JSS syntax for inline styling of the Box element.\n\nThe backgroundColor and margin of the Box element, for instance, might be set using the sx prop as follows:\n\n```jsx\n<Box component=\"span\" sx={{ backgroundColor: \"primary.main\", margin: 1 }}>\n  This is a box with a primary color background and a small margin\n</Box>\n```\n\nThe backgroundColor is set to the primary.main color specified by the Material-UI theme in the prior example, and the margin is set to 1 to correspond to the theme’s small margin size.\n\nBecause it eliminates the need to construct a CSS class and use the className attribute to apply it to the Box element, the sx prop is quite helpful. By doing this, you can make your React components shorter and simpler to read.\n\n## More Customization Options\n\n![MUI Box](https://cdn.magicui.design/assets/dvb95o2aswi.jpg)\n\n### Positioning Content in Material UI Box with Flexbox\n\nUsing the display and flexDirection props, you can position content within the Material-UI Box component using flexbox. The display type specified by the display prop determines the position of the Box element on the page. The direction in which the child components are arranged is specified by the flexDirection prop.\n\n### Adding Colors to Material UI using Palette\n\nThe Palette component allows you to add colors to the Material-UI interface. It is a core component of the Material-UI library and enables you to provide a palette of colors for your application.\n\n### Material UI Box Sizing\n\nYou can control an element's sizing behavior by using the boxSizing prop provided by the Material-UI Box component. The padding and border of the element are included in the overall width and height because the boxSizing prop's default setting is 'border-box'.\n\n### Material UI Box Typography\n\nThe Box and Typography components are part of the Material-UI React-based UI library. While the Typography component displays text, the Box component is a general-purpose container that can enclose other elements. The Box component allows you to apply styles like padding, margin, and size to a container element.\n\nOn the other hand, the Typography component can display text in various forms, including headings, body text, and captions.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- What Is NextJS\n\n## Overriding Material UI Components\n\n![MUI Box](https://cdn.magicui.design/assets/z01ubapdoyq.jpg)\n\nThe Box component in MUI serves as a wrapper element for your components. By default, it generates a new DOM element, specifically a `<div>`. This default functionality can be altered by utilizing the component prop. For instance, if you wish to utilize a `<span>` instead, you can simply set the component prop to \"span\":\n\n```jsx\nimport * as React from \"react\"\nimport Box from \"@mui/material/Box\"\nimport Button from \"@mui/material/Button\"\n\nexport default function BoxComponent() {\n  return (\n    <Box component=\"span\" sx={{ p: 2, border: \"1px dashed grey\" }}>\n      <Button>Save</Button>\n    </Box>\n  )\n}\n```\n\nIn the provided code snippet, the Box component envelopes the Button component. By setting the component prop to \"span,\" the underlying DOM element shifts from a `<div>` to a `<span>`. This customization enables you to override the default behavior of the Box component, allowing you to use a distinct element to wrap your content effectively.\n\nBy using the component prop in the Box component, developers can effortlessly alter the component's default behavior, thereby enhancing the flexibility and customization options when implementing Material UI components in their projects.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It provides over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Effortless Animation & Design-Focused Components for Streamlined UI\n\nMagicUI aims to bridge the gap between design and development. With a focus on animation and a design-centric approach, it offers a range of visually appealing and interactive elements that can be easily integrated into web applications. This enables the creation of stunning user interfaces with minimal effort.\n\n### Crafting Captivating Digital Experiences\n\n[MagicUI](https://magicui.design/) components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. The library's goal is to empower users to craft captivating digital experiences. In addition to the free component library, MagicUI Pro offers templates for creating beautiful landing pages that can convert visitors into customers.\n\nAre you ready to save thousands of hours and create a stunning user interface? Delve into the MagicUI [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n"
  },
  {
    "path": "apps/www/content/blog/mui-card.mdx",
    "content": "---\ntitle: \"How To Create A Functional MUI Card\"\ndescription: \"Learn how to design and implement MUI cards with ease using this guide. Start building eye-catching & interactive designs for your projects.\"\nimage: https://cdn.magicui.design/assets/f8a0a598-0e19-4abf-8e36-bb593af453e6.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-05\"\nfeatured: false\n---\n\nVisual appeal is critical for digital success, and finding the perfect [UI Frameworks](https://magicui.design/blog/ui-frameworks) can be stressful, particularly when you want eye-catching MUI card components to make your React application stand out. Miss the mark, and you risk appearing outdated and losing your audience's attention. This blog will serve as your guide, helping you understand the MUI card components and their application in React projects.\n\nMagicUI is your solution, offering the [React component library](https://magicui.design/) you need to implement the Material UI Card Component successfully. Its simplicity and efficiency are unparalleled, giving you more time to focus on your design and less time on the technical nitty-gritty.\n\n## What Is Material UI?\n\n![MUI Card](https://images.unsplash.com/photo-1587620962725-abab7fe55159?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxjb2RlfGVufDB8fHx8MTcyMDIyNDMzOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is a React-based UI framework designed to create consistent user interfaces across web and mobile applications. It includes many components and tools to help developers easily create modern user interfaces.\n\nIt's a one-stop solution for developers, providing a comprehensive library of components and tools to create modern user interfaces easily. From input to layout components, it has everything you need. The Material [UI card](https://mui.com/material-ui/react-card/) is an example of the Material UI surfaces.\n\n## What Is Material UI Card?\n\nCards contain information and actions about a single topic. Material UI cards are an excellent way to add a visually appealing, well-organized layout to a website quickly. They are simple to use and can be customized with various options, such as:\n\n- Colors\n- Sizes\n- Images\n\nTo make a card, simply choose the card component from the Material UI library and customize it to your specifications. You can also quickly add content to the card, such as text, images, and buttons. Material UI cards are an excellent way to quickly improve the visual appeal and organization of a website.\n\n### Balancing Functionality with Concise Information Presentation\n\nAlthough cards can support multiple actions, UI controls, and an overflow menu, use caution and remember that cards are gateways to more complex and detailed information. They should be simple to scan for relevant and actionable data. Text and images, for example, should be placed on them in a way that clearly indicates hierarchy.\n\n### Pre-Built Components and Design Focus\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Is The Difference Between Card And Paper In Material UI?\n\n![MUI Card](https://images.unsplash.com/photo-1581934952711-2fc9c6521e7b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkaXNjdXNzfGVufDB8fHx8MTcyMDIyNDM1MHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI, a component library in React, has many components. Paper is a component that works similarly to a card. They can be mistaken for each other, but below are the differences between them.\n\n### Card\n\n- Named after physical cards\n- Extends the Paper component\n- Used with its child components (e.g CardActions, CardMedia, etc)\n- Has a set shadow or elevation\n\n### Paper\n\n- Named after physical sheets of paper\n- Doesn't extend any component; instead serves as a base for the Card component.\n- Doesn't have any specific child components\n- Doesn't have a set shadow or elevation\n\nIn other words, Paper is the base from which the Card component is built. This also shows that Papers are more dynamic than Cards.\n\n## What Are The Components Of Material UI Card?\n\n![MUI Card](https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxub3Rlc3xlbnwwfHx8fDE3MjAyMjQzMjd8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI card is made up of a list of components such as:\n\n- CardActionArea\n- CardActions\n- CardContent\n- CardHeader\n- CardMedia\n\n### CardActionArea\n\nThe CardActionArea component in Material UI makes an area within a card clickable by wrapping contents within a card that should be interactive. The code snippet below shows how to use CardActionArea in combination with a Card component:\n\n```jsx\nimport { CardActionArea } from \"@mui/material\"\nimport Card from \"@mui/material/Card\"\n\n;<Card>\n  <CardActionArea>{/* Card Contents */}</CardActionArea>\n</Card>\n```\n\n### CardHeader\n\nThe Material UI CardHeader provides context to a card by adding a header. It can display a title, an avatar, a subheader, and an action within a card. The example code below shows how to use a CardHeader component.\n\n```jsx\nimport { Avatar, CardHeader, IconButton } from \"@mui/material\"\nimport Card from \"@mui/material/Card\"\n\n;<Card>\n  <CardHeader\n    avatar={<Avatar aria-label=\"card-name\">C</Avatar>}\n    title=\"Card Title\"\n    subheader=\"Subheader\"\n    action={<IconButton aria-label=\"settings\"></IconButton>}\n  />\n</Card>\n```\n\n### CardMedia\n\nThe CardMedia component in Material UI allows adding images, videos, icons, and other media within a card. Below is the example code for using a CardMedia component:\n\n```jsx\n<Card>\n  <CardMedia\n    style={{ paddingTop: \"24px\" }}\n    image=\"./background.png\"\n    title=\"Background image\"\n  />\n</Card>\n```\n\n### CardContent\n\nThe CardContent component is used to wrap the core contents of the Card component. The code snippet below illustrates how to use the CardContent component:\n\n```jsx\nimport { CardContent } from \"@mui/material\"\nimport Card from \"@mui/material/Card\"\n\n;<Card>\n  <CardContent>{/* Card Contents */}</CardContent>\n</Card>\n```\n\n### CardActions\n\nIn material UI, the CardActions component is used to add card actions. The code snippet below shows how to use CardActions in combination with a Card component:\n\n```jsx\nimport { Button, CardActions } from \"@mui/material\"\nimport Card from \"@mui/material/Card\"\n\n;<Card>\n  <CardActions>\n    <Button>Click here</Button>\n  </CardActions>\n</Card>\n```\n\n## Getting Started With Material UI Card\n\n![MUI Card](https://images.unsplash.com/photo-1522252234503-e356532cafd5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzIwMjI0MzE2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Creating a Basic MUI Card With Material UI: A Step-By-Step Guide\n\nTo begin creating a Material UI card component, you must first install the necessary Material UI packages. You can do this by running either of the following commands:\n\n- npm install @mui/material @emotion/react @emotion/styled\n- yarn add @mui/material @emotion/react @emotion/styled\n- pnpm add @mui/material @emotion/react @emotion/styled\n\nTo utilize the Material Icons font, which includes the font Icon component and prebuilt SVG Material Icons, you need to install @mui/icons-material using npm, yarn, or the Google Web Fonts CDN.\n\nThe provided code snippet below showcases an example of creating a straightforward Material UI card component:\n\n```jsx\nimport {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  Typography,\n} from \"@mui/material\"\n\nimport \"./styles.css\"\n\nconst BasicCard = () => {\n  return (\n    <Card sx={{ maxWidth: 400 }}>\n      <CardContent>\n        <Typography\n          sx={{ fontSize: 24, mb: 2, textAlign: \"center\" }}\n          variant=\"h2\"\n          color=\"text.secondary\"\n          gutterBottom\n        >\n          Insightful Design Tip\n        </Typography>\n        <Typography\n          sx={{ fontSize: 18, mb: 1.5 }}\n          variant=\"h5\"\n          color=\"text.secondary\"\n        >\n          \"MagicUI is a free and open-source UI library that we designed\n          specifically for design engineers.\"\n        </Typography>\n        <Typography sx={{ mb: 1 }} variant=\"body2\">\n          \"Best UI Library\" by MagicUI.\n        </Typography>\n      </CardContent>\n      <CardActions>\n        <Button size=\"small\">Read More</Button>\n      </CardActions>\n    </Card>\n  )\n}\n\nconst App = () => {\n  return (\n    <div className=\"App\">\n      <h1>Basic card</h1>\n      <BasicCard />\n    </div>\n  )\n}\n\nexport default App\n```\n\nYou can create your own Material UI card component by following these steps and using the provided code snippet. The framework offers a straightforward way to structure and style information, making it visually appealing and structured for your webpage or application.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Other Material UI Card Variants\n\n![MUI Card](https://images.unsplash.com/photo-1694878981905-b742a32f8121?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxVSSUyMGFwcHxlbnwwfHx8fDE3MjAyMjQzMDN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Image Cards\n\nThe image card is a more interactive card type. It allows developers to include an image or icon, as well as a title and description, making it easier to convey a message to the user in a timely and effective manner.\n\n### Outlined Cards\n\nThis variant of the Material UI Card is meant to be used when there is a need to reduce the prominence of the card, such as when it is part of a list of other cards. It has a [thin border that outlines the card](https://github.com/mui/material-ui/blob/v5.15.21/docs/data/material/components/cards/OutlinedCard.tsx) and a slightly less prominent title.\n\nSet variant=outlined to render an outlined card.\n\n### Interactive Cards\n\nMaterial UI Card Interactions are a Material Design feature that allows users to interact with data quickly and easily. Users can quickly scan the data and decide what to take using cards with titles, content, and action.\n\nThis results in a more fluid, intuitive user experience, as the user can quickly access and interact with the data without having to scroll or search for it. This feature also displays a visual representation of the data to the user, making it easier to digest and comprehend the information.\n\n## Real World Examples Of MUI Cards\n\n![MUI Card](https://images.unsplash.com/photo-1551650975-87deedd944c3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxtb2JpbGUlMjBhcHB8ZW58MHx8fHwxNzIwMjI0Mjg2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Product Cards\n\nThe Material-UI Card component can showcase product information, including:\n\n- Images\n- Descriptions\n- Prices\n- CTA buttons for purchasing the item\n\nThis initiates a smooth shopping experience, enabling users to view essential product details at a glance and proceed with their purchase promptly.\n\n### 2\\. Article Cards\n\nArticle cards with Material-UI can present [snippets of blog posts or articles](https://www.semrush.com/blog/how-to-make-your-content-more-visible-in-google-with-articles-snippet/#:~:text=visible%20in%20search.-,What%20is%20a%20Snippet%3F,questions%20on%20a%20search%20page.), offering a brief preview of the content and the article's title, author, publication date, and a concise summary. Users can then interact with an action button to expand the card, read the entire article, or navigate to a separate page for further details.\n\n### 3\\. User Profile Cards\n\nBy utilizing Material-UI Cards for user profiles, individuals can display their personal information in an organized and visually appealing manner. These cards facilitate seamless networking and personal branding; these include:\n\n- Profile pictures\n- Names\n- Bios\n- Links to social media platforms\n\n### 4\\. Media Cards\n\nMedia cards created with Material-UI are ideal for presenting multimedia content like images, videos, or audio files. These cards often feature captions and interactive elements that allow users to control the visual or auditory content within the card, enhancing user engagement and entertainment value.\n\n### 5\\. Dashboard Cards\n\nIn the context of dashboard cards, Material-UI is employed to summarize data or statistics in a visually engaging format. These cards offer users a quick overview of key metrics, enabling them to monitor performance or track progress efficiently.\n\n### 6\\. Notification Cards\n\nMaterial-UI Cards can also be used to display notifications or alerts to users. These cards typically contain concise messages and actions like dismissing or acknowledging the notifications, streamlining communication between the system and the user.\n\n### 7\\. Event Cards\n\nEvent cards leverage Material-UI to showcase details of upcoming events, including the event name, date, time, location, and a brief description. Users can interact with additional elements within the card to access more detailed information about the event or register to attend.\n\n### 8\\. Portfolio Cards\n\nArtists, photographers, designers, and other creatives can utilize Material-UI Cards to showcase their portfolio items effectively. These cards often include images, project descriptions, and links to further information, enabling users to seamlessly explore the creator's work.\n\n### 9\\. Testimonial Cards\n\nBusinesses can showcase customer feedback visually appealingly by employing Material-UI Cards for testimonials and reviews. These cards typically feature the following:\n\n- Customer's name\n- Profile picture\n- Feedback\n\n### 10\\. Contact Cards\n\nMaterial-UI Cards can also present contact information for individuals or businesses. These cards typically include:\n\n- Names\n- Phone numbers\n- Email addresses\n- Locations\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a revolutionary free and open-source UI library that brings design engineers a seamless and efficient way to create stunning user interfaces. With over 20 animated components, MagicUI is designed to offer a range of visually appealing and interactive elements easily integrated into web applications like:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThis allows for the creation of captivating digital experiences with minimal effort.\n\n### Effortless Customization and Animation\n\n[MagicUI](https://magicui.design/) components are highly customizable, allowing for seamless adaptation to match desired branding and design requirements. By focusing on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering users to craft visually appealing user interfaces effortlessly. MagicUI offers MagicUI Pro, a premium version with beautifully crafted landing page templates to convert visitors into customers efficiently.\n\n### MagicUI Solutions for Every Stage of the User Journey\n\nWith [MagicUI](https://magicui.design/), you can save thousands of hours and effortlessly create beautiful landing pages to enhance user experiences and elevate your online presence. Embrace the power of MagicUI today and unlock a world of possibilities for creating visually appealing web applications.\n\nVisit [https://magicui.design/docs](https://magicui.design/docs) and use our free [React component library](https://magicui.design/) to enhance your UI design efforts.\n"
  },
  {
    "path": "apps/www/content/blog/mui-react.mdx",
    "content": "---\ntitle: \"What Is MUI? How To Access MUI React For Projects\"\ndescription: \"Get started with MUI React and elevate your project's UI design. Learn how to easily access MUI and start building sleek and modern interfaces.\"\nimage: https://cdn.magicui.design/assets/04pf4rvakamy.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-29\"\nfeatured: false\n---\n\nAre you struggling to find the best [UI frameworks](https://magicui.design/blog/ui-frameworks) to enhance your React.js projects? Have you been searching for a reliable and user-friendly solution to help you streamline your web development process with MUI for React.js? If so, you're in the right place! This article provides valuable insights that can empower you to make informed decisions and supercharge your React.js projects with MUI (Material-UI).\n\nAre you ready to discover Magic UI's [React component library](https://magicui.design/) solution, an identity management platform that can help you achieve your objectives, such as information about MUI (Material-UI) for React.js? Magic UI's powerful features can unlock new possibilities for your web development projects, making them more efficient and effective.\n\n## What Is MUI?\n\n![MUI React](https://cdn.magicui.design/assets/nls2tqj6jx.jpg)\n\nMaterial UI, or MUI, is a robust library of UI design components tailored for the React framework. This open-source project aligns with Google's guidelines for creating components for apps or websites. Using MUI, developers can effortlessly import various basic and advanced UI elements to streamline development.\n\nThe library offers a wide range of customizable components, providing React developers with the resources to craft visually stunning and highly functional interfaces. MUI boasts a broad selection of React templates and tools that can be leveraged to create impressive user interfaces with minimal effort.\n\n### Development with Pre-Built Templates\n\nOne notable aspect of MUI is its collection of [React templates and tools](https://material-ui.com/store/#populars) that are available for purchase. These pre-built user interfaces can be easily customized to suit the specific requirements of any project. Replete with features and functionalities, these templates enable developers to expedite the design and development process, facilitating the creation of aesthetically pleasing and user-friendly applications.\n\n### Empowering Developers to Build Beautiful and Functional UIs\n\nMUI serves as a valuable resource for React developers seeking to elevate the design and functionality of their projects. Through its extensive collection of UI components, templates, and tools, MUI empowers developers to easily create visually captivating and highly functional applications and websites.\n\n## Why Use MUI For Your React Project?\n\n![MUI React](https://cdn.magicui.design/assets/123w1sxqxnvg.jpg)\n\nReact is a robust framework for application development. There are several reasons why MUI must be part of your React developer toolkit. Here are the significant ones:\n\n### 1\\. Much faster time-to-market\n\nTime-to-market is a critical metric for success in the highly competitive tech landscape. When you use Material UI, you get a good headstart as you use thoroughly tested UI elements in your projects.\n\nNot only developers but frontend designers, too, can utilize MUI for rapid interface creation. It supports drag-and-drop elements that allow full-scale customization of apps and websites to suit a brand’s needs. Creating components from scratch is unnecessary, which also accelerates usability testing. If the UI is not working, you can easily make changes on the go.\n\n### 2\\. A consistent UI design\n\nConsistency creates trust, satisfactory user experience, and brand loyalty. If you generate UI components from scratch or import them from multiple sources, the appearance differences affect the interface’s overall consistency. When you use MUI in React applications, you use the same UI components throughout the project; this helps you create consistency and minimize errors and rework.\n\n### 3\\. Accessibility\n\nIf you create interfaces for enterprise-level websites or apps, you must adhere to some mandatory accessibility standards. Material UI’s creators ensured that all the components of the MUI library meet the WCAD 2.0 accessibility guidelines. Developers and designers do not have to waste time investigating whether the components they use in their React applications are standardized. All UI components must be accessible to the test navigation, and user flows easily ensure they meet the accessibility standards.\n\n### 4\\. Scalability\n\nTo create UI components from scratch, you must design, prototype, and test the components before scaling the product. But with MUI’s comprehensive component library, you get design elements to use in your prototype and scale immediately. Even as a developer without any design knowledge, you can copy/paste React components from MUI to create appealing designs.\n\nYou can import the MUI X library with more advanced scalable features with components like data pickers, data grips, charts, and pagination.\n\n### 5\\. Easy Maintenance\n\nA component library like MUI comes with detailed documentation for installing, using, updating, and customizing components. Designers and engineers can use this framework to maintain the organization’s design system, making establishing governance systems and protocols easier.\n\nMUI also provides how-to guides for migrating from one version to the next. So, organizations can take advantage of the latest UI styles, technologies, and trends whenever MUI releases an update.\n\n### 6\\. A Single Source of Truth\n\nOne of the biggest challenges of a design system is maintaining a single source of truth. It’s not uncommon for product teams, UX designers, and developers to have out-of-sync design systems–resulting in errors, rework, and massive headaches and challenges for DesignOps.\n\nMUI’s component library can significantly reduce these challenges while creating a single source of truth between [design and development](https://www.w3.org/TR/wai-aria-practices/#intro). Designers and engineers will still have separate design systems (image-based for designers and code for engineers), but MUI gives them the same starting blocks.\n\n### 7\\. Skills Empowerment\n\nMUI’s open-source component UI library empowers startups and young entrepreneurs to build new products–especially in developing nations where they don’t have the same access to education, mentoring, and skills transfer.\n\nThe library is also incredibly beneficial for charities, non-profits, NGOs, and similar organizations who want to develop products and tools but don’t have the budget to invest in a design system. Anyone can leverage the skills of MUI’s talented designers and developers using the same component library used by Fortune 500 companies to develop sophisticated digital products and compete in a global market.\n\n### Magic UI: Free and Open-Source UI Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Sets MUI Apart From Other Component Libraries?\n\n![MUI React](https://cdn.magicui.design/assets/wdb6jcge9i.jpg)\n\nMUI React is built on Google’s Material Design UI, a widely acclaimed and comprehensive design library. This provides MUI with a solid foundation to deliver a React component library that is both visually appealing and feature-rich. A notable standout feature is the ability to easily customize MUI React using its Theming feature. The library's Theming feature makes customization a breeze, allowing developers to tailor the library to their specific design needs.\n\n### Well-Documented for All Levels\n\nMUI React provides excellent documentation, making it accessible for developers of all levels. Whether working on a large-scale project for a multinational corporation or a small project as a solo developer, MUI React's documentation ensures you have the support you need to do the job.\n\n### Backed by a Large and Active Community\n\nBeing one of the most widely used component libraries in the world, MUI React boasts a massive global community of designers, researchers, and developers. This strong community means you can easily reach out for guidance and support, thus minimizing roadblocks in your development journey. The popularity of React as one of the most widely used front-end frameworks further enhances the appeal of MUI React as a component library.\n\n### Strong Foundation for Building Beautiful UIs\n\nMUI React stands out from other component libraries due to its strong foundation in Google’s Material Design UI, easy customization using the Theming feature, excellent documentation, and a vast global community of developers. Whether you are a seasoned developer or just starting, MUI React provides the tools and support to create stunning UIs for your web applications.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## How To Access MUI React For Project?\n\n![MUI React](https://cdn.magicui.design/assets/p5jwhiup61.jpg)\n\nTo install MUI in your React project, you only need to use an NPM package.\n\nYou can import the package into your React application easily by running the following command:\n\nnpm install @mui/material @emotion/react @emotion/styled\n\nAfter running this command, you can access over a hundred different React components that designers and developers can use. These material UI components are categorized into:\n\n- Data Display\n- Data Grid\n- Date/Time\n- Feedback\n- Inputs\n- Layout\n- Navigation\n- Surfaces\n- Utilities\n\nOnce you have installed MUI, you can import any required components for your project and include them within a specific file or location throughout the UI. MUI also offers valuable templates that you can use out of the box. For instance, the sign-in page template in the MUI package helps you set up clean design pages almost instantly.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specially designed for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These components are visually appealing and interactive, making integrating them into web applications easy. MagicUI components are highly customizable, allowing developers to adapt smoothly to match their desired branding and design requirements.\n\n### Effortless UI Creation with Pre-Built Templates\n\n[MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering users to create captivating digital experiences effortlessly. With a focus on animations and a design-centric approach, MagicUI is the ultimate solution for crafting beautiful user interfaces. In addition to the free component library, MagicUI Pro offers website templates that can help save hours of development time. These templates are designed to create stunning landing pages that can effectively convert visitors into customers.\n\n### Effortless UI Creation with Pre-Built Templates\n\n[MagicUI](https://magicui.design/) is designed to be user-friendly, empowering design engineers to create stunning user interfaces with minimal effort. By using MagicUI, developers can enhance their web applications' visual appeal and interactivity. The library's components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. MagicUI's collection of animated components enables developers to easily create visually appealing and interactive elements.\n\n### Boost User Engagement and Save Time with Design & Development\n\nThe library aims to empower design engineers to craft captivating digital experiences by bridging the gap between design and development. With MagicUI, developers can save time and effort by using pre-designed website templates optimized for conversions. MagicUI is a versatile and user-friendly UI library that can help boost user engagement and create stunning web applications.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n"
  },
  {
    "path": "apps/www/content/blog/mui-table.mdx",
    "content": "---\ntitle: \"How To Create A Basic MUI Table In React\"\ndescription: \"Build a basic MUI Table in React with this easy-to-follow tutorial. Learn how to display data in a structured table using Material-UI components.\"\nimage: https://cdn.magicui.design/assets/cc7de8ab-134d-4cf6-8d7a-819e8b03aca1.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-04\"\nfeatured: false\n---\n\nAre you eager to use interactive and visually appealing tables to enhance your React app with [UI frameworks](https://magicui.design/blog/ui-frameworks)? Imagine creating a responsive MUI table effortlessly. You will learn how to create a Magic UI table in React, which could be just the solution to help you achieve that goal. Know how MUI Table can streamline your app development process and make your tables more interactive, user-friendly, and visually stunning.\n\nMagic UI, a [React component library](https://magicui.design/), offers a perfect solution for smoothly creating MUI tables in React. Its components make it easy to build dynamic tables. Its intuitive design and robust features cater to various needs, making it a valuable tool for boosting your React app's functionality.\n\n## What Is Material UI (MUI)?\n\n![MUI Table](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxtYXRlcmlhbCUyMHVpfGVufDB8fHx8MTcyMDE2ODQyNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI (MUI) is an open-source component library that implements Google’s Material Design principles. It offers various pre-styled components, from simple buttons and checkboxes to complex dialog boxes and tables, that can be fully customized to fit your project’s needs. Material UI can significantly speed up the development process, reducing the need to write custom CSS for each component.\n\nThe design philosophy behind Material UI is material design, a design language developed by Google. It aims to create a visual language synthesizing the classic principles of good design with the innovation and possibility of technology and science. Material-UI brings this philosophy to web development, providing components that are:\n\n- Visually pleasing\n- Functionally robust\n- Easy to use\n\nMaterial Design's concepts are transposed into Material-UI, providing web developers with stylish and functional components to implement in their projects.\n\n### Material UI's Component Library\n\nMaterial UI provides a wide range of components that can be easily integrated into web applications. The components range from simple buttons and checkboxes to complex dialog boxes and tables, allowing for a versatile yet unified user interface. The Button component, for instance, is a customizable button with support for icons and text.\n\nSimilarly, the checkbox component provides a selection control that allows users to select multiple options. These components and many others are designed with Material Design principles in mind.\n\n### Material UI's Customization Capabilities\n\nMaterial UI components can be customized to align with a project's design requirements. The components provide props that enable developers to modify the appearance and behavior of each component. For instance, the button component offers color, size, and variant props that allow developers to change the button's appearance.\n\nThis flexibility ensures developers can create unique and visually appealing interfaces that match their design vision. MUI's customization capabilities enable developers to create engaging and interactive UI elements that cater to their unique design preferences.\n\n### MUI Table Component\n\nOne of the most powerful components offered by Material UI is the table component. This component enables developers to:\n\n- Create data tables with sorting\n- Pagination\n- Filtering features\n\nThe MUI Table component provides an easy-to-use interface for managing large datasets and displaying them organizationally. By incorporating the Table component into a project, developers can create sophisticated tables that enhance the user experience when interacting with data. MUI Table's functionality and customization options make it an invaluable tool for developers working on data-intensive applications.\n\n### Pre-Styled Components and Material Design\n\nMaterial UI (MUI) is a comprehensive UI framework that simplifies the development process by providing pre-styled components that follow Google's material design principles. MUI's customization capabilities enable developers to create visually appealing and engaging user interfaces that enhance the overall user experience. By leveraging Material UI, developers can expedite the development process and create consistent, stylish, and functional web applications.\n\n## Why Use Material UI?\n\n![MUI Table](https://images.unsplash.com/photo-1512314889357-e157c22f938d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxub3RlfGVufDB8fHx8MTcyMDE2ODQ0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is one of the [top user interface libraries for React.js](https://dev.to/kylehunter/6-six-reasons-to-use-material-ui-for-react-1anh), offering many benefits for developers. An open-source project, Material UI features React components that implement Google’s material design, enabling developers to build a high-quality digital experience. This UI library helps create beautiful apps with consistent layouts quickly without compromising performance.\n\nBy leveraging Material UI, developers can access a wide range of configurable and accessible UI widgets that can be directly imported and used. This eliminates the need to write code for creating components from scratch, saving significant time in web development. With the time saved, developers can focus on building the app's core functionalities to deliver a seamless user experience.\n\nMaterial UI boasts key features such as:\n\n- Light and user-friendly\n- Simple design and layout\n- Responsive by default\n- Customizable\n- Well-documented API\n- Strong community support\n\nAll these features combined make Material UI a valuable resource for React projects.\n\nCompared to other UI libraries, Material UI offers the unique advantage of implementing Google’s material design, providing developers with a standardized design language that improves user experience. The extensive range of components available in Material UI allows developers to quickly and easily implement complex UI elements in their applications.\n\n### Building User Interfaces with MagicUI in React \n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. With over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nMagicUI provides a collection of visually appealing and interactive elements that are easily integrated into web applications. MagicUI offers a range of highly customizable components for developers looking for a [React component library](https://magicui.design/) to create stunning user interfaces with minimal effort.\n\nUse our free React component library today at [MagicUI](https://magicui.design/docs) to take advantage of your projects' extensive features and benefits.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## The Different Types Of React Tables You Can Build With MUI\n\n![MUI Table](https://images.unsplash.com/photo-1612832021455-245704c6755a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjAxNjg0NTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Simple/Basic Table\n\nThis is a basic table with fixed column and row numbers. It is simple to implement and provides a straightforward display of tabular data.\n\n### Data Table\n\nThe Data Table is used when a large amount of data requires more complex insights. This table type features advanced functionalities like pagination, sorting, and filtering.\n\n### Dense Table\n\nA dense table minimizes table size and spacing between rows. This table type is useful when space is limited and much data needs to be displayed compactly.\n\n### Collapsible Table\n\nThe Collapsible Table has expandable rows that reveal more information when clicked. This table type utilizes the Collapse component to provide additional details about each row.\n\n### Spanning Table\n\nA spanning Table allows for the combination of multiple rows or columns. A good example of a Spanning Table might be a billing table where information from various sections is combined for easier viewing.\n\n### Virtualized Table\n\nIn a Virtualized Table, a large amount of data is handled within a single frame to save resources. This eliminates the need for pagination or a traditional data table, making it more efficient for managing extensive datasets.\n\n## Getting Started With MUI Tables\n\n![MUI Table](https://images.unsplash.com/photo-1612832164313-ac0d7e07b5ce?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjAxNjg0NTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Setting up your project\n\nThe first step in using [Material-UI tables](https://mui.com/material-ui/react-table/) is creating a React app. If you haven't already, you can quickly create one using create-react-app.\n\n### Create A React App\n\nIf you do not have a React app already, you can create one using the following command:\n\n```bash\nnpx create-next-app@latest mui-table\n```\n\n### Install Material-UI\n\nThe next step is to add Material-UI to your project using npm or yarn. You can do this by running either of the following commands:\n\nUsing npm:\n\n```bash\nnpm install @mui/material @emotion/react @emotion/styled\n```\n\nOR\n\nUsing yarn:\n\n```bash\nyarn add @mui/material @emotion/react @emotion/styled\n```\n\n### Start Your App\n\nOnce you have created your app and installed Material-UI, you can start your app using the following command:\n\n```bash\nnpm run dev\n```\n\nAfter running the command, your app should be up and running at [localhost:3000](http://localhost:3000), and you are all set to begin working with Material-UI tables.\n\n## Creating A Basic MUI Table\n\n![MUI Table](https://images.unsplash.com/photo-1516321497487-e288fb19713f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHx3aXRoJTIwdGVhbXxlbnwwfHx8fDE3MjAxNjg0Nzh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nTables are essential for creating appealing and functional user interfaces. Material-UI provides a comprehensive set of components for creating tables. These tables are not just visually appealing; they are also highly customizable and functional. Let's delve into how to create these MUI tables with an example.\n\n### Basic Table\n\nA simple example with no frills. Here's how you can create a basic table component using Material-UI:\n\n```jsx\nimport * as React from \"react\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport Paper from \"@mui/material/Paper\";\n\nfunction createData(\n  name: string,\n  calories: number,\n  fat: number,\n  carbs: number,\n  protein: number\n) {\n  return { name, calories, fat, carbs, protein };\n}\n\nconst rows = [\n  createData(\"Frozen yoghurt\", 159, 6.0, 24, 4.0),\n  createData(\"Ice cream sandwich\", 237, 9.0, 37, 4.3),\n  createData(\"Eclair\", 262, 16.0, 24, 6.0),\n  createData(\"Cupcake\", 305, 3.7, 67, 4.3),\n  createData(\"Gingerbread\", 356, 16.0, 49, 3.9),\n];\n\nexport default function BasicTable() {\n  return (\n    <TableContainer component={Paper}>\n      <Table sx={{ minWidth: 650 }} aria-label=\"simple table\">\n        <TableHead>\n          <TableRow>\n            <TableCell>Dessert (100g serving)</TableCell>\n            <TableCell align=\"right\">Calories</TableCell>\n            <TableCell align=\"right\">Fat&nbsp;(g)</TableCell>\n            <TableCell align=\"right\">Carbs&nbsp;(g)</TableCell>\n            <TableCell align=\"right\">Protein&nbsp;(g)</TableCell>\n          </TableRow>\n        </TableHead>\n        <TableBody>\n          {rows.map((row) => (\n            <TableRow\n              key={row.name}\n              sx={{ \"&:last-child td, &:last-child th\": { border: 0 } }}\n            >\n              <TableCell component=\"th\" scope=\"row\">\n                {row.name}\n              </TableCell>\n              <TableCell align=\"right\">{row.calories}</TableCell>\n              <TableCell align=\"right\">{row.fat}</TableCell>\n              <TableCell align=\"right\">{row.carbs}</TableCell>\n              <TableCell align=\"right\">{row.protein}</TableCell>\n            </TableRow>\n          ))}\n        </TableBody>\n      </Table>\n    </TableContainer>\n  );\n}\n```\n\nThis code creates a simple table with 5 columns for:\n\n- Dessert (100g serving)\n- Calories\n- Fat (g)\n- Carbs (g)\n- Protein (g)\n\nYou can customize the simple table's column header and column values or other data and appearance according to your project's needs.\n\nAfter creating the Basic Table, you can import it into your base file (e.g., App.js) and use it within your application. Following these steps, you can efficiently create and customize tables using Material-UI's components.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Different Props To Be Used In React Tables\n\n![MUI Table](https://images.unsplash.com/photo-1510915228340-29c85a43dcfe?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlcnxlbnwwfHx8fDE3MjAxNjg0ODl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Sorting and Selecting\n\nSorting and selecting are essential props when dealing with React tables. Sorting helps arrange rows in ascending or descending order based on the column type. This allows users to navigate the data easily and find what they need efficiently.\n\nOn the other hand, selection lets users select multiple data rows to delete or perform other actions based on their needs. This enhances the table's interactivity and functionality, providing a more seamless user experience.\n\n### Pagination\n\nThe pagination feature allows users to effectively manage the data displayed in a React table. The ActionsComponent prop of the TablePagination component empowers the implementation of custom actions.\n\nUsers can configure the number of data rows displayed per page and switch between pages to explore the data at their own pace. This breaks down large datasets into manageable chunks, making it easier for users to consume the information without feeling overwhelmed or lost in a sea of data.\n\n### Sticky Header\n\nThe sticky header prop in MUI tables ensures that the header remains fixed while scrolling through the rows. This feature provides a consistent view of the table's structure, making it easy to reference column names and maintain context as users navigate the data.\n\nBy keeping the header visible at all times, users can quickly identify which data column they are viewing and understand the information being presented, enhancing the table's overall usability.\n\n### Column Grouping\n\nColumn grouping is a handy feature that allows users to group multiple columns together using the `TableRow` item inside the table header. This is particularly useful when dealing with complex datasets that require subtypes or categories within a single class.\n\nUsers can visually organize the data by grouping related columns and more effectively understand the relationships between data points. This feature simplifies data exploration and analysis, helping users derive meaningful insights from the information presented in the table.\n\n## 3 Material UI Alternatives To Material UI Table\n\nWhile Material-UI Tables offer many features and customization options, there are other libraries that you might find useful, depending on your needs. Some popular alternatives include:\n\n### 1\\. React Table\n\nThis is a lightweight, flexible, and powerful React table library. It doesn’t come with any pre-styled components, giving you complete control over the look and feel of your tables.\n\n### 2\\. React Data Grid\n\nThe data grid library provides Excel-like grid components for React, with features like:\n\n- Filtering\n- Grouping\n- Editing\n\n### 3\\. Ant Design Table\n\nThis is part of the Ant Design library, a comprehensive UI library for React. It provides a feature-rich table component with a modern and clean design.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed explicitly for design engineers. This innovative library offers a collection of 20+ animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese components can seamlessly integrate into web applications, making it easier than ever to create visually appealing and interactive user interfaces with minimal effort.\n\n### Design-Centric Approach with Customizable Components\n\n[MagicUI](https://magicui.design/) components are highly customizable, allowing seamless adaptation to match specific branding and design requirements. With a primary focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences effortlessly.\n\n### Boost Conversions with MagicUI Pro\n\nMagicUI Pro offers additional benefits, allowing users to save significant time and effort by utilizing beautiful landing pages and website templates to convert visitors into customers. Take advantage of the free [React component library](https://magicui.design/) today at [https://magicui.design/docs](<https://magicui.design/docs](https://magicui.design/docs)>) and easily elevate your UI design.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/mui-transitions.mdx",
    "content": "---\ntitle: \"How to Create and Use MUI Transitions\"\ndescription: \"Learn how to create and use MUI transitions effectively. Discover practical tips and examples to enhance your UI with smooth, dynamic animations.\"\nimage: https://cdn.magicui.design/assets/f3355d7a-4134-4c6d-87e5-254d11fa47ef.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-02\"\nfeatured: false\n---\n\nConsider you just finished building a fantastic website. Your content is on point, and the design looks great. But when you test it out, the site feels static and unresponsive. Despite your best efforts to create a visually appealing site, it needs more interactivity and feels exciting. Follow our tailored [web design best practices](https://magicui.design/blog/web-design-best-practices) for better results.\n\nNot getting a better output is a common scenario for many web designers. Luckily, MUI Transitions can help you solve this problem. In this guide, we’ll explore the role of MUI Transitions in web design best practices. You’ll learn how to create and implement MUI Transitions to improve user experience and create a more engaging website.\n\nOne way to start with MUI Transitions is to use MagicUI’s startup landing page template. This solution includes pre-built transitions that help create a more interactive website that boosts user experience and keeps visitors engaged.\n\n## What is MUI Transitions?\n\n![MUI Transitions](https://images.unsplash.com/photo-1494778752932-64ee27ba2a37?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjUzMjA1MTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n[Transitions in MUI](https://mui.com/material-ui/customization/transitions/) offer developers an easy way to create smooth animations and transitions for their applications. The default animations and transitions can feel jarring. Users who interact with your application might expect a smooth change between states. MUI transitions help create that change, making your application less abrupt and more user-friendly.\n\n### MUI Transition Basics: Fade, Grow, Slide, And Zoom\n\nMUI transitions provide a variety of effects to choose from. The library offers several transition components, each with unique animations. The four most common are:\n\n#### Fade\n\nSmoothly fades an element in or out.\n\n#### Grow\n\nAnimates the size of an element to create a growing or shrinking effect.\n\n#### Slide\n\nMoves an element in or out from a set direction (i.e., left, right, up, down).\n\n#### Zoom\n\nCreates a zooming effect to transition an element in or out.\n\n### Key Props Govern Transition Behavior\n\nMUI transitions can be customized with various props, allowing developers to create unique animations that fit their application’s needs. Three of the most important props are:\n\n#### In\n\nThis boolean prop controls whether the transition will occur. It determines the component's visibility and triggers the animation.\n\n#### Timeout\n\nThis prop defines the duration of the transition animation. It sets the time for how long the animation will take to complete in milliseconds.\n\n#### Easing\n\nThe easing prop defines the timing function of the animation. It controls how the animation accelerates and decelerates.\n\n### Example: Implementing a Basic MUI Transition\n\nThe following example demonstrates a simple implementation of an MUI transition. In this case, a fade transition is used to animate the appearance and disappearance of a piece of text when a button is clicked.\n\n```javascript\nimport { useState } from \"react\"\nimport { Transition } from \"@mui/material\"\n\nfunction MyComponent() {\n  const [show, setShow] = useState(false)\n\n  return (\n    <div>\n      <button onClick={() => setShow(!show)}>Toggle</button>\n      <Transition in={show} timeout={500}>\n        <div>This component will fade in and out.</div>\n      </Transition>\n    </div>\n  )\n}\n```\n\nIn this example, the Transition component will fade in the div element when the show state is valid and fade out when the show is false. The timeout prop is set to 500 milliseconds, which means the transition will take half a second to complete.\n\n### Beyond the Basics: Advanced Transition Techniques\n\nWhile the above example demonstrates the fundamental usage of MUI transitions, many more advanced techniques and customization options are available. For instance:\n\n#### Conditional Rendering\n\nConditional rendering triggers transitions based on specific conditions, such as user interactions or data changes.\n\n#### Nested Transitions\n\nYou can nest multiple Transition components within each other to create complex animations.\n\n#### Custom Easing Functions\n\nYou can create custom easing functions to achieve unique animation effects.\n\n#### Performance Optimization\n\nOptimizing the performance of transitions for large-scale applications to avoid frame drops or stuttering is crucial.\n\n### Troubleshooting Common MUI Transition Issues\n\nWhen working with MUI transitions, you may encounter common issues such as unexpected animations, performance problems, or compatibility conflicts. To troubleshoot these issues, consider the following tips:\n\n#### Inspect CSS Styles\n\nUse your browser's developer tools to inspect the [CSS styles](https://www.w3schools.com/css/css_intro.asp) applied to the element undergoing the transition. Ensure that the styles are correct and that there are no conflicting rules.\n\n#### Check JavaScript Code\n\nVerify that the JavaScript code responsible for triggering the transition is correct and that there are no errors or logical inconsistencies.\n\n#### Use the Transition Component's Props\n\nExperiment with different values for the props, such as timeout, easing, and in, to see how they affect the animation.\n\n#### Isolate the Issue\n\nTry isolating the problem by creating a simplified example reproducing it. This will help you narrow down the potential causes.\n\n#### Check MUI Documentation\n\nRefer to the official MUI documentation for troubleshooting tips and known issues.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Creating MUI Transitions--A Simple Guide\n\n![MUI Transitions](https://images.unsplash.com/photo-1607798748738-b15c40d33d57?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlcnxlbnwwfHx8fDE3MjUzMjA1Mjd8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Get Started with MUI Transitions\n\n[Creating MUI transitions](https://mui.com/material-ui/transitions/) starts with importing the Transition component from MUI's @mui/material/transitions package. You can import the component into your project using the code snippet below.\n\n```javascript\nimport { Transition } from \"@mui/material/transitions\"\n```\n\n### Set Up the In Prop for Your MUI Transition\n\nNext, you must set up the in-prop. The in-prop controls the visibility of the component and triggers the animation. When it is true, the component will appear; when it's false, it will disappear. Use the code example below as a guide for using the in-prop.\n\n```javascript\n<Transition in={show} timeout={500}>\n    {/* Your component */}\n</Transition>\n```\n\n### Customize Your MUI Transition\n\nYou can [customize MUI transitions](https://github.com/mui/material-ui/issues/36065) using various props to control how a transition behaves. These props include:\n\n#### Timeout\n\nControls the duration of the transition in milliseconds.\n\n#### Easing\n\nSpecifies the easing function for the animation.\n\n#### MountOnEnter\n\nDetermines whether the component should be mounted to the DOM before the animation starts.\n\n#### UnmountOnExit\n\nAfter the animation finishes, determine whether the component should be unmounted from the DOM.\n\n### Appear\n\nControls whether the initial appearance of the component should be animated. Here is an example of a customized transition:\n\n```javascript\n<Transition\n  in={show}\n  timeout={1000}\n  easing=\"easeInOutCubic\"\n  mountOnEnter\n  unmountOnExit\n  appear\n>\n   {/* Your component */}\n</Transition>\n```\n\n### Add Conditional Rendering to Your Transition\n\nYou can use conditional rendering to trigger the transition based on a specific condition. Here’s a simple example:\n\n```javascript\n<Transition in={show} timeout={500}>\n    \n  {show && (\n    <div>This component will appear or disappear based on the show state.</div>\n  )}\n</Transition>\n```\n\n### MUI Transitions Best Practices\n\n#### Use Transitions Sparingly\n\nOverusing transitions can clutter the user interface and make it difficult for users to focus on the critical content. Use transitions only when they add value to the user experience.\n\n#### Consider Performance Implications\n\nTransitions can impact your application's performance, especially in complex or large-scale projects. Use transitions judiciously and optimize your code to avoid performance bottlenecks.\n\n#### Test Your Transitions Thoroughly\n\nEnsure that your transitions work as expected in different browsers and devices. Test them with assistive technologies to ensure they are accessible to all users.\n\n#### Use the TransitionGroup Component\n\nThe TransitionGroup component helps manage animations in lists of dynamic elements that are added or removed. It ensures that animations are coordinated and do not overlap.\n\n#### Avoid Using Transitions for Non-Essential Elements\n\nFocus on using transitions for elements essential to the user experience, such as navigation menus, dialog boxes, or dynamically loaded content.\n\n#### Consider the Impact on Users with Visual Impairments\n\nUsers with visual impairments may rely on screen readers or other assistive technologies to navigate the web. Ensure that your transitions do not interfere with these technologies or make it difficult for users to understand the content.\n\nBy following these best practices, you can effectively create and use MUI transitions to enhance the user experience of your applications while minimizing potential issues.\n\n### MaagicUI: A Quick Overview\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. [MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.  Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## Different Types of MUI Transitions\n\n![MUI Transitions](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBsYXB0b3B8ZW58MHx8fHwxNzI1MzIwNTEzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Fade: The Classic Transition\n\nThe Fade component creates a simple [fade-in and fade-out effect](https://help.clideo.com/hc/en-us/articles/4413311127442-What-are-fade-in-and-fade-out-effects). It's suitable for transitions that involve the appearance or disappearance of elements.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={500}>\n  <Fade in={show}>{/* Your content */}</Fade>\n</Transition>\n```\n\nUse code with caution.\n\n### Grow: The Eye-Catching Transition\n\nThe Grow component creates a growing or shrinking effect. It's often used to emphasize the appearance or disappearance of elements.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={500}>\n  <Grow in={show}>{/* Your content */}</Grow>\n</Transition>\n```\n\nUse code with caution.\n\n### Slide: The Dynamic Transition\n\nThe Slide component creates a sliding effect, allowing elements to slide in from or out of a specified direction.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={500}>\n  <Slide direction=\"right\" in={show}>\n    {/* Your content */}\n  </Slide>\n</Transition>\n```\n\nUse code with caution.\n\n### Zoom: The Fun Transition\n\nThe Zoom component creates a zooming effect, allowing elements to zoom in or out.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={500}>\n  <Zoom in={show}>{/* Your content */}</Zoom>\n</Transition>\n```\n\nUse code with caution.\n\n### Custom Transitions: The Unique Transition\n\nIn addition to the built-in transition components, you can also create custom transitions using [CSS keyframes](https://www.w3schools.com/cssref/css3_pr_animation-keyframes.php). This allows for more flexibility and control over the animation effects.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={500}>\n  <div className=\"animated-element\">{/* Your content */}</div>\n</Transition>\n```\n\nUse code with caution.\n\n#### CSS\n\n```css\n@keyframes bounce {\n  0% {\n    transform: scale(1);\n  }\n    50% {\n    transform: scale(1.2);\n  }\n\n  100% {\n    transform: scale(1);\n  }\n}\n\n.animated-element {\n    animation: bounce 1s ease-in-out;\n}\n```\n\nUse code with caution.\n\nThis example creates a custom bouncing animation using CSS keyframes.\n\n### Choosing the Right Transition\n\nThe best transition type to use depends on the specific effect you want to achieve and the context of your application. Experiment with different types to find the one that best suits your needs.\n\n### Additional Tips\n\nYou can combine multiple transitions within a single Transition component to create more complex animations. Consider the performance implications of using transitions, especially in large or complex applications. Use the TransitionGroup component to manage animations in lists of components that dynamically add or remove them. You can use CSS transitions directly with the Transition component for more advanced customization.\n\n## Advanced MUI Transitions\n\n### CSS Transition Component\n\nThe [CSS Transition component](http://reactcommunity.org/react-transition-group/css-transition/) provides more granular control over animations using CSS classes. This allows you to define custom animation effects and transitions using CSS properties.\n\n#### Example\n\n```javascript\n<Transition\n  in={show}\n  timeout={500}\n  component=\"div\"\n  classes={{\n    entering: \"fade-in\",\n    exiting: \"fade-out\",\n  }}\n>\n  {/* Your content */}\n</Transition>\n```\n\n#### Use Code With Caution \n\n```css\n.fade-in {\n  opacity: 0;\n}\n```\n\n```css\n.fade-out {\n  opacity: 1;\n  animation: fadeOut 0.5s ease-in-out;\n}\n```\n\n```css\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n\n@keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n```\n\n#### Use Code With Caution \n\nIn this example, we've defined two CSS classes, fade-in and fade-out, that contain the animation styles. The Transition component uses these classes to control the animation during the enter and exit phases.\n\n### TransitionGroup for Component Lists \n\nThe TransitionGroup component helps manage animations in lists of dynamic elements that are added or removed. It ensures that animations are coordinated and do not overlap.\n\n#### Example\n\n```javascript\n<TransitionGroup>\n  {items.map((item) => (\n    <CSSTransition key={item.id} timeout={500} classNames=\"fade\">\n      {/* Your component */}\n    </CSSTransition>\n  ))}\n</TransitionGroup>\n```\n\nUse code with caution.\n\n#### Use Code With Caution\n\n```css\n.fade-enter {\n  opacity: 0;\n}\n```\n\n```css\n.fade-enter-active {\n    opacity: 1;\n\n  transition: opacity 500ms;\n}\n```\n\n```css\n.fade-exit {\n  opacity: 1;\n}\n```\n\n```css\n.fade-exit-active {\n  opacity: 0;\n  transition: opacity 500ms;\n}\n```\n\n#### Use Code With Caution \n\nIn this example, the TransitionGroup component manages the animations for the list of items, while the CSS transition component defines the CSS classes for the enter and exit transitions.\n\n### Custom Transitions \n\nYou can create custom transitions by combining the Transition component with CSS keyframes or custom [JavaScript logic](https://www.w3schools.com/js/js_comparisons.asp). This allows for more flexibility and control over the animation effects.\n\n#### Example\n\n```javascript\n<Transition in={show} timeout={1000} onEnter={handleEnter} onExit={handleExit}>\n  {/* Your content */}\n</Transition>\n```\n\n#### Use Code With Caution \n\n```javascript\nfunction handleEnter(node) {\n  node.style.transform = \"scale(0.8)\"\n  setTimeout(() => {\n    node.style.transform = \"scale(1)\"\n  }, 100)\n}\n```\n\n```javascript\nfunction handleExit(node) {\n  node.style.transform = \"scale(1)\"\n\n  setTimeout(() => {\n    node.style.transform = \"scale(0.8)\"\n  }, 100)\n}\n```\n\n#### Use Code With Caution \n\nIn this example, we've defined custom onEnter and onExit handlers that modify the element's transform property to create a scaling animation.\n\nUsing these advanced techniques, you can create complex and customized animations that enhance the user experience of your MUI applications.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- React Spring\n\n## Responsive Design with MUI and MagicUI\n\n![MUI Transitions](https://images.unsplash.com/photo-1629904853893-c2c8981a1dc5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzI1MzIwNTYyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nResponsive design allows websites to adapt to any screen size or device. MUI is built for responsive design, and no configuration is required. [MagicUI is a free animated](https://pro.magicui.design/docs/templates/startup) UI library that works excellently with MUI and can enhance your MUI project’s responsiveness.\n\n### MUI's Responsiveness\n\nMUI is designed to be responsive, automatically adapting to different screen sizes and orientations. This makes it easy to create websites that look great on all devices.\n\n### MagicUI Integration\n\nMagicUI, a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library, can be used with MUI to create more responsive and visually appealing user interfaces. It offers a collection of pre-built animated components designed to work seamlessly with MUI.\n\n### Benefits of Using MagicUI\n\n#### Extensive Collection of Pre-built Components\n\n[MagicUI provides various animated components](https://pro.magicui.design/docs/templates/startup), including buttons, cards, modals, and more. This can save you time and effort when building your UI.\n\n#### Seamless Integration with MUI\n\n[MagicUI components are designed](https://pro.magicui.design/docs/templates/startup) to work seamlessly with MUI's theming and styling system, making integrating them into existing MUI projects easy.\n\n#### Responsive Design Made Easy\n\n[MagicUI components are built](https://pro.magicui.design/docs/templates/startup) with responsiveness in mind, so they automatically adapt to different screen sizes. This helps you create websites that look great on all devices.\n\n#### Example\n\n```javascript\nimport { MagicUIButton } from \"@magicui/react\"\nimport { Button } from \"@mui/material\"\n\nfunction MyComponent() {\n  return (\n    <div>\n      <Button variant=\"contained\">MUI Button</Button>\n      <MagicUIButton variant=\"primary\">MagicUI Button</MagicUIButton>\n    </div>\n  )\n}\n```\n\nUse code with caution.\n\nIn this example, we've used MUI's Button and [MagicUI's MagicUIButton components](https://pro.magicui.design/docs/templates/startup). Both components will be responsive and adapt to the screen size.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library specifically designed for design engineers. This library provides over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nMagicUI offers a range of [visually appealing and interactive elements](https://pro.magicui.design/docs/templates/startup) that can easily integrate into web applications, allowing for stunning user interfaces with minimal effort.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/navbar-in-react-js.mdx",
    "content": "---\ntitle: Build a Responsive Navbar in React JS\ndescription: >-\n  A practical guide to building a responsive navbar in React JS. Learn to use\n  hooks, handle state, and integrate modern UI libraries for a polished result.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-297d32b7-89ce-4342-9fc3-9f50821c19ce.jpg\nauthor: Dillion Verma\ntags:\n  - navbar in react js\n  - responsive react\n  - react hooks\n  - react router\n  - magic ui\npublishedOn: \"2025-09-28\"\nfeatured: true\n---\n\nA solid **navbar in React JS** is more than just a collection of links. It’s a dynamic user interface built with JSX for structure, CSS for looks, and a sprinkle of JavaScript magic with React Hooks like `useState` to make it interactive. This combo is the secret to creating a navigation system that’s both reusable and incredibly efficient for modern web apps.\n\n## Why a Great Navbar Is More Than Just Links\n\nBefore we jump into the code, let's talk about why the navbar deserves our full attention. Think of it as the front door to your application. It’s often the very first thing a user clicks, acting as the main roadmap for their entire journey.\n\nA clunky, confusing navbar is a recipe for disaster—it frustrates users and can send your bounce rate through the roof. On the other hand, an intuitive and clean navigation bar makes finding content a breeze. It encourages people to stick around and explore, which is a huge win for user retention and how long they spend on your site.\n\n### The Power of React for Navigation\n\nThis is where React's component-based architecture really shines. We can break down our navbar into smaller, self-contained pieces. Imagine having separate components like `<Logo />`, `<NavLinks />`, and `<MobileMenu />`. This approach makes your code incredibly easy to manage and scale. Need to update the logo? You just touch one file without worrying about breaking the rest of the navigation.\n\nIt's no surprise that this modular style is how the pros build their interfaces. React is a dominant force on the web, powering over **11 million websites**, including giants like [Netflix](https://www.netflix.com/) and [Airbnb](https://www.airbnb.com/). Its massive adoption is a testament to its power in building complex, high-performance UIs, making it the perfect tool for a robust `navbar in React JS`.\n\n### Core Concepts for Our Navbar Build\n\nTo get this right, we'll lean on a few core React concepts. These aren't just buzzwords; they're the foundational pillars that will make our navbar functional, interactive, and genuinely user-friendly.\n\n- **State Management:** We’ll use the `useState` hook to keep track of the mobile menu's state—is it open or closed? This simple hook is the key to our toggle functionality.\n- **Conditional Rendering:** This is how we’ll show or hide elements based on the situation. For example, we'll display a hamburger icon on smaller screens or apply a special style to the currently active link.\n- **Component Composition:** We’re not going to build one giant, monolithic navbar component. Instead, we'll compose it by fitting smaller, specialized components together, which is the heart of building modern React applications.\n\n> A well-crafted navbar is the silent ambassador of your brand. It communicates professionalism, thoughtful design, and a clear path for your users, shaping their entire experience from the very first click.\n\nBefore you start coding, it’s always a good idea to gather some inspiration. Checking out some effective [website header examples](https://magicui.design/blog/website-header-examples) can spark creative ideas for layouts, color schemes, and cool interactive elements.\n\n## Setting Up Your Project and Core Navbar Component\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0d89ee2b-595f-4a9b-966d-dcb86d386809.jpg)\n\nAlright, enough theory. Let’s get our hands dirty and start building this thing. A clean project setup is the bedrock of any maintainable app, so we'll start there. We’re going to use [Vite](https://vitejs.dev/), a fantastic build tool that gets you from zero to a running dev server in seconds. Seriously, it's fast.\n\nPop open your terminal and fire off this command. It'll scaffold a brand new React project for you.\n\nnpm create vite@latest my-react-navbar -- --template react\n\nOnce that’s done, just `cd` into your new `my-react-navbar` directory and run `npm install`. This pulls in all the packages React needs to do its magic.\n\n### Structuring Your Navbar Component\n\nGood organization is a lifesaver on any project. Instead of just dumping everything into the main `src` folder, we'll create a dedicated `components` directory. This is standard practice and keeps all your reusable UI pieces in one predictable place.\n\nGo ahead and create a `components` folder inside `src`. Then, inside that, make another folder called `Navbar`. This keeps our component's logic and styling bundled together, which makes finding and editing things much easier down the road.\n\nYour file structure should now look like this:\n\n- `src/`\n  - `components/`\n    - `Navbar/`\n      - `Navbar.jsx`\n      - `Navbar.module.css`\n\nI’m a big fan of this co-location approach. The component’s logic (`Navbar.jsx`) lives right next to its dedicated styles (`Navbar.module.css`). By using **CSS Modules**, we ensure the styles in `Navbar.module.css` only apply to _this_ component. No more worrying about accidentally overwriting button styles somewhere else in your app.\n\n### Creating the Initial JSX Structure\n\nLet's lay down the basic skeleton for our **navbar in React JS**. Open up that `Navbar.jsx` file you just created and paste in this initial JSX. This gives us a solid blueprint with placeholders for our logo, navigation links, and a couple of call-to-action buttons.\n\n```jsx\nimport React from \"react\"\n\nimport styles from \"./Navbar.module.css\"\n\nconst Navbar = () => {\n  return (\n    <nav className={styles.navbar}>\n      <a href=\"/\" className={styles.logo}>\n        Logo\n      </a>\n      <ul className={styles.navLinks}>\n        <li>\n          <a href=\"/features\">Features</a>\n        </li>\n        <li>\n          <a href=\"/pricing\">Pricing</a>\n        </li>\n        <li>\n          <a href=\"/about\">About</a>\n        </li>\n      </ul>\n      <div className={styles.navButtons}>\n        <button className={styles.loginBtn}>Log In</button>\n        <button className={styles.signupBtn}>Sign Up</button>\n      </div>\n    </nav>\n  )\n}\n\nexport default Navbar\n```\n\n> This initial JSX provides a clear and semantic structure using a `<nav>` element for accessibility. By separating the logo, links, and buttons into distinct containers, we've set a strong foundation for the responsive styling and state management we'll add next.\n\nWith this barebones component in place, we have a functional (if a little plain) starting point. Now for the fun part: bringing it to life and making it responsive.\n\n## Making Your Navbar Responsive with CSS and Hooks\n\nA static navbar is only half the battle. For a truly professional user experience, our component needs to look great and function perfectly on any screen, from a sprawling desktop monitor to the smallest smartphone. This is where we get to blend the power of CSS with the dynamic capabilities of React Hooks.\n\nThe best way to tackle this is with a **mobile-first CSS strategy**. This simply means we'll write our base styles for the smallest screens first, then use media queries to layer on changes for larger screens. I've found this approach almost always leads to cleaner CSS and better performance on mobile devices, which is critical when a huge chunk of your users are on their phones.\n\nThis workflow diagram shows exactly what I mean—start with mobile and progressively enhance the layout as the screen size increases.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c7ca313d-3784-4bd0-aac2-6505671ddcd9.jpg)\n\nThinking mobile-first simplifies the whole process. Instead of trying to cram a complex desktop design into a tiny space, you build up from a solid, simple foundation.\n\n### Introducing State with the useState Hook\n\nOn smaller screens, there's just not enough room to lay out all our navigation links horizontally. The go-to solution is the classic \"hamburger\" menu icon that users can tap to reveal the navigation. To manage whether this menu is open or closed, we need to introduce **state** into our `Navbar` component.\n\nThis is a perfect job for the `useState` hook. It's React's built-in way to add state to functional components. Let's pop it into our `Navbar.jsx` file.\n\n```jsx\nimport React, { useState } from \"react\"\n\nimport styles from \"./Navbar.module.css\"\n\nconst Navbar = () => {\n  const [menuOpen, setMenuOpen] = useState(false)\n\n  return (\n    <nav className={styles.navbar}>\n      <a href=\"/\" className={styles.logo}>\n        Logo\n      </a>\n      <div className={styles.menuIcon} onClick={() => setMenuOpen(!menuOpen)}>\n        {/* Hamburger Icon SVG or an element */}\n      </div>\n      <ul className={`${styles.navLinks} ${menuOpen ? styles.active : \"\"}`}>\n        {/* ... our li elements */}\n      </ul>\n      {/* ... navButtons div */}\n    </nav>\n  )\n}\n\nexport default Navbar\n```\n\nWhen we call `useState(false)`, we're creating a new piece of state called `menuOpen` and setting its initial value to `false`. The `setMenuOpen` function is what we'll use to change that value. The real magic is the `onClick` event, which simply flips the `menuOpen` state from true to false and back again with every tap.\n\nTo really get a handle on the interactive parts of a navbar, it helps to know which hooks do what. Here’s a quick rundown of the most common ones you’ll encounter.\n\n### React Hooks for Navbar Interactivity\n\nThis table is a quick reference for the essential React hooks used to build an interactive and stateful navbar.\n\n| Hook           | Primary Use Case in Navbar                                                                                            | Example                                                    |\n| :------------- | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------- |\n| **useState**   | Manages the open/closed state of a mobile menu or dropdowns.                                                          | `const [isOpen, setIsOpen] = useState(false);`             |\n| **useEffect**  | Handles side effects, like closing the menu when the user clicks outside of it or when the window is resized.         | `useEffect(() => { document.addEventListener(...) }, []);` |\n| **useRef**     | Gets a direct reference to a DOM element, like the navbar itself, to measure its height or position.                  | `const navbarRef = useRef(null);`                          |\n| **useContext** | Shares global state (like theme or user authentication) across the navbar and other components without prop drilling. | `const { theme, setTheme } = useContext(ThemeContext);`    |\n\nThese hooks are the fundamental building blocks for creating dynamic, modern navigation that responds to user input and browser events.\n\n### Implementing CSS Media Queries\n\nNow we need the CSS to bring this all to life. In our `Navbar.module.css` file, we'll start by hiding the navigation links on mobile and only showing the hamburger icon. When our `menuOpen` state is `true`, our JavaScript adds the `active` class to the `ul`, and our CSS will use that class to make the links visible.\n\nThis component-based architecture is a big reason why, as of 2025, over **40% of professional developers** are actively using React. Being able to encapsulate logic and styling like this can result in up to **60% faster build times** compared to older methods. It’s all about creating reusable, high-performance components like the navbar we’re building right now.\n\nIf you want to brush up on the HTML fundamentals behind navigation, our guide on [how to create a navigation bar in HTML](https://magicui.design/blog/how-to-create-navigation-bar-in-html) is a great place to start.\n\nAs you build out your responsive navbar, I highly recommend keeping these [responsive design best practices](https://exclusiveaddons.com/responsive-design-best-practices/) in mind. They’ll help you ensure the final product is polished, user-friendly, and works flawlessly everywhere.\n\n## Highlighting Active Links with React Router\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/Ul3y1LXxzdU\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nA great navbar doesn't just look good—it tells you where you are. That small visual cue of highlighting the current page's link is a massive boost for user experience. For single-page apps built with React, the best tool for the job is hands-down [**React Router**](https://reactrouter.com/).\n\nInstead of plain old `<a>` tags, React Router gives us a much smarter component: `NavLink`. This component is route-aware, meaning it automatically knows when its link matches the current URL. When it does, it can apply a specific CSS class, which is exactly what we need to style our active link.\n\n### Putting NavLink to Work\n\nFirst things first, if you don't have React Router in your project, you'll need to add it. A quick `npm install react-router-dom` in your terminal will do the trick.\n\nWith that installed, we can pop open our `Navbar.jsx` file, import `NavLink`, and replace our anchor tags.\n\nThe magic happens with the `className` prop. We can pass it a function that receives an `isActive` boolean. This is a clean, modern way to conditionally apply our active link style.\n\n```jsx\nimport { NavLink } from \"react-router-dom\"\n\nimport styles from \"./Navbar.module.css\"\n\nconst Navbar = () => {\n  // ... existing useState logic\n\n  return (\n    <nav className={styles.navbar}>\n      {/* ... logo and menu icon */}\n      <ul className={`${styles.navLinks} ${menuOpen ? styles.active : \"\"}`}>\n        <li>\n          <NavLink\n            to=\"/\"\n            className={({ isActive }) => (isActive ? styles.activeLink : \"\")}\n          >\n            Home\n          </NavLink>\n        </li>\n        <li>\n          <NavLink\n            to=\"/features\"\n            className={({ isActive }) => (isActive ? styles.activeLink : \"\")}\n          >\n            Features\n          </NavLink>\n        </li>\n        <li>\n          <NavLink\n            to=\"/pricing\"\n            className={({ isActive }) => (isActive ? styles.activeLink : \"\")}\n          >\n            Pricing\n          </NavLink>\n        </li>\n      </ul>\n      {/* ... buttons */}\n    </nav>\n  )\n}\n```\n\nWhen a link is active, this code applies the `styles.activeLink` class from our CSS module. It’s a simple but incredibly effective way to give users instant feedback on their location.\n\n> Providing immediate visual feedback, like an active link style, isn't just a design choice—it's a core usability principle. It reduces cognitive load by instantly confirming the user's location within your application's hierarchy.\n\n### When You Need More Control: The useLocation Hook\n\n`NavLink` handles most cases beautifully, but what about more complex routing? Maybe you have nested routes, like a \"Dashboard\" section with its own sub-pages, and you want the \"Dashboard\" link to stay highlighted.\n\nFor those trickier scenarios, React Router gives us another powerful tool: the `useLocation` hook.\n\nThis hook provides access to the `location` object, which contains all the details about the current URL, including its `pathname`. With the pathname in hand, you can write custom logic to define what \"active\" means for your specific **navbar in React JS**.\n\nFor instance, you could check if the current `pathname` _starts with_ `/dashboard`. This would keep the main \"Dashboard\" link highlighted whether the user is on `/dashboard/settings` or `/dashboard/profile`. This kind of fine-grained control is what allows you to build truly intuitive navigation, no matter how sophisticated your app becomes.\n\nOkay, our responsive navbar works. It does the job. But let's be real—functionality is just the baseline. A truly great user experience comes from the little details, the polish that makes an interface feel alive.\n\nTo take our **navbar in React JS** from functional to fantastic, we're going to add some subtle but impactful animations. This is the perfect job for a library like [Magic UI](https://magicui.design/).\n\nI'm a big fan of Magic UI because it gives you a whole suite of beautifully designed, copy-and-paste components that play nicely with React and Tailwind CSS. It’s designed to give you that professional-grade animation flair without needing a degree in motion design.\n\nYou can get a feel for the kind of slick, modern components they offer just by looking at their site. They're built to be eye-catching but also incredibly simple to drop into your project.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/05d64bd3-a328-4c37-8af1-3c61ede663ca.jpg)\n\nThis is what I mean by polish. A library like this can instantly elevate a standard component into something that not only grabs a user's attention but also makes your brand feel more premium.\n\n### Integrating a Magic UI Component\n\nLet's start by swapping out one of our plain, static nav links with something more dynamic. The `AnimatedShinyText` component is a great choice. It adds a really elegant shimmer effect when a user hovers over it—a tiny detail that makes the UI feel much more interactive.\n\nFirst things first, we need to get the right dependencies installed. Magic UI's components often lean on `Framer Motion` for the heavy lifting on animations, and they use handy utilities like `clsx` and `tailwind-merge` to intelligently handle CSS classes.\n\nPop open your terminal and run this command in your project directory:\n\nnpm install framer-motion clsx tailwind-merge\n\nThink of these packages as the engine under the hood. They power the smooth animations and give us the tools to manage dynamic styling without headaches.\n\n### Putting AnimatedShinyText to Work\n\nWith the dependencies installed, we can now bring the `AnimatedShinyText` component into our `Navbar.jsx`. The best way to do this is to head over to the [Magic UI component documentation](https://magicui.design/docs/components), find the component, and copy its code into a new file in your project. Once you have that file, you can import and use it just like any other React component.\n\nHere’s a quick example of how you could replace the \"Features\" link in your navbar:\n\n```jsx\nimport React, { useState } from \"react\"\nimport { NavLink } from \"react-router-dom\"\n\nimport { AnimatedShinyText } from \"../components/magicui/AnimatedShinyText\" // Make sure this path is correct!\nimport styles from \"./Navbar.module.css\"\n\nconst Navbar = () => {\n  const [menuOpen, setMenuOpen] = useState(false)\n\n  return (\n    <nav className={styles.navbar}>\n      {/* ... your logo and menu icon ... */}\n      <ul className={`${styles.navLinks} ${menuOpen ? styles.active : \"\"}`}>\n        <li>\n          <NavLink to=\"/\">Home</NavLink>\n        </li>\n        <li>\n          <NavLink to=\"/features\">\n            <AnimatedShinyText className=\"inline-flex items-center justify-center ...\">\n              <span>✨ Features</span>\n            </AnimatedShinyText>\n          </NavLink>\n        </li>\n        <li>\n          <NavLink to=\"/pricing\">Pricing</NavLink>\n        </li>\n      </ul>\n      {/* ... your buttons ... */}\n    </nav>\n  )\n}\n```\n\n> By simply wrapping a standard navigation link with a pre-built animated component, you add a layer of sophistication in minutes. This is a massive time-saver compared to trying to build complex CSS or JavaScript animations from the ground up.\n\nThis small tweak is a perfect illustration of a broader trend in development: efficiency through component libraries. It's no surprise the React Native market is projected to grow at a CAGR of **16.7% through 2033**, largely because developers are hungry for reusable components. In fact, using a framework like React can cut development costs by up to **40%**, which is a powerful argument for leaning on pre-built, optimized solutions whenever you can.\n\n## Answering Common Questions About React Navbars\n\nOnce you've got the basics of your responsive, animated navbar down in React, you'll inevitably run into a few real-world challenges. Moving past the tutorial stage means grappling with these common issues, and it's what really sharpens your skills as a developer. Let's dig into some of the most frequent questions that pop up.\n\nThink of this section as the next level—a way to head off common problems and really solidify your understanding of building robust components.\n\n### How Do I Make My React Navbar Accessible?\n\nAccessibility isn't just a nice-to-have feature; it's a fundamental part of building professional, usable web apps. For a navbar, this means making sure everyone, including people who rely on assistive technologies, can easily get around your site.\n\nIt all starts with using the right HTML. The `<nav>` element is non-negotiable—it's a signpost for screen readers, telling them, \"Hey, this is the main navigation.\" From there, you have to make sure every interactive part works with a keyboard.\n\n- **Buttons vs. Links:** Use a `<button>` for actions, like opening and closing the mobile menu. For actual navigation, stick with `<a>` or, even better, `<NavLink>` from React Router.\n- **Label Everything:** That hamburger menu icon is just a visual cue. For screen readers, it's invisible without an `aria-label`. Something like `<button aria-label=\"Open navigation menu\">` is perfect.\n- **Smart Focus Management:** When a mobile menu slides open, the user's focus should jump right into it. When it closes, focus should return to the button that opened it. This prevents keyboard users from getting lost.\n\n> Building for accessibility is really about empathy. A properly built, accessible navbar ensures that **100% of your audience** can find their way around your site, which is the whole point of a UI in the first place.\n\n### How Should I Handle Dropdown Menus for Nested Links?\n\nOkay, so what about when you have nested navigation? Think of a \"Products\" link that needs to reveal a list of product categories. This is where dropdowns come in, and the trick is to manage their state correctly.\n\nFor each dropdown, you'll need its own piece of state, probably managed with `useState`, to track whether it's open or closed. The user experience also needs to adapt to the device. On a desktop, hovering feels natural, so you can use `onMouseEnter` and `onMouseLeave` to show and hide the menu. On mobile, that's not an option, so a clean `onClick` toggle is the way to go.\n\n### How Can I Stop My Navbar From Re-rendering All the Time?\n\nPerformance is always on our minds, especially as an app grows. The last thing you want is your entire navbar re-rendering every time a piece of state changes somewhere else on the page.\n\nA quick and effective fix for this is to wrap your navbar component in `React.memo`. This is a higher-order component that tells React to only re-render the component if its props have actually changed. It performs a quick shallow comparison, and if nothing's different, React just skips the render cycle for that component. It’s a simple optimization that can make a big difference for components that don't change often.\n\n---\n\nReady to build interfaces that feel alive? **Magic UI** gives you a massive library of **150+** free, open-source animated components built with React and Tailwind CSS. Stop building from scratch and start creating beautiful, professional UIs in minutes. Check out the components at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/navbar-react-js.mdx",
    "content": "---\ntitle: Build a Modern Navbar React JS Component\ndescription: >-\n  Learn to build a stunning, responsive navbar react js component. This guide\n  uses Magic UI and Tailwind CSS for modern animations and a seamless user\n  experience.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-d81d92ce-21f7-4d7a-a835-e39092b90a06.jpg\nauthor: Dillion Verma\ntags:\n  - navbar react js\n  - react component\n  - magic ui\n  - tailwind css\n  - frontend development\npublishedOn: \"2025-11-02T09:51:25.556571+00:00\"\nfeatured: true\n---\n\nWhen we talk about a **navbar in React JS**, we're not just talking about a simple list of links. It’s a core piece of the user interface, built with React's component-based approach to manage everything from navigation links to user state. In a single-page application, it's what makes the user experience feel seamless, letting people move around without those clunky, full-page reloads.\n\n## Why a Modern Navbar Is Crucial for UX\n\nLet’s be honest: in modern web dev, a navbar is so much more than a menu at the top of the screen. It's the primary way users find their bearings and explore what you've built. A confusing navigation bar is a one-way ticket to a high bounce rate. On the flip side, an intuitive one guides users effortlessly, which is a game-changer for engagement and conversions.\n\n![A sleek, modern navbar component with interactive elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/1d880424-2cf9-4a94-a512-974e5354e5dd.jpg)\n\nWith single-page applications (SPAs) becoming the standard, users expect fluid, dynamic navigation. The jarring interruption of a full-page refresh feels dated. This is exactly where building a **navbar with React JS** truly comes into its own.\n\n### The Power of React for Navigation\n\nReact's component-based structure is practically tailor-made for building robust, reusable navigation systems. Instead of treating the navbar as a static chunk of HTML, you can build it as an intelligent component that reacts to application state, user authentication, or even the screen size. This approach not only simplifies the development process but also keeps the user experience consistent everywhere in your app.\n\nThere's a reason React has become the go-to for navbars, now powering over **11 million live sites**. It’s especially popular on high-traffic websites where a flawless UX isn't just a nice-to-have—it's essential for success. For a deeper dive into its market dominance, you can check out the latest [React JS trends at Netguru](https://www.netguru.com/blog/react-js-trends).\n\n> A great navbar does more than show users where to go; it instills confidence and makes the digital experience feel intuitive and polished. It’s often the first and most frequent interaction a user has with your interface.\n\n### Accelerating Development with Magic UI\n\nSure, you could build a navbar from scratch in React. But why reinvent the wheel? Modern UI libraries like [Magic UI](https://magicui.design/) give you a massive head start. They come packed with pre-built, customizable, and animated components that deliver a premium feel right out of the box.\n\nUsing a library like this lets you focus on what makes your app unique, while still getting a professional, highly interactive result. In this guide, we'll walk through creating a responsive and beautiful **navbar react js** component by tapping into the power of Magic UI.\n\n## Setting Up Your React Project Environment\n\nBefore we dive into building a slick **navbar react js** component, we need to get our workspace ready. A solid foundation is everything, which means setting up a modern, fast development environment. For this, we'll be using **Vite**. If you're coming from Create React App, you'll be blown away by how much faster the development experience is.\n\nFirst things first, let's spin up a new React project. Pop open your terminal and run this command. It'll ask for a project name and walk you through picking React and TypeScript.\n\nnpm create vite@latest your-navbar-project -- --template react-ts\ncd your-navbar-project\nnpm install\n\nThis one-liner creates a new directory for your project, jumps inside it, and pulls in all the initial packages you need. In just a couple of minutes, you'll have a live React app, ready for the fun part.\n\n![Screenshot from https://magicui.design/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2d64ac8c-330f-43ff-ad54-7546be0a4022.jpg)\n\nThe screenshot above gives you a taste of the clean, modern aesthetic you get with Magic UI components—which is exactly what we're about to install.\n\n### Integrating Tailwind CSS and Magic UI\n\nMagic UI components are built right on top of **Tailwind CSS**, so getting it integrated is a must. Tailwind's utility-first approach is a perfect match for React's component-based world, letting you style things quickly and directly inside your JSX.\n\nLet's get Tailwind and its buddies installed. Run these commands to add the packages and generate the config files you'll need:\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\nWith Tailwind in place, adding Magic UI is a piece of cake. It's just a single dependency that bundles all the components and their slick animations.\n\nnpm install magic-ui-react\n\n> The real secret to a smooth setup is getting your dependencies configured correctly from the get-go. A clean `package.json` and a properly set up `tailwind.config.js` file will save you from some of the most common headaches later on.\n\nFor a more detailed walkthrough on getting Tailwind CSS configured in a React project, you can **check out our guide on how to install Tailwind in React** at https://magicui.design/blog/install-tailwind-react. It'll make sure your `tailwind.config.js` and main CSS file are set up to properly handle all of Magic UI's classes.\n\nAs you're setting up your environment, it's always good to have some context on how different frameworks stack up. A quick read of a comparison like [Flutter Vs React Native](https://catdoes.com/blog/flutter-vs-react-native-2025) can give you a broader perspective on the ecosystem.\n\nAlright, with your environment locked and loaded, you're ready to start building. Next, we'll import the components we need and start putting together the `Navbar` component itself.\n\n## Building Your Core Navbar Component\n\nWith our project environment ready to go, it’s time to actually build our **navbar react js** component. We’ll start by laying down the foundational JSX structure—keeping it clean, semantic, and reusable from the get-go. First, we'll get the essentials in place (a logo and our main links), and then we'll pull in a sleek [Magic UI](https://magicui.design/) component to give it that modern, interactive feel.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/pfaSUYaSgRo\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nFirst things first, create a new file in your components directory. Let's call it `Navbar.jsx`. Inside, we’ll define a functional component that maps over an array of link objects. I always prefer this approach over hardcoding links directly into the JSX; it makes updating or adding new navigation items down the line so much easier.\n\nThis initial setup ensures our component is organized and scalable right from the start.\n\n### Structuring the JSX and Adding Links\n\nLet's get the basic layout down. Our component will return a `<nav>` element, which is the right semantic tag for a main navigation block. Inside, we'll have a spot for our logo and a `<ul>` to hold our links. For a real-world app, you'd probably have links like 'Features', 'Pricing', 'Blog', and maybe a primary call-to-action like 'Get Started'.\n\nHere’s what that initial component looks like. Notice how we're mapping over a `navLinks` array to keep our code DRY (Don't Repeat Yourself). It's a simple habit that pays off big time in larger projects.\n\n```jsx\nimport React from \"react\"\n\nconst navLinks = [\n  { name: \"Features\", path: \"/features\" },\n  { name: \"Pricing\", path: \"/pricing\" },\n  { name: \"Blog\", path: \"/blog\" },\n]\n\nexport const Navbar = () => {\n  return (\n    <nav className=\"fixed top-4 z-50 flex w-full justify-center\">\n      <div className=\"flex items-center gap-4\">\n        {/* Placeholder for Logo */}\n        <span className=\"text-lg font-bold\">YourLogo</span>\n\n        {/* Navigation Links */}\n        <ul className=\"flex items-center gap-4\">\n          {navLinks.map((link) => (\n            <li key={link.name}>\n              <a\n                href={link.path}\n                className=\"transition-colors hover:text-gray-400\"\n              >\n                {link.name}\n              </a>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </nav>\n  )\n}\n```\n\nThis code gives us a perfectly functional, if a bit plain, navbar. It's a solid foundation, but now it's time to bring in Magic UI to really elevate the design and feel.\n\n### Integrating Magic UI for a Modern Look\n\nThis is where the fun begins. We're going to swap out our basic `div` container with Magic UI's `<Dock />` component. This component is a game-changer—it provides a beautiful, animated container with a magnetic hover effect, instantly making the navbar feel more dynamic and polished.\n\nFirst, you'll need to import it at the top of your `Navbar.jsx` file.\n\n```jsx\nimport { Dock, DockIcon } from \"magic-ui-react\"\n```\n\nNext, we'll wrap our navigation links inside the `<Dock />` component itself. Each link will then be placed inside a `<DockIcon />` to get those signature hover and scaling effects that make it feel so premium.\n\n> The `<Dock />` component is a fantastic way to add a high-end feel with minimal effort. It handles all the complex animations behind the scenes, so you can focus on the structure and functionality of your **navbar react js** component.\n\nHere’s the updated code with the Magic UI components integrated. We've replaced the `<ul>` with `<Dock />` and wrapped each `<a>` tag in a `<DockIcon />`. The styling is all handled via `className` props, tapping into the power of the Tailwind CSS setup we configured earlier.\n\n```jsx\nimport React from \"react\"\nimport { Dock, DockIcon } from \"magic-ui-react\"\n\n// Assuming navLinks array is defined as before\nconst navLinks = [\n  { name: \"Features\", path: \"/features\" },\n  { name: \"Pricing\", path: \"/pricing\" },\n  { name: \"Blog\", path: \"/blog\" },\n]\n\nexport const Navbar = () => {\n  return (\n    <nav className=\"fixed bottom-10 z-50 flex w-full justify-center\">\n      {/* Dock container for nav items */}\n      <Dock direction=\"middle\">\n        {navLinks.map((link) => (\n          <DockIcon key={link.name}>\n            <a\n              href={link.path}\n              className=\"flex h-12 w-12 flex-col items-center justify-center gap-1 rounded-full bg-neutral-900 text-sm font-medium text-gray-400 hover:text-white\"\n            >\n              {link.name}\n            </a>\n          </DockIcon>\n        ))}\n      </Dock>\n    </nav>\n  )\n}\n```\n\nJust like that, our navigation bar is no longer just a static list of links. It’s now an interactive, engaging element that responds to the user with fluid animations—setting a much better tone for the entire user experience.\n\n## Implementing a Fully Responsive Mobile Menu\n\nA static desktop navbar is only half the battle. To deliver a truly professional user experience, our **navbar react js** component has to adapt flawlessly to any screen size. This is where we shift our focus from desktop aesthetics to mobile functionality, making sure our navigation is just as intuitive on a smartphone as it is on a wide monitor.\n\n![A mobile device showcasing a responsive hamburger menu overlay.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3a4b8033-de7d-4b0d-8ba7-df7de9bbd0de.jpg)\n\nWe'll lean on React's `useState` hook to manage the visibility of a mobile menu, toggling it open and closed. The real goal here is to create a seamless transition between the desktop view and a mobile-friendly overlay, complete with that classic hamburger icon.\n\n### Managing State for Mobile Views\n\nFirst things first, to make our navbar responsive, we need to introduce state. We need a way for our component to \"remember\" if the mobile menu is open or not. For this job, the `useState` hook is perfect.\n\nWith just a single line of code, we can create a state variable—let's call it `isMobileMenuOpen`—and a function to update it, `setIsMobileMenuOpen`.\n\n`const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);`\n\nThis simple boolean state acts as our on/off switch. When a user taps the hamburger icon, we'll call `setIsMobileMenuOpen` to flip the value from `true` to `false`. This triggers a re-render and lets us conditionally apply styles or even render entirely different JSX. It’s this simple hook that powers our entire mobile menu's interactivity.\n\nThe demand for this kind of dynamic, state-driven navigation has exploded as React's market share has climbed from a mere **1.2% in 2015 to 5.9%** today. Single-page applications are now the standard, and they depend on components like a **navbar react js** to handle navigation without jarring, full-page reloads. It’s really no surprise that **80% of Fortune 500 companies** use React in production, with responsive navbars being a non-negotiable feature.\n\n### Using Tailwind CSS for Responsive Design\n\nWith our state management in place, it's time to bring in [Tailwind CSS](https://tailwindcss.com/) and its responsive prefixes to control what users see on different screens.\n\nTailwind's mobile-first approach is incredibly intuitive. You design for the smallest screen first, then layer on classes prefixed with `sm:`, `md:`, or `lg:` to adapt the layout for larger viewports.\n\nFor our navbar, this breaks down nicely:\n\n- **The Hamburger Icon:** We only want this button visible on mobile. We can pull this off by giving it a class of `md:hidden`, which simply means \"hide this element on medium screens and up.\"\n- **The Desktop Links:** On the flip side, our main navigation links (inside the `<Dock />` component) should only show up on larger screens. We'll give this container a class of `hidden md:flex`, which translates to \"hide it by default, but show it as a flex container on medium screens and up.\"\n\nThis approach keeps our JSX clean and declarative. We can build a fully responsive layout without ever leaving our component file or writing a single line of custom CSS media queries.\n\n> By combining React's state management with Tailwind's responsive utilities, you can build a highly adaptive UI that feels custom-built for every device. This is the modern workflow for creating components that are both powerful and maintainable.\n\nThe logic for a mobile overlay often shares principles with other UI patterns. For instance, if you're looking to build more complex navigation, you might want to [check out our guide on how to create a drop-down menu](https://magicui.design/blog/how-to-create-drop-down-menu), which uses similar concepts for managing visibility and user interaction.\n\n---\n\n### Responsive Breakpoints for Navbar Design\n\nDeciding _when_ to switch from a desktop to a mobile layout is a critical design choice. Tailwind's default breakpoints are a fantastic starting point, as they cover the most common device sizes. Here’s a quick rundown of how you might use them for a navbar.\n\n| Breakpoint Prefix | Minimum Width | Typical Device               | Navbar Layout                                  |\n| :---------------- | :------------ | :--------------------------- | :--------------------------------------------- |\n| `sm`              | 640px         | Large Phones                 | Often still uses the mobile hamburger menu.    |\n| `md`              | 768px         | Tablets (Portrait)           | Good point to switch to the full desktop menu. |\n| `lg`              | 1024px        | Laptops, Tablets (Landscape) | Definitely desktop menu territory.             |\n| `xl`              | 1280px        | Standard Desktops            | The desktop menu should feel spacious here.    |\n\nThis table helps visualize the transition points. For our navbar, the `md` breakpoint is the sweet spot to hide the hamburger icon and reveal the full navigation links, ensuring a great experience on both small and large screens.\n\n## Adding Polished Animations and Interactions\n\nA working navbar is one thing, but a polished, interactive one? That’s what takes the user experience to the next level. Those finishing touches—the subtle animations and clear visual feedback—are what make a **navbar react js** component feel truly professional and intuitive.\n\nSo, let's go beyond the basics and inject some life into our navigation.\n\n![A visually striking navbar with animation effects and interactive elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/67042979-5f84-4290-807c-58392061e882.jpg)\n\nWe'll kick things off with a popular feature you see on modern sites: a dynamic background that fades in as the user scrolls. It’s a subtle effect that adds a sense of depth and context, cleanly separating the navigation from the page content once the user starts exploring.\n\n### Create a Dynamic Background on Scroll\n\nYou might be surprised at how simple it is to implement a scroll-based background change using React hooks. The plan is to keep an eye on the user's vertical scroll position (`window.scrollY`) and then slap a different class on the navbar once they've scrolled past a certain point—say, **10 pixels** from the top.\n\nWe'll lean on the `useState` and `useEffect` hooks to get this done.\n\nFirst, we need a simple state variable to track whether the navbar should have its \"scrolled\" style or not.\n\n```jsx\nconst [scrolled, setScrolled] = useState(false)\n```\n\nNext, we’ll use `useEffect` to wire up a scroll event listener to the `window` object as soon as the component mounts. Crucially, this effect also cleans up after itself by removing the listener when the component unmounts, preventing memory leaks.\n\n```jsx\nuseEffect(() => {\n  const handleScroll = () => {\n    // Set state to true if scrolled more than 10px, otherwise false\n    setScrolled(window.scrollY > 10)\n  }\n\n  window.addEventListener(\"scroll\", handleScroll)\n  // Cleanup function to remove the event listener\n  return () => window.removeEventListener(\"scroll\", handleScroll)\n}, [])\n```\n\nWith that in place, all that’s left is to conditionally apply a class to your `<nav>` element. For instance, you could add a semi-transparent background color only when `scrolled` is `true`. If you want to dive deeper, learning about **[CSS animation on scroll](https://magicui.design/blog/css-animation-on-scroll)** can give you even more creative ideas.\n\n### Highlight the Active Navigation Link\n\nGood UX is all about communication, and users should always know where they are in your app. Highlighting the active navigation link is a classic, powerful way to orient them.\n\nIf you happen to be using a library like [React Router](https://reactrouter.com/), this is almost laughably easy. The library provides a `<NavLink>` component, a drop-in replacement for the standard `<a>` tag, that comes with a handy `isActive` property built right in.\n\nYou can pass a function to the `className` prop to toggle your styles based on whether the link is active.\n\n```jsx\n<NavLink\n  to=\"/features\"\n  className={({ isActive }) =>\n    isActive ? \"font-bold text-white\" : \"text-gray-400\"\n  }\n>\n  Features\n</NavLink>\n```\n\nIn this snippet, the link's text will be bold and white if its route is currently active. It's a small detail that instantly signals the user's location and makes a huge difference in usability.\n\n> A great user interface isn't just about what it can do; it's about how it communicates with the user. Active link styling and scroll-based feedback are subtle conversations that guide and reassure the user at every step.\n\nBy layering in these interactions, your **navbar react js** component is no longer just a static list of links. It becomes a dynamic, responsive guide that enhances the entire feel of your application.\n\n## Got Questions About React Navbars?\n\nWhen you're piecing together a slick **navbar in React JS**, a few common questions always seem to pop up. It's totally normal. You're often juggling routing, trying to mix different styling libraries, and making sure the final product is usable by everyone. Let's walk through some of the hurdles I see developers run into all the time.\n\n### How Do I Handle Routing with a React Navbar?\n\nThis one's a classic. To get that smooth, single-page application feel where views change without a full page refresh, you need a client-side routing library. My go-to, and the industry standard, is **React Router**.\n\nIt’s actually a pretty simple swap. Instead of using the old-school HTML `<a />` tags for your links, you'll use the `<Link />` component that comes with `react-router-dom`. So, a link that used to be `<a href=\"/about\">About</a>` becomes `<Link to=\"/about\">About</Link>`. That one change is all it takes to hook into your app's routing state, letting React Router handle the view changes without reloading everything.\n\n### Can I Use Magic UI with Other CSS Frameworks?\n\nShort answer? Not really. **Magic UI** is built from the ground up to work hand-in-hand with [Tailwind CSS](https://tailwindcss.com/) and [Framer Motion](https://www.framer.com/motion/). The components lean heavily on Tailwind’s utility classes for all their styling, so Tailwind is a non-negotiable dependency.\n\nCould you _technically_ try to wrestle it into working with something like Bootstrap or Styled Components? Maybe, but you’d be fighting the framework every step of the way, overriding styles and dealing with conflicts. Trust me, it's not worth the headache. For a smooth ride, stick to a project that's already set up with Tailwind CSS.\n\n> Making your React navbar accessible isn't just a best practice; it's essential for creating an inclusive user experience. Using semantic HTML and proper ARIA attributes from the start will save you significant time and effort later on.\n\n### How Can I Make My React Navbar Accessible?\n\nAccessibility (often shortened to **a11y**) isn't an afterthought—it's a core part of professional development. The best place to start is with semantic HTML. Use tags like `<nav>`, `<ul>`, and `<li>` to give your navigation a logical structure that screen readers can easily interpret.\n\nFor anything interactive, like a mobile menu toggle, always reach for a `<button />`. Don't try to make a `div` act like a button. You’ll also want to manage its state with ARIA attributes, like `aria-expanded`, to signal whether the menu is open or closed.\n\nA few other key things to remember:\n\n- Make sure every interactive element can be focused using the keyboard.\n- Give those elements a clear, visible focus indicator.\n- If you're using an icon, like a hamburger menu, provide an accessible name for it with an `aria-label` attribute.\n\n---\n\nReady to build beautiful, animated, and production-ready components in minutes? **Magic UI** offers a powerful library of over **50** customizable blocks and templates built with React, Typescript, and Tailwind CSS. Explore the components and elevate your next project at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/navigation-bar-for-website.mdx",
    "content": "---\ntitle: Build a High-Converting Navigation Bar for Website\ndescription: >-\n  Learn how to build a high-converting navigation bar for website. A\n  step-by-step guide using React, TypeScript, and Tailwind CSS for modern web\n  development.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f06d7f7e-ee39-4c36-8d89-c494b82411a8/navigation-bar-for-website-responsive-design.jpg\nauthor: Dillion Verma\ntags:\n  - navigation bar for website\n  - React\n  - Tailwind CSS\n  - Web Development\n  - UI Design\npublishedOn: \"2025-11-26T09:13:13.576159+00:00\"\nfeatured: true\n---\n\nA website's navigation bar can make or break the entire user experience. Think of it as the central nervous system of your site—it can either guide visitors exactly where they need to go or send them running for the exit. A truly modern, effective navigation bar isn't just about looking good; it's about clarity, performance, and accessibility.\n\n## The Blueprint for a High-Converting Navigation Bar\n\nA great navigation bar is so much more than a list of links. It’s a strategic tool that maps out user flow and instantly communicates your site's structure. Since it's often the first major interaction point for visitors, it sets the tone for their entire journey. When you get it right, it feels completely intuitive, almost invisible, helping people find what they need without a second thought.\n\nThe impact here is huge. Research consistently shows that **94% of online users** believe easy navigation is the single most important feature a website can have. If it's clunky or confusing, they won't stick around. In fact, **61% of people** will abandon a site if they can't find what they're looking for in about five seconds.\n\n### Our Modern Tech Stack\n\nTo build something that meets these demanding standards, we need a tech stack that's both powerful and flexible. We've settled on a combination that delivers speed, type safety, and killer styling efficiency:\n\n- **React:** Perfect for building a declarative, component-based UI that’s easy to manage.\n- **TypeScript:** This adds static typing, which helps us catch errors early and makes our codebase far more robust and predictable.\n- **Tailwind CSS:** We'll use its utility-first approach for rapid, custom styling directly in our markup, which speeds things up immensely.\n\nThis stack gives us everything we need to create a navigation bar that not only looks fantastic but is also maintainable and ready to scale.\n\n### Adopting a Mobile-First Philosophy\n\nBefore we jump into any code, we have to get our mindset right. We're building this with a **mobile-first** philosophy. This isn't just a buzzword; it's a practical approach where we design for the smallest screen first and then expand our design for larger devices. This forces us to prioritize what's truly essential, leading to a cleaner, more focused experience across the board.\n\nA solid grasp of core [user experience design principles](https://screenshotwhale.com/blog/what-is-user-experience-design) is non-negotiable for this stage.\n\nOur workflow is straightforward: we'll deconstruct the problem, design a solution, and then develop it.\n\n![Navigation bar blueprint showing three phase workflow: deconstruct with search icon, design with mobile device, develop with code symbols](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5343b877-2816-4dfe-a912-0b853bb5f5ca/navigation-bar-for-website-development-workflow.jpg)\n\nThis simple roadmap keeps us on track. By methodically analyzing requirements, creating a thoughtful design, and then executing with clean code, we can sidestep common pitfalls and ensure our final navigation bar is both beautiful and bulletproof.\n\nTo give you a clearer picture of what we're building, here’s a breakdown of the key features.\n\n### Key Features of Our Modern Navigation Bar\n\n| Feature                    | Technology           | User Benefit                                                                  |\n| :------------------------- | :------------------- | :---------------------------------------------------------------------------- |\n| **Responsive Design**      | Tailwind CSS         | Ensures a seamless experience on any device, from mobile to desktop.          |\n| **Accessibility (A11y)**   | React, Semantic HTML | Makes the site usable for everyone, including those with disabilities.        |\n| **Animated Mobile Drawer** | Framer Motion        | Provides a smooth, intuitive menu for mobile users without cluttering the UI. |\n| **Reusable Components**    | React & TypeScript   | Allows for easy maintenance, scalability, and consistent design.              |\n\nThese elements come together to form a navigation bar that is not only functional but also enhances the overall user experience. Let's get started.\n\n## Setting Up Your Development Environment\n\nBefore we get to the fun part of crafting a sleek navigation bar, we need to lay down a solid foundation. Trust me, getting your development environment right from the start saves a ton of headaches later. We'll be using [Vite](https://vitejs.dev/) to get our React project up and running; it's incredibly fast and makes for a smooth development experience.\n\nFirst things first, let's spin up a new React project with TypeScript. Pop open your terminal and run this command:\n\n`npm create vite@latest my-navbar-project --template react-ts`\n\nThis command quickly scaffolds a new project inside a `my-navbar-project` directory. Once that’s finished, jump into the new folder and get the initial dependencies installed.\n\n`cd my-navbar-project`\n`npm install`\n\nWith the basic project set up, it's time to bring in the tools that will really make our component shine.\n\n### Installing Core Dependencies\n\nWe'll need a few key packages to build our navigation bar. I’m talking about **Tailwind CSS** for styling, **Framer Motion** for silky-smooth animations, and **`lucide-react`** for a great, lightweight icon set.\n\nYou can add them all to your project with this one command:\n\n`npm install -D tailwindcss postcss autoprefixer`\n`npm install framer-motion lucide-react`\n\nThis command is doing two things: it's installing Tailwind and its related packages as development dependencies, and it's adding Framer Motion and Lucide as regular dependencies for our app.\n\nNext up, we need to initialize Tailwind CSS. This is a crucial step that creates the config files it needs to work with Vite.\n\n`npx tailwindcss init -p`\n\nThis simple command generates two files you’ll get very familiar with: `tailwind.config.js` and `postcss.config.js`. These are the control centers for tailoring Tailwind to our project's specific needs. For a deeper dive, our guide on the [Tailwind CSS installation process](https://magicui.design/blog/tailwind-css-install) covers all the details.\n\n### Configuring Tailwind CSS\n\nAlright, let's tell Tailwind where to look for its utility classes. Open up `tailwind.config.js` and update the `content` array to point to your project's files.\n\n```jsx\n/** @type {import('tailwindcss').Config} */\nexport default {\n  content: [\"./index.html\", \"./src/**/*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis little piece of configuration is a big deal—it tells Tailwind to scan your HTML file and all the JavaScript and TypeScript files in your `src` folder for class names.\n\nThe final piece of the puzzle is to actually import Tailwind's styles into our app. Open `./src/index.css`, clear out whatever is in there, and replace it with these three directives:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\n> **Here's the bottom line:** A well-configured setup isn't just about installing packages. It's about creating an efficient workflow that lets you focus on building great components instead of fighting with your tools.\n\n![Laptop displaying web development interface with security shields representing website protection and coding](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5dd67b21-0c1e-4e45-be87-ec393000a338/navigation-bar-for-website-web-development.jpg)\n\nAnd that’s it! Your environment is prepped and ready. You have a blazing-fast Vite project powered by React, TypeScript, and a best-in-class styling engine. Go ahead and fire up the dev server with `npm run dev`, and let's start building this nav bar.\n\nAlright, with our development environment ready to go, it's time to build the desktop version of our **navigation bar for a website**. We'll kick things off by scaffolding the main component, defining its structure with React and props with TypeScript, and then bringing it to life with Tailwind CSS. The goal here is a clean, modern design that looks great and works even better.\n\nFirst things first, let's create a new file at `src/components/Navbar.tsx`. This is where our primary navigation component will live. Inside, we'll define the props it expects using a TypeScript interface. I always do this first—it's a great practice that ensures our component gets the right data, which saves a ton of headaches and bugs later on.\n\n```jsx\nimport React from 'react';\n\n// Define the type for a single navigation link\ninterface NavLink {\n  href: string;\n  label: string;\n}\n\n// Define the props for our Navbar component\ninterface NavbarProps {\n  logo: React.ReactNode;\n  links: NavLink[];\n}\n\nexport const Navbar: React.FC<NavbarProps> = ({ logo, links }) => {\n  return (\n    <nav className=\"flex items-center justify-between p-4 bg-white shadow-md\">\n      {/* Component content will go here */}\n    </nav>\n  );\n};\n```\n\nThis initial setup gives us a solid, type-safe foundation to build upon.\n\n### Structuring with Flexbox and Tailwind\n\nNow for the fun part. We'll use Tailwind's utility classes to nail the layout. Flexbox is your best friend here; it makes aligning items horizontally almost effortless. We'll add a container to hold our navigation items and a call-to-action button.\n\nInside the `Navbar` component, we can simply map over the `links` prop to render our navigation items. This makes the component incredibly reusable and easy to update. In my experience, breaking down each link into its own component is a huge win for keeping the code clean and maintainable.\n\n> A well-structured navigation bar really comes down to semantic HTML and a logical component architecture. Creating reusable components for things like links and buttons not only keeps your design consistent but also makes future updates a breeze.\n\nFor instance, we can create a `NavLinkComponent` that just takes a `href` and `label`. This small abstraction really pays off in readability and keeps the main `Navbar` component from getting cluttered.\n\n### Adding Subtle Hover Animations\n\nLet's face it, static elements can feel a bit boring. To give users better feedback, we'll add some subtle hover animations with [Framer Motion](https://www.framer.com/motion/). A simple scale or color transition on hover can make the navigation feel much more interactive and polished.\n\nLet’s quickly integrate it into our link component. Here's the game plan:\n\n- **Wrap links with `motion.a`**: This is a special component from Framer Motion that lets us animate standard HTML elements.\n- **Define hover states**: We'll use the `whileHover` prop to specify what happens on hover, like `scale: 1.05` for a gentle zoom effect.\n- **Add a transition**: The `transition` prop lets us fine-tune the animation's timing and easing, making it feel smooth and natural.\n\nHere's what an animated link component might look like:\n\n```jsx\nimport { motion } from \"framer-motion\"\n\nconst AnimatedLink = ({ href, label }) => (\n  <motion.a\n    href={href}\n    whileHover={{ scale: 1.05, color: \"#3b82f6\" }}\n    transition={{ duration: 0.2 }}\n    className=\"text-gray-700 hover:text-blue-500\"\n  >\n    {label}\n  </motion.a>\n)\n```\n\nThis tiny detail provides immediate visual confirmation to the user, which goes a long way in improving the overall experience. For more in-depth guides and inspiration, you can check out our tutorial on how to build a [complete navbar in React JS](https://magicui.design/blog/navbar-in-react-js). With these pieces in place, our desktop navigation is looking sharp and ready for action.\n\n![Empty web browser window showing blank page with standard navigation toolbar and buttons](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fa5aa68b-eb9f-4ceb-9774-35ab0ae8e932/navigation-bar-for-website-browser-window.jpg)\n\nWith our desktop navigation looking sharp, it's time to pivot to the mobile experience. A slick desktop design is only half the story. If you neglect the mobile side, you're essentially shutting the door on a massive chunk of your audience. This is where we double down on our mobile-first approach, turning our existing navigation into something that works beautifully on any screen.\n\n![Smartphone displaying food delivery app interface with hamburger icon and orange search button](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c710b1b0-969f-4d80-a946-ca6f7a453c89/navigation-bar-for-website-mobile-app.jpg)\n\nHonestly, this is something a lot of otherwise great websites still fumble. Baymard Institute's research on [e-commerce navigation benchmarks](https://baymard.com/blog/ecommerce-navigation-best-practice) paints a grim picture: a whopping **67% of mobile e-commerce sites** offer a navigation experience that's just ‘mediocre’ to ‘poor’. That translates directly to frustrated users and lost sales. We're going to sidestep those common mistakes and build something truly seamless.\n\nOur strategy is to use [Tailwind’s](https://tailwindcss.com/) responsive modifiers to conditionally show and hide elements. On smaller screens, the full list of navigation links will disappear, making way for a clean hamburger menu icon. That icon becomes the trigger for our off-canvas drawer menu.\n\n### Managing State and Interactivity\n\nSo, how do we control the drawer's open/close state? The React `useState` hook is perfect for this. We’ll introduce a simple boolean state, `isMenuOpen`, to keep track of whether the drawer is visible. When a user taps the hamburger icon, we'll just flip this state, and React will handle the rest.\n\nHere’s what that basic state logic looks like inside our `Navbar` component:\n\n```jsx\nimport React, { useState } from \"react\"\nimport { Menu, X } from \"lucide-react\" // Icons for open/close\n\n// ... inside your Navbar component\nconst [isMenuOpen, setIsMenuOpen] = useState(false)\n\nconst toggleMenu = () => {\n  setIsMenuOpen(!isMenuOpen)\n}\n\nreturn (\n  <nav>\n    {/* ... desktop content ... */}\n    <div className=\"md:hidden\">\n      <button onClick={toggleMenu}>{isMenuOpen ? <X /> : <Menu />}</button>\n    </div>\n  </nav>\n)\n```\n\nThis little snippet is the core of our toggle functionality. Notice the `md:hidden` class? That’s a Tailwind utility that automatically hides the button on medium screens and up, so it only ever shows up on mobile.\n\n> **Key Takeaway:** Mobile navigation should prioritize clarity over density. Hiding complex menus behind a simple, recognizable icon like a hamburger menu declutters the interface and improves focus on the main content.\n\n### Animating the Drawer with Framer Motion\n\nA menu that just pops into existence can feel a bit abrupt. To create a more polished feel, we can animate its entrance and exit. This is another spot where [Framer Motion](https://www.framer.com/motion/) comes in clutch. We'll wrap our mobile menu in a `motion.div` and tie its `animate` prop directly to our `isMenuOpen` state.\n\nWe can define a couple of variants to create a slick slide-in effect from the side:\n\n- **Closed State:** The drawer is positioned completely off-screen (`x: \"-100%\"`).\n- **Open State:** The drawer slides into view on-screen (`x: 0`).\n\nThis provides immediate visual feedback and makes the whole interaction feel much more professional and responsive. If you need to build out deeper navigation levels within the drawer, you could even implement accordion-style submenus. For more on that, check out our guide on how to [create a drop down menu](https://magicui.design/blog/how-to-create-drop-down-menu).\n\nOne last thing: never forget about mobile usability. Make sure your tap targets for links and buttons are big enough for clumsy thumbs—aim for **at least 48x48 pixels**. Also, give users an easy way out by letting them dismiss the drawer with a tap on an overlay or a dedicated close button.\n\n## Advanced Patterns and Accessibility\n\nOkay, we’ve got a solid desktop and mobile navigation system in place. Now, let’s take it a step further. We'll add some advanced patterns to elevate the user experience and, most importantly, make sure it’s accessible to absolutely everyone. A truly great **navigation bar for a website** isn't just functional—it feels effortless and inclusive.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/-YwZC2_nWc4\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nOne of the easiest wins for usability is the **sticky navigation bar**. By fixing the navigation to the top of the screen as the user scrolls, you keep those essential links always within reach. It's a small change that significantly reduces the effort needed to move around your site, which is a huge plus for user engagement.\n\nPulling this off in React with Tailwind CSS is pretty straightforward. You can whip up a custom hook that tracks the user's scroll position. Then, once they scroll past a certain point, you just conditionally apply classes like `fixed` and `shadow-md` to your navigation component. It adds a subtle, professional touch without being jarring.\n\n### Considering Mega Menus\n\nFor bigger, content-heavy sites—think large e-commerce stores or sprawling news platforms—a simple dropdown menu just isn't going to cut it. That's where the **mega menu** shines. It's a large, multi-column dropdown that can display a huge number of links, categories, and even images in a clean, organized way.\n\nMega menus are fantastic for revealing the depth of a site’s content at a single glance. But they come with a big warning label: they can get overwhelming fast if they aren't designed with care. If you're building one, your focus should be on sharp typography, logical groupings, and plenty of whitespace to help guide the user's eye.\n\nThe psychology of how users interact with menus is fascinating. Research on the Serial Position Effect shows that people best remember the first and last items in a list. This means you should always place your most important pages at the beginning and end of your navigation. That same research also suggests keeping the number of main menu items around **seven** to avoid cognitive overload. You can dive deeper into the [psychology of website navigation over at usersnap.com](https://usersnap.com/blog/website-navigation/).\n\n### Making Your Navigation Accessible\n\nThis is non-negotiable. An inaccessible navigation bar can make your website completely unusable for a huge portion of the population. Accessibility isn't a \"nice-to-have\" feature you tack on at the end; it's a core part of your responsibility as a developer.\n\nHere are the absolute essentials for making your navigation component accessible:\n\n- **Keyboard Navigation:** Every single interactive element—links, buttons, dropdowns—must be focusable and usable with just a keyboard. Users should be able to move through them with the **Tab** key (forward) and **Shift+Tab** (backward).\n- **Semantic HTML:** Use the right tools for the job. Wrap your main navigation in a `<nav>` element and use standard `<a>` tags for your links. This gives assistive technologies the context they need to understand your site's structure.\n- **ARIA Attributes:** Use ARIA (Accessible Rich Internet Applications) attributes to communicate the state and purpose of your components. For a menu button, `aria-expanded` tells screen readers whether the menu is open (`true`) or closed (`false`). An `aria-label` can give a descriptive name to an icon-only button, like `aria-label=\"Main menu\"` for a hamburger icon.\n\n> **Pro Tip:** Get comfortable with your browser's developer tools for accessibility audits. The \"Accessibility\" tab in Chrome DevTools is your best friend here. It lets you inspect ARIA attributes, check the accessibility tree, and run automated checks with Lighthouse to catch common problems like low-contrast text or missing labels before they ever reach your users.\n\nOf course, even with a step-by-step guide, you're bound to run into a few specific questions when building the perfect navigation. Let's tackle some of the most common ones I hear from developers to help you iron out the final details.\n\n### How Does a Navigation Bar Actually Impact SEO?\n\nA well-built navigation bar is an absolute powerhouse for your site's SEO. Think of it as a roadmap for search engine crawlers. It shows them the lay of the land, helping them understand your site's structure and which pages you consider most important.\n\nWhen you use descriptive, keyword-rich labels for your links (like \"React Development Services\" instead of just \"Services\"), you're sending powerful signals to Google about what each page is about.\n\nOn top of that, good navigation directly impacts user behavior. When people can easily find what they're looking for, they stick around longer and click through more pages. This lowers your bounce rate and boosts session duration—both are key metrics that tell search engines your site is valuable. Just make sure you're always using standard `<a href=\"...\">` tags so every link is crawlable.\n\n> **The bottom line:** Your navigation isn't just a convenience for users; it's a critical tool for search engines. A logical, crawlable structure with clear link text is foundational to any solid SEO strategy.\n\n### What’s the Best Way to Handle Dropdowns on Mobile?\n\nThis one's a classic trip-up. On mobile, the traditional hover-to-open dropdowns from desktop just don't work. It's a recipe for frustration.\n\nThe gold standard here is to use an accordion-style pattern, usually tucked inside a mobile drawer menu. This means the main menu item becomes a tappable button. Tap it once, and it expands to show the sub-items. Tap it again, and it collapses.\n\nIt’s also a good idea to add a clear visual cue, like a small chevron icon (`>`), to let users know an item is expandable. This approach prevents accidental taps and makes the experience feel much more controlled and predictable. And if you have a massive desktop mega menu, you'll definitely want to simplify it into a more streamlined, nested list for the mobile view.\n\n### How Can I Pull My Navigation Links from a CMS?\n\nMaking your navigation dynamic is a super common need, especially for sites where the content team is constantly making changes. The typical way to handle this in a React app is to fetch the navigation data directly from your CMS API.\n\nHere's the usual flow:\n\n- You'll fetch the data inside a `useEffect` hook, so it runs when the component first mounts.\n- Once you've got the data, you'll store it in state with `useState`.\n- From there, it's as simple as mapping over that array of link data to render each navigation item dynamically.\n\nThis approach is fantastic because it separates your site's content from its code. It lets non-developers add, remove, or reorder nav links right from the CMS, no developer needed. To keep things clean and prevent bugs, I always recommend defining a TypeScript interface for your link data structure. It adds a layer of safety and makes the code so much easier to understand.\n\n---\n\nReady to stop building from scratch and start creating beautiful, high-performing web interfaces in minutes? **Magic UI** gives you over **50** customizable blocks and templates built with React, Typescript, and Tailwind CSS. It's the perfect way to build stunning landing pages without reinventing the wheel.\n\n[Explore Components and Templates on Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/next-js-app.mdx",
    "content": "---\ntitle: \"How To Create A Next JS App With React\"\ndescription: \"Combine the features of React with the benefits of Next JS in this tutorial on creating a Next JS app. Get started and enhance your coding skills.\"\nimage: https://cdn.magicui.design/assets/08012826-d0ee-4b20-b62a-b716e1aada45.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-02\"\nfeatured: false\n---\n\nAre you struggling to find the perfect [UI Framework](https://magicui.design/blog/ui-frameworks) for your project? You will learn all about creating an app with Next JS and the benefits it can bring to your project. Whether you're a seasoned developer or just starting, this read will help you to discover the full potential of Next JS for your project's success.\n\nLooking to get a head start on your project? MagicUI's [React component library](https://magicui.design/) is your go-to resource for creating an app with Next JS. Get the benefits of this fantastic tool and learn how it can take your project to a whole new level. Start your journey today with MagicUI!\n\n## What Is Next JS\n\n![Next JS](https://images.unsplash.com/photo-1643116774075-acc00caa9a7b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxuZXh0anN8ZW58MHx8fHwxNzE5OTkxNzQ0fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js is a revolutionary React framework that is taking the web development world by storm, offering ways to build user-facing static websites and web applications. Known for its SEO-friendly attributes and supercharged performance, Next.js is a developer's dream come true. But what makes this framework so special, and why should you consider using it for your next project?\n\n### Hybrid Static and Server Rendering for Lightning-Fast Load Times\n\nOne of Next.js's standout features is its hybrid static and server rendering capabilities. This means that you can serve static pages for lightning-fast load times while also having the option to dynamically render pages on the server when needed. The result is a snappy user experience that keeps visitors engaged without sacrificing performance.\n\n### TypeScript Support for Strongly-Typed Development\n\nFor developers who crave the structure and safety of TypeScript, Next.js delivers with robust support for this popular programming language. With TypeScript, you can catch errors before they happen, write cleaner code, and enjoy enhanced productivity throughout development.\n\n### Smart Bundling and Route Prefetching for Optimal Performance\n\nNext.js takes care of the heavy lifting when bundling your app for production. With smart bundling, only the necessary code is sent to the user's browser, resulting in faster load times and improved performance. Next.js uses route prefetching to anticipate which pages a user might visit next, preloading them in the background for a seamless browsing experience.\n\n### No Configuration Needed for Production-Ready Applications\n\nSay goodbye to extensive configuration files and boilerplate code - Next.js provides everything you need out of the box to build production-ready applications. Whether you're a seasoned developer or starting out, you can hit the ground running with Next.js and build amazing websites and web applications quickly.\n\n## Next JS Styling And Features\n\n![Next JS](https://images.unsplash.com/photo-1510915228340-29c85a43dcfe?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlcnxlbnwwfHx8fDE3MTk5OTE3NTh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js supports:\n\n- Styling with CSS\n- Precompiled Scss and Sass\n- CSS-in-JS\n- Styled JSX\n\nIn addition, it is built with TypeScript support and smart bundling. The open-source transpiler SWC transforms and compiles code into JavaScript that is usable by a browser. TurboPack, another open-source tool, bundles the modules afterward. All of these tools are used with npm in a terminal.\n\n### Server-Side Rendering\n\nThe main feature of Next.js is its use of server-side rendering to reduce the burden on web browsers and provide enhanced security. This can be done for any part of the application or the entire system, allowing content-rich pages to be singled out for server-side rendering. It can also be done only for first-time visitors to reduce the burden on web browsers that have yet to download site assets.\n\n### Developer Experience\n\nThe hot reloading feature detects changes as they are made and re-renders the appropriate pages so the server avoids the need to be restarted. This allows changes to the application code to be immediately reflected in the web browser, though some browsers will require the page to be refreshed.\n\nThe software uses page-based routing for developer convenience and includes support for dynamic routing. Other features include hot-module replacement so that modules can be replaced live, automatic code splitting, which only includes code necessary to load the page, and page prefetching to reduce load time.\n\n### Static Site Generation & Incremental Regeneration\n\nNext.js also supports incremental static regeneration and static site generation—a compiled version of the website is usually built during build time and saved as a .next folder. When a user makes a request, the pre-built version, which is a static HTML page, is cached and sent to them. This makes the [load time very fast](https://nextjs.org/docs/architecture/turbopack), but it's unsuitable for every website, particularly for interactive sites that change often and utilize a lot of user input.\n\n### Streamlining UI Development\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Why Use Next JS\n\n![Next JS](https://images.unsplash.com/photo-1531539134685-27d854339120?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlciUyMGRpc2N1c3N8ZW58MHx8fHwxNzE5OTkxNzY4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Rich Ecosystem\n\nNext.js benefits from the wide adoption of JavaScript and strong support from industry giants like Vercel and Meta. It offers a rich talent pool and ease of learning.\n\n### Future-Proof Technology\n\nWith regular updates and support from the community and industry leaders, Next.js represents a future-proof solution in web development. Its alignment with the latest web standards makes it a strategic asset for long-term business goals and technology roadmaps.\n\n### Easy Scalability\n\nNext.js supports scalability through features like automatic code splitting, flexible rendering options, and optimized image handling. These features ensure efficient resource utilization and performance under high traffic.\n\n### High Security\n\nOffering a wide range of tools for building secure web applications, Next.js addresses critical areas like authentication and data validation. It is crucial for maintaining user trust and data integrity in the face of growing cyber threats.\n\n### Performance Optimization\n\nKey features in Next.js, such as lazy loading, image optimization, code splitting, and route prefetching, positively influence site performance.\n\n### Internationalization\n\nAnother great feature added to Next.js is internationalization. Creating an enterprise application can be easily translated into different languages worldwide. This feature is an addition to Next.js and makes Next.js internationally recognized because it takes less configuration to set up internalization.\n\n### Zero Config\n\nNext.js compiles and builds automatically with hot refresh without any extra configuration from you, and it automatically scales and optimizes your production application.\n\n### Prebuilt SSR, SSG, and CSR Support\n\nWith Next.js, you can support server-side rendering, static generation, and client-side rendering in one application. You can decide the type of application you want to build and how you intend to compile it to best suit your use case. Server-side rendering makes Next.js suitable for large-scale SEO-oriented production-ready applications, and configuring it is a breeze.\n\n## What You Can Build With Next JS\n\n![Next JS](https://images.unsplash.com/photo-1519389950473-47ba0277781c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx3ZWJzaXRlJTIwcGxhbnxlbnwwfHx8fDE3MTk5OTE3Nzl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js can be used to build various websites with various goals and purposes. The benefits it offers and its server-side rendering feature make it an ideal choice for certain types of web applications. Here are some of the specific cases where using Next.js is advantageous:\n\n### 1\\. Large Multi-User Websites\n\nNext.js works well for websites with many users where server-side rendering can enhance performance and scalability.\n\n### 2\\. Client-Side Rendered Applications (SPA/MPA)\n\nIf you are building a complex web application that requires client-side rendering, Next.js can be a great choice due to its efficiency.\n\n### 3\\. E-Commerce Platforms\n\nNext.js is suitable for building e-commerce platforms that need dynamic content and fast loading times to optimize the user experience.\n\n### 4\\. Web Portals\n\nWebsites that serve as gateways to a broad range of services or information can benefit from Next.js's server-side rendering capabilities.\n\n### 5\\. Content-Heavy Websites\n\nIf you want to build a website with significant content, Next.js can help manage the content efficiently and ensure fast loading times.\n\n### 6\\. Progressive Web Apps (PWAs)\n\nNext.js is an excellent framework for building PWAs due to its capabilities for creating fast, engaging, and responsive web applications.\n\n### 7\\. MVPs (Minimum Viable Products)\n\nNext.js can rapidly develop MVPs and prototypes to test ideas and concepts before investing in full-scale development.\n\nIn addition to these advanced web applications, Next.js can be used for simpler websites, such as B2B and SaaS or finance websites. Its versatility and performance optimization make it suitable for various web development projects.\n\n## Popular Apps Using Next JS Framework\n\n![Next JS](https://images.unsplash.com/photo-1480694313141-fce5e697ee25?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxhcHB8ZW58MHx8fHwxNzE5OTkxNzkwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### TikTok\n\nTikTok, a social media app for short-form mobile videos, utilizes Next.js to scale and optimize its web page for millions of daily active users.\n\n### Loom\n\nLoom, a [video communication platform](https://vercel.com/customers/loom-headless-with-nextjs), enables users to create screen recordings to share with colleagues. Next.js is the core of Loom's software.\n\n### Twitch Mobile\n\nTwitch, a platform for chatting, interacting, and enjoying various content, is another example of a Next.js project showcasing the framework's wide possibilities.\n\n### Hulu\n\nHulu, a platform for watching movies and TV shows online, is powered by Next.js.\n\n### Deliveroo\n\nDeliveroo, a food delivery app popular in the United Kingdom, is a great example of a Next.js project.\n\n### Binance\n\nBinance, a popular cryptocurrency portal, relies on Next.js to power its platform, with millions of active users engaging in daily crypto trading.\n\n## How To Create A Next JS App\n\n![Next JS](https://images.unsplash.com/photo-1515378791036-0648a3ef77b2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTk5OTE4MzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCreating a [new Next.js project](https://nextjs.org/docs/app/building-your-application) is easy and straight to the point. You can create a Next.js project differently, but CLI is the most preferred and recommended approach.\n\n- To create a new Next.js application with CLE, have NPX installed (NPX has been shipped by default since npm 5.2.0), npm v6.1, or yarn.\n- Type in the following command in the right folder you want to place your Next.js project:\n\n```bash\n  npx create-next-app\n  // Follow the instructions to create your first Next.js project.\n  cd <project-name>\n  npm run dev\n```\n\n- Make sure to replace the `<project-name>` with your actual project name. You can then start creating different pages and components required by your project.\n- After creating a new Next.js project from a CLI, you’ll notice a Next.js app with a lean folder tree. This default folder structure is the bare minimum to run a Next.js app. When you build your project, you’ll initially have more folders and files than the framework.\n\n### Core Next.js Folders: `app/pages`, `public`, and `styles`\n\nThe only Next.js-specific folders are the `app/pages`, `public`, and `styles` folders. These should not be renamed unless you’re prepared to adjust additional configurations.\n\nBelow is the default folder structure for a new Next.js project:\n\n```javascript\n# other files and folders, .gitignore, package.json...\n/app\n├── api\n│   └── hello.js\n├── page.js\n/public\n├── favicon.ico\n├── vercel.svg\n/styles\n├── globals.css\n└── Home.module.css\n```\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Drawbacks Of Using Next JS\n\n![Next JS](https://images.unsplash.com/photo-1633180888652-c561b86040f1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcxOTk5MTgwNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Development and maintenance cost\n\nThe flexibility provided by Next.js can come at a high price, including development and maintenance costs. You might need a dedicated Next.js developer and frontend expert to make changes and maintain the application, which can be costly.\n\n### Lack of built-in state manager\n\nNext.js does not offer built-in support for state management. If you need any form of state management, you must install and use it, just like you would with React.\n\n### Low on plugins\n\nWhen using Next.js, you may find fewer easy-to-adapt plugins available than other frameworks. This could limit your options and require more custom solutions.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers to create stunning user interfaces with minimal effort. With over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nMagicUI offers a range of visually appealing and interactive elements that can be easily integrated into web applications. These highly customizable components allow seamless adaptation to match desired branding and design requirements. Through its focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### MagicUI Pro: Simplifying Web Development\n\nMagicUI Pro allows users to save thousands of hours and create a beautiful landing page to convert visitors into customers with its website templates. Users can easily create visually appealing and interactive web applications by utilizing the [React component library](https://magicui.design/) at no cost. MagicUI Pro provides an efficient solution for design engineers to streamline their development process and deliver exceptional user experiences to their audience.\n"
  },
  {
    "path": "apps/www/content/blog/next-js-create-app.mdx",
    "content": "---\ntitle: Next Js Create App Complete Guide With TypeScript Tailwind CSS And Magic UI\ndescription: >-\n  Learn how to next js create app with TypeScript, Tailwind CSS, and Magic UI in\n  this practical guide. Build, optimize, and deploy your responsive Next.js app.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a91785c0-2937-4749-9f0e-1168dfb08cb6/image.jpg\nauthor: Dillion Verma\ntags:\n  - next js create app\n  - next js\n  - typescript\n  - tailwindcss\n  - magic ui\npublishedOn: \"2025-12-18T08:13:33.899983+00:00\"\nfeatured: true\n---\n\nSpinning up a fresh Next.js project couldn’t be simpler. Open your terminal, type _next js create app_, and a React-ready structure appears in seconds. It’s the fastest path to focus on features instead of folder setup.\n\n## Quick Start Guide\n\nBelow is a handy snapshot mapping **core CLI commands** to their results. Treat it as your go-to cheat sheet when you kick off your _next js create app_ workflow.\n\n### CLI Command Overview\n\nThis table highlights **three** commands you’ll run first.\n\n| Command                      | Outcome                 |\n| ---------------------------- | ----------------------- |\n| `npx create-next-app my-app` | Scaffold project        |\n| `npm run dev`                | Start dev server        |\n| `npm run build && npm start` | Create production build |\n\n- The scaffold command lays out folders, default pages, and basic configs instantly.\n- Kicking off `npm run dev` gives you hot reload plus live error overlays.\n- Executing the build script (`npm run build && npm start`) creates a local production mirror to test before deployment.\n\nRefer back whenever you need a quick refresher on your CLI-driven workflow. It keeps you focused on designing landing pages instead of hunting through documentation.\n\n### Why These Commands Matter\n\n- Standard starters stop endless debates over file structures.\n- Hot reload surfaces layout glitches before they reach users.\n- Local production builds expose runtime surprises ahead of launch.\n\n![Infographic about next js create app](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5912bfed-6e12-4f43-a5d3-ecb843da0d32/image.jpg)\n\nSeeing these steps laid out visually can be a real time-saver when you’re under a tight deadline. It maps the scaffold, dev, and build phases so you never lose track.\n\n> **Key Takeaway:** Keep these three CLI commands close at hand to avoid scattered setup notes.\n\nAlways stay on the latest CLI release. That way, you’ll benefit from new features and fixes as soon as they arrive. And don’t forget to jot down your project’s commands in a README—your team will thank you.\n\nCheck out our guide on [creating a Next.js app with Magic UI](https://magicui.design/blog/next-js-app) for deeper context and tips.\n\n## Understanding Next.js Core Concepts\n\n![Highlevel Next.js architecture](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8119e4e1-2cb8-4f05-99a8-8ab6f5112f8f/image.jpg)\n\nNext.js makes juggling different rendering needs feel almost effortless. You get to mix server-side rendering, static site generation and incremental static regeneration—all under one roof. This trio lets you dial in both performance and fresh data exactly where it matters.\n\n### Hybrid Rendering Models\n\n- **SSR** delivers up-to-the-second content on every request—perfect for live dashboards.\n- **SSG** generates pages ahead of time, so visitors see your site load in a blink.\n- **ISR** quietly refreshes static pages behind the scenes without rebuilding your entire project.\n\nIn practice, you might serve your analytics panel with SSR, then lean on SSG for marketing copy that rarely changes. That way, you strike the right balance between speed and data accuracy.\n\n> **Key Insight** SSR boosts SEO for content-heavy pages but can add server overhead.\n\nMany teams remark how spinning up a project with _next js create app_ feels smoother than stitching together a manual React boilerplate. You skip the setup fuss and dive straight into building features.\n\nRecent studies predict Next.js interest peaking around **2025**, with **search volumes climbing steadily** over the past five years. [Learn more about these findings on Raft Labs](https://www.raftlabs.com/blog/building-with-next-js-best-practices-and-benefits-for-performance-first-teams/)\n\n### Routing And Performance Optimizations\n\nFile-based routing in Next.js means there’s no extra config to map URLs. Drop a file into `/pages` or `/app` and it turns into a route. This convention dramatically cuts down on routing bugs and accelerates your workflow.\n\n- Create your homepage by adding `pages/index.js`.\n- Spin up serverless endpoints with `pages/api/hello.js`.\n- Organize nested routes simply by creating subfolders—no extra setup needed.\n\nOn top of that, Next.js handles image resizing, lazy loading and automatic code splitting out of the box. Your bundles stay lean, and pages render faster.\n\n| Feature                  | Benefit                            |\n| ------------------------ | ---------------------------------- |\n| File-Based Routing       | Zero-config URLs                   |\n| Image Optimization       | Faster loads and reduced bandwidth |\n| Automatic Code Splitting | Smaller initial bundles            |\n\n### API Routes And Data Fetching\n\nNext.js lets you build front-end and back-end logic side by side. Any file under `/pages/api` or `/app/api` turns into an HTTP endpoint. You keep all your code in one repo, which is a huge win for full-stack teams.\n\nFor instance, `pages/api/users.js` can pull data from your database and return JSON straight to your dashboard component. When it’s time to fetch that data in your page, you have several options:\n\n- **getStaticProps** — Fetches data at build time for static pages.\n- **getServerSideProps** — Grabs fresh data on every request.\n- **useSWR** — A React hook for client-side fetching with caching and revalidation.\n\nThis setup slashes the friction between front-end and back-end work. In a _next js create app_ project, spinning up an API is almost as quick as creating a new page.\n\n### Real World Trade-Offs\n\nEvery rendering choice comes with its price tag. SSR can push up CPU and memory usage. SSG needs rebuilds when content changes. ISR sits in the middle, giving you fresh static pages without a full redeploy.\n\n- SSR shines for user dashboards and real-time portals.\n- SSG works best on brochure sites or docs that don’t change often.\n- ISR is ideal when content updates are unpredictable.\n\nMix and match these strategies to build workflows that fit how your team works—and give your users the experience they expect.\n\n## Initial Next.js App Setup\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/6-qMfLcPhOw\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n/>\n\nStart by spinning up a fresh project:\n\nnpm init next-app my-project\n\nIn seconds, you'll see a React-ready structure:\n\n- **/pages** for route files\n- **/components** to stash reusable UI pieces\n- **/public** for images, fonts, and other static assets\n\nThe generated `package.json` already includes scripts for **dev**, **build**, and **start**, so you can launch your server right away.\n\nI always integrate **ESLint**, **Prettier**, and Git hooks at this stage. It’s a quick setup that pays dividends down the road—no drift in code style and fewer trivial PR comments.\n\n### Setting Up Linting And Formatting\n\nLet’s nail down your code-quality pipeline. Install these tools:\n\nnpm install --save-dev eslint prettier husky lint-staged  \nnpx eslint --init\n\nThen add a `lint-staged` block in `package.json`:\n\n```json\n{\n  \"lint-staged\": {\n    \"\\*.js\": [\"eslint --fix\", \"prettier --write\"]\n  }\n}\n```\n\nWith Husky enabled, every commit triggers automatic fixes. Trust me, this saves hours in code review feedback.\n\n### Configuring Environment Variables\n\nSensitive keys deserve a safe home. Create a `.env.local` file and jot down:\n\nAPI_KEY=your_api_key_here  \nNEXT_PUBLIC_API_URL=https://api.example.com\n\nNext.js picks these up via `process.env`. Reference `process.env.API_KEY` in server files and avoid hard-coding secrets in your components.\n\n> **Key Takeaway** Keep `.env.local` out of your repo. This simple step protects your tokens and keeps your audits clean.\n\n### Organizing Core Folders\n\nA predictable layout keeps everyone on the same page. Here’s my go-to structure:\n\n| Folder     | Purpose                                 |\n| ---------- | --------------------------------------- |\n| pages      | Route definitions and top-level UI      |\n| components | Reusable widgets and UI building blocks |\n| public     | Static assets (images, fonts, icons)    |\n| styles     | Global and module-specific styles       |\n| .env.local | Local environment variables             |\n\nWhen you’re onboarding a teammate, they instantly know where to add a new page or tweak a shared component.\n\n### Customizing Next Config\n\nMost projects benefit from a few tweaks in `next.config.mjs`. Here’s a minimal tweak list:\n\n```js\n// next.config.mjs\nconst nextConfig = {\n  reactStrictMode: true,\n  swcMinify: true,\n  env: {\n    NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,\n  },\n}\nexport default nextConfig\n```\n\n- **reactStrictMode** enables extra checks during development.\n- **swcMinify** slims down your production bundle.\n- **env** exposes selected variables to the browser securely.\n\n### Verifying Your Setup\n\nFinally, double-check everything before moving forward:\n\n- Fire up the local server with `npm run dev`.\n- Point your browser to http://localhost:3000 and confirm you see the starter page.\n- Make a minor change to trigger Husky—your lint-staged setup should run automatically.\n\nIf any errors pop up, tweak your ESLint rules or run `npx eslint .`. Once your working directory is spotless, you’re ready to integrate Magic UI components or dive into advanced configurations without a second thought.\n\n## Configure TypeScript And Tailwind CSS\n\nIntegrating **TypeScript** into your [Next.js](https://nextjs.org) project unlocks real-time error catching and smarter auto-completion. I usually start by renaming `.js` files to `.ts` or `.tsx`—that simple change kicks off type analysis immediately.\n\nInstalling [TypeScript](https://www.typescriptlang.org) is as easy as running:  \nnpm install --save-dev typescript @types/react @types/node  \nWithin seconds, a `tsconfig.json` appears in your root. From there, you can tweak compiler strictness, path mapping, and JSX support to suit your workflow.\n\nI bump `\"strict\": true` to catch subtle bugs early and set `\"baseUrl\": \".\"` so imports never feel awkward. Small tweaks like these save you hours when reorganizing folders or refactoring large codebases.\n\nAdding **Tailwind CSS** then feels like a breeze. A single command spins up both config files:  \nnpx tailwindcss init -p  \nOnce that’s done, Tailwind’s purge feature can slash unused classes—often cutting CSS payloads by **90%** in production.\n\nTo wrap up this step, double-check that you have:\n\n- Installed `tailwindcss`, `postcss`, and `autoprefixer` via npm or Yarn\n- Switched on **JIT mode** inside your `tailwind.config.js`\n- Listed all pages and components under `content` so purge finds every class\n\n> **Key Takeaway**  \n> Tailwind’s JIT mode and purge rules keep your CSS lean without dropping any styles you depend on.\n\n### Customize TypeScript Settings\n\nOne of my favorite perks is short, clean imports after aliasing paths. Open `tsconfig.json` and tweak it like this:\n\n```json\n{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": { \"@/*\": [\"src/*\"] },\n    \"strict\": true,\n    \"jsx\": \"react-jsx\"\n  }\n}\n```\n\nThat `@/` shortcut spares you from `../../../` madness. And setting `\"jsx\": \"react-jsx\"` aligns [React](https://reactjs.org) 18’s new JSX transform, keeping MDX support and `className` syntax seamless.\n\nHere’s a quick demo. Rename `Button.jsx` to `Button.tsx`, then update the code:\n\n```tsx\nimport React from \"react\"\n\ninterface ButtonProps {\n  label: string\n  onClick: () => void\n}\n\nexport default function Button({ label, onClick }: ButtonProps) {\n  return (\n    <button\n      className=\"rounded bg-blue-600 px-4 py-2 text-white hover:bg-blue-700\"\n      onClick={onClick}\n    >\n      {label}\n    </button>\n  )\n}\n```\n\nThat tiny tweak means missing props or type mismatches get flagged before you even refresh the browser. And since you’re using Tailwind utilities, there’s zero extra CSS to track.\n\n### Configure Tailwind Integration\n\nNext, point Tailwind at every TSX and MDX file so it knows where to look:\n\n```js\nmodule.exports = {\n  content: [\"./src/**/*.{js,jsx,ts,tsx,mdx}\"],\n  theme: { extend: {} },\n  plugins: [],\n}\n```\n\nThen, in `globals.css`, pull in Tailwind’s layers:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\nThis setup gives you a lightning-fast feedback loop. I often tweak a `className` and see the result in under a second thanks to JIT compilation.\n\nWhen something behaves oddly, open your browser dev tools and inspect the styles. The Tailwind Chrome extension is a lifesaver for spotting active classes—and ones you accidentally left out.\n\nDon’t forget to double-check file names and import paths. A tiny typo in your `content` array can block purging or trigger “Module not found” errors.\n\nYou might be interested in learning more about installing Tailwind CSS in Next.js projects. Check out our guide on [Tailwind CSS installation in Next.js](https://magicui.design/blog/tailwind-css-install)\n\nBy following these steps, you’ll lay down a bulletproof foundation for landing-page workflows. With type safety and utility-first styling locked in, your Next.js app scales gracefully and stays a joy to maintain.\n\nHappy coding!\n\n## Integrate Magic UI Components\n\n![Magic UI Preview](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a2c9e1eb-f5a2-4ef4-9b3c-c2c41283808f/image.jpg)\n\nI once built a SaaS landing page in record time—thanks to Magic UI’s ready-made sections. Dropping this into a fresh [Next.js](https://nextjs.org) app instantly halved my layout work.\n\n- **Prebuilt Blocks** such as hero, feature grid, and testimonials\n- **Page Templates** that stitch common patterns into full-screen designs\n- **Animated Components** for fade-ins, slides and typewriter effects\n\nInstalling the package is as simple as keeping your MDX files lean. Just run the command below and import components with **className** props and style objects.\n\nnpm install @magicui/react\n\n### Building A Hero Section\n\nWhen you need a hero that pops, Magic UI’s HeroBlock handles the heavy lifting. Import it, pass your heading, subheading and animation props, then wrap with your own classes to match brand colors.\n\n> “I trimmed two hours off styling time by leveraging Magic UI’s animated headline.”  \n> — Alex Developer, Frontend Engineer\n\nNext, pull together a feature grid and a call-to-action button:\n\n- Import the FeatureGrid block and map your content into cards\n- Manage loading states with React’s useState hook\n- Attach onClick handlers to the ActionButton component\n\n### Styling Overrides And Performance\n\nTweaking colors or spacing is painless with inline style objects. Still, keep an eye on bundle size when you import large page templates. Balancing custom overrides against defaults will help keep your CSS payload light.\n\n| Component Type    | Customization                                     | Impact |\n| ----------------- | ------------------------------------------------- | ------ |\n| Blocks            | Props & style objects                             | Low    |\n| Templates         | [Tailwind CSS](https://tailwindcss.com) overrides | Medium |\n| Animated Elements | Conditional rendering                             | High   |\n\n### Animating Text And Elements\n\nMagic UI ships with **150+** free animations—everything from simple fades to elaborate typewriter effects. I usually set the `duration` between **300–500ms** for a snappy feel, but you can stretch it out on a pricing or testimonial reveal.\n\n- Tweak the `duration` prop to control pacing\n- Stagger elements with the `delay` prop for a storytelling flow\n- Use the `once` flag so animations fire only once on scroll\n\nYou can dive into every component in our guide on [Magic UI components](https://magicui.design/docs/components).\n\nTip: Lazy-load noncritical sections with dynamic imports and `<Suspense>`. On a recent project, this cut my first-byte time by over **20%**.\n\n[Next.js](https://nextjs.org) 16 just hit beta and saw adoption soar—**50%** of dev sessions and **20%** of production builds on Vercel now use it. Learn more in this post: https://nextjs.org/blog/next-16\n\nLaying this foundation now means your next landing page will come together in hours, not days.\n\n## Deploy Next.js App To Production\n\n![Deploy Next.js App To Production](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/bd60e5d4-4f6a-4758-bc3d-3c14238f0701/image.jpg)\n\nOnce your Next.js project is ready, the next step is choosing a hosting platform. Before you kick off any builds, stash your secrets in **.env.local** so they never slip into public repos.\n\nIf you opt for Vercel, you’ll find deployments happen almost instantly—ideal for rapid iterations.\n\n### Preview And Build Strategies\n\nNext.js supports three distinct rendering modes, each with its own balance of speed and freshness. Picking the right one depends on how dynamic your data needs to be.\n\n- **SSR** (Server-Side Rendering): Always up-to-date content at request time, but watch out for higher CPU usage.\n- **SSG** (Static Site Generation): Prepackaged HTML delivers lightning-fast loads with minimal server strain.\n- **ISR** (Incremental Static Regeneration): Static pages with behind-the-scenes updates, blending performance with timely content.\n\nTo make this decision easier, consider the following breakdown:\n\n### Rendering Options Comparison\n\nHere’s a quick look at how each method stacks up, along with real-world use cases to guide your choice.\n\n| Rendering Method | Performance Impact                   | Use Cases                 |\n| ---------------- | ------------------------------------ | ------------------------- |\n| SSR              | Real-time freshness with server cost | Dashboards, user profiles |\n| SSG              | Fastest loads, minimal server work   | Marketing pages, blogs    |\n| ISR              | Static speed with background updates | News feeds, ecommerce     |\n\nBy comparing these three, you can match your landing-page demands to the right rendering strategy.\n\nIn practice, many teams lean on **SSG** for evergreen pages and add **ISR** where content changes regularly. That mix often keeps both performance and freshness in check.\n\nIn fact, **35%** of web developers reported adopting static site generators in 2024, up from **20%** the previous year. Dig into those figures on [static site generation trends](https://moldstud.com/articles/p-nextjs-trends-and-predictions-for-developers-in-2025).\n\n### Post Deploy Monitoring Strategies\n\nAfter your site goes live, keep an eye on uptime and response metrics with tools like [Uptime Robot](https://uptimerobot.com) or [Datadog](https://www.datadoghq.com). Proactive alerts mean you’ll know about issues before visitors do.\n\nPerformance audits through Lighthouse help you spot layout shifts and long-task warnings. That way, you can optimize render-blocking scripts ahead of peak traffic.\n\n- Schedule weekly audits to catch regressions early.\n- Rotate secrets after any security patch.\n- Wrap quick fixes in feature flags for zero-downtime hotfixes.\n\nI often deploy critical patches behind toggles. If something goes awry, rolling back via the Vercel dashboard or CLI is straightforward—and keeps your landing page live.\n\n> Monitoring and swift hotfixes slash downtime and keep users happy.\n\nIn your CI pipeline, use `npm run build && npm start` with `NODE_ENV=production` to mirror production settings locally. Regular log reviews and error-rate checks tie post-deploy health back to team confidence.\n\nHappy deploying your Next.js app—and here’s to blazing page speeds on every marketing page!\n\n## Frequently Asked Questions\n\nThinking about moving your React project over to Next.js? Start by copying your **components** folder into the new structure. Then rename files in `pages` to match Next.js routing and swap any `class` tags for `className`. You’ll see your UI slot right in with minimal fuss.\n\nHow can you speed up image loading? The built-in `<Image>` component handles resizing and lazy loading automatically:\n\n```jsx\nimport Image from \"next/image\"\n```\n\nIn our tests, this approach cuts load times by **40%**.\n\n- Mark key graphics with `priority`\n- Use `layout=\"responsive\"` to preserve aspect ratios\n- Turn on `blurDataURL` for a smooth Largest Contentful Paint\n\nWhat’s the best way to plug in analytics? Drop your script into `_app.tsx` and wrap it in a `useEffect` hook. Whether you choose Google Analytics or [Plausible](https://plausible.io), dynamic imports keep your first paint lightning-fast and your CLS score low.\n\n### Caching Strategies\n\nWondering if Incremental Static Regeneration fits your project? ISR updates pages in the background—perfect for blogs or feeds that refresh every few minutes. Just set `revalidate` inside `getStaticProps`:\n\n```js\nexport async function getStaticProps() {\n  return { props: { data }, revalidate: 60 }\n}\n```\n\n> **Key Insight**  \n> ISR balances speed with freshness by regenerating pages on demand without interrupting users.\n\nHow do you lock down a Next.js app? Keep dependencies current and rotate environment variables often. For example:\n\n```bash\nnpm install next@16.0.7\n```\n\nThis simple upgrade wards off issues like **CVE-2025-66478** and keeps your data secure.\n\nReady to resolve hurdles and make confident architecture decisions in your _next js create app_ journey? Keep experimenting with rendering modes to find what keeps visitors engaged.\n\nExplore our Q&A archive for more tips on optimizing your Next.js workflow today.\n\nElevate your landing pages with **Magic UI**: [Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/next-js-getting-started.mdx",
    "content": "---\ntitle: Next JS Getting Started Your First Project\ndescription: >-\n  Your essential Next JS getting started guide. Learn to build and deploy your\n  first modern web application with actionable steps and real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-0d8806a5-3afd-44f9-ba7c-3fe8f2ee065f.jpg\nauthor: Dillion Verma\ntags:\n  - next js getting started\n  - nextjs tutorial\n  - react framework\n  - web development\npublishedOn: \"2025-11-14T09:54:52.820806+00:00\"\nfeatured: true\n---\n\nWhen you kick off a new Next.js project, you’ll typically start with `create-next-app`. This command-line tool is a lifesaver, setting up a production-ready React framework that comes packed with powerful features like file-based routing and server-side rendering right out of the box. It gives you a solid foundation to build fast, SEO-friendly web apps without getting bogged down in configuration.\n\n## Why Choose Next JS for Your Next Project\n\n![A laptop screen displaying a code editor with Next.js related code, set against a modern, clean desk environment.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7d10a1a8-66f3-481a-9217-e02f9ea0ff66.jpg)\n\nBefore we jump into the code, it's worth taking a moment to understand _why_ so many developers are flocking to Next.js. At its heart, Next.js is a React framework that supercharges the popular library with a whole suite of production-grade features. It tackles common headaches that pop up when building single-page applications (SPAs) with plain React, like subpar SEO performance and sluggish initial load times.\n\nInstead of boxing you into a client-side or server-side corner, Next.js hands you a hybrid solution. This flexibility is its biggest advantage, letting you decide exactly how each page of your application gets rendered.\n\n### The Power of Hybrid Rendering\n\nNext.js isn't just one thing—it's a versatile toolkit that lets you mix and match different rendering strategies to get the best possible performance and user experience. This means you can pick the perfect tool for each job.\n\nHere are the main rendering options you'll be working with:\n\n- **Static Site Generation (SSG)**: This approach pre-renders your pages at build time. It’s absolutely perfect for content that doesn’t change often, like blog posts or marketing pages. The result? Blazing-fast load times.\n- **Server-Side Rendering (SSR)**: With SSR, pages are generated on the server for every single request. This is your go-to for dynamic content that needs to be fresh, like a user dashboard or an e-commerce product page pulling real-time data.\n- **Incremental Static Regeneration (ISR)**: ISR is a brilliant hybrid. It lets you update static pages _after_ they’ve been built. You can serve a speedy, cached version of a page while regenerating it in the background, making sure your content is always up-to-date without sacrificing speed.\n\nThis multi-pronged approach lets you build an app that's both incredibly fast and highly dynamic—a combination that used to be a real challenge to pull off. For a deeper dive into its architecture, check out our guide on [what is Next.js](https://magicui.design/blog/what-is-nextjs) and its core concepts.\n\n### Built for a Better Developer Experience\n\nBeyond raw performance, Next.js is built to make our lives as developers easier. It features a file-based routing system where creating a new page is as simple as dropping a file into a folder. Conveniences like automatic code splitting, optimized image loading, and built-in API routes mean you spend less time messing with config files and more time actually building features.\n\n> The real magic of Next.js is that it provides a structured, opinionated way to build React apps that scale. It takes care of the complex parts of web development, allowing you to focus on creating a great product.\n\nThis solid foundation has led to massive adoption across the industry. In fact, **17,921 verified companies** now use Next.js, including giants like Amazon, Walmart, and Apple. This widespread use, especially in the Business Services sector, really speaks to its reliability for building high-stakes, large-scale applications. You can learn more about [the global adoption of Next.js](https://data.landbase.com/technology/next-js/).\n\n## Setting Up Your First Next JS Project\n\nThere’s no better way to learn than by doing, and the Next.js team has made getting started an absolute breeze. Your main tool for this job is `create-next-app`, a command-line interface (CLI) that builds out a complete, production-ready project for you. Forget about wrestling with manual configurations and dependencies; this gets you up and running in minutes.\n\nBefore you dive in, just make sure you have **Node.js version 18.17 or later** installed on your machine. You can quickly check this by popping open your terminal and running `node -v`. If your version is up to date, you’re good to go.\n\n### The Create Next App Command\n\nTo get the ball rolling, navigate in your terminal to wherever you want your new project to live. Then, run this single command:\n\nnpx create-next-app@latest\n\nThis kicks off an interactive setup process that will walk you through a few questions. It’s a great way to customize the project to your specific needs right from the get-go.\n\n> Answering these prompts thoughtfully is your first big step. The choices you make here—like using TypeScript or setting up Tailwind CSS—will shape your development workflow from day one.\n\nThe installer will ask for your input on several options. Here’s a quick rundown of what they mean and my personal recommendations for anyone starting out:\n\n- **What is your project named?** - Just pick a simple, clear name for your project folder.\n- **Would you like to use TypeScript?** - Go with **Yes**. The type safety it adds is a lifesaver for catching errors early, especially as your app gets bigger.\n- **Would you like to use ESLint?** - Absolutely **Yes**. This is a fantastic tool for keeping your code style consistent and flagging potential bugs automatically.\n- **Would you like to use Tailwind CSS?** - Definitely choose **Yes**. It’s a utility-first CSS framework that feels like it was made for Next.js, making styling incredibly fast.\n- **Would you like to use the `src/` directory?** - **Yes**. It's a common convention to keep your actual application code inside a `src` folder, which helps keep your project organized.\n- **Would you like to use App Router?** - **Yes**, without a doubt. This is the new, recommended routing system and the modern way to build a [Next.js app](https://magicui.design/blog/next-js-app).\n\nOnce you’ve made your selections, the CLI will work its magic. It creates a new directory, installs all the packages you need, and even sets up a Git repository for you.\n\nAll that's left is to jump into your new project folder (`cd your-project-name`) and fire up the development server with `npm run dev`. Your first Next.js project is now live and waiting for you at `localhost:3000`.\n\n## Navigating the Next JS Project Structure\n\nOnce you’ve got your project running, pop open the folder in your code editor. You'll see a structure that’s both logical and powerful, and getting a handle on this layout is your next big step. This is where your code lives and how your entire application hangs together.\n\nThe star of the show here is the **`app` directory**. This folder is home to the **App Router**, which is Next.js's modern approach to routing. Forget about clunky config files; Next.js uses a file-based system where folders in the `app` directory directly map to URL paths. It’s incredibly intuitive once you get the hang of it.\n\n### The Heart of Your Application\n\nInside the `app` folder, you'll find a few critical files that the setup process created for you. These are the foundational pieces of your UI and routing logic.\n\n- **`layout.tsx`**: This is your root layout, the main shell that wraps your entire application. Think of it as the place for things that never change, like your main navigation, header, or footer. Any UI you add here will be shared across every single page.\n- **`page.tsx`**: This file represents the UI for a specific route. The one in the root of the `app` directory controls your homepage, which is the `/` path. As you build out more pages, you'll be creating more of these.\n- **`globals.css`**: Just like it sounds, this is where you put styles that apply to your whole application. It's the perfect spot for CSS resets, base typography, or defining font properties for your site.\n\nThis infographic gives you a quick visual recap of how the simple setup process results in this clean project structure.\n\n![Infographic about next js getting started](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5f8d0672-0b5f-4682-af46-64a4264087c2.jpg)\n\nAs the graphic shows, you go from checking a few prerequisites to having a ready-to-code project folder, which is exactly what we're exploring now.\n\n### Organizing Your Assets and Components\n\nOutside of the `app` directory, you'll spot a `public` folder. This folder has a special job: any file you drop in here—images, favicons, fonts—can be accessed directly from your site's root URL. It's the go-to place for all your static assets.\n\nWhen it comes to your reusable React components, it's a common best practice to create a brand new `components` folder. You could technically put it inside `src` or even in the `app` directory, but keeping it at the root level helps maintain a clean and scalable architecture as your project grows.\n\nTo help you get your bearings, here's a quick reference table for the core files and folders you'll encounter.\n\n### Next JS Core File and Folder Functions\n\nA quick reference guide to the purpose of key files and folders in a standard Next.js App Router project.\n\n| File/Folder           | Purpose and Key Features                                                                                 |\n| :-------------------- | :------------------------------------------------------------------------------------------------------- |\n| **`app/`**            | The core of your application. Contains all routes, layouts, and pages using the App Router.              |\n| **`app/layout.tsx`**  | The root layout component that wraps every page. Ideal for shared UI like headers and footers.           |\n| **`app/page.tsx`**    | The homepage for your application, corresponding to the `/` URL path.                                    |\n| **`app/globals.css`** | The place for global CSS styles that apply to the entire application.                                    |\n| **`public/`**         | A directory for static assets like images, fonts, and favicons. Files here are served from the root URL. |\n| **`components/`**     | A user-created folder (best practice) for storing reusable React components.                             |\n| **`package.json`**    | Manages project dependencies and scripts (e.g., `npm run dev`).                                          |\n| **`next.config.mjs`** | The configuration file for customizing Next.js behavior, such as adding redirects or image domains.      |\n\nThis table should be a handy cheat sheet as you start moving around your new project.\n\n> The App Router's design has been a huge factor in the framework's success. By tying routing directly to your file structure, it just makes the whole development process feel more natural. Developers really seem to appreciate that.\n\nThis focus on developer experience is a big reason for its explosive growth. Next.js now sees an adoption rate of **52.9% among React developers**, largely thanks to game-changing features like the App Router. Add in its excellent performance metrics, like a Lighthouse score of **98.6**, and it's easy to see why it's a top choice for building fast, modern websites. You can find more insights on [frameworks for JavaScript app development on strapi.io](https://strapi.io/blog/frameworks-for-javascript-app-developlemt).\n\n## Building Pages and Adding Navigation\n\n![A developer's hand pointing at a screen displaying a Next.js navigation component with code snippets overlaid.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/57bf1bb8-7781-4ad4-8336-dac099210542.jpg)\n\nAlright, this is where the magic starts to happen and your project begins to feel like a real website. One of the best things about Next.js, and a feature I've come to love, is its file-based routing system. It's incredibly intuitive. You can forget about wrestling with separate routing libraries or messy configuration files; Next.js just works by looking at the folders you create.\n\nThe whole concept is beautifully simple: a new folder in your `app` directory equals a new URL path. Inside that folder, a `page.tsx` file provides the actual UI for that route. It's a clean, predictable structure that makes perfect sense from day one.\n\n### Creating Your First Pages\n\nLet's get our hands dirty and build out two pages every website needs: a homepage and an \"About Us\" page. Your project already has a homepage, which you can find at `app/page.tsx`. Now, let's create the about page.\n\n1.  Jump into the `app` directory and create a new folder. Call it `about`.\n2.  Inside that brand new `about` folder, create a file named `page.tsx`.\n\nAnd that's literally all it takes. You've just created the `/about` route. Now, let's drop some basic React code into `app/about/page.tsx` so it actually displays something.\n\n```tsx\n// app/about/page.tsx\nexport default function AboutPage() {\n  return (\n    <main className=\"p-24\">\n      <h1 className=\"text-4xl font-bold\">About Us</h1>\n      <p className=\"mt-4\">This is the about page for our first Next.js app!</p>\n    </main>\n  )\n}\n```\n\nWith that code in place, Next.js handles the rest. Fire up your browser and navigate to `localhost:3000/about`, and you'll see your new component rendered on the screen.\n\n> This file-based approach is a total game-changer for productivity. You can visualize your entire site's structure just by looking at your file explorer. It keeps everything organized and easy to find.\n\n### Implementing Seamless Navigation\n\nNow that you have a couple of pages, you need a way for people to get between them without having to type URLs into the address bar. This is a job for the Next.js `<Link>` component. It’s what enables **client-side navigation**, giving you that snappy, single-page app feel by preventing the browser from doing a full-page reload every time you click a link.\n\nTo connect your homepage to the about page, you'll import `Link` from `next/link` and use it almost exactly like a regular `<a>` tag. If you want to dive deeper into building a complete navigation bar, there are some great tutorials on building a [navbar in React.js](https://magicui.design/blog/navbar-in-react-js) that you can easily adapt.\n\nHere’s a quick example of how you could add a link to your `app/page.tsx`:\n\n```tsx\n// app/page.tsx\nimport Link from \"next/link\"\n\nexport default function HomePage() {\n  return (\n    <main className=\"p-24\">\n      <h1 className=\"text-4xl font-bold\">Welcome Home</h1>\n      <nav className=\"mt-6\">\n        <Link href=\"/about\" className=\"text-blue-500 hover:underline\">\n          Go to About Page\n        </Link>\n      </nav>\n    </main>\n  )\n}\n```\n\nThe `href` prop tells the `<Link>` component where to go. When a user clicks it, Next.js fetches what it needs in the background and swaps out the view without that classic white flash of a page refresh.\n\n### Handling Dynamic Content with Routes\n\nMost real-world applications aren't just static pages. You'll often need to show unique content based on something in the URL, like a specific product ID or a blog post title. Next.js handles this beautifully with something called **dynamic segments**.\n\nYou can create a dynamic route by just wrapping a folder's name in square brackets, like `[slug]`. For instance, if you wanted to build a blog with URLs like `/blog/my-first-post`, you'd set up your folder structure like this:\n\n- `app/blog/[slug]/page.tsx`\n\nFrom inside that `page.tsx` file, Next.js gives you access to the dynamic part of the URL (in this case, `my-first-post`) through the component's props. You can then use that `slug` to fetch and display the right content. It’s an incredibly powerful way to build out entire sections of your site with just a single component file.\n\n## Fetching Data The Modern Way\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/MaebEqhZR84\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nJust about every app you'll ever build needs to get data from somewhere—a database, a CMS, a third-party API, you name it. [Next.js](https://nextjs.org/) makes this surprisingly straightforward, especially with the App Router, which leans heavily on **React Server Components** right out of the box. This isn't just a minor feature; it's a game-changer for performance and security.\n\nWhen you fetch data on the server, you're sending a complete HTML page to the browser. Your users see the content almost instantly, and you get to keep all your sensitive API keys and business logic tucked away safely on the server, far from prying eyes. It’s a clean, modern way to sidestep a lot of the classic headaches of web development.\n\n### Using Async and Await in Components\n\nOne of the coolest things about Server Components is the ability to just drop `async/await` directly into your component. Seriously. This tidies up your data-fetching logic, making it easy to read and keeping it right next to the UI that actually uses the data. No more wrestling with `useEffect` or complex state management libraries just to get some information on the screen.\n\nLet's look at a practical example. Say you want to pull in a list of products from a public REST API and display them on a page. Here’s how you could fetch and render that data right inside a page component.\n\n```tsx\n// app/products/page.tsx\nasync function getProducts() {\n  const res = await fetch(\"https://dummyjson.com/products\")\n  if (!res.ok) {\n    // This will activate the closest `error.js` Error Boundary\n    throw new Error(\"Failed to fetch data\")\n  }\n  return res.json()\n}\n\nexport default async function ProductsPage() {\n  const data = await getProducts()\n\n  return (\n    <main className=\"p-24\">\n      <h1 className=\"mb-8 text-4xl font-bold\">Our Products</h1>\n      <div className=\"grid grid-cols-1 gap-6 md:grid-cols-3\">\n        {data.products.map((product) => (\n          <div key={product.id} className=\"rounded-lg border p-4\">\n            <h2 className=\"text-xl font-semibold\">{product.title}</h2>\n            <p className=\"mt-2 text-gray-600\">{product.description}</p>\n          </div>\n        ))}\n      </div>\n    </main>\n  )\n}\n```\n\nDid you catch it? `ProductsPage` is an `async` function. That one keyword lets you `await` the `getProducts()` call right before returning your JSX. It’s an incredibly clean and direct way to handle what used to be a much more complicated task.\n\n> A huge behind-the-scenes win here is that Next.js’s built-in `fetch` API automatically caches your requests. For data that doesn't change often, it's fetched once at build time, and every user gets a cached, instant response. You get a massive performance boost with zero extra effort.\n\n### Why This Matters for Your Career\n\nThis blend of React’s slick component model with powerful server-side features is why Next.js has absolutely exploded in popularity. Its knack for boosting performance and SEO makes it a go-to for critical industries like e-commerce.\n\nThis isn't just talk; the job market reflects it. We're seeing a massive demand for developers with these skills, with Next.js roles seeing an increase of over **41% in job postings** year-over-year. Getting good at Next.js isn't just about learning a new tool—it's a smart career move. If you want to dive deeper, you can find more [insights about why you should learn Next.js](https://www.statista.com/statistics/1124683/learn-react-js-reasons-developers-worldwide/).\n\n## Deploying Your First Next.js Application\n\nBuilding a killer Next.js app is a great feeling, but the real magic happens when you push it live for the world to see. Getting your project online is the final, most rewarding step, and thankfully, it's easier than you might think—especially with a platform built specifically for Next.js.\n\nWe're going to focus on deploying with **Vercel**, the company that created Next.js. Their platform is practically tailor-made for it, offering a smooth, zero-configuration experience that feels like a natural extension of your coding workflow. It’s hands-down the fastest way to get from `localhost` to a live URL.\n\n### The Power of Git Integration\n\nThe best way to get your site live is by connecting your project's Git repository—whether it's on [GitHub](https://github.com/), [GitLab](https://about.gitlab.com/), or [Bitbucket](https://bitbucket.org/)—directly to Vercel. This unlocks a powerful workflow called **Continuous Deployment**. Every time you push a change to your main branch, Vercel automatically kicks off a new build and deploys the update. No manual steps, no fuss.\n\nThis integration isn't just a convenience; it's a game-changer.\n\n- **Automatic Builds**: Forget about dragging and dropping files or running manual build commands. Just push your code, and Vercel takes care of the rest.\n- **Preview Deployments**: For every single pull request, Vercel spins up a unique preview URL. This lets you and your team test changes in a real, production-like environment _before_ merging them. It's an incredible safety net.\n- **Instant Rollbacks**: If a deployment goes sideways and introduces a bug, you can roll back to a previous, stable version with a single click.\n\n> Connecting your Git repo is the modern standard for web deployment. It automates all the boring, error-prone parts, letting you focus on what you do best: writing code. Your live app stays perfectly in sync with your latest stable version.\n\n### Configuring for Production\n\nBefore you hit that deploy button, there’s one critical bit of housekeeping: managing your secrets. Things like API keys, database credentials, and other sensitive info should **never** be hardcoded into your source code and committed to Git. The right way to handle this is with **environment variables**.\n\nVercel gives you a dead-simple UI to manage these. Just head to your project’s settings, add your variables, and they’ll be securely injected into both the build process and the runtime environment. This keeps your secrets locked down while making them accessible in your server-side code through `process.env.YOUR_VARIABLE_NAME`.\n\nOnce your repo is linked and your environment variables are in place, deploying is as simple as importing your project on the Vercel dashboard. The platform is smart enough to detect it’s a Next.js app and will apply all the optimized settings for you. One final click, and your application is live, globally distributed on Vercel's edge network for lightning-fast performance.\n\nWhile there are other great platforms out there like [Netlify](https://www.netlify.com/) or [AWS Amplify](https://aws.amazon.com/amplify/), the native integration from Vercel makes it the most straightforward choice for anyone just getting their feet wet with Next.js.\n\n## Common Questions for Beginners\n\nAs you start your journey with Next.js, a few questions always seem to pop up. Let's tackle them head-on to clear up any confusion and help you build a solid foundation right from the get-go.\n\n### Is Next.js a Backend or Frontend Framework?\n\nThis is easily one of the most common points of confusion for newcomers, and the answer is simple: it’s both. Next.js is a **full-stack framework** that sits on top of React.\n\nIt’s brilliant at building the interactive, beautiful user interfaces you see in a browser (the frontend), but it also packs a punch on the server. It handles server-side logic like rendering pages before they hit the browser, fetching data securely, and even creating your own API endpoints (the backend). This hybrid approach is what makes it so incredibly powerful.\n\n> The real magic of Next.js is how it blurs the lines between client and server. You can write your frontend and backend code in the same project, sometimes even in the same file, which makes for a remarkably seamless development experience.\n\n### Do I Need to Know React First?\n\nYes, you absolutely do. Think of it this way: Next.js is a powerful toolkit for React, but it assumes you already know how to use the base tools. Having a solid grasp of React fundamentals is crucial for a smooth ride.\n\nBefore you dive headfirst into Next.js, make sure you're comfortable with these core React concepts:\n\n- **Components:** You should know how to create, compose, and manage component state with hooks like `useState`.\n- **Props:** Be confident in passing data down through your component tree.\n- **JSX:** You'll need to be fluent in writing that HTML-like syntax inside your JavaScript.\n- **Hooks:** A good handle on `useEffect` for managing side effects will be particularly helpful.\n\nTrust me, a strong React foundation will make learning Next.js feel much more intuitive and less like a steep climb.\n\n### What Is the Difference Between Pages Router and App Router?\n\nWhen you start a new project today, you’ll be prompted to use the **App Router**, and for good reason—it’s the modern, recommended way forward. The older **Pages Router** was the original method for building Next.js apps.\n\nHere's a quick breakdown of what that means for you:\n\n- **App Router (app/):** This is the new standard. It's built around React Server Components by default, which improves performance by shifting more work to the server. It also introduces game-changing concepts like layouts, loading UIs, and error boundaries that are all tied directly to your file structure.\n- **Pages Router (pages/):** This is the legacy approach. It defaulted to client-side rendering for each page and had a different system for API routes (they lived in `pages/api`).\n\nFor any new project, just stick with the App Router. It’s where all the exciting new features and performance boosts are happening.\n\n### When Should I Create an API Route?\n\nOne of the coolest things about the App Router and Server Components is that you can often fetch data directly without needing a separate API route, especially if that data is just for your own Next.js application. But API routes (now called Route Handlers) are still incredibly useful.\n\nYou'll want to create an API route when you need to:\n\n1.  **Expose data to external clients:** This is perfect if you're building a mobile app, a third-party service, or another frontend that needs to pull data from your application.\n2.  **Handle webhooks:** You'll need a dedicated endpoint to receive callbacks from services like Stripe for payments or GitHub for repository events.\n3.  **Proxy requests:** API routes are great for hiding a complex backend or combining multiple microservices behind a single, clean URL for your frontend to talk to.\n\nAs you get started, it's also worth thinking about the bigger picture and [the enduring importance of learning to code](https://thinkinleverage.com/why-founders-learning-to-code-remains-crucial-despite-ai-advances/) in our ever-changing tech world. Getting a handle on these core concepts is what gives you the power to build truly robust, full-stack applications from the ground up.\n\n---\n\nReady to build stunning, high-performance web interfaces with less effort? **Magic UI** offers over 150 free and open-source animated components built with React, Typescript, and Tailwind CSS. Accelerate your development and create beautiful landing pages in minutes.\n\n[Explore Magic UI Components](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/next-js-layout.mdx",
    "content": "---\ntitle: Mastering Next JS Layout for Scalable Web Apps\ndescription: >-\n  Unlock the power of the Next JS Layout system. Learn to build fast, scalable\n  apps with nested layouts, route groups, and advanced SEO strategies.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0b38b037-7d2b-433d-8051-2ac109aeffd2/next-js-layout-web-development.jpg\nauthor: Dillion Verma\ntags:\n  - next js layout\n  - Next.js App Router\n  - Nested Layouts\n  - React Development\n  - Web Performance\npublishedOn: \"2025-12-08T09:04:13.761994+00:00\"\nfeatured: true\n---\n\nAt its core, a **Next JS layout** is just a React component that wraps around your pages. Think of it as a persistent UI shell—things like headers, footers, or sidebars—that doesn't disappear when you navigate from one page to another. It's a foundational feature of the [Next.js](https://nextjs.org/) App Router that lets you define a common structure once and reuse it across an entire section of your site, cutting down on repetitive code and keeping your component state intact.\n\n## Why Next JS Layouts Are a Game Changer\n\n![Illustration comparing Next.js Pages Router with scattered elements versus App Router with a structured hierarchy.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/00e3964d-0325-44df-9001-f7839e01f231/next-js-layout-router-comparison.jpg)\n\nThe arrival of the App Router in Next.js really changed how we build web apps. It was a massive pivot from the old, page-focused model of the Pages Router to a more modern, component-driven architecture. This wasn't just some small tweak; it was a total reimagining of routing, rendering, and even how we fetch data.\n\nThe `layout.js` file convention sits right at the heart of this new approach. You no longer have to manually import and wrap every single page component with a shared `<Layout>` component. Instead, you just drop a `layout.js` file into a directory, and it automatically wraps every page and sub-folder within it. This simple idea has profound effects on how you structure and scale your projects.\n\n### From Manual Wrappers to Automatic Shells\n\nI remember the old days with the Pages Router. If you wanted a consistent UI, you had to import your layout component and wrap your page content with it... on every. single. page. It worked, sure, but it was tedious and inefficient. For a dashboard with dozens of pages, that meant dozens of files with the same boilerplate code.\n\nThe App Router makes this so much cleaner. When you place a `layout.js` file in a folder, you're essentially creating a UI \"shell\" that sticks around. So, when a user moves from `/dashboard` to `/dashboard/settings`, the shared layout—maybe a sidebar and header—doesn't have to re-render. Only the actual page content swaps out.\n\nThis shift brings a few huge wins right away:\n\n- **State Preservation:** Because the layout component doesn't get unmounted during navigation, its state is preserved. That search query in your sidebar input? It stays right where it is.\n- **Performance Gains:** Shared components and assets inside the layout are only downloaded once. This smart deduplication drastically cuts down on the data being sent over the wire as users click around your site.\n- **Simplified Codebase:** It completely gets rid of the need for all those redundant wrapper components. Your project becomes cleaner and way easier to manage. You define the shared UI in one spot, and Next.js does all the heavy lifting.\n\n### The Power of Nested Layouts\n\nThe true magic of the **Next JS layout** system really clicks when you start nesting them. You can have a root layout in your `app` directory that defines the global `<html>` and `<body>` tags, a site-wide navigation bar, and maybe a footer. Then, inside a `/dashboard` folder, you can add _another_ `layout.js` that introduces a sidebar specific only to the dashboard section.\n\n> This nested structure just makes sense. The dashboard's layout automatically wraps its own child pages while still being wrapped by the main root layout. You get this layered, super-organized UI without any complicated setup.\n\nIn this guide, I'll walk you through everything you need to master this system. We'll start by setting up your foundational root layout, then dive into creating more complex UIs with nested layouts, and finally, look at how to optimize it all for top-notch performance and SEO.\n\n## Creating Your Foundational Root Layout\n\nAlright, let's move from theory to actually building something. The first real step in using the App Router is setting up your root layout. This is a special file, `app/layout.js`, that acts as the main server component for your entire application. It’s what renders the initial HTML document that gets sent to the browser.\n\nThink of it as the foundational blueprint for your whole site. Every single page and every nested layout you create will live inside this one component. It’s where you define the universal structure—the `<html>` and `<body>` tags—that’s shared across every route. Getting this right from the start is key to keeping your app consistent and building a solid base for everything else.\n\n### The Anatomy of a Root Layout\n\nAt its heart, `app/layout.js` is just a React Server Component. Its one non-negotiable job is to accept and render a `children` prop. This prop is a placeholder for whatever child layout or page is currently active for a given route. When a user clicks a link, Next.js smartly swaps out the `children` without unmounting the root layout itself, preserving its state.\n\nThis file is the perfect spot for handling anything that needs to be global. Typically, you'll see the root layout taking care of a few common tasks:\n\n- **Importing Global Styles:** This is where you pull in your main stylesheet, like `globals.css`, to make sure your styles are applied everywhere.\n- **Defining Metadata:** You can export a `metadata` object right from this file to set default SEO tags for your site's title and description.\n- **Structuring the Document:** It's required to include the `<html>` and `<body>` tags here to create a valid HTML structure.\n\nThis centralized setup is a huge improvement over older ways of doing things. The numbers back it up, too. A recent State of JavaScript Survey found that **68% of developers preferred Next.js for production apps**, putting it way ahead of other frameworks. This widespread adoption is largely thanks to its powerful, SEO-friendly layout system that just works. For a deeper dive, check out this [Next.js framework comparison on staticmania.com](https://staticmania.com/blog/next-js-vs-remix).\n\n### A Practical Root Layout Example\n\nLet's put together a root layout you could actually use in a project. This one will include global styles, a shared navigation bar and footer, and the `metadata` configuration for site-wide SEO.\n\nFirst, go ahead and create the file `app/layout.js`:\n\n```jsx\nimport { Inter } from \"next/font/google\"\n\nimport \"./globals.css\"\n\nimport Footer from \"@/components/Footer\"\nimport Header from \"@/components/Header\"\n\nconst inter = Inter({ subsets: [\"latin\"] })\n\nexport const metadata = {\n  title: \"Magic UI - Stunning Landing Pages\",\n  description: \"Build beautiful web interfaces in minutes with Magic UI.\",\n}\n\nexport default function RootLayout({ children }) {\n  return (\n    <html lang=\"en\">\n      <body className={inter.className}>\n        <Header />\n        <main>{children}</main>\n        <Footer />\n      </body>\n    </html>\n  )\n}\n```\n\nIn this snippet, we're importing and applying the Inter font from `next/font`, which is great for performance. We're also bringing in our `Header` and `Footer` components. Now, they'll show up on every single page of the app automatically—no need to import them anywhere else. If you want to see how to build a component like that, **check out our guide on creating a React JS Navbar**.\n\n> **Key Takeaway:** The root `next js layout` is more than a simple container. It's the single source of truth for your app's global UI and metadata. By putting components like headers and footers here, you ensure they're always present, while the `children` prop dynamically renders the active page.\n\nThis structure is also incredibly efficient. The `Header` and `Footer` components will only render on the initial load. They won't re-render as users navigate between pages, which preserves their state and saves the browser from doing unnecessary work. The result is a much faster, smoother user experience—a core benefit of the Next.js App Router. With this foundation in place, you're ready to start building out the rest of your UI.\n\n## Building Complex UIs with Nested Layouts\n\nA single root layout is a great start, but the real power of the **Next JS layout** system comes alive when you start nesting them. This is how you level up from a simple site to a complex application with different UI sections.\n\nThink about a common scenario: building a web app that has both a public-facing marketing site and a private user dashboard. These two areas need entirely different looks. The marketing pages probably want a big, eye-catching header, while the dashboard needs a persistent sidebar for navigation and user controls.\n\nThis is exactly what nested layouts were made for.\n\n![A diagram showing a code block leading to 'Body Tag', which then leads to 'Children' elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/359b05ee-fea8-4480-8ab6-cb312b80514f/next-js-layout-html-structure.jpg)\n\nThis diagram shows how the root layout sets up the basic HTML and Body tags that wrap everything else. Nested layouts just add more layers inside, wrapping the `children` prop with extra UI specific to that part of your site.\n\n### Creating a Segment-Specific Layout\n\nLet's actually build that user dashboard. To create a layout that _only_ applies to the dashboard section, you just need to create a new `dashboard` folder inside your `app` directory and drop a `layout.js` file in there.\n\nThe file structure would look like this:\n\n- `app/`\n  - `layout.js` (Root layout with global nav/footer)\n  - `page.js` (Your homepage)\n  - `dashboard/`\n    - `layout.js` (Dashboard-specific layout with a sidebar)\n    - `page.js` (Dashboard's main page)\n    - `settings/`\n      - `page.js` (Dashboard settings page)\n\nNow, any page inside the `dashboard` folder—like `/dashboard` or `/dashboard/settings`—will automatically be wrapped by _both_ the root layout and the new dashboard layout. The components just compose together, no extra work needed.\n\nHere’s a quick, practical example for `app/dashboard/layout.js`:\n\n```jsx\nimport DashboardSidebar from \"@/components/DashboardSidebar\"\n\nexport default function DashboardLayout({ children }) {\n  return (\n    <section className=\"flex\">\n      <DashboardSidebar />\n      <div className=\"flex-grow p-8\">{children}</div>\n    </section>\n  )\n}\n```\n\nWith this in place, the `DashboardSidebar` shows up on every single dashboard page but stays completely out of your homepage or any other public routes. It’s a clean and powerful way to segment your UI logic.\n\n### Organizing Routes without Affecting URLs\n\nSometimes, you need to group pages under different layouts without actually changing their URLs. For example, maybe you want your marketing pages (`/`, `/about`, `/pricing`) and your app pages (`/login`, `/signup`) to have completely different UI shells, but they all live at the root of your domain.\n\nThis is where **Route Groups** come in handy. By wrapping a folder name in parentheses, like `(marketing)`, you're telling [Next.js](https://nextjs.org/) that this folder is just for organization—it won't become part of the final URL.\n\n> **Key Takeaway:** Route Groups are a fantastic architectural tool for partitioning your app into sections with unique layouts while keeping your URLs clean. It’s a must-know for managing complex projects.\n\nLet's apply this to our example. We could structure the app like so:\n\n- `app/`\n  - `(marketing)/`\n    - `layout.js` (Marketing layout with a big header)\n    - `page.js` (Renders at `/`)\n    - `about/page.js` (Renders at `/about`)\n  - `(app)/`\n    - `layout.js` (App layout with a simple, clean UI)\n    - `login/page.js` (Renders at `/login`)\n    - `signup/page.js` (Renders at `/signup`)\n  - `layout.js` (The main root layout)\n\nWith this setup, `/about` gets the marketing layout and `/login` gets the app layout. Both still inherit from the root layout, but their intermediate shells are completely different. This setup is perfect for preventing UI from one section from ever bleeding into another.\n\nDeciding on the right layout strategy can be tricky. Here’s a quick reference to help you choose the best approach for different scenarios in your Next.js project.\n\n### Layout Strategies and When to Use Them\n\n| Layout Type               | Directory Structure                               | Primary Use Case                                                                                          | Key Benefit                                                                                              |\n| :------------------------ | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------- |\n| **Root Layout**           | `app/layout.js`                                   | Applying global UI like navigation, footers, and providers to the entire application.                     | Ensures a consistent shell for every page and is the ideal place for context providers.                  |\n| **Nested Layout**         | `app/dashboard/layout.js`                         | Creating a specific UI for a segment of your app, like a user dashboard or admin panel.                   | UI is automatically applied to all child routes, preserving state and avoiding re-renders on navigation. |\n| **Route Group Layout**    | `app/(marketing)/layout.js`                       | Grouping pages with a shared layout without affecting the URL structure.                                  | Organizes your project logically while keeping URLs clean and user-friendly.                             |\n| **Multiple Root Layouts** | `app/(group1)/layout.js` `app/(group2)/layout.js` | For completely separate sections of an app, like a marketing site and a web app, that don't share any UI. | Total UI separation; each section has its own `<html>` and `<body>` tags.                                |\n\nThis table should give you a clear starting point for structuring your layouts effectively, whether you're building a simple blog or a large-scale web application.\n\n### The Performance and State Preservation Win\n\nHonestly, one of the biggest wins with nested layouts is how they handle state and rendering. When a user clicks a link to navigate between pages that share a layout (say, from `/dashboard` to `/dashboard/settings`), the shared layout component **does not re-render**.\n\nThis is a huge deal for two reasons:\n\n1.  **State is Preserved:** Any React state you have in the layout—like a search query in a sidebar or the scroll position of a nav panel—stays right where it is. The user experience feels incredibly fluid and natural.\n2.  **Performance is Improved:** Since the layout and its child components aren't being torn down and rebuilt, the browser does way less work. Any shared data fetched within the layout isn't re-fetched, and the DOM isn't needlessly updated, leading to noticeably faster page transitions.\n\n## Enhancing Layouts with Interactive Components\n\n![A UI illustration showing a hand cursor clicking a button in a browser window interface.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d1925854-ad55-41d6-a745-48b9a495c363/next-js-layout-ui-interaction.jpg)\n\nA solid **Next.js layout** does more than just organize your UI—it’s the foundation for a truly dynamic and engaging experience. Once you’ve got your basic nested layouts in place, the real fun begins: bringing them to life with interactive elements. This is where you transform a static structure into a modern, lively interface that grabs a user's attention.\n\nJumping straight into pre-built component libraries is one of the most efficient ways I've found to add visual flair without reinventing the wheel. Libraries like [Magic UI](https://magicui.design) are packed with animated and interactive components that you can drop right into your layouts for a polished, professional feel in minutes.\n\n### Installing and Integrating a UI Library\n\nLet's get our hands dirty and add some magic to our layout. I’ll walk you through installing a component from the Magic UI library. For this example, we'll use an animated grid pattern to add a subtle, professional background to our root layout.\n\nFirst things first, you need to add the component to your project. Pop open your terminal and run the installation command:\n\n```bash\nnpm i @magic-ui/react-animated-grid-pattern\n```\n\nWith the component installed, you can import it directly into your `app/layout.js` file. The goal here is to wrap the main content area of the entire site with this new visual element. It's a perfect example of how layouts become a central hub for site-wide design decisions.\n\nThe recent growth of Next.js has been remarkable, highlighting its importance in modern web development. Much of this surge comes from its powerful ability to handle complex layouts and hybrid rendering, which strikes a great balance between fast load times and dynamic content. The App Router, in particular, has made organizing code a breeze with file-based routing and nested layouts, cutting down on redundant code significantly. You can learn more about the [advantages of using Next.js on aalpha.net](https://www.aalpha.net/articles/nextjs-advantages-and-disadvantages/).\n\n### Wrapping Layout Children with an Animated Component\n\nOkay, let's modify our `RootLayout` to actually _use_ the `AnimatedGridPattern`. We'll place it inside the `<body>` tag so it acts as a background for the entire application, sitting neatly behind the `Header`, `Footer`, and the main `children` content.\n\nHere’s what your updated `app/layout.js` file might look like:\n\n```jsx\nimport { Inter } from \"next/font/google\"\n\nimport \"./globals.css\"\n\nimport { cn } from \"@/lib/utils\" // A utility for merging class names\nimport Footer from \"@/components/Footer\"\nimport Header from \"@/components/Header\"\nimport { AnimatedGridPattern } from \"@/components/magicui/animated-grid-pattern\" // Assuming you place it here\n\nconst inter = Inter({ subsets: [\"latin\"] })\n\nexport default function RootLayout({ children }) {\n  return (\n    <html lang=\"en\">\n      <body className={inter.className}>\n        <div className=\"relative flex min-h-screen w-full flex-col items-center justify-center\">\n          <AnimatedGridPattern\n            numSquares={30}\n            maxOpacity={0.5}\n            duration={3}\n            repeatDelay={1}\n            className={cn(\n              \"[mask-image:radial-gradient(ellipse_at_center,white,transparent_75%)]\",\n              \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n            )}\n          />\n          <Header />\n          <main className=\"z-10 w-full\">{children}</main>\n          <Footer />\n        </div>\n      </body>\n    </html>\n  )\n}\n```\n\nNotice how we've wrapped our page structure in a `relative` container and positioned the `AnimatedGridPattern` inside it. By adding `z-10` to the `<main>` element, we make sure our actual page content always sits on top of the animated background. It's a simple CSS trick that saves a lot of headaches.\n\n> **Pro Tip:** When you're integrating background components, always use a relative parent container and `z-index` to manage the layering of your UI. This is a lifesaver for preventing the background from covering up clickable elements like buttons and links.\n\n### Adding an Interactive Navigation Component\n\nLet's push this a bit further. Say you want to add an interactive navigation element, like Magic UI's `<Dock>` component, but only to a specific part of your app. This is a fantastic use case for a nested layout, like one for a user dashboard. You could add a sleek, macOS-style dock to your `app/dashboard/layout.js` in just a few steps.\n\nThe process is exactly the same:\n\n1.  **Install the component:** `npm i @magic-ui/react-dock`\n2.  **Import it:** `import { Dock, DockIcon } from \"@/components/magicui/dock\";`\n3.  **Integrate it:** Place the `<Dock>` component inside your `DashboardLayout`, maybe fixing it to the bottom of the screen to give your users an intuitive way to navigate.\n\nThis modular approach is what makes the **Next.js layout** system so powerful. You can build up complex, interactive UIs by adding specialized components exactly where they’re needed, without bloating your global layout. If you want more ideas for cool UI enhancements, you should check out how to build an [interactive hover button](https://magicui.design/docs/components/interactive-hover-button).\n\n## Optimizing Your Layout for SEO and Performance\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/TvrQnBDIDpI\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nA solid **Next.js layout** does more than just organize your UI. It's the bedrock for building apps that are both incredibly fast and friendly to search engines. If you get performance and SEO right at the layout level, every page you build on top of it inherits that strong foundation.\n\nThis goes way beyond just writing clean code. It's about being smart with how you fetch data, how you manage your metadata, and how you understand Next.js's asset handling to create a snappy user experience. Let's dig into the essential optimizations every developer should have in their toolkit.\n\n### Mastering Metadata for Better SEO\n\nOne of the slickest features in the App Router is the built-in Metadata API. This lets you define all the SEO-critical info—titles, descriptions, Open Graph tags—right inside your `layout.js` and `page.js` files.\n\nFor site-wide defaults, you can just export a static `metadata` object from your root layout. It's that simple.\n\n```js\n// in app/layout.js\nexport const metadata = {\n  title: \"Magic UI - Stunning Landing Pages\",\n  description: \"Build beautiful web interfaces in minutes with Magic UI.\",\n  openGraph: {\n    images: [\"/og-image.png\"],\n  },\n}\n```\n\nThat's a great starting point, but the real magic happens with dynamic metadata. Since layouts are Server Components, they can fetch data and use it to cook up unique metadata for each route. For example, a layout for a product category page could fetch the category's name to craft a perfectly tailored title.\n\n```js\n// in app/products/[category]/layout.js\nasync function getCategory(slug) {\n  const res = await fetch(`https://api.example.com/categories/${slug}`)\n  return res.json()\n}\n\nexport async function generateMetadata({ params }) {\n  const category = await getCategory(params.category)\n  return {\n    title: `Shop ${category.name} Products`,\n    description: `Explore our collection of ${category.name}.`,\n  }\n}\n```\n\nWith this approach, every page is perfectly tuned for search engines, serving up relevant, specific content in its tags. If you want to dive deeper into the principles of improving your site’s visibility, check out [a complete guide to Search Engine Optimization](https://sharpetools.com/blog/what-is-search-engine-optimization/).\n\n### Leveraging Server Components and Caching\n\nLayouts are Server Components by default, and that’s a huge win for performance. They render on the server, sending fully-formed HTML to the browser with zero client-side JavaScript needed just to render the layout structure.\n\nThis immediately slashes your initial bundle size, which translates directly to faster load times. You can even fetch data right inside a layout without worrying about shipping data-fetching libraries to the client. Next.js handles it all, caching the data to prevent unnecessary requests.\n\nHere are a few practical tips to squeeze out more performance:\n\n- **Fetch Data High in the Tree:** Grab shared data, like user session details or main navigation items, in the highest-level layout that needs it. This data gets fetched once and can be passed down or accessed via context.\n- **Keep Layouts Static When You Can:** If a layout doesn't rely on dynamic data, Next.js can render it statically at build time, making it lightning-fast.\n- **Embrace Next.js Caching:** The framework's built-in `fetch` caching is your friend. Next.js automatically caches `fetch` requests, and you can control how data is revalidated, either based on time or on-demand using `revalidateTag`.\n\n### The Power of Layout Deduplication\n\nOne of the unsung heroes of Next.js performance is **layout deduplication**. When a user navigates between pages that share a layout, Next.js is smart. It only downloads the code and assets for that layout _once_.\n\nThink about it: if you have a product grid with **50** links, and each one goes to a detail page using the same layout, the browser isn't going to re-download that layout **50** times. It fetches it on the first click and reuses it for every subsequent navigation. This is a game-changer for reducing network traffic and making page transitions feel instant.\n\n> By preventing redundant asset fetching and leveraging server-side rendering, Next.js layouts directly improve Core Web Vitals like Largest Contentful Paint (LCP) and First Input Delay (FID), which are major factors in SEO ranking.\n\nThis intelligent asset handling is a core reason why apps built with the App Router feel so responsive. It all happens automatically, giving you a performant application right out of the box. For those who want to get even more out of their optimizations, you might find our guide on [how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance) useful. Pairing these layout strategies with broader web performance principles will make your site fly for users and climb the ranks on search engines.\n\n## Common Questions About Next.js Layouts\n\nThe App Router is incredibly powerful, but as with any new system, a few common questions tend to pop up. When developers start digging into **Next.js layouts**, they often run into the same handful of challenges. Let's walk through them so you can get past the hurdles and back to building.\n\n### How Do I Apply a Layout to a Specific Group of Pages?\n\nThis is a classic use case, and the answer is Route Groups. It's a simple but brilliant convention.\n\nYou just create a folder with its name wrapped in parentheses, like `(dashboard)`. Inside that folder, you can drop a `layout.js` file. That layout will then wrap every route inside that group—think `/dashboard/settings` or `/dashboard/profile`—but the `(dashboard)` part never shows up in the URL.\n\nIt’s the perfect way to create distinct sections in your app. You could have one for your public marketing pages and another for your authenticated user area, each with its own UI shell, all while keeping your URLs clean and logical.\n\n### Can I Fetch Data Directly in a Layout?\n\nYes, you can, and for shared data, you absolutely should. Layouts in the App Router are Server Components by default. This means you can use `async/await` to fetch data right inside the layout file itself. It’s a game-changer for things like grabbing a user's session data or fetching the navigation links that need to be on every page.\n\n> Here's the key takeaway: layouts _don't_ re-fetch data when you navigate between their child pages. That makes them incredibly efficient for data that's consistent across an entire section of your site, cutting down on unnecessary network requests and making your app feel faster.\n\n### What Is the Difference Between a Layout and a Template?\n\nThis one trips a lot of people up because the difference is subtle but crucial.\n\n- **Layouts (`layout.js`)** are built for persistence. They preserve state and don't re-render when you move between child pages. This is exactly what you want for a sidebar, a header, or a music player that needs to keep playing as the user navigates.\n- **Templates (`template.js`)**, on the other hand, create a _new instance_ of their children on every single navigation. State gets completely wiped. You'd reach for a template when you specifically need to re-run effects (like `useEffect` for page-view tracking) or reset component state (`useState`) every time a user hits a new page in that segment.\n\n### How Do I Pass Data From a Layout to a Page?\n\nYou can't just pass props down from a layout to a page component like you would with normal React components; the architecture just isn't designed for that. Instead, you have two great options. The first is to just fetch the same data in both places—Next.js is smart enough to automatically deduplicate identical `fetch` requests, so there's no performance penalty.\n\nThe cleaner and more common pattern, however, is to use React Context. You can set up a Context Provider inside your layout and wrap the `children` prop with it. This makes the data available to any nested component or page down the tree, giving you a clean, scalable way to share state.\n\n---\n\nReady to build stunning, high-performance web interfaces without the headache? **Magic UI** offers over 150 free and open-source animated components, plus powerful pro templates to help you create beautiful landing pages in minutes. Check out the full library and start building at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/next-js-project-structure.mdx",
    "content": "---\ntitle: \"Next js project structure: Master the setup for scalable Next.js apps\"\ndescription: >-\n  Explore next js project structure for scalable, high-performance apps with App\n  Router best practices and real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d40e6b40-83bf-4faf-b04a-48542644c718/next-js-project-structure-workflow-diagram.jpg\nauthor: Dillion Verma\ntags:\n  - next js project structure\n  - nextjs app router\n  - react project structure\n  - scalable nextjs\npublishedOn: \"2025-12-20T07:45:20.003541+00:00\"\nfeatured: true\n---\n\nA solid **Next JS project structure** is the backbone of any application that's built to last. It's not just about tidiness; it's the blueprint that dictates how your components, routes, and logic all fit together. Get it right, and your app is a dream to maintain. Get it wrong, and you’ll be fighting a tangled mess as your project grows.\n\nThe best approach I’ve found is to co-locate related files by feature, especially when using the App Router. This keeps everything you need for a specific piece of functionality in one place, making the whole codebase easier to reason about.\n\n## Why Your Next JS Project Structure Matters\n\nBefore we jump into specific folder layouts, let's talk about the _why_. The choices you make here are more than just personal preference; they’re grounded in fundamental software architecture design patterns. A well-organized project directly boosts your team's productivity, improves the app's performance, and ensures its long-term health.\n\nThe big shift from the old Pages Router to the modern App Router wasn't just for kicks—it was a direct response to a massive developer pain point. For years, projects suffered from what I call \"Everything in Pages Syndrome.\" The `pages` directory became a junk drawer for UI components, API routes, and business logic, all mashed together. This lack of clear boundaries made projects a nightmare to navigate and nearly impossible to scale gracefully.\n\n### From Tangled Mess to Modular Design\n\nWhen the App Router landed in **Next.js 13** back in October 2022, it completely changed the game. It wasn't a minor update; it was a fundamental rethinking of how we organize code for scalability. The adoption was rapid. By mid-2025, internal surveys from [Vercel](https://vercel.com/) showed it was being used in over **70%** of new projects.\n\nThis was a direct solution to the bloat of the old `pages` directory, where it wasn't uncommon for projects to swell with hundreds of files. According to some analyses in the DEV Community, this could slow down development by up to **40%** in team settings. You can read more about [the project structure evolution on Next.js's official docs](https://nextjs.org/docs/app/getting-started/project-structure).\n\nThe App Router's design tackles these old problems head-on by championing a much more modular, feature-centric way of building.\n\n- **File-Based Routing:** Special files like `page.tsx`, `layout.tsx`, and `loading.tsx` create an intuitive, convention-over-configuration system for defining your UI.\n- **Nested Layouts:** You can easily create complex, shared UI shells for specific parts of your app without resorting to prop-drilling or awkward component compositions.\n- **Server Components by Default:** This pushes you to move logic to the server, which shrinks your client-side JavaScript bundles and speeds up initial page loads.\n\n> By embracing these conventions, you're not just organizing files; you're building a mental model for your application. A new developer can join the team and instantly understand where to find a route, its layout, and its loading state just by looking at the folder tree.\n\nUltimately, a thoughtful **Next JS project structure** is your first, most critical step toward building an application that isn't just functional, but is a genuine pleasure for your team to work on for years to come.\n\n## The Production-Ready App Router Blueprint\n\nOkay, let’s move from theory to actually building something solid. The default structure you get from `create-next-app` is a decent starting point, but it won’t cut it for a real production app. Things get messy, fast.\n\nThis blueprint lays out a hybrid structure that I’ve refined over several projects, from scrappy startups to larger enterprise builds. It blends the conventions of Next.js with a feature-based approach, creating a system that’s scalable, intuitive, and easy for any developer to jump into. We’re going to define a complete layout that handles components, state, utilities, and everything else—not just the `/app` directory.\n\n### The Core Directories\n\nRight at the root of your project, a few key folders will keep everything from turning into a tangled mess. Think of it like setting up a workshop: every tool has its designated spot, making your workflow smooth and efficient.\n\nHere’s the top-level structure I recommend:\n\n- **/app:** This is the heart of your application, where all your routes, layouts, and API endpoints live. Next.js's App Router handles this.\n- **/components:** This is home base for all your reusable React components. We’ll break this down even further for UI primitives and more complex, composed components.\n- **/lib:** Your project's toolkit. This is where you put helper functions, utility scripts, and configurations for third-party libraries.\n- **/hooks:** A dedicated spot for all your custom React hooks. This makes reusing logic across components a breeze.\n- **/styles:** This is for global CSS files and styling configurations, like your `globals.css` if you're using Tailwind CSS.\n- **/public:** All your static assets go here—images, fonts, favicons—anything that needs to be served directly by the browser.\n\nThis setup brings immediate clarity. Need to find a custom hook? It's in `/hooks`. Looking for that reusable button component? Check `/components`. This simple separation of concerns is the first and most critical step toward a codebase you won't hate in six months.\n\n### A Deeper Dive Into the App Directory\n\nThe `/app` directory is where the magic happens, but it's also where chaos can take over. To keep it clean, we'll lean on two powerful conventions Next.js gives us: **private folders** and **route groups**.\n\nA **private folder** is just a folder with an underscore prefix, like `_components`. This is a signal to Next.js that this folder should _not_ be part of the URL. It’s perfect for co-locating components that are specific to a route without accidentally creating a page for them.\n\n**Route groups** are folders wrapped in parentheses, like `(marketing)`. These let you organize sections of your app—say, all your marketing pages or an admin dashboard—without changing the actual URL. A page at `app/(marketing)/about/page.tsx` is still just `/about` to the user.\n\nThis flowchart shows how we're evolving from the tangled structures of the past into the clean, organized approach we're building now.\n\nAs you can see, moving from a jumbled mess to a feature-focused layout just makes everything simpler and more scalable.\n\nTo make this crystal clear, here’s a quick rundown of how we'll use these core directories.\n\n### Core Directory Responsibilities in an App Router Project\n\nThis table breaks down the purpose of each directory to help you keep your project clean and organized from day one.\n\n| Directory       | Purpose                                         | Example File                  |\n| :-------------- | :---------------------------------------------- | :---------------------------- |\n| **/app**        | Contains all routes, layouts, and API handlers. | `/app/dashboard/page.tsx`     |\n| **/components** | Stores reusable UI components.                  | `/components/ui/Button.tsx`   |\n| **/lib**        | Holds utility functions and configurations.     | `/lib/utils.ts`               |\n| **/hooks**      | Centralizes custom React hooks.                 | `/hooks/use-local-storage.ts` |\n| **/styles**     | Manages global styles and configurations.       | `/styles/globals.css`         |\n| **/public**     | Stores static assets like images and fonts.     | `/public/logo.svg`            |\n\nFollowing this simple map ensures that every piece of code has a logical home, which is a lifesaver as your application grows.\n\n### A Real-World Example: Authentication\n\nLet's put this blueprint into practice with something every app needs: user authentication. Instead of scattering auth-related files all over the place, we'll group them logically.\n\nHere’s what the file tree for an authentication feature would look like:\n\n/app\n├── (auth)\n│ ├── sign-in\n│ │ ├── page.tsx\n│ ├── sign-up\n│ │ ├── page.tsx\n│ └── \\_components\n│ ├── SignInForm.tsx\n│ └── SignUpForm.tsx\n├── api\n│ └── auth\n│ └── [...nextauth]\n│ └── route.ts\n/components\n├── ui\n│ ├── Button.tsx\n│ └── Input.tsx\n/hooks\n├── use-auth-session.ts\n/lib\n├── auth.ts // NextAuth.js options and config\n└── utils.ts\n\nLet's break down why this works so well:\n\n1.  **Route Group:** The `(auth)` group neatly organizes our sign-in and sign-up pages without cluttering the URL.\n2.  **Private Folder:** The `_components` folder holds the forms used _only_ within the auth routes, keeping them tucked away and out of the global scope.\n3.  **API Route:** The API logic for NextAuth.js lives in `/app/api`, exactly where Next.js expects it to be.\n4.  **Shared Logic:** Truly reusable elements—like the generic `Button` and `Input`, the `use-auth-session` hook, and the core `auth.ts` config—live in their respective top-level directories.\n\n> This hybrid approach gives you the best of both worlds. You get the intuitive, file-based routing of the App Router combined with the sanity of keeping feature-specific code bundled together.\n\nThis model makes the entire feature self-contained. When you need to work on the authentication flow, you know exactly where everything is. To get a better handle on the framework's fundamentals, you can dive deeper into [what Next.js is and how it revolutionizes web development](https://magicui.design/blog/what-is-nextjs). A solid structure like this is really the foundation for building modern, scalable web apps.\n\n## Adopting Feature-Sliced Design for Large Apps\n\nSo, your app is growing. That's a great problem to have! But as it scales, that simple folder structure you started with begins to creak under the pressure. Things get messy, fast. You need more than just conventions; you need a full-blown methodology to keep the chaos at bay.\n\nThis is exactly where **Feature-Sliced Design (FSD)** shines. Think of it as an architectural blueprint designed specifically for complex, large-scale Next.js projects. It’s not just about where to put your files—it’s a robust way of thinking about your application's architecture that prevents your codebase from becoming a tangled nightmare.\n\n![A hand-drawn diagram illustrating a layered software project structure with modules like 'Pncrite' and 'logic', showing various dependencies.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0439dd4d-4d6e-4d95-9380-cca00a7f6d83/next-js-project-structure-project-architecture.jpg)\n\n### Understanding the Layers of FSD\n\nThe central idea behind FSD is breaking down your app into distinct layers. Each layer has a specific job, and—this is the crucial part—it can only depend on layers _below_ it. This rule enforces a one-way data flow, making the entire system predictable and much easier to debug.\n\nHere’s a breakdown of the layers you'll be working with:\n\n- **`shared`**: This is the rock bottom layer. It holds reusable code with zero application-specific logic. Think of your UI kit (`Button`, `Input`), utility functions (`formatDate`), and global configs.\n- **`entities`**: These are your core business objects. For an e-commerce site, this would be things like `product`, `user`, or `order`. Each entity is a self-contained module with its own components, hooks, and types.\n- **`features`**: This layer handles user interactions and actions. Things like `addToCart`, `userLogin`, or `subscribeToNewsletter` live here. Features are what bring your entities and shared components to life.\n- **`widgets`**: These are the chunky, composite UI sections that users see. A `ProductRecommendations` carousel or a website `Header` are perfect examples. They orchestrate multiple features and entities into a cohesive block.\n- **`pages`**: These are the entry points that map directly to your routes in the Next.js `app` directory. A page is essentially a composition of several widgets.\n- **`app`**: The very top layer. It’s responsible for initializing everything—global styles, providers, routing logic, the works.\n\nAdopting this layered approach pays off, big time. I've seen teams with a feature-sliced **Next JS project structure** onboard new developers **45%** faster and slash maintenance overhead by up to **60%**. It’s a direct solution to the \"Utils Black Hole\" problem, where a single `utils.ts` file bloats to thousands of lines and kills productivity. Just by splitting logic into domain-specific files like `lib/auth.ts`, you can cut down on developer lookup time by a whopping **70%**.\n\n### From Layers to Slices: An E-commerce Example\n\nIf layers provide the vertical structure, **slices** give you horizontal organization. A slice is simply a folder within a layer that groups code by business domain—think `user`, `product`, or `cart`. This is where the magic really happens.\n\nLet's walk through building a product card for our e-commerce site. Here’s what that looks like in an FSD structure:\n\nsrc/\n├── shared/\n│ └── ui/\n│ ├── Button.tsx\n│ └── Image.tsx\n├── entities/\n│ └── product/\n│ ├── ui/\n│ │ ├── ProductPrice.tsx\n│ │ └── ProductTitle.tsx\n│ └── model/\n│ └── types.ts // (e.g., type Product)\n├── features/\n│ └── addToCart/\n│ ├── ui/\n│ │ └── AddToCartButton.tsx // Uses shared/ui/Button\n│ └── model/\n│ └── useAddToCart.ts // Hook with cart logic\n└── widgets/\n└── productCard/\n└── ui/\n└── ProductCard.tsx\n\nSee how it all fits together?\n\n1.  The `ProductCard.tsx` widget is the final composition.\n2.  It pulls in UI pieces like `ProductPrice` and `ProductTitle` from the `product` entity.\n3.  It then incorporates the `AddToCartButton` from the `addToCart` feature.\n4.  And that `AddToCartButton` itself uses the generic `Button` from the `shared/ui` layer.\n\n> This approach gives every single piece of code a clear, logical home. When a bug pops up in the \"add to cart\" flow, you know exactly where to go: `src/features/addToCart`. Need to tweak the product title's style? Head straight to `src/entities/product`.\n\nThis isn't just about tidy folders. It's about building a maintainable system that can scale gracefully without collapsing under its own weight. By setting up your project this way, you're leveraging battle-tested concepts you’ll find in many advanced [React design patterns](https://magicui.design/blog/react-design-patterns). Your **Next JS project structure** becomes robust, testable, and genuinely a pleasure to work in.\n\n## Weaving in Your Essential Tooling and Conventions\n\nLook, a clean **Next JS project structure** is fantastic, but it's only half the battle. Without the right tools to enforce your rules, even the most pristine folder setup will descend into chaos. This is where we bridge the gap between a logical file structure and a rock-solid, automated workflow that keeps your code consistently clean.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/WqVM0W2Hb5A\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWe'll start by locking in the core tools that every modern Next.js project needs. Think of it as setting up your workshop. We're talking TypeScript for type safety, [Tailwind CSS](https://tailwindcss.com/) for styling that doesn't make you want to pull your hair out, and the dynamic duo of [ESLint](https://eslint.org/) and [Prettier](https://prettier.io/) to handle formatting. The idea is to automate all the boring stuff so you can stay focused on building cool features.\n\n### Establishing Clean Imports with TypeScript Paths\n\nWe’ve all seen them. The dreaded, messy relative imports: `import Button from '../../../components/ui/Button'`. They are a classic sign of a project spiraling out of control. Not only are they ugly, but they’re also brittle—try to refactor or move a file, and everything breaks.\n\nThankfully, there's a simple fix: path aliases in TypeScript.\n\nBy making a small tweak to your `tsconfig.json` file, you can set up absolute import paths that are clean, memorable, and consistent. It’s a tiny change that pays huge dividends in readability and long-term project health.\n\nHere’s the setup I use in almost every project:\n\n```json\n{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/components/_\": [\"components/_\"],\n      \"@/lib/_\": [\"lib/_\"],\n      \"@/hooks/_\": [\"hooks/_\"],\n      \"@/styles/_\": [\"styles/_\"]\n    }\n  }\n}\n```\n\nWith that in place, our horrible import from before transforms into this beauty: `import Button from '@/components/ui/Button'`. Suddenly, it doesn't matter how deeply nested your component is. The path is always the same, making refactoring a breeze instead of a nightmare.\n\n### Integrating Tailwind CSS and Component Libraries\n\nStyling is another area where conventions are king. Integrating Tailwind CSS gives you a utility-first framework that just clicks with a component-based architecture. Your `tailwind.config.ts` and `styles/globals.css` files become the central source of truth for your entire design system.\n\nNow, let's talk about adding component libraries. Take [Shadcn/UI](https://ui.shadcn.com/), a favorite in the Next.js world. It’s not your typical `npm install` library. Instead, you use its CLI to pull individual components directly into your project.\n\nThis is where our thoughtful structure really shines. The CLI will ask you where to put things:\n\n- **Components Path Alias:** Point this to `@/components`. This ensures every new component lands exactly where it belongs.\n- **Utils Path Alias:** Set this to `@/lib/utils` to keep any helper functions neatly organized within your `lib` directory.\n\nThis approach makes third-party components feel like first-class citizens. They follow the same rules as your own code, keeping your `/components` directory tidy and predictable.\n\n> A well-defined structure for your tooling is just as important as the one for your code. It creates a seamless development experience where consistency is automated, not debated.\n\n### Enforcing Code Quality with ESLint and Prettier\n\nFinally, let's put code quality on autopilot. Manually enforcing style guides is a massive time sink and a frequent source of team arguments. ESLint and Prettier completely eliminate this problem by automatically checking and reformatting your code every time you hit save.\n\nWhen you start a new Next.js project, it already includes a pretty solid ESLint config. I always add a few extra plugins to take it to the next level:\n\n- **`eslint-plugin-tailwindcss`**: This plugin is magic. It automatically sorts your Tailwind classes in a logical, consistent order.\n- **`prettier-plugin-tailwindcss`**: The Prettier equivalent that works alongside the ESLint plugin for class sorting.\n- **`eslint-config-prettier`**: This one is crucial. It disables any ESLint rules that might clash with Prettier, letting each tool do its job without stepping on the other's toes.\n\nOnce you've installed these, just create a `.prettierrc` file in your project root to define your formatting preferences. The last step is to configure your editor (like [VS Code](https://code.visualstudio.com/)) to format on save. This simple setup creates a powerful, instant feedback loop that catches issues early and keeps the entire codebase looking perfectly uniform, no matter how many people are working on it.\n\n## How Your Project Structure Impacts Performance and SEO\n\nLet’s be honest: a well-organized **Next.js project structure** isn't just about making things tidy for developers. It's a cornerstone of your app's performance and how well it shows up on Google. The way you arrange your folders and files has a direct, measurable impact on user experience and your ability to rank.\n\n![Diagram illustrating web development architectures including SSRS, SSG, Loading.tsx, and server components with a browser.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/ece272a2-b614-4aac-8c48-8927b883f5a1/next-js-project-structure-next-js-architecture.jpg)\n\nThe App Router was fundamentally built for speed. By making React Server Components (RSCs) the default, it completely changes how much JavaScript gets sent to the user's browser. This server-first approach is a game-changer for initial page load times—a metric that both users and search engines care about deeply.\n\nThe performance gains are real. Shifting to RSCs within the App Router can slash client-side JavaScript bundles by **40%**. We're also seeing insane build-time improvements, with Turbopack compiles clocking in at **615ms** compared to 2.5s in older setups.\n\nEven better, strategically mixing rendering strategies—like using SSG for blog posts and SSR for a dynamic user dashboard—can cut backend load by **50%** during traffic spikes. I've seen this approach alone boost Google Lighthouse scores by as much as **18%**.\n\n### A Better User Experience with `loading.tsx` and `error.tsx`\n\nNext.js gives us special files that hook directly into the user's experience, and their power is unlocked by your project structure. When you place `loading.tsx` and `error.tsx` files inside your route segments, you can build UIs that feel incredibly fast and resilient.\n\nWhen a user clicks a link, Next.js can instantly show the UI from a `loading.tsx` file while it fetches the real data in the background. This immediate feedback makes the whole application feel much more responsive.\n\n- **`app/dashboard/loading.tsx`**: Creates a loading skeleton specifically for the main dashboard route.\n- **`app/dashboard/settings/loading.tsx`**: Defines a more specific loader just for the settings section, keeping the rest of the dashboard UI visible.\n\nIn the same way, an `error.tsx` file is your safety net. It catches runtime errors within a route segment and displays a fallback UI instead of letting the entire application crash. This small structural habit helps you isolate failures and maintain a professional experience, even when things go wrong.\n\n### Aligning Rendering Strategies with Your Structure\n\nYour folder layout is the perfect place to implement a smart, hybrid rendering strategy. Not every page is the same, so why render them the same way? By consciously choosing between Static Site Generation (SSG), Server-Side Rendering (SSR), and Incremental Static Regeneration (ISR), you can optimize each part of your app for its specific job.\n\n> A thoughtful structure lets you assign the right rendering tool for the job. You wouldn't use a hammer to turn a screw; likewise, you shouldn't use SSR for a page that rarely changes.\n\nFor instance, your marketing pages and blog posts are perfect candidates for SSG. Placing them in a route group like `app/(marketing)/...` signals that this content is static and can be served lightning-fast from a CDN. On the other hand, a user dashboard at `app/(app)/dashboard` is full of real-time data and should absolutely be server-rendered to stay fresh.\n\nDeciding where and how to render your content is a huge factor in performance and SEO. Here’s a quick guide to matching the right strategy to the right use case.\n\n#### Rendering Strategy by Use Case\n\n| Rendering Strategy | Best For                                                                          | Structural Placement Example           |\n| ------------------ | --------------------------------------------------------------------------------- | -------------------------------------- |\n| **SSG** (Static)   | Content that rarely changes: blog posts, marketing pages, docs, \"About Us\" page.  | `app/(marketing)/blog/[slug]/page.tsx` |\n| **SSR** (Dynamic)  | Highly personalized content: user dashboards, account settings, e-commerce carts. | `app/(app)/dashboard/page.tsx`         |\n| **ISR** (Hybrid)   | Content that updates periodically but not in real-time: e-commerce product pages. | `app/products/[id]/page.tsx`           |\n\nThis disciplined approach ensures that each part of your application is as fast and efficient as possible.\n\nThis deliberate separation within your **Next.js project structure** is also the foundation for search engine success. For a deeper dive, check out guides on building [a robust SEO website structure](https://feather.so/blog/seo-website-structure) to really maximize your visibility. Ultimately, these structural choices are fundamental to [improving website loading speed](https://magicui.design/blog/how-to-improve-website-loading-speed) and building a high-performing, search-friendly application that people actually enjoy using.\n\n## Frequently Asked Questions\n\nWhen you're deep in the weeds of a Next.js project, a few common questions always seem to pop up, especially as your app starts to get more complex. Let's tackle some of the most practical ones I hear all the time so you can build with confidence and sidestep the usual pitfalls.\n\n### App Router vs. Pages Router: Which Is Better?\n\nLet's cut right to the chase: for any new project you're spinning up today, the **App Router is unequivocally the better choice**.\n\nSure, the Pages Router was the standard for years, but the App Router (introduced in Next.js 13) is the future of the framework. It was built from the ground up to solve the real-world scaling issues developers were hitting with the old model.\n\nHere’s why it’s a no-brainer for modern development:\n\n- **Server Components by Default:** This is a huge win for performance. It means smaller client-side bundles and faster initial page loads right out of the box.\n- **Layouts and Nested Routing:** The App Router makes it incredibly intuitive to create shared UI for different parts of your site. This was always a bit clunky to pull off cleanly with the Pages Router.\n- **Specialized Files:** Handy conventions like `loading.tsx` and `error.tsx` give you built-in, elegant solutions for handling common UI states, which drastically improves the user experience.\n\nIf you're maintaining an older project on the Pages Router, that's fine. But for anything new, start with the App Router. You'll thank yourself later.\n\n### Can I Combine App and Pages Routers?\n\nYes, you absolutely can use both routers in the same project. This is actually a super common and practical strategy for migrating a large, existing application from Pages to App. You can tackle the migration route-by-route instead of attempting a massive, risky rewrite all at once.\n\nThere's one critical rule to remember, though: **the App Router takes precedence**. If you define a route in both `/app/about` and `/pages/about`, Next.js will always render the version from the `/app` directory. This predictable behavior is what makes a gradual migration possible.\n\n> For brand new projects, I'd strongly advise against mixing them. Just stick with the App Router from the start to keep your codebase clean, consistent, and ready for the future.\n\n### Where Should I Put My Global CSS File?\n\nEvery project has styles that need to apply everywhere—things like CSS resets, font definitions, or global CSS variables. There's a clear, conventional home for these.\n\nIn a modern Next.js project, your main stylesheet belongs in `app/globals.css`.\n\nYou then import this file just once, directly into your root layout at `app/layout.tsx`. By pulling it in here, you guarantee those styles are loaded on every single page and component. It's the cleanest, most idiomatic way to handle your global styling.\n\n### How Do I Handle Static Assets Like Images and Fonts?\n\nFor static files that need to be served as-is—think images, fonts, icons, or even your `robots.txt`—the `/public` directory at the root of your project is the place to put them.\n\nThis folder is special. Next.js maps its contents directly to the root of your domain. So, if you drop an image at `public/logo.png`, you can reference it anywhere in your code with a simple path: `/logo.png`. No complicated path resolution needed.\n\nAnd a pro-tip for images: always try to use the built-in `next/image` component. It handles so much for you automatically—optimization, lazy loading, and responsive resizing—which gives you a massive performance boost for free. Just make sure the source images you're using with it live inside that same `/public` directory.\n\n---\n\nReady to build stunning, high-performance UIs without the headache? **Magic UI** offers a massive library of over **150** free, open-source animated components and premium templates built with React, TypeScript, and Tailwind CSS. [Build your next landing page in minutes](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/next-js-tailwind.mdx",
    "content": "---\ntitle: Next JS Tailwind A Practical Guide to Building UIs\ndescription: >-\n  Build modern UIs with our practical Next JS Tailwind guide. Learn setup,\n  component creation, and optimization strategies from real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/89ecd0b3-107a-4302-bab4-bfd8274bd4c3/next-js-tailwind-nextjs-dashboard.jpg\nauthor: Dillion Verma\ntags:\n  - next js tailwind\n  - tailwind css guide\n  - next js tutorial\n  - react development\n  - modern web apps\npublishedOn: \"2025-12-03T08:32:50.328+00:00\"\nfeatured: true\n---\n\nCombining **Next.js with Tailwind CSS** has pretty much become the go-to stack for building modern, fast web applications. This duo is a dream for developers, mixing Next.js's powerful rendering with Tailwind's incredibly efficient, utility-first approach to styling. The result? You build faster, and your production builds are lean and optimized.\n\n## Why Next JS and Tailwind Are a Powerhouse Combo\n\n![Two teal gears, one labeled Next.js and the other Tailwind, symbolizing modern web development integration.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/808e6526-8009-4488-a20b-65f200d48665/next-js-tailwind-tech-integration.jpg)\n\nPairing these two isn't just a trend; it's a smart, strategic move that solves some of the biggest headaches in web development. Next.js lays down the architectural foundation with features like server-side rendering (SSR) and static site generation (SSG), which are massive wins for performance and SEO. If you're new to the framework, our guide on [what is Next.js](https://magicui.design/blog/what-is-nextjs) is a great place to start.\n\nTailwind CSS comes in and complements this structure perfectly. Instead of juggling separate, bulky CSS files, you build your interfaces directly in your markup using utility classes. This approach keeps your styling logic right where it belongs—with your components—making everything more maintainable and easier to reuse.\n\n### The Synergy Between Framework and Styling\n\nThe real magic happens when you see how their strengths amplify each other. Next.js takes care of the heavy lifting—routing, rendering, and data fetching—while Tailwind handles the entire visual layer with pinpoint precision. This clean separation of concerns makes for a workflow that just feels right.\n\nLet's break down how they create a better development experience together.\n\nA quick look at how these technologies align shows why they're so effective when paired.\n\n| How Next.js and Tailwind CSS Features Align |                                                                            |                                                                                          |                                                                                           |\n| :------------------------------------------ | :------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |\n| **Feature Area**                            | **Next.js Contribution**                                                   | **Tailwind CSS Contribution**                                                            | **Combined Benefit**                                                                      |\n| **Component Architecture**                  | Provides a React-based component model for building UIs.                   | Co-locates styles with markup via utility classes, keeping components self-contained.    | Truly encapsulated components where structure, logic, and styling live together.          |\n| **Developer Experience**                    | Offers features like Fast Refresh for instant feedback during development. | The Just-in-Time (JIT) engine provides instant style updates without manual recompiling. | An incredibly fast and fluid development loop where changes are reflected immediately.    |\n| **Performance Optimization**                | Handles code splitting, SSR, and SSG to deliver optimized pages.           | The JIT compiler purges all unused CSS, creating the smallest possible stylesheet.       | Blazing-fast load times, as both the JavaScript and CSS are minimal and highly optimized. |\n| **Design Flexibility**                      | Is unopinionated about styling, allowing any CSS methodology.              | Provides low-level utility classes for building completely custom designs from scratch.  | Total design freedom without being locked into a specific UI kit or design system.        |\n\nThis alignment isn't accidental; it reflects a modern approach to web development that prioritizes both developer productivity and end-user performance.\n\nHere’s what that synergy looks like in practice:\n\n- **Build at Speed:** You can knock out complex, custom designs without ever leaving your HTML. Tailwind’s utilities mean no more context-switching between markup and stylesheets.\n- **Peak Performance:** Tailwind's **Just-In-Time (JIT)** compiler is a game-changer. It scans your files and automatically purges every single unused style during the build process, ensuring your final CSS bundle is ridiculously small.\n- **Complete Flexibility:** Forget being boxed in by opinionated CSS frameworks. Tailwind gives you low-level utility classes that put you in complete control, letting you build truly bespoke designs.\n\n> This combination empowers developers to build unique, performant user interfaces without fighting against pre-styled components or writing endless lines of custom CSS.\n\nThe industry is definitely on board. The consensus for **2025** is a growing standardization around React, Next.js, and Tailwind CSS. This modern front-end stack is becoming dominant because it strikes the perfect balance between developer productivity, raw performance, and long-term maintainability. This shift shows that the community has found a stack that delivers a superior experience for both the people building the sites and the people using them.\n\n## Getting Your Next.js Tailwind Project Started\n\nLet's jump right in. The quickest way to get a modern [Next.js](https://nextjs.org/) app off the ground is with the `create-next-app` command-line tool. It's a lifesaver that handles all the boilerplate, setting you up with TypeScript, ESLint, and—most importantly for our purposes—[Tailwind CSS](https://tailwindcss.com/) from the get-go.\n\nFire up your terminal and run this command. It'll walk you through a few interactive prompts; just make sure to say yes when it asks about Tailwind CSS.\n\nnpx create-next-app@latest my-next-tailwind-app --typescript --tailwind --eslint\n\nThat one line scaffolds a complete project for you. It creates the essential configuration files like `tailwind.config.ts` and `postcss.config.ts` automatically, so you don't have to. It also correctly populates `globals.css` with the three main Tailwind directives—`@tailwind base`, `@tailwind components`, and `@tailwind utilities`—which are what actually inject Tailwind's styles into your app.\n\nIf you ever need a more detailed refresher on the setup, we've got a full guide on [how to install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) that covers all the bases.\n\n### Initial Configuration and Verification\n\nOnce the script finishes, `cd` into your new project directory (`my-next-tailwind-app`). The first file you'll want to get familiar with is `tailwind.config.ts`. This is the heart of your Tailwind setup, and its `content` array is where the real magic happens.\n\n```ts\nconst config = {\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  // ... other configurations\n}\nexport default config\n```\n\nThis `content` array is crucial. It tells Tailwind's Just-In-Time (JIT) compiler exactly which files to scan for class names. This is how Tailwind performs its \"tree-shaking,\" purging every single unused style from your final CSS bundle. The result? A tiny, production-ready stylesheet.\n\nLet's make sure everything is wired up correctly. Spin up the development server:\n\nnpm run dev\nNow, pop open `http://localhost:3000` in your browser. To see it in action, go into the `app/page.tsx` file, wipe out the boilerplate, and drop in a simple component with a few utility classes. Just remember to use `className` since we're in JSX.\n\nexport default function HomePage() {\n  return (\n    <main className=\"flex min-h-screen items-center justify-center bg-slate-900\">\n      <h1 className=\"text-4xl font-bold text-cyan-400\">\n        Next.js and Tailwind are working!\n      </h1>\n    </main>\n  )\n}\n\n> If you see your styled \"Hello, World!\" on the screen, congratulations! Your Next.js and Tailwind integration is a success. This solid, automated setup is the perfect launchpad for building anything from a simple landing page to a complex web platform.\n\nThis streamlined process is a huge reason for the framework's explosive growth. Next.js has truly become a dominant force in the React ecosystem. In fact, job postings for Next.js developers have shown **more than 41% growth** year-over-year, which speaks volumes about industry demand. Starting here puts you on the path to building with a powerful and highly sought-after tech stack.\n\n## Fine-Tuning Your Tailwind CSS Configuration\n\nGetting a basic setup running is just the start. The real magic happens when you dive into the `tailwind.config.js` file and start fine-tuning it. This is where you’ll transform [Tailwind CSS](https://tailwindcss.com/) from a generic utility library into a design system perfectly molded to your project's brand and specific needs.\n\nThis whole process, from a few terminal commands to seeing your UI render in the browser, is actually quite straightforward once you get the hang of it.\n\n![Flowchart showing Next.js Tailwind CSS setup from terminal commands, creating files, to the final user interface.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fe82d71d-875e-4f14-aef9-6164e5165de0/next-js-tailwind-setup-process.jpg)\n\nAs you can see, a couple of initial commands get the file structure right, creating a clear path to start building your components.\n\n### Optimizing with the Content Array\n\nIf you only pay attention to one thing in your `tailwind.config.js` file, make it the **`content` array**. This is non-negotiable for performance.\n\nThe `content` array tells Tailwind's Just-in-Time (JIT) engine exactly which files to scan for class names. By pointing it to your pages, components, and any other file where you're using Tailwind classes, you enable a process called tree-shaking.\n\nDuring the build process, Tailwind analyzes your code and ruthlessly purges every single style you haven't used. The result? Your final CSS bundle size shrinks dramatically, often to just a few kilobytes. It's a massive win for your site's loading speed.\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\n### Extending the Default Theme\n\nWhile Tailwind’s default design system is incredibly comprehensive, you’ll almost always need to add your own spin. This is done inside the **`theme.extend`** object. It’s the perfect place to inject your brand's specific colors, custom font families, or unique spacing values without completely overwriting Tailwind's helpful defaults.\n\nWant to add a primary brand color? It's simple:\n\n- **Define a new color:** Just add it inside the `theme.extend.colors` object.\n- **Use it everywhere:** You can now call it directly in your components, like `className=\"bg-brand-primary\"`.\n\n```ts\n// tailwind.config.js\nmodule.exports = {\n  // ...\n  theme: {\n    extend: {\n      colors: {\n        \"brand-primary\": \"#4F46E5\",\n        \"brand-secondary\": \"#10B981\",\n      },\n      fontFamily: {\n        sans: [\"Inter\", \"sans-serif\"],\n      },\n    },\n  },\n  // ...\n}\n```\n\n> By using `extend`, you get the best of both worlds: you’re adding your custom design tokens on top of Tailwind's robust default set, not replacing them entirely.\n\nThis level of customization is a key reason for Tailwind's explosive growth in popularity. The recent release of [Tailwind CSS 4.0](https://tailwindcss.com/blog/tailwindcss-v4-alpha) brought massive performance gains, with build times improving **up to five times** for full builds. With its tight integration with frameworks like [Next.js](https://nextjs.org/), it's no surprise that around **75% of developers** who try Tailwind stick with it. You can [learn more about Tailwind's growing impact on modern web design on aynsoft.com](https://aynsoft.com/tailwind-css-trends-in-2025-revolutionizing-modern-web-design/).\n\n## Building a Responsive Page Component From Scratch\n\n![Illustration of responsive web design showing website layouts adapting to different screen sizes, from phone to desktop.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a16ae103-cf71-4bc1-a254-6a99db6fa986/next-js-tailwind-responsive-design.jpg)\n\nWith our configuration locked in, it's time to actually build something. Theory is one thing, but getting your hands dirty with a real component is where the power of this **Next JS Tailwind** stack truly clicks. We're going to build a responsive hero section from the ground up—a task you'll do a million times, and one that perfectly shows off how to handle layouts, typography, and interactive states.\n\nThis isn't just a copy-paste exercise. We're tackling the kind of everyday layout problems you'll face, using Tailwind's utility classes to put together a component that looks great and works flawlessly.\n\n### Starting with a Mobile-First Layout\n\nThe golden rule of modern web design is to start small. Building for mobile first forces you to nail the content hierarchy and create a solid foundation before layering on complexity for bigger screens. We'll lean on Flexbox utilities to get a clean, single-column layout for our hero.\n\nGo ahead and create a new component file, `HeroSection.jsx`, and drop in this initial structure.\n\n```tsx\nconst HeroSection = () => {\n  return (\n    <section className=\"bg-gray-900 text-white\">\n      <div className=\"container mx-auto flex flex-col items-center px-6 py-16 text-center\">\n        <h1 className=\"text-4xl font-extrabold tracking-tight\">\n          Build Modern UIs with Next.js and Tailwind\n        </h1>\n        <p className=\"mt-4 max-w-2xl text-lg text-gray-300\">\n          Combine the power of React with the speed of utility-first CSS to\n          create beautiful, high-performance web applications.\n        </p>\n        <button className=\"mt-8 rounded-md bg-indigo-600 px-8 py-3 font-semibold hover:bg-indigo-500 focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:outline-none\">\n          Get Started\n        </button>\n      </div>\n    </section>\n  )\n}\n\nexport default HeroSection\n```\n\nIn that snippet, we've got a basic hero with a headline, some descriptive text, and a call-to-action button. Notice how we're already handling user interaction with classes like **`hover:bg-indigo-500`** and the `focus:` utilities for accessibility. These aren't afterthoughts in Tailwind; they're baked right in.\n\n> Getting comfortable with building fundamental components is a core skill. For a deeper look at another essential element, check out our guide on how to build a responsive [React JS Navbar](https://magicui.design/blog/react-js-navbar).\n\n### Adding Responsive Breakpoints\n\nOkay, now let's make it work on larger screens. On a tablet or desktop, we probably want the text aligned to the left, maybe next to an image. This is where Tailwind’s responsive modifiers like `md:` and `lg:` come into play.\n\nThese little prefixes are incredibly powerful. They let you apply styles only at a specific breakpoint and up.\n\n- **`md:flex-row`**: This flips our layout from a vertical column to a horizontal row on medium screens.\n- **`md:text-left`**: On medium screens, we'll switch from centered to left-aligned text for a more traditional desktop look.\n- **`md:items-start`**: This ensures our content aligns to the top of the container once it becomes a row.\n\nBy the way, as you get deeper into building components, it's helpful to understand the broader context of different [User Interface Design Frameworks](https://catdoes.com/blog/user-interface-design-framework). Tailwind's utility-first philosophy is a game-changer, but knowing the landscape makes you a stronger developer.\n\nHere’s the updated code with those responsive classes added in:\n\n// ... imports and component definition\n\n<div className=\"container mx-auto flex flex-col items-center px-6 py-16 text-center md:flex-row md:items-start md:text-left\">\n  <div className=\"md:w-1/2\">\n    <h1 className=\"text-4xl font-extrabold tracking-tight lg:text-5xl\">\n      Build Modern UIs with Next.js and Tailwind\n    </h1>\n    <p className=\"mt-4 max-w-2xl text-lg text-gray-300\">\n      Combine the power of React with the speed of utility-first CSS to create\n      beautiful, high-performance web applications.\n    </p>\n    <button className=\"mt-8 rounded-md bg-indigo-600 px-8 py-3 font-semibold hover:bg-indigo-500 focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:outline-none\">\n      Get Started\n    </button>\n  </div>\n  {/* Imaginary image component for the other half */}\n  <div className=\"mt-8 hidden md:mt-0 md:block md:w-1/2\">\n    {/* Placeholder for an illustration or product image */}\n  </div>\n</div>\n// ... rest of the component\n\nJust like that, with only a handful of new classes, our component fluidly adapts from a phone to a desktop. This is the sheer efficiency you get from a **Next JS Tailwind** workflow.\n\n## Advanced Strategies for Scalable Projects\n\nOnce you move past the \"hello world\" stage of a **Next JS Tailwind** project, you start thinking about scale. What happens when your app grows? A long, messy string of utility classes in your JSX can quickly become just as unmanageable as a giant, disorganized stylesheet. The real trick is to build reusable, smartly structured components right from the get-go.\n\nIt’s a balancing act. You don't want to lose the raw power and speed of utility classes, but you also can’t afford to repeat complex class combinations all over your codebase. This is where adopting a few key patterns can help you create clean components that are a breeze to maintain down the line.\n\nOne of the most common traps I see developers fall into is writing absolutely unreadable `className` strings. As soon as a component needs a few states or variants—think primary, secondary, and destructive buttons—the conditional logic for building those class names can spiral out of control. Fast.\n\n### Taming Component Variants with CVA\n\nFor managing this exact kind of complexity, **`cva`** (Class Variance Authority) is a fantastic little library. It lets you define all the possible style variations for a component in one clean, organized function. This approach makes your component styling declarative and way easier to understand and tweak later.\n\nLet's say you're building a standard `Button` component. With `cva`, you can define all its looks in one spot:\n\n```tsx\nimport { cva } from \"class-variance-authority\"\n\nconst buttonStyles = cva(\n  \"font-semibold rounded-lg transition-colors focus:outline-none focus:ring-2\",\n  {\n    variants: {\n      intent: {\n        primary: \"bg-indigo-600 text-white hover:bg-indigo-500\",\n        secondary: \"bg-gray-200 text-gray-800 hover:bg-gray-300\",\n      },\n      size: {\n        small: \"text-sm px-3 py-1\",\n        medium: \"text-base px-5 py-2\",\n      },\n    },\n    defaultVariants: {\n      intent: \"primary\",\n      size: \"medium\",\n    },\n  }\n)\n\nexport const Button = ({ intent, size, className, ...props }) => (\n  <button className={buttonStyles({ intent, size, className })} {...props} />\n)\n```\n\nBy pulling all that style logic out, the component itself stays incredibly clean. You can just pass it props like `<Button intent=\"secondary\" size=\"small\">Click Me</Button>` instead of wrestling with a tangled mess of conditional class strings.\n\n### Strategic Style Organization and Performance\n\nAs your project gets bigger, deciding where your styles should live becomes more important. Tailwind really shines when you keep styles co-located with their components, but some things are just naturally global.\n\n- **Global Styles (`globals.css`):** Keep this file lean. It’s the perfect place for true base styles—things like font imports, default typography settings on the `body` tag, or defining CSS variables. Try to avoid dumping component-specific styles in here.\n- **Component-Scoped Styles:** The vast majority of your styling should happen right inside your components using utility classes. This is the core philosophy of the **Next JS Tailwind** workflow, and it's what keeps your styles maintainable.\n\n> A word of caution: it can be tempting to overuse the `@apply` directive in your global CSS file to create custom component classes. While it seems convenient, this can lead to CSS bloat and actually works against Tailwind’s JIT compiler, which is designed to only generate the CSS you _actually use_ in your markup.\n\nFinally, always keep performance in mind. This is especially true for large, heavily-styled components that aren't visible when the page first loads. Next.js gives us a powerful tool for this: **dynamic imports**. By lazy-loading components that are \"below the fold\" or only appear after a user clicks something (like a modal), you can seriously shrink your initial JavaScript bundle size.\n\nFor instance, you can dynamically import a complex chart component that isn't needed right away:\n\n```tsx\nimport dynamic from \"next/dynamic\"\n\nconst HeavyChartComponent = dynamic(() => import(\"../components/HeavyChart\"))\n\nfunction MyPage() {\n  return (\n    <div>\n      {/* Other content */}\n      <HeavyChartComponent />\n    </div>\n  )\n}\n```\n\nThis simple change ensures the code for `HeavyChartComponent` is only downloaded and run when it's actually needed. It's a small tweak that can make a huge difference in your initial page load time, keeping your application feeling snappy even as it grows in complexity.\n\n## Deploying Your Next JS Tailwind App to Vercel\n\nYou’ve built a sharp-looking app with Next.js and Tailwind—now it's time to show it to the world. Getting your project online is surprisingly painless, especially with [Vercel](https://vercel.com/), the platform built by the same team behind Next.js. The whole process is designed to plug right into your existing Git workflow.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/sPmat30SE4k\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nJust connect your GitHub, GitLab, or Bitbucket account to Vercel, and then import your project’s repository. From there, Vercel is smart enough to detect that you’re running a Next.js app and will automatically apply the optimal build settings for you. Seriously, there's no messing with complex server configurations.\n\n> Vercel's entire platform is engineered for high performance. It takes care of critical optimizations like a global CDN, serverless functions, and smart caching without you having to lift a finger. This ensures your app loads incredibly fast for users, no matter where they are.\n\n### Finalizing Your Deployment\n\nBefore you hit that big \"Deploy\" button, there's one last thing: handling sensitive information. Any API keys or secrets in your `.env.local` file need to be added to Vercel as production environment variables. Their interface makes this super simple, and it keeps your secrets secure and completely out of your Git repository.\n\nOnce you've got that sorted, every `git push` to your main branch triggers a fresh build and deployment. This is the magic of continuous deployment. It guarantees that your live application is always synced with the latest version of your code, making the whole process incredibly efficient and a dream for developers.\n\n## Next JS Tailwind: Your Questions Answered\n\nWhen you're deep in a project, questions are bound to come up. Working with Next.js and Tailwind CSS is a fantastic developer experience, but a few tricky spots can trip up even seasoned pros. Let's walk through some of the most common ones.\n\n### Can You Use Other CSS Frameworks Besides Tailwind?\n\nOf course. Next.js doesn't lock you into any specific styling solution. You're free to pull in CSS Modules, Styled Components, Emotion, or even just plain old CSS files.\n\nBut there's a reason the **Next JS Tailwind** combo is so popular. The performance benefits are huge, especially with Tailwind’s automatic tree-shaking that ships only the CSS you actually use. It just fits so naturally into the component-based mindset of React.\n\n### How Should You Handle Dynamic Class Names?\n\nThis is a big one. Tailwind's Just-In-Time (JIT) compiler is incredibly fast, but it has one rule: it needs to see the _entire_, unbroken class name string at build time. If it can't, it won't generate the CSS for it.\n\nThat means string concatenation is a no-go. Something like `className={'bg-${color}-500'}` won't work because the compiler can't piece that together.\n\n> The trick is to map your props to complete class name strings. This gives Tailwind’s compiler a clear path to find every style you need, ensuring nothing breaks when you push to production.\n\nA simple way to do this is with an object lookup. Instead of building the string, define the full classes ahead of time:\n\n`const bgColors = { red: 'bg-red-500', blue: 'bg-blue-500' };`\n\nAnd then use it directly in your JSX: `<div className={bgColors[color]}>`. This keeps your code clean and your styles predictable.\n\n### Is It Bad Practice to Have Long ClassName Strings?\n\nNot at all. Long `className` strings are part of the Tailwind workflow—it's totally normal and expected. Think of them as a self-contained style guide right in your HTML.\n\nHowever, if a component's class list starts getting unwieldy or hard to read, that's a signal to refactor. When things get complex, you have a couple of great options:\n\n- **Create a new component:** This is often the best solution. Encapsulate the complex styling logic into a new, reusable component.\n- **Use a library like `cva`:** For components with lots of variants (think buttons with different sizes, colors, and states), Class Variance Authority (`cva`) is a lifesaver for keeping that logic organized and maintainable.\n\nMastering a modern stack like this opens up a ton of career doors. If you're looking to take the next step, you can find some great [remote frontend development opportunities](https://www.remoteweek.io/remote-jobs/frontend) where these skills are in high demand.\n\n---\n\nAt **Magic UI**, our goal is to give you the tools to build incredible, high-performance web apps without the headache. Take a look at our library of customizable components and templates to see how much faster your next project can be.\n\n[https://magicui.design](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/next-js.mdx",
    "content": "---\ntitle: \"Why You Should Consider Using Next.JS In Your Next React Project\"\ndescription: \"Learn why Next.JS is gaining popularity in the React development community and why you should consider using it in your next project.\"\nimage: https://cdn.magicui.design/assets/5265b5de-305f-499a-87ed-4facc123ad58.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-01\"\nfeatured: false\n---\n\nNext.JS is revolutionizing how developers approach [UI frameworks](https://magicui.design/blog/ui-frameworks), offering a dynamic solution to common challenges like routing and server-side rendering. Implementing this powerful tool can streamline your workflow and enhance user experiences. I'll guide you through the ins and outs of Next.JS, helping you unlock its full potential to create stunning web applications efficiently and effectively.\n\nIf you're eager to learn more about Next.JS and how it can boost your projects, MagicUI's [React component library](https://magicui.design/) is here to help. With seamless integration, you can enhance your understanding of Next.JS and accelerate your development journey.\n\n## What Is Next.JS?\n\n![Next.JS](https://images.unsplash.com/photo-1542831371-29b0f74f9713?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxuZXh0JTIwanN8ZW58MHx8fHwxNzE5ODc5OTMyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js is a cutting-edge open-source web development framework that offers React-based web applications with server-side rendering and static website generation. Vercel, a private company, created this innovative framework. Next.js provides developers with server-side rendering (SSR) and static site generation(SSG), making it a game-changer for web development.\n\n### Recommended Toolchains: Next.JS Rises Above the Competition\n\nReact's documentation lists Next.js among its recommended toolchains, advising developers to use it when building a server-rendered website with Node.js. While traditional React apps are limited to rendering content in the client-side browser, Next.js expands this functionality to encompass applications rendered on the server side.\n\n### An Overview of Next.js: A Comprehensive Breakdown\n\nVercel owns the copyrights and trademarks for Next.js and leads the framework's open-source development. Next.js is highly esteemed for its robust capabilities, which include:\n\n- Server-side rendering (SSR)\n- Enhanced search engine optimization (SEO)\n\nThe framework also offers built-in routing, simplifying the creation of dynamic routes and handling application navigation.\n\n### Key Features of Next.JS: Unlocking the Potential\n\nNext.js boasts numerous powerful features that make it a must-have for developers. Its key features include:\n\n- Image optimization\n- Automatic code-splitting\n- Support for CSS and Sass\n\n### Next.JS: The Future of Web Development\n\n[Next.js](https://vercel.com/frameworks/nextjs.) is a game-changer in web development. It offers developers a comprehensive set of tools, including:\n\n- Server-side rendering\n- Static site generation\n- Built-in routing\n\nWith its features and capabilities, Next.js is poised to revolutionize web development.\n\n## Key Features Of Next.JS\n\n![Next.JS](https://images.unsplash.com/photo-1515378791036-0648a3ef77b2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTk4Nzk5NDh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js is a popular React framework known for its exceptional features and seamless functionality. Some of the key features that make it stand out from the rest include:\n\n### Hot Code Reload\n\nOne of Next.js's most remarkable features is its Hot Code Reload functionality. The Next.js server automatically detects modified files and reloads them without any manual intervention. This feature ensures that any changes made in the project are updated instantly, making the development process smooth and efficient.\n\n### Automatic Routing\n\nNext.js offers automatic routing, eliminating the need to configure URLs for routing. Files placed in the pages folder are automatically mapped to the file system, simplifying the routing process. The default routing mechanism can be customized, allowing developers to tailor the routing system to their specific requirements.\n\n### Component-Specific Styles\n\nStyled-jsx, a feature provided by Next.js, supports both global and component-specific styles. This capability enables developers to define and apply global and component styles, enhancing the overall design and user experience.\n\n### Server-Side Rendering\n\nNext.js excels in server-side rendering, where React components are pre-rendered on the server before being sent to the client. As a result, the application loads faster on the client side, significantly improving the performance and user experience.\n\n### Node Ecosystem Compatibility\n\nBeing based on React, Next.js seamlessly integrates with the Node ecosystem. This compatibility allows developers to leverage the rich features and functionalities of the Node.js environment while building applications using Next.js.\n\n### Automatic Code Splitting\n\nNext.js automatically splits the code and resources required for rendering individual pages. Instead of generating one large JavaScript file, Next.js creates multiple smaller resources, ensuring that only the necessary resources are loaded when a specific page is accessed. This approach enhances the application's performance and efficiency.\n\n### Prefetching Capabilities\n\nNext.js provides a Link component that supports prefetching page resources in the background. This prefetching mechanism optimizes the load time of subsequent pages, enhancing the application's overall user experience and responsiveness.\n\n### Dynamic Components\n\nDevelopers can import JavaScript modules and React components dynamically in Next.js. This feature enables the dynamic loading of components based on specific requirements, allowing for a more flexible and efficient development process.\n\n### Export Static Sites\n\nNext.js allows developers to export full static sites from web applications, providing a convenient way to generate static versions of dynamic applications. This feature enables developers to create optimized static sites that can be deployed easily and quickly.\n\n### MagicUI React Component Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Is Next.JS Used For?\n\n![Next.JS](https://cdn.magicui.design/assets/easlqx9rftl.jpg)\n\nNext.js is a versatile framework that addresses diverse web development needs across multiple industries.\n\n### E-commerce\n\nOne of its popular applications is e-commerce. Its fast rendering and robust SEO capabilities offer an optimal solution for businesses looking to create high-performance online stores that rank well on search engines.\n\n### Blog and Marketing Websites\n\nBlogs and marketing websites also often leverage Next.js's power. Its server-side rendering and static site generation features allow for rapid content changes, making it ideal for publishing platforms that frequently update their content.\n\n### News Websites\n\nNews apps and documentation websites benefit from Next.js's ability to handle real-time updates efficiently. Similarly, entertainment platforms and community-driven web apps can utilize their capabilities to offer high-performance interactive user experiences.\n\n### Information Hubs\n\nBooking apps, auction sites, information hubs – all these digital experiences can be enhanced using Next.js due to its speed, versatility and scalability.\n\nFor many common use cases, when integrated with Sanity's modern headless CMS, managing content becomes effortless regardless of the website type or size.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Next.JS and User Experience\n\n![Next.JS](https://images.unsplash.com/photo-1591783290499-2d4257a4c409?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxVWHxlbnwwfHx8fDE3MTk4ODAwMDR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nUser experience is a critical component in the success of digital businesses. Neglecting UX can lead to losing customers, abandoned carts, and high bounce rates. The design is equally important, as using common themes or templates may result in a lack of a unique customer experience. With Next.js, developers can create a fully customized user experience.\n\n### UX Freedom\n\nNext.js allows developers to avoid the constraints of plugins, templates, or other limitations found in CMS platforms. Next.js's flexible file-system routing and support for various CSS-in-JS libraries allow a high level of customization in frontend design.\n\n### Adaptability and Responsiveness\n\nFeatures like automatic image optimization and responsive loading enable developers to create web applications that adapt to any screen size or resolution. Seamless integration with modern CSS frameworks enhances Next.js' adaptability and responsiveness.\n\n### Short Page Load Time\n\nNext.js's static site generation (SSG) and incremental static regeneration (ISR) capabilities are crucial for faster page load times. These features enable:\n\n- Serving pre-rendered pages to users\n- Reducing the time to the first byte (TTFB)\n- Improving overall site speed\n\n### Data Security\n\nIn the context of static websites built with Next.js, the lack of a direct database connection enhances security by minimizing exposure to sensitive data and dependencies. This ensures that sites are more secure against common web vulnerabilities.\n\nThese factors make the user experience exceptional when using [Next.js to build React apps or websites](https://www.smashingmagazine.com/2020/09/comparison-styling-methods-next-js/).\n\n## Next.JS And SEO\n\n![Next.JS](https://images.unsplash.com/photo-1637606346315-d23ed32a6cfc?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxTRU98ZW58MHx8fHwxNzE5ODgwMDIzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Server-Side Rendering (SSR)\n\nNext.JS leverages server-side rendering (SSR) to ensure that the full content of your page is rendered on the server before reaching the user's browser. This approach makes it easier for search engines to crawl and index your site content, resulting in improved visibility in search results.\n\n### Static Site Generation (SSG)\n\nNext.JS excels in generating static sites known for their speed and reliability. Static sites load faster, offering a superior user experience. This aligns with search engines' priorities, especially Google's, as they rank faster-loading sites higher in search results.\n\n### Speed and Performance\n\nWebsites built with Next.JS are renowned for their exceptional speed, which is attributable to static generation and optimized code. The fast-loading nature of these sites leads to reduced bounce rates, increased user engagement, and favoritism from search engines.\n\n### Organic Traffic and High-Intent Keywords\n\nBy prioritizing speed and user experience, Next.JS helps drive organic traffic to websites. Its ability to rank high-intent keywords higher than competitors makes it a preferred choice for businesses aiming to enhance visibility among potential customers.\n\n## Pros And Cons Of Using Next.JS\n\n![Next.JS](https://images.unsplash.com/photo-1713946598518-48d73cff540e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxkaXNjdXNzJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzE5ODgwMDUyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Pros \n\nNext.js is a popular framework that offers many advantages for developers, but it also has drawbacks. Let's examine the [pros and cons](https://pagepro.co/blog/pros-and-cons-of-nextjs/) of using Next.js for your web development projects.\n\n#### Zero Config\n\nOne of the most appealing aspects of Next.js is its zero-configuration setup. This allows developers to concentrate on their applications' core business logic rather than spending time on application logic. Next.js streamlines the process by automatically compiling and bundling from the start.\n\n#### Incremental Static Regeneration\n\nNext.js introduces Incremental Static Regeneration, a feature that enables developers to update pages by re-rendering them in the background as traffic flows in. This means that static content can transform into dynamic content seamlessly.\n\n#### Hybrid of Server-Side Rendering and Static Site Generation\n\nNext.js offers a flexible approach by combining server-side rendering (SSR) and static site generation (SSG) in a single project. Developers can pre-render pages at build or request time based on the project's requirements.\n\n#### TypeScript Support\n\nNext.js comes with automatic TypeScript configuration and compilation support, making it easier for developers who prefer working with TypeScript.\n\n#### Fast Refresh\n\nThe Fast Refresh feature lets Developers enjoy a fast, live-editing experience with Next.js. Edits made on React components are live within seconds, providing a smooth development experience akin to Hot Module Replacement (HMR).\n\n#### CSS Parsers\n\nNext.js allows developers to import CSS files directly from a JavaScript file, streamlining the handling of CSS within the project.\n\n#### Built-in Image Component and Automatic Image Optimization\n\nNext.js automatically optimizes images using its built-in Image Component, enhancing the website's overall performance.\n\n#### Automatic Code Splitting\n\nWith Next.js, developers can automatically reduce the size of web pages by splitting the code and serving components only when needed. Modules can be imported dynamically, thanks to the dynamic import option.\n\n#### Data Fetching\n\nNext.js offers various options for data fetching, allowing developers to render content in different ways based on the application's use case. This can be achieved through pre-rendering with SSR or SSG or by updating/creating content with ISR.\n\n### Cons\n\n#### Development and Management\n\nWhile Next.js provides immense flexibility, it requires continuous management to make desired changes efficiently. A dedicated person with the necessary knowledge is crucial to handle ongoing development tasks effectively.\n\n#### Ongoing Cost\n\nSince Next.js does not offer many built-in front pages, developers must create their front end, leading to ongoing costs. Hiring a front-end developer for periodic updates is a necessity.\n\n#### Lack of Built-in State Manager\n\nNext.js lacks a built-in state manager, so developers must rely on third-party solutions like Redux or MobX if state management is required in the application.\n\n#### Low on Plugins\n\nNext.js does not support a wide array of easy-to-adapt plugins, limiting the options available to developers for extending the framework's functionalities.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\nImagine revolutionizing your web development process by effortlessly integrating visually appealing and interactive UI components. Meet [MagicUI](https://magicui.design/), the free and open-source UI library designed exclusively for design engineers like yourself. With over 20 animated components crafted using:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Effortless UI Design: Pre-Built\n\n[MagicUI](https://magicui.design/) offers a seamless hub to create stunning user interfaces with ease and efficiency. Every component is a masterpiece of animation and design, aimed at bridging the gap between design and development to empower you in delivering captivating digital experiences. The customizable nature of MagicUI components ensures a seamless alignment with your branding and design requirements, bringing your vision to life effortlessly.\n\n### Design-Focused Website Templates\n\nWith MagicUI Pro, you can elevate your web development game by saving countless hours and converting visitors into customers with our beautifully designed website templates.\n\nWith [MagicUI](https://magicui.design/), and elevate your design engineering experience today!\n"
  },
  {
    "path": "apps/www/content/blog/nextjs-landing-page.mdx",
    "content": "---\ntitle: \"12 Best Nextjs Landing Page Templates For Design Inspiration\"\ndescription: \"Searching for the perfect Nextjs landing page template? Look no further! Explore our curated list of the best designs for your next project.\"\nimage: https://cdn.magicui.design/assets/9c6bdfc5-df8d-4ed8-a42c-57032d6a42e5.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nMany designers and developers need help finding that perfect Nextjs landing page template. Seeking inspiration and guidance to ensure their landing page is not only stunning but also functional and effective. This article will provide valuable insights, from showcasing beautiful [landing page examples](https://magicui.design/blog/landing-page-examples) to offering design tips that could transform your project.\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a solution to help you find Nextjs landing page template examples for design inspiration. This resource offers a range of beautiful and functional templates that could be just what you need to bring your landing page dreams to life.\n\n## What Is Nextjs?\n\n![a computer screen with a program running on it](https://images.unsplash.com/photo-1643116774075-acc00caa9a7b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxuZXh0anN8ZW58MHx8fHwxNzIyNjc0NDY0fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nNext.js is a powerful and flexible React framework for building modern web applications. It is built on top of Node.js, a JavaScript runtime that allows developers to [run JavaScript code on the server side](https://www.codeproject.com/Questions/56509/Can-we-execute-server-side-code-using-JavaScript).\n\n### A Fusion of React and Server-Side Rendering\n\nNext.js combines the best features of React, a popular JavaScript library for:\n\n- Building user interfaces\n- Server-side rendering\n- Static site generation\n- Other advanced features.\n\n### Addressing the Limitations of Traditional React Apps\n\nNext.js was created by the private company Vercel to address issues with traditional React apps. React apps can only be rendered in users’ browsers. However, that can be problematic if the client is disabled from JavaScript or has a lot of information to render. Next.js extends the functions of React by rendering pages and apps on the server side, making the process fast and efficient.\n\n### The Team Behind Next.js\n\nReact becomes a viable option as a framework for creating a mobile app with the power of Next.js. The framework author, Guillermo Rauch, serves as the CEO of Vercel, and Tim Neutkens is the project’s lead maintainer.\n\n### A Versatile Framework for Modern Web Development\n\nNext.js is a versatile and efficient tool for developers creating modern [web applications with enhanced performance](https://www.linkedin.com/pulse/how-build-scalable-high-performance-web-applications-lucy-kristena) and scalability. Its combination of React and server-side rendering capabilities makes it a valuable framework for building dynamic and robust web solutions. With Next.js, developers can leverage React and server-side rendering strengths to create high-performing, scalable, and efficient web applications.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Why Choose Nextjs For Your Landing Page?\n\n![man in black sweater sitting beside man in black sweater](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyMjY3NDQ3Nnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Ease of Use\n\nNext.js provides a simple and intuitive API, making it easy to get started building web applications. It also offers built-in support for CSS and SASS, allowing developers to style their applications easily.\n\n### Performance\n\nWith server-side rendering and [static site generation features](https://www.smashingmagazine.com/2020/07/differences-static-generated-sites-server-side-rendered-apps/), Next.js enables fast initial page loads and optimal performance. It automatically optimizes and bundles the application for efficient delivery to the client.\n\n### Fast Loading\n\nNext.js’ in-built image optimization capabilities ensure that these websites enjoy lightning-fast page loads, higher conversion rates, and reduced bounce rates. According to WebAlmanac, images contribute to 75 percent of a webpage’s weight. This is where Next.js comes in. Its custom image component automatically optimizes images—no matter the number—to ensure the best performance.\n\n### SEO-Friendly\n\nNext.js generates [static files written in HTML](https://www.w3schools.com/howto/howto_website_static.asp), which are easily crawlable by search engines. This improves search engine optimization (SEO) and helps your website rank higher in search results.\n\n### MagicUI: A Design Engineer's Toolkit\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## Key Components Of A Successful Nextjs Landing Page\n\n![](https://cdn.magicui.design/assets/8c6igalgv2o.jpg)\n\n### Header\n\nA header is the central part of the top section of your website that helps to introduce your graphic charter and branding. Usually, you’ll find it on all the pages of your website. The word Header contains the root word Head. And just like a human’s head, a header, in web design, is the website’s head. It’s where we go to find the navigation system of the website, which contains all the main links we need to browse your website.\n\n### Navbar\n\nA navbar is the navigation bar in the user interface that contains all the main links to other sections or pages of the website. In the navbar, you can find the product’s logo, links, and a call-to-action button.\n\n### Hero Section\n\nThe hero section is typically the first thing visitors see when they land on your webpage. It usually includes an image or video that expresses the website's main message and a description that can be a slogan, a product description, some small text for details, or a call to action.\n\n### Features/Benefits Section\n\nAs one can guess, the features section describes the technical features of the product being sold. This section also shows how valuable the product is and what the benefits of using it are. Based on the company’s marketing strategy, this part demonstrates how different and superior their product is from their competitors.\n\n### Testimonials Section\n\nThe [testimonials section](https://www.peppercontent.io/blog/benefits-of-customer-testimonials/) is where you can put your customers’ previous reviews and comments about how good your products or services are. It’s a great strategy companies use to build trust, demonstrate social proof, and convince/attract new customers.\n\n### Footer\n\nA [landing page footer](https://mcstarters.com/blog/footer-important-for-your-website/#:~:text=Web%20pages%20are%20often%20peppered,take%20the%20actions%20they%20desire.) is the area at the bottom of each page under the main section. From a technical standpoint, landing pages don’t require footers to function correctly, but having a footer on your web page is still a great thing because it helps navigate content more efficiently by adding a well-detailed links section.\n\n## 12 Best Nextjs Landing Page Templates For Design Inspiration\n\n![two gray pencils on yellow surface](https://images.unsplash.com/photo-1472289065668-ce650ac443d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkZXNpZ24lMjBwYWdlfGVufDB8fHx8MTcyMjY3NDUyMXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI's Startup Template\n\nThis is the best landing page template for launching new ideas. It is perfect for bootstrappers and pre-PMF VC-backed startups. This is a complete landing page template (front only) for launching a new project or idea. It uses the latest front-end technologies and best practices to unblock you and delight your customers.\n\n#### Who is this for?\n\nYou are an indiehacker, bootstrapper, YC startup, solopreneur, VC-backed startup, developer, or student. You are thinking about launching a new idea or already have a prototype. Maybe it's an AI SaaS, a crazy drone robot company, or just a simple digital product. But... you dread the idea of learning to react or anything frontend.\n\n#### Features\n\n- Header Section\n- Hero Section\n- Social Proof Section\n- Pricing Section\n- Call To Action Section\n- Footer Section\n- Mobile Responsive Navbar\n\n### 2\\. Fintech\n\nA contemporary landing page template designed with a sleek and modern aesthetic, perfect for showcasing financial apps and services. It's built with Tailwind CSS v3 and Next.js 14, ensuring high performance and compatibility with modern web standards. The template features a:\n\n- Minimalist design\n- Bold typography\n- Intuitive navigation\n\nIt includes three pages:\n\n- A main landing page with custom illustrations and icons\n- A sign-up page\n- A support center page\n\nDesigned to look great on all devices, from desktops to smartphones, FinTech is an ideal choice for launching new banks, promoting financial products, or showcasing money apps.\n\n### 3\\. Nerko\n\nA highly [versatile NFT Portfolio React NextJS Template](https://themeforest.net/item/nerko-nft-portfolio-react-nextjs-template/43117017) available on Themeforest. Offering a pixel-perfect design with modern layouts, it is optimized for developing:\n\n- NFT blockchain\n- Crypto art\n- Digital projects\n\nThe template is built on the UIKit 3 framework and has custom icons. It is SEO-optimized, ensuring fast load times and compatibility across various browsers. The package offers easy customization options and supports both dark and light modes. It includes dynamic blog pages and clean typography, offering premium support and frequent updates. Its well-organized code and content make it user-friendly.\n\n### 4\\. Plurk\n\nA set of multipurpose landing templates created using the Tailwind CSS framework. It offers a collection of well-designed demos that are fully responsive, ensuring seamless performance across various devices. Its reusable components and pages make it an ideal starting point for diverse projects.\n\nThe templates are designed to be developer-friendly, with a rich feature set that allows for high levels of customization. Lifetime updates are included with every purchase, and support is provided through a ticket submission system. Plurk templates are part of the Envato Market, available on ThemeForest, and crafted by an Elite Author.\n\n### 5\\. Startup Landing\n\nA dynamic resource for startups and businesses, offering an extensive collection of free, high-quality landing pages. These templates, built with the cutting-edge technology of React, Next JS, and Gatsby JS, are designed to help you make a powerful first impression and establish your online presence.\n\nThe platform is updated weekly with new, top-tier Startup Landing demos, ensuring its users can access the latest and most innovative designs. These templates cover a broad range of niches and are optimized for mobile use, reflecting the changing trends in web design. To access these templates, simply send your email address, and you can start downloading them immediately.\n\n### 6\\. Gray\n\nThis cutting-edge, minimal black-and-white landing page template is designed specifically for modern tech and SaaS companies. This template emphasizes content over excessive design elements, allowing you to focus on the message you want to communicate. The design includes hand-drawn vector illustrations that can fit any context or necessity, offering a unique aesthetic appeal.\n\nThe Gray template features a:\n\n- Dense interface layout with multiple content sections\n- Two functional carousels\n- Dedicated sections for pricing and testimonials\n- Additional pages for demo requests, user login, and password reset\n\nOnce purchased, the template can be downloaded via a unique sign-in link sent to your email\n\n### 7\\. Genial\n\nThis versatile template pack offers 15+ unique, ready-to-use demos suitable for various business niches. It is an excellent choice for startups, agencies, and established businesses looking to enhance their online presence. The templates are fully responsive, ensuring optimal viewing experience on all devices.\n\nGenial provides a range of features not just visually appealing but also technically sound, such as:\n\n- SEO optimization\n- Speed optimization\n- Well-commented code\n\nWith its easy customization options, you can tweak these templates to align perfectly with your brand identity.\n\n### 8\\. Saasley\n\nA beautifully designed, responsive landing page template that seamlessly blends elegance and functionality. The template provides three distinct landing demos, catering to various design preferences. Its features include:\n\n- Both light and dark mode options\n- AOS animations for a dynamic user experience\n- Swiper slider components for smooth navigation\n- multiple pricing tables for easy comparison\n- Over 2500 Material symbols icons for diverse visual representation.\n\nSaasley comes equipped with an API for Blogs, FAQs, and Customer stories, enhancing the interactive aspect of your landing page. As a bonus, purchasers of this template enjoy lifetime free updates, ensuring your landing page remains up-to-date with the latest web development trends.\n\n### 9\\. Nextly\n\n[Nextly](https://github.com/web3templates/nextly-template) is a free landing page & marketing website template for startups and indie projects. It's built with Next.js & TailwindCSS. And it's an entirely open-source (MIT) License.\n\n### 10\\. Saas UI\n\nThis is a free Next.js landing page template based on [https://saas-ui.dev](https://saas-ui.dev). Feel free to submit any feature requests. If you use this template, please share what you've built on Twitter.  \nIncluded features:\n\n- Feature blocks\n- Testimonials\n- Pricing tables\n- Log in and Sign up pages\n- FAQ\n\n### 11\\. Startup Next.js Template\n\nThe second template I would recommend is this landing page theme, created by Next.js Templates. Some of the sections include feature blocks, testimonials, a contact for, and much more. It has a cool design overall, with a stunning dark theme. The template's hero section is featuring:\n\n- A headline\n- Sub-heading\n- Two call-to-action buttons.\n\n### 12\\. NutriTrack\n\n[NutriTrack](https://github.com/christian-luntok/nutritrack) is a customizable Next.js and TailwindCSS landing page template that offers personalized styling and easy customization. Tailored to provide a minimal design, it allows you to create a site that suits your requirements effortlessly. You can easily make use of the components and customize the code to mix and match to suit your needs.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- Nextjs Landing Page\n\n## Key Features To Look For In A Nextjs  Landing Page Template\n\n![two black computer monitors on black table](https://images.unsplash.com/photo-1457305237443-44c3d5a30b89?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWIlMjBhcHB8ZW58MHx8fHwxNzIyNjc0NTM2fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Responsiveness: Importance of Mobile-Friendly Design\n\nOne of the most critical features of any Nextjs template is responsiveness. People will view the landing page on desktops, tablets, and smartphones. A [mobile-friendly design](https://elementor.com/blog/mobile-landing-page/) ensures the page looks great and functions well on all screen sizes. This enhances user experience and positively impacts search engine rankings since search engines prioritize mobile-friendly sites.\n\n### Customization Options: Flexibility to Tailor the Template to Individual Branding\n\nCustomization is key when it comes to making your page stand out. Look for a template that offers flexibility regarding:\n\n- Colors\n- Fonts\n- Layouts\n- Content\n\nBeing able to tailor the template to match the brand's branding ensures that your portfolio is unique and reflects your style.\n\n### SEO Optimization: Features that Help Improve Search Engine Visibility\n\nAn SEO-optimized template is crucial for increasing a page's visibility in search engine results. Look for templates with built-in SEO features, such as:\n\n- [Clean URLs](https://www.woorank.com/en/blog/guide-to-clean-urls-for-seo-and-usability)\n- Meta tags\n- Optimized images\n\n### Performance: Fast Loading Times and Efficient Code\n\nPerformance is another essential feature to consider. A template with fast loading times and efficient code enhances user experience and keeps visitors on your site longer. Slow-loading websites can frustrate users and lead to higher bounce rates. Efficient, clean code ensures the landing page runs smoothly without unnecessary lag or errors.\n\n## Best Practices For Customizing Your Landing Page Template\n\n### Changing Colors and Fonts\n\nTo create a landing page that truly resonates with your brand, selecting a [color scheme that reflects your identity](https://instapage.com/blog/landing-page-colors-influence-on-landing-pages/) is essential. Consistency and brand reflection are crucial whether you desire a sleek, modern look or a more vibrant appearance.\n\nWith Next.js, tools like Tailwind CSS in [Magic UI](https://magicui.design/) make it simple to adjust colors, ensuring your palette aligns with your brand. Fonts also play a significant role—opt for Google Fonts that look great and enhance readability. Typography should complement your brand's personality and amplify your message with clarity.\n\n### Personalizing the Layout\n\nYour layout presents a prime opportunity to shine. By considering the sections that will effectively showcase your business, such as:\n\n- Our Services\n- About Us\n- Get in Touch\n\nMagic UI's reusable components, like cards and sections, enable you to organize information effortlessly. With these components, you can:\n\n- Easily display services\n- Present client testimonials\n- Customize each section\n\n### Adding Personal Branding Elements\n\nMemorable branding is vital for your landing page. Start by [placing your logo prominently](https://turbologo.com/articles/place-website-logo/#:~:text=To%20improve%20brand%20recognition%20and,page%20appear%20messy%20and%20unbalanced.) on the homepage and navigation bar, anchoring your brand visually. Craft a compelling narrative in the About Us section to connect with your audience personally, enabling visitors to grasp who you are and why your business is worth their attention.\n\n### Using Magic UI for Interactive and Animated Elements\n\nEngaging visitors with interactive and animated elements of [Magic UI](https://magicui.design/), such as Shimmer Buttons and Carousels, adds a dynamic touch to your landing page. These components maintain user interest and encourage further exploration. These interactive features appeal visually to your site and enhance the overall user experience.\n\n### More Customization Tips\n\n- _Images and Media:_ High-quality images are indispensable for showcasing your products, team, or workspace in a manner consistent with your brand's style, providing a professional appearance.\n- _Animations:_ Consider subtle animations to make your landing page more engaging. These should feature smooth transitions and eye-catching effects that draw visitors' attention without overwhelming them.\n- _Social Media Links:_ Including links to your social media profiles facilitates visitor connection with your brand and keeps them updated on your latest news and promotions.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a cutting-edge UI library designed to elevate your landing page. MagicUI offers a diverse collection of over 20 animated components meticulously crafted with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI, you can seamlessly integrate visually appealing and interactive elements into your web application, transforming your digital presence into a captivating user experience with minimal effort.\n\n### Customizing MagicUI to Match Your Brand\n\nEnjoy the flexibility of customizing [MagicUI](https://magicui.design/) components to align perfectly with your branding and design requirements. Whether your style is sleek and modern or bold and vibrant, MagicUI empowers you to create a landing page that truly reflects your unique identity.\n\nMagicUI bridges the gap between design and development, enabling you to craft captivating digital experiences that leave a lasting impression on your visitors.\n\n### Elevate Your Website with MagicUI Pro\n\nUnlock the full potential of MagicUI with [MagicUI Pro](https://pro.magicui.design/). This premium offering allows you to save precious time and effortlessly create stunning landing pages that convert visitors into loyal customers. With MagicUI Pro, you can access a treasure trove of website templates designed to inspire and delight. Take the first step towards transforming your digital presence today – explore our [startup landing page template](https://pro.magicui.design/docs/templates/startup) and start your journey toward unlocking the magic of MagicUI.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/nextjs-portfolio-template.mdx",
    "content": "---\ntitle: \"23 NextJS Portfolio Template Examples For Design Inspiration\"\ndescription: \"Need ideas for your portfolio website design? Browse through stunning NextJS portfolio template examples for the perfect inspiration.\"\nimage: https://cdn.magicui.design/assets/02b1a266-37e6-4acc-8752-b69c01023152.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: true\n---\n\nAre you looking for inspiration to create a stunning portfolio website that stands out in the given [landing page examples](https://magicui.design/blog/landing-page-examples)? Crafting a captivating online portfolio can be an intimidating task, especially when you're trying to find the right template. There is a way to simplify the process and find a NextJS portfolio template tailored to your needs.\n\nImagine having a solution that allows you to jumpstart your digital presence and showcase your skills seamlessly. That's where Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) comes in. With its user-friendly interface and sleek design, this template could be the perfect tool to help you achieve your goal of building a standout portfolio website.\n\n## What Is A NextJS Template?\n\n![NextJS Portfolio Template](https://images.unsplash.com/photo-1713946598664-b753ed24f9a9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxvbiUyMGxhcHRvcCUyMGFsb25lfGVufDB8fHx8MTcyMTY4NzIxMnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA Next.js template is a pre-built or starter template for constructing web applications utilizing the Next.js framework. Next.js, made by Vercel, is an in-demand open-source React framework that empowers developers to create server-rendered React applications with simplicity. It offers features like static site generation and server-side rendering.\n\n### Benefits of Next.js Template\n\nWhen creating a portfolio, a Next.js template offers a pre-designed, customizable web layout employing Next.js components. This template is your digital business card, displaying your skills, creativity, and personality. With a Next.js portfolio template, you can craft a visually appealing, functional portfolio without starting from scratch. This approach allows you to concentrate on personalizing and adding your content.\n\nNext.js templates commonly come with pre-designed components, styles, and configurations, facilitating developers in starting their projects quickly. These templates may feature common elements such as:\n\n- Routing\n- State management\n- Authentication\n\nThese are all executed using Next.js and potentially other related libraries like Redux for state management and Next.js's inherent routing capabilities. This setup guarantees a robust foundation for building dynamic, interactive user interfaces efficiently.\n\n## Why Use NextJS For Portfolio Websites?\n\n![NextJS Portfolio Template](https://images.unsplash.com/photo-1654610285929-a1b63280dd60?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx3ZWJzaXRlc3xlbnwwfHx8fDE3MjE2ODcyMjR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Boosted productivity\n\nThe templates save time by providing a foundation to build upon, allowing developers to focus on customizing the design and adding their content rather than starting from scratch.\n\n### Time-saving\n\nThe templates come with pre-configured settings and optimizations, such as routing and code splitting, which help speed up development and improve performance.\n\n### Quick deployment\n\nNextJS can be easily deployed to various hosting platforms, making launching the portfolio website quickly and convenient.\n\nBy using NextJS portfolio templates, developers can expedite creating a portfolio website and take advantage of the benefits and efficiencies offered by NextJS.\n\n### Building Captivating Web Apps with MagicUI Components and Templates\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach,\n\n### Bridging the Gap with Free Components and Pro Templates\n\nMagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 23 Best NextJS Portfolio Templates For A Great Online Presence\n\n![NextJS Portfolio Template](https://images.unsplash.com/photo-1487017159836-4e23ece2e4cf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjE2ODcyNDR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI's Portfolio Template\n\n[Magic UI's portfolio template](https://pro.magicui.design/docs/templates/startup) is a complete, customizable solution designed for developers to showcase their work to the world. It saves you over 100 hours of development time with easy configuration, built-in advanced animations, and a 1-click setup. You can quickly update text and images and deploy your portfolio live to Vercel in minutes with sections like:\n\n- Hero\n- About\n- Work\n- Education\n- Projects\n- Hackathon\n- Contact\n- Blog\n\n### 2\\. React Portfolio Template\n\n[Chetan Verma's React portfolio template](https://github.com/chetanverma16/react-portfolio-template) is a testament to simplicity and elegance. Built with Next.js and TailwindCSS, this template offers a clean, modern design perfect for showcasing your skills and projects. Its responsiveness ensures your portfolio looks fantastic on any screen, making it a top choice for those searching for a user-friendly solution.\n\n### 3\\. Personal Portfolio\n\nHamish Williams has crafted a personal portfolio template that stands out using Next.js, Three.js, and Framer Motion. This combination of technologies delivers an aesthetically pleasing design and ensures a smooth and engaging user experience. It's the perfect choice for those looking to make a bold statement with their portfolio.\n\n### 4\\. React Personal Portfolio\n\n[Adrian Hajdin's React personal portfolio template](https://github.com/adrianhajdin/portfolio_website) combines React and Next.js to create a dynamic and engaging portfolio website. This template is perfect for those who want to infuse their personal touch into their online presence. Its responsiveness ensures that your portfolio remains stunning and functional across all screen sizes.\n\n### 5\\. Neoh – NFT Portfolio React Nextjs Landing Page\n\n[Neoh stands](https://elements.envato.com/neoh-nft-portfolio-react-nextjs-landing-page-6S92YN3) as an NFT portfolio and landing React NextJs template, tailor-made for crafting your own NFT Portfolio page. Whether you’re exploring:\n\n- NFT blockchain\n- Crypto art\n- Digital assets\n- Or any related field\n\n### 6\\. Glitche – Personal Portfolio React Template\n\n[Glitche – CV resume and personal portfolio](https://elements.envato.com/glitche-personal-portfolio-react-template-88L38G9) React Next.JS Template is the choice for:\n\n- Designers\n- Freelancers\n- Developers\n- Programmers\n- Coders\n- Professionals of all stripes\n\nWith Glitche’s array of ready-made components, including:\n\n- Various layouts\n- Dark & Light versions\n- One- and multi-pages\n- RTL support,\n\nGlitche boasts a unique web design that will impress and attract new clients. Packed with many awesome features, this template empowers you to create a compelling web presence that effectively promotes yourself and showcases your work.\n\n### 7\\. Aali – Personal Portfolio React NextJs Template\n\n[Aali – Personal Portfolio / Resume / CV React NextJs template](https://elements.envato.com/aali-personal-portfolio-react-nextjs-template-P7T9DG3) is a versatile solution for many purposes. With its creative, minimal, and clean design, it caters to the needs of various businesses. Equipped with all the essential features of a business website, it serves as an ideal platform for:\n\n- Startup businesses,\n- Companies\n- Agencies\n- Freelancers alike\n\nBoasting a 100% super responsive experience, Ali ensures that your projects and services are showcased professionally across all devices. Whether you aim to establish your online presence or present your portfolio sleek and polished, Ali can help you.\n\n### 8\\. Developers Portfolio\n\n[Hashir Shoaib's developers portfolio template](https://github.com/hashirshoaeb/home) leverages React.js, Bootstrap, and Typist to provide developers with an engaging and dynamic showcase. Whether you're a seasoned pro or just starting out, this template's responsiveness ensures your portfolio will captivate visitors and potential employers.\n\n### 9\\. Cleanfolio\n\n[Raj Shekhar's Cleanfolio template](https://github.com/rajshekhar26/cleanfolio), powered by React.js, lives up to its name with a clean and minimalistic design. This template allows your work to take center stage. With its responsive layout, your portfolio will maintain its sleek appearance on screens of all sizes.\n\n### 10\\. Software Developer Portfolio Template\n\n[Hanzla's Software developer portfolio template](https://github.com/1hanzla100/developer-portfolio), built with Next.js, Axios, and Reactstrap, offers a comprehensive solution for software developers. This template provides the tools you need to effectively showcase your skills and projects. Its responsive design ensures that your portfolio will impress on any device.\n\n### 11\\. Mitra - Personal Portfolio React/NextJS Template\n\nMitra is a multi-purpose, gorgeous, and creative portfolio ReactJS/NextJS template with the sharp user experience you need to build a modern and functional website. Mitra is a Clean and professional personal portfolio React/Next template that can be utilized to demonstrate your inventiveness.\n\n### 12\\. Salimov - Horizontal Personal React NextJS Portfolio\n\nSalimov is a creative, animated, horizontal personal portfolio template based on Bootstrap 5, You can use it for your resume, CV or your portfolio. Salimov is written in valid and clean React & CSS3 code. It’s easy to customize and well documented to suit your needs.\n\n### 13\\. Sergio – Personal Portfolio React NextJS Template\n\nSergio is a simple, modern, creative, and responsive ReactJS One-Page Template. It will help you present yourself and your Business/resume more smartly and easily. This template is built with modern technologies like:\n\n- ReactJS\n- CSS3\n- Bootstrap 4\n\nIt is 100% responsive with a clean, modern design.\n\n### 14\\. EdgeFolio - Nextjs React Blog Portfolio TailwindCSS Template\n\nEdgeFolio’s components are styled with Tailwind CSS, giving you access to a wealth of pre-designed UI components that can be customized to match your brand. The Markdown/MDX blogging system built on Next.js makes it easy to create and share dynamic and rich content, while integration with the ConvertKit newsletter platform lets you connect with your audience and grow your mailing list.\n\n### 15\\. Cavani - Personal Portfolio React NextJs Theme\n\nCavani is for many purposes like:\n\n- Minimal portfolios\n- Agencies\n- Personal Portfolio\n- Photography\n- Freelancer portfolios, etc.\n\nUsers will love your site because it provides a unique user experience (UX). All components are well organized and named accordingly, so it's very easy to change any part of the design.\n\n### 16\\. Nerko - NFT Portfolio React NextJS Template\n\nNerko is an NFT portfolio and landing React NextJs template that can be used to build your own NFT Portfolio page. It is the best-designed:\n\n- NFT blockchain\n- Crypto\n- Crypto art\n- Digital, and many other purpose React NextJs Template\n\n### 17\\. Edrea - Personal Portfolio React NextJS Template\n\nEdrea is a one-page portfolio. React NextJs is for many purposes. It’s a creative, minimal, and clean design. It has all of the features of the business website. It’s suitable for any startup business, company, agency, and freelancer that needs a professional way to showcase their projects and services with 100% super responsive experience.\n\n### 18\\. Bostami - Creative Personal Portfolio React + NextJS Template\n\nBostami is a Personal Portfolio Tailwind CSS React NextJS Template that can be used for many purposes. It’s a creative, minimal, and clean design. It’s suitable for:\n\n- Designers\n- Developers\n- Specialists\n- Content Writers\n- Instructors\n- Photographers\n- Freelancers\n- Software Engineers\n- Teachers or other experts who digitally showcase their professional projects and services.\n\n### 19\\. Elito - Creative Portfolio Nextjs Template\n\nElito is a Fully Responsive Template built on Bootstrap 5, Pure Next-js. It’s a modern crafted Next Js template that can be used for portfolio, CV,/Resume website templates. This is highly customizable and looks fantastic on tablets and mobile devices. We have included a documentation folder to describe the code structures. We have included the best web development practices so you can create a great website layout based on Reactstrap.\n\n### 20\\. Vercel Portfolio With Blog\n\nWe recommend looking at this template if you'd like to build a blog quickly. A blog is a popular portfolio feature, as you can include articles about past projects. You can quickly deploy this template with the click of a button and host it with Vercel.\n\n### 21\\. Dora - Personal Portfolio React NextJS Template\n\nDora is a simple, modern, creative, and responsive React OnePage template. It will help you to present yourself, even your Business/resume, more smartly and easily. This is built with modern technologies like jQuery CSS3. It is 100% responsive with a clean, modern design.\n\n### 22\\. Tonu\n\nTonu has a tremendous personal portfolio. The Next Js template enables you to create a robust portfolio website. The Template layout contains custom-made pages for the portfolio niche, Latest portfolio, service, project, team page, and blog page.\n\nTonu will undoubtedly make your Website look more impressive and attractive to viewers. It includes high-quality Next Js files that are well organized and named accordingly, so it’s easy to change any of the designs. It’s all that you're looking for on your Website.\n\n### 23\\. Sliim – Personal Portfolio React NextJs Template\n\nSliim is a highly creative, modern, visually stunning React NextJs portfolio template, a stunning animated portfolio that helps you to present yourself more smartly and easily.\n\n## Key Features To Look For In A NextJS Portfolio Template\n\n![NextJS Portfolio Template](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyMTY4NzI1OXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Responsiveness: Importance of Mobile-Friendly Design\n\nResponsive design is critical for any NextJS portfolio template as it ensures your portfolio looks great and functions well on all devices.\n\n- A mobile-friendly design enhances user experience and positively affects your search engine rankings. With more people accessing websites on mobile devices, ensuring your portfolio is responsive is vital.\n- A mobile-friendly design ensures visitors can easily navigate and interact with your portfolio on any device.\n- Search engines like Google prioritize responsive websites in their rankings, which can give your portfolio an SEO boost.\n- A well-designed, responsive site gives your visitors a professional impression, showcasing your attention to detail and professionalism.\n\n### Customization Options: Flexibility to Tailor the Template to Individual Branding\n\nCustomization is key when it comes to standing out with your portfolio. You want to look for a NextJS portfolio template that offers flexibility in terms of:\n\n- Colors\n- Fonts\n- Layouts\n- Content\n\nTailoring the template to match your personal or professional branding ensures that your portfolio is unique and reflects your style. Injecting your personality and style into the design allows for personal branding, making your portfolio more relatable and unique. This customization also helps your portfolio stand out, showcasing your individuality and creativity. The adaptability of a customizable template allows you to easily update and tweak your portfolio as your brand evolves over time.\n\n### SEO Optimization: Features that Help Improve Search Engine Visibility\n\nAn SEO-optimized NextJS portfolio template is crucial for increasing your portfolio’s visibility in search engine results. Look for templates with built-in SEO features, such as:\n\n- Clean URLs\n- Meta tags\n- Optimized images\n\nThese features help improve your search engine ranking, making it easier for potential clients or employers to find you through online searches. Having an SEO-optimized template significantly improves your chances of appearing in search engine results, driving more traffic to your portfolio. This visibility helps you reach a broader audience, including potential employers or clients, and expands your professional reach.\n\n### Performance: Fast Loading Times and Efficient Code\n\nPerformance is another critical feature to consider when selecting a NextJS portfolio template. A template with fast loading times and efficient code enhances user experience and keeps visitors on your site longer.\n\n- [Slow-loading websites can frustrate users](https://wetopi.com/slow-website-impact-business/) and lead to higher bounce rates.\n- Having efficient, clean code ensures your portfolio runs smoothly without lag or errors.\n- Fast loading times keep visitors engaged and reduce bounce rates, contributing to a positive user experience.\n\nSearch engines also consider page speed when ranking sites, making the performance of your portfolio a crucial factor for SEO. A well-performing site reflects your attention to detail and technical skills, leaving a positive impression on your visitors.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How to Customize Your NextJS Portfolio Template\n\n![NextJS Portfolio Template](https://images.unsplash.com/photo-1622674850896-dafe9f125ed2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzIxNjg3MjcwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Changing Colors and Fonts\n\nWhen customizing your NextJS portfolio template with Magic UI, one of the initial steps involves selecting a color scheme that resonates with your brand. The process is straightforward, whether you prefer sleek, modern tones or lively, energetic hues. [Magic UI](https://magicui.design/) coupled with Tailwind CSS allows you to switch color palettes effortlessly. The Tailwind configuration file aids in modifying the color palette, which can be applied to components seamlessly.\n\nRegarding fonts, opt for a typeface that is both legible and possesses character. Google Fonts is an excellent resource for integrating free fonts into your project. You can create an appealing visual aesthetic by importing the chosen font into your CSS file and applying it to text elements.\n\n### Personalizing the Layout\n\nYour portfolio layout should be neat, user-friendly, and effectively highlight your work. It is crucial to consider which sections to include. Common sections may consist of:\n\n- “About Me” page, a segment for showcasing projects\n- “Contact” form\n\nMagic UI facilitates the creation of reusable components for these sections. For instance, the Card component from Magic UI can be utilized to exhibit each project, allowing for easy updates without rewriting the layout code.\n\n### Adding Personal Branding Elements\n\n[Personal branding](https://www.searchenginejournal.com/what-is-personal-branding-why-important/327367/) plays a pivotal role in making your portfolio distinct. Begin by designing a logo or using online tools for this purpose. Placing the logo prominently on your homepage and within the navigation bar enhances brand visibility.\n\nCraft a compelling bio for the “About Me” section, sharing insights into your background, skills, and passions. This narrative provides an opportunity to engage with potential clients or employers personally.\n\n### Using Magic UI for Interactive and Animated Elements\n\n[Magic UI](https://magicui.design/) excels in incorporating interactive and animated elements, boasting over 20 animated components constructed with:\n\n- React\n- Tailwind CSS\n- Framer Motion\n- TypeScript\n\nFor instance, the Shimmer Button component can create captivating call-to-action buttons, while the Carousel component dynamically showcases projects. Users can customize [Magic UI](https://magicui.design/) components extensively, adjusting animations, styles, and behaviors to align perfectly with branding and design requirements. This enables the effortless creation of a striking, interactive portfolio.\n\n### More Customization Tips\n\n#### Images and Media\n\nHigh-quality images and videos effectively showcase projects, encompassing screenshots, demo videos, or GIFs illuminating project functionalities.\n\n#### Animations\n\nSubtle animations enhance the dynamic and engaging nature of your portfolio. Magic UI simplifies the integration of these animations.\n\n#### Social Media Links\n\nInclude links to platforms where you are active, such as LinkedIn, GitHub, or Twitter, to facilitate visitor connections.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a cutting-edge UI library that we designed particularly for design engineers. It offers a vast collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese visually appealing interactive elements can be effortlessly integrated into web applications. By leveraging MagicUI, you can swiftly create stunning user interfaces with minimal effort, bridging the chasm between design and development.\n\n### Customizable Landing Pages with MagicUI Pro\n\nMagicUI components are highly customizable, allowing seamless adaptation to match specific branding and design requirements for landing pages. With [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can save countless hours and effortlessly create attractive landing pages that convert visitors into customers. Combining an extensive free component library and MagicUI Pro empowers you to craft captivating digital experiences that leave a lasting impression on your audience.\n\n### Seamless Design and Development Integration\n\nWith a strong focus on animation and a design-centric approach, MagicUI seamlessly integrates design and development processes. This approach empowers designers to create visually captivating landing pages while providing developers with the tools to execute these designs effectively.\n\nBy streamlining this collaboration between design and development, MagicUI accelerates the creation of visually stunning websites that engage visitors and drive conversions.\n\n### Leverage MagicUI for Your Startup Landing Page\n\nAre you looking to create a compelling landing page for your startup? Utilize MagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) today. By leveraging MagicUI's intuitive components and customizable features, you can craft a landing page that captures your brand essence and effectively communicates your value proposition to your target audience. Start converting your visitors into customers with a visually appealing and interactive landing page designed using MagicUI.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/nextjs-website-template.mdx",
    "content": "---\ntitle: Your Guide to Blazing-Fast Nextjs Website Templates\ndescription: >-\n  Discover how to choose, customize, and deploy a high-performance nextjs\n  website template. Build SEO-ready sites faster with this practical guide.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b1ec34fd-c656-4e3d-8df9-be39e7df2d4b/nextjs-website-template-website-design.jpg\nauthor: Dillion Verma\ntags:\n  - nextjs website template\n  - nextjs templates\n  - react templates\n  - tailwind css\n  - web development\npublishedOn: \"2025-12-19T08:33:55.990483+00:00\"\nfeatured: true\n---\n\nA good Next.js website template is more than just a pre-built layout; it's a production-ready foundation for your entire project. It lets you skip all the tedious, time-consuming setup and jump straight into building the features that actually matter. Think of it as getting a massive head start, with optimized configurations for performance and SEO already baked in.\n\n## Why Smart Developers Start with a Next.js Template\n\nWe've all been there: staring at a blank terminal after typing `git init`. While building from the ground up gives you absolute control, it also means you're reinventing the wheel on core configurations every single time. This is where a quality Next.js template offers a serious strategic edge. It’s not just about saving time—it’s about gaining tangible, long-term benefits.\n\nThe biggest win is inheriting a codebase that's already been battle-tested. Instead of spending hours, or even days, wrestling with boilerplate for routing, state management, or getting TypeScript to play nice, you start with a solid, pre-configured structure. That foundational work is critical, but let's be honest, it adds zero direct value to your users. A template handles it all for you.\n\n### Accelerate Development and Focus on Value\n\nBy starting with a template, you immediately shift your focus from setup to execution. You can get to work on the unique features that define your product from day one, whether that's a slick e-commerce checkout flow or a complex SaaS dashboard. This isn't just about moving faster; it's about investing your most valuable resource—your development time—where it has the most impact.\n\nTo really get it, you can look at the classic debate of a [custom website vs. template website](https://www.cleffex.com/blog/custom-website-vs-template-website/). While a fully custom build has its place, templates provide a powerful middle ground, giving you structure without handcuffing your ability to customize.\n\n### Inherit Performance and SEO Best Practices\n\nA well-crafted **Next.js website template** comes pre-optimized for crucial metrics like Core Web Vitals and search engine visibility. This means you’re not just getting a few components; you're getting a performance-first architecture right out of the gate.\n\n> A great template bakes in best practices for image optimization, code splitting, and metadata handling, ensuring your site is fast and SEO-friendly out of the box. This saves countless hours of post-launch tuning and optimization.\n\nThis built-in quality is a huge reason why major companies trust Next.js for their most important applications. In 2025, data shows that **17,921 organizations** use Next.js, including giants like Walmart, Apple, and Microsoft. They choose the framework because it delivers performance at scale—a quality you inherit when you start with a professional template.\n\nIf you're still getting familiar with the framework, understanding its core ideas is a great first step. You can learn more about [what Next.js is and why it's so popular](https://magicui.design/blog/what-is-nextjs) in our detailed guide. This context makes it crystal clear why starting with a template is such a powerful way to build modern web apps.\n\n## How to Choose the Right Nextjs Template\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/O8ivm7403rk\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nPicking a **Next.js website template** is one of those early decisions that can either supercharge your project or bog you down in technical debt for months. The right one lets you hit the ground running, but the wrong one can feel like trying to build a skyscraper on a shaky foundation. With so many options out there, it's easy to get swayed by a flashy demo. You've got to look under the hood.\n\nSo, where do you start? The fundamentals: code quality and the tech stack.\n\nFirst, make **TypeScript** support a non-negotiable requirement. Seriously. In modern web development, type safety isn't a \"nice-to-have\"; it's essential for building anything that you plan to maintain or scale. If a template treats TypeScript as an afterthought, walk away.\n\nThe styling solution is just as critical. I'm a huge advocate for templates built with **Tailwind CSS**. Its utility-first approach is incredibly intuitive for customization and scales beautifully as your project grows. Be wary of templates that use complex, bespoke CSS-in-JS solutions—they can lock you into a rigid system that's a nightmare to modify later.\n\n### Assessing Code Quality and Documentation\n\nBefore you commit, get your hands on the code. If it’s open-source, clone the repository. If it's a premium template, look for a live code preview or a detailed walkthrough. A well-built template should have a file structure that makes sense immediately, with clear naming conventions and comments where they matter. Messy, disorganized code is a huge red flag that signals a maintenance headache waiting to happen.\n\nAnd then there's the documentation. This is a big one. Good docs are more than a quick \"how to install\" guide. They should walk you through the project's architecture, show you how to customize core components, and give you practical examples for common tasks. If the documentation is thin or confusing, you’ll waste more time reverse-engineering the template than you'll save using it.\n\n> A template without clear, comprehensive documentation isn't a shortcut—it's a gamble. The time you save on setup will be lost tenfold in trying to understand and extend an undocumented codebase.\n\nThis decision-making process is often the first fork in the road when starting something new. Do you build from scratch, adapt an existing structure, or fast-track with a template?\n\n![Project initiation flowchart showing decisions for new projects: template, existing structure, or build from scratch.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7e66ce57-b0c8-47c7-ac2a-66c5b90dbaba/nextjs-website-template-project-initiation.jpg)\n\nAs the flowchart shows, choosing a template is a strategic move to accelerate development right from day one, but it requires careful consideration.\n\n### Finding Reliable Templates and What to Look For\n\nThe market for Next.js templates has exploded, which is great because there are options for everything from personal blogs to complex SaaS dashboards. By **2025**, curated marketplaces have become the go-to source, with developers happily paying in the **$20–$150 range** for quality, support, and peace of mind. As Next.js continues to evolve with features like edge rendering and better performance tooling, this ecosystem only gets stronger. You can [see how Next.js usage is trending on w3techs.com](https://w3techs.com/technologies/details/js-nextjs).\n\nWhen you're browsing, keep an eye out for these key signs of a quality template:\n\n- **Active Maintenance:** Check the last update date and the commit history. A template that's actively maintained will be more secure and compatible with the latest Next.js updates. A dusty repository is a warning sign.\n- **Community and Support:** Is there a Discord server, a GitHub Discussions page, or a clear support channel? Having a place to ask questions when you get stuck is invaluable. Don't underestimate this.\n- **Purpose-Fit:** This seems obvious, but it’s crucial. A template designed for a SaaS product will be structured differently than one for a marketing site. For instance, our own [guide on SaaS templates](https://magicui.design/docs/templates/saas) dives into pre-built features like authentication and billing pages—things you'd have to rip out of a blog template. Choose a template that actually aligns with your end goal.\n\nTo make this even more practical, here’s a quick checklist you can use to evaluate templates based on what you're building.\n\n### Nextjs Template Evaluation Checklist\n\n| Feature                  | E-commerce Site                   | SaaS Dashboard                    | Marketing Blog                 |\n| :----------------------- | :-------------------------------- | :-------------------------------- | :----------------------------- |\n| **Authentication**       | Customer accounts, social login   | User roles, multi-factor auth     | Optional (for comments/subs)   |\n| **Data Fetching**        | ISR/SSR for product pages         | Client-side fetching, SWR         | SSG for posts, ISR for updates |\n| **Styling**              | Highly customizable (Tailwind)    | Component library (Shadcn/UI)     | Minimal, content-focused       |\n| **Database Integration** | Essential (e.g., PostgreSQL)      | Essential (e.g., Supabase)        | Optional (MDX-based)           |\n| **SEO Features**         | Rich snippets, sitemaps           | Basic meta tags, route protection | Advanced schema, Open Graph    |\n| **Performance**          | Image optimization (`next/image`) | Code splitting, lazy loading      | Fast static builds             |\n\nUltimately, the best template is the one that gets you **80%** of the way there on day one. It should provide a solid, well-documented foundation that you can confidently build upon, not one that you have to fight against.\n\n## Getting Your Project Running Locally\n\n![An illustration of a modern workspace featuring a laptop with code, a plant, and a coffee.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/da887ff8-30ad-464c-80f1-5f958948b256/nextjs-website-template-coding-workspace.jpg)\n\nAlright, you've picked out a solid **Next.js website template**. Now for the fun part: getting it off the GitHub page and onto your own machine. This is where the magic happens and you see your project come to life for the first time. Thankfully, most template creators make this process pretty painless.\n\nThe first move is to clone the repository. You'll find a `git clone` command on the template's page—just copy that and run it in your terminal. Once it's downloaded, `cd` into the new project folder. Now you need to pull in all the packages and libraries the template depends on.\n\nDepending on your package manager of choice, the command is dead simple:\n\n- For npm users: `npm install`\n- For yarn users: `yarn install`\n\nThis command dives into the `package.json` file and fetches everything needed—React, Next.js itself, Tailwind CSS, and any other goodies the author included.\n\n### Configuring Your Environment\n\nPay close attention here, because this is probably the most important part of the setup. Modern apps talk to all sorts of external services, APIs, and databases. You absolutely cannot store your secret keys or database connection strings directly in your code. That’s a huge security no-no. This is what environment variables are for.\n\nYour template will almost certainly come with a file called something like `.env.example` or `.env.template`. Your job is to make a copy of this file and rename it to `.env.local`. This new file is your secret vault.\n\n> The `.env.local` file is already listed in the project's `.gitignore` file. This is a critical safety feature that tells Git to completely ignore it, preventing you from ever accidentally pushing your secret keys to a public repository.\n\nFor an e-commerce site using Stripe and a headless CMS, for instance, your `.env.local` file would end up looking something like this:\n\n### Stripe API Keys\n\n`NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...`\n\n`STRIPE_SECRET_KEY=sk_test_...`\n\n### Headless CMS Config\n\n`CMS_API_URL=https://your-cms.com/graphql`\n\n`CMS_PREVIEW_SECRET=a_very_secret_token`\n\nGetting these values right is non-negotiable. If they're missing or incorrect, your app simply won't work as expected.\n\n### Firing Up the Development Server\n\nWith your dependencies installed and environment variables locked in, you're ready to launch. The last step is to kick off the local development server. Again, this is usually a standard script you can run straight from your terminal:\n\n- For npm: `npm run dev`\n- For yarn: `yarn dev`\n\nThis command spins everything up and launches your new site, usually at `http://localhost:3000`. Pop that address into your browser, and you should be greeted by the template's homepage. It's always a good idea to click through a few pages and make sure everything loads correctly and your terminal isn't screaming with errors. This quick check confirms the foundation is solid before you start writing any of your own code.\n\n## Making the Template Your Own\n\nThis is where the fun really begins. Grabbing a **Next.js website template** gives you a massive head start, but the real magic happens when you start molding it to fit your brand and unique needs. We're going to dive into making some meaningful, lasting changes using the powerhouse duo of [Tailwind CSS](https://tailwindcss.com/) and [TypeScript](https://www.typescriptlang.org/).\n\n![An illustration of a woman organizing digital content and UI elements on a large screen and multiple windows.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c71fcc9d-0f54-4324-b3c9-364fb33b5616/nextjs-website-template-digital-workflow.jpg)\n\nThe first stop for almost any project is styling. A well-built template is designed for easy customization, and with Tailwind, this whole process feels incredibly systematic and clean. Forget hunting through endless CSS files; you’ll make global changes in one central spot.\n\nThis approach is all about consistency. It saves you from writing dozens of one-off style overrides and lets you inject your brand's DNA directly into the template's core design system.\n\n### Injecting Your Brand with Tailwind CSS\n\nYour brand identity—those specific colors, fonts, and spacing rules—is what makes your site instantly recognizable. With Tailwind, defining these is surprisingly straightforward.\n\nPop open the `tailwind.config.js` file you'll find at the root of your project. Think of this as the control center for your site's entire aesthetic.\n\nInside, you'll see a `theme` object. This is where you can extend Tailwind's default styles with your own. For instance, let's say you want to add your custom brand color palette:\n\n```js\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  // ...other config\n  theme: {\n    extend: {\n      colors: {\n        brand: {\n          primary: \"#5A67D8\",\n          secondary: \"#ED64A6\",\n          accent: \"#FBBF24\",\n        },\n      },\n    },\n  },\n  // ...plugins\n}\n```\n\nJust like that, you can use these colors anywhere in your project with utility classes like `bg-brand-primary` or `text-brand-accent`. You can apply this exact same principle to typography (`fontFamily`) and spacing, giving you total command over your site's visual language from one organized file.\n\n### Customizing Components with TypeScript\n\nBeyond just the looks, you'll inevitably need to adapt the template's components to handle your specific data and logic. This is where TypeScript really shines, acting as a safety net to prevent common bugs before they ever make it to the browser.\n\nLet's imagine you're tweaking a pricing card component. The original template might have props for a `title` and `price`. But what if you need to add a list of features and a \"most popular\" badge?\n\nFirst, you'd jump into the component's props interface and update it:\n\n```tsx\n// src/components/PricingCard.tsx\n\ninterface PricingCardProps {\n  title: string\n  price: number\n  features: string[]\n  isPopular?: boolean // Optional prop\n}\n\nexport function PricingCard({\n  title,\n  price,\n  features,\n  isPopular,\n}: PricingCardProps) {\n  // ... component JSX\n}\n```\n\nThe moment you update that interface, TypeScript's compiler gets to work. It will immediately flag any instance of `<PricingCard />` in your codebase that's now missing the required `features` prop. This kind of proactive error checking is an absolute lifesaver, especially as your application grows.\n\n> Using TypeScript to modify component props isn't just about adding fields; it's about creating a contract. You define exactly what data a component needs to function, and the compiler ensures that contract is never broken. It drastically cuts down on those pesky runtime errors.\n\n### Adding Dynamic UI with Magic UI\n\nTo really elevate the user experience, you'll want to sprinkle in some subtle, professional animations. This is where a library like our own **Magic UI** comes in handy. It's a collection of pre-built, beautifully animated components that you can drop into your project with almost no effort.\n\nOften, integrating a component is as simple as installing a package and importing it into your page. This lets you add those delightful micro-interactions that make a site feel polished and alive—without having to write complex animation code from scratch. It’s a fast track to adding a layer of professionalism to your customized **Next.js website template**.\n\n## Optimizing for Search Engines and Performance\n\nA sharp-looking **Next.js website template** is a great starting point, but it won't do you much good if it’s slow or invisible to search engines. The real magic happens when your site is lightning-fast and easy for Google to find. Thankfully, Next.js templates are built for speed, and you can push that advantage even further by learning [how to improve page load speed](https://frozencrow.com/how-to-improve-page-load-speed/).\n\nLet's get into the tools Next.js has baked right in to make your site a top performer.\n\n![A digital dashboard displaying various data visualizations including a gauge, a network graph, and a cost optimization layout.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/ff4dff6d-00ff-4145-af3f-f4c3dbb06a87/nextjs-website-template-data-dashboard.jpg)\n\nPerformance is more than just a number on a report; it's the foundation of a good user experience. Nobody sticks around for a page that takes forever to load. This is where Next.js really shines, and a couple of features, in particular, give you an immediate boost.\n\n### Boosting Your Core Web Vitals\n\nIf you’re hunting for performance bottlenecks, start with your images. They are, without a doubt, one of the most common culprits for slow page loads. The built-in Next.js `<Image>` component is your secret weapon here.\n\nIt automatically takes care of the heavy lifting:\n\n- **Lazy Loading:** Images won't even start to load until a user scrolls them into view, which drastically cuts down initial load time.\n- **Format Conversion:** It intelligently serves up modern formats like WebP, which are significantly smaller than old-school JPEGs or PNGs without losing quality.\n- **Responsive Sizing:** The component creates different sizes of an image and serves the right one for the device, so mobile users aren't stuck downloading a massive desktop image.\n\nThe other game-changer is **Dynamic Imports**. This lets you split your code into smaller pieces that only load when they're needed. For instance, why load a heavy data visualization library on every single page? With dynamic imports, you can make sure it only loads on the dashboard where it's actually used. This is a direct path to improving your site’s initial load time and Core Web Vitals. For a deeper dive into these strategies, our guide on https://magicui.design/blog/how-to-improve-website-loading-speed has you covered.\n\n### Mastering On-Page SEO\n\nA fast site gets people in the door, but solid SEO is what helps them find the door in the first place. Next.js gives you a fantastic foundation for this, going way beyond just basic title tags.\n\nWith the `generateMetadata` function, you can manage SEO details for every single page. This means you can programmatically create unique titles, descriptions, and Open Graph tags for each blog post or product. That level of control is crucial for ranking well.\n\n> One of the most critical pieces is a dynamic sitemap. You can set up a `sitemap.xml` file that automatically adds new pages as you create them. This ensures search engine crawlers always have an up-to-date map of your entire site.\n\nFinally, don't forget **structured data** (also known as Schema markup). This is how you give search engines context. By adding a simple JSON-LD script, you can tell Google that a specific page is an article, a product review, or an event. This is what unlocks those \"rich results\" in search, driving way more clicks and turning your **Next.js website template** into a true SEO powerhouse.\n\n## Got Questions About Next.js Templates?\n\nJumping into a **Next.js website template** is a huge productivity boost, but it's smart to have a few questions before you go all in. Let's clear up some of the common things that trip developers up, so you can pick the right template and get started with confidence.\n\nThink of this as a quick chat based on real-world experience, designed to help you navigate your options like a pro.\n\n### Are Free Next.js Templates Good Enough for Production?\n\nLook, free templates are awesome for getting your feet wet. They're perfect for personal projects, quick prototypes, or just figuring out how Next.js works. But when you’re building something for real users—an application your business depends on—the game changes.\n\nFor a production app, you have to be ruthless about vetting free options. Is the code clean? Is it still being maintained? Does it follow accessibility best practices? This is where premium templates usually pull ahead. They almost always come with solid documentation, actual human support, and a more complete, battle-tested codebase that can save you from countless late-night coding sessions.\n\n> The fact that people happily pay for templates tells you everything. A small upfront investment often pays for itself tenfold in time saved and headaches avoided.\n\n### How Should I Handle Updates to a Template I Purchased?\n\nThis is a fantastic question, and the answer really depends on how the template author set things up. The best-case scenario is a workflow built around Git. Instead of just downloading a ZIP file, you should fork the original template repository.\n\nForking lets you create your own version where you can make all your customizations. When the author releases an update, you can pull their changes from the main branch and carefully merge them into your project. Always read the documentation first, though. Good authors will provide specific guides or detailed changelogs to make integrating updates a whole lot smoother.\n\n### Can I Deploy a Next.js Template to Any Host?\n\nYes, absolutely. Under the hood, a Next.js app is a Node.js app, which means any host that supports Node will work. However, if you want the best performance and a ridiculously simple developer experience, you should really look at platforms like [Vercel](https://vercel.com) and [Netlify](https://www.netlify.com).\n\nVercel, created by the same team behind Next.js, offers an experience that's pretty much seamless. These platforms are fine-tuned for Next.js features like Incremental Static Regeneration (ISR), Server Components, and automatic image optimization. They take care of all the complicated server stuff for you, letting you deploy with just a few clicks.\n\n---\n\nReady to build a stunning landing page in minutes? Check out the powerful components and templates from **Magic UI**. You'll build faster, design better, and get your vision launched with our production-ready UI library. [Explore Magic UI today!](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/nextjs.mdx",
    "content": "---\ntitle: \"A Quick & Simple Introduction To NextJS\"\ndescription: \"New to NextJS? This beginner-friendly guide will help you with the basics of NextJS and get started to creating an efficient web apps.\"\nimage: https://cdn.magicui.design/assets/q47ofr9ogw.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-30\"\nfeatured: false\n---\n\nAre you looking to enhance your [UI frameworks](https://magicui.design/blog/ui-frameworks)? NextJS, a React framework that can streamline your development process. This article will help you understand how NextJS can elevate your projects, from faster rendering to better SEO.\n\nMagic UI's [React component library](https://magicui.design/) adds the finishing touch to boost your NextJS projects. Ready to improve your skills and make the most of your UI Frameworks? Let's get started!\n\n## What Is NextJS?\n\n![NextJS](https://cdn.magicui.design/assets/lh7h7pc2pai.jpg)\n\nNextJS is an open-source web development framework that empowers React-based web applications with server-side rendering and static website generation. React documentation recommends NextJS among the recommended toolchains, suggesting it to developers when building a server-rendered website with Node.js.\n\nUnlike traditional React apps that can solely render their content in the client-side browser, NextJS extends this functionality to applications rendered on the server side. This dynamic framework is copyrighted and trademarked by Vercel, the private company that created it, and continues to lead its open-source development.\n\n### Powerful Framework for Building SEO-Friendly Apps\n\nNextJS is renowned for its robust capabilities, including server-side rendering (SSR) and enhanced search engine optimization (SEO). NextJS offers built-in routing, simplifying the creation of dynamic routes and navigation handling within your application. With the increased emphasis on performance and SEO in modern web development, leveraging a framework like NextJS can offer a significant advantage in building high-performing, SEO-friendly web applications.\n\n### Streamlined Development and Enhanced Performance\n\nYou have access to its versatile features that streamline the development process and enhance the performance of web applications. Its server-side rendering capabilities can lead to faster loading times and improved SEO, resulting in better search engine rankings and increased visibility. The built-in routing functionality simplifies your application's navigation structure, making it easier for users to navigate through pages seamlessly.\n\n### The Go-To Choice for High-Performance\n\n[NextJS](https://github.com/vercel/next.js) provides a robust foundation for developing high-performance web applications with enhanced SEO, faster load times, and improved user experience. With its server-side rendering capabilities and built-in routing, NextJS is a go-to choice for developers looking to create dynamic and search engine-friendly web applications.\n\n## NextJS Styling And Features\n\n![NextJS](https://cdn.magicui.design/assets/9ieqo7brzu6.jpg)\n\nNextJS supports styling with:\n\n- CSS\n- Precompiled Scss and Sass\n- CSS-in-JS\n- Styled JSX\n- TypeScript support\n- Smart bundling\n- Open-source transpilers such as SWC\n\n[TurboPack bundles](https://nextjs.org/docs/architecture/turbopack) modules after transformation; all these tools are used with npm in a terminal.\n\n### Server-Side Rendering for Performance and Security\n\nThe main [highlight of NextJS](https://nextjs.org/docs/architecture/nextjs-compiler) is its server-side rendering feature that lessens the burden on web browsers and enhances security. Server-side rendering can be implemented for any part of the application or the entire system, allowing content-rich pages to be singled out for server-side rendering.\n\nIt can be applied only for first-time visitors to lessen the load on web browsers that have not downloaded any site assets yet. The hot reloading feature detects code changes and re-renders appropriate pages, avoiding the need to restart the server.\n\n### Development with Routing, Hot Reloading, and More\n\nNextJS utilizes page-based routing for developer convenience and supports dynamic routing. Other notable features include hot-module replacement for live module replacement, automatic code splitting that includes only necessary code for page loading, and page prefetching to reduce load time.\n\nIt also supports incremental static regeneration and static site generation. During build time, a pre-built version of the website is usually saved as a .next folder consisting of static HTML pages cached and sent to users when requested.\n\nNextJS provides numerous features such as:\n\n- Server-side rendering\n- Hot reloading\n- Automatic code splitting\n- Page prefetching\n\n### Free Animated React Components for Effortless UI Design\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Benefits Of Using NextJS\n\n![NextJS](https://cdn.magicui.design/assets/o9uufnd7pxr.jpg)\n\n### 1\\. Rich Ecosystem\n\nNextJS benefits from the wide adoption of JavaScript and strong support from industry giants like Vercel and Meta. It offers a rich talent pool and ease of learning. With a vast community of developers and various resources available, NextJS has a solid foundation. The wide adoption of JavaScript as a primary language for web development contributes to the wide acceptance and implementation of NextJS.\n\nIndustry leaders like Vercel and Meta strongly support the framework, ensuring its relevance and longevity in the constantly evolving tech landscape. This rich ecosystem translates into a pool of skilled developers and extensive learning resources, making it easier for businesses to adopt and scale with NextJS.\n\n### 2\\. Future-Proof Technology\n\nWith regular updates and support from the community and industry leaders, NextJS represents a future-proof solution in web development. Its alignment with the latest web standards makes it a strategic asset for long-term business goals and technology roadmaps. Continuous updates and enhancements ensure that NextJS stays relevant and competitive in the fast-paced tech industry.\n\nThis commitment to ongoing development results in a robust framework that can adapt to changing requirements and advancements in the field. By staying aligned with the latest web standards, NextJS ensures that businesses can build applications that are sustainable and compatible with evolving technologies, making it a safe long-term investment for any organization.\n\n### 3\\. Easy Scalability\n\nNextJS supports scalability through features like automatic code splitting, flexible rendering options, and optimized image handling. These features ensure efficient resource utilization and performance under high traffic. Scalability is a critical consideration for any web application, especially as it grows in popularity and user base. NextJS addresses this need by providing features that help manage and optimize resources.\n\nAutomatic code splitting allows the framework to handle large codebases efficiently, reducing load times and improving overall performance. Flexible rendering options enable developers to adapt the application to varying traffic levels, ensuring a smooth user experience under high loads. Optimized image handling further enhances performance by reducing load times and bandwidth usage, making NextJS a reliable choice for scalable applications.\n\n### 4\\. High Security\n\nOffering a wide range of tools for building secure web applications, NextJS addresses critical areas like authentication and data validation. It is crucial for maintaining user trust and data integrity in the face of growing cyber threats. Security is a top priority for any web application, and NextJS offers a comprehensive set of tools to help developers build secure applications.\n\nFeatures like built-in support for authentication and data validation simplify the implementation of security measures, reducing the risk of vulnerabilities. By providing robust security features, NextJS ensures that businesses can protect user data and maintain the trust of their customers, safeguarding their reputation and compliance with data protection regulations.\n\n### 5\\. Performance Optimization\n\nKey features like lazy loading, image optimization, code splitting, and route prefetching in NextJS positively influence site performance. Performance is a crucial aspect of user experience, and NextJS offers a range of features to optimize site speed and responsiveness. Lazy loading enables the framework to load assets on demand, improving load times and reducing bandwidth usage. Image optimization ensures that images are delivered in the most efficient format and size, reducing load times.\n\nCode splitting breaks down the application into smaller chunks, reducing load times and improving resource management. Route prefetching anticipates user interaction, preloading resources in advance, and enhancing the overall browsing experience. These performance optimization features make NextJS an excellent choice for applications where speed and responsiveness are critical.\n\n## How Does NextJS Compare To Other Frameworks?\n\n![NextJS](https://cdn.magicui.design/assets/w8s695aunve.jpg)\n\nComparing NextJS to other frameworks, its unique value proposition becomes more clear. Unlike traditional React applications that require additional configurations for tooling and functionalities, NextJS comes out of the box with features like server-side rendering and static site generation.\n\n### Beyond React\n\nWhile React is excellent for building user interfaces, it doesn't provide solutions for other aspects of application development. This means developers often have to spend considerable time configuring tools and solving common application requirements. With NextJS, these challenges are addressed head-on as it extends React's capabilities by providing a structured framework with pre-configured functionalities.\n\n### Server-Side Rendering and Static Generation\n\nUnlike many JavaScript frameworks, which focus solely on client-side rendering—a method that can lead to performance issues and poor SEO outcomes—NextJS leverages server-side rendering and static site generation. These features make websites built with NextJS performant and SEO-friendly right from the get-go.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n\n## Common Use Cases For NextJS\n\n![](https://cdn.magicui.design/assets/2x5vt9rw0ld.jpg)\n\nNextJS is a versatile framework that addresses diverse web development needs across multiple industries. One of its popular applications is e-commerce. Its fast rendering and robust SEO capabilities offer an optimal solution for businesses looking to create high-performance online stores that rank well on search engines.\n\n### Blogs and Marketing Websites Optimized with NextJS\n\nBlogs and marketing websites also often leverage the power of NextJS. Its server-side rendering and static site generation features allow for rapid content changes, making it ideal for publishing platforms that frequently update their content.\n\n### Real-time Updates for News Apps and Documentation Websites\n\nNews apps and documentation websites benefit from NextJS's ability to efficiently handle real-time updates. Similarly, entertainment platforms and community-driven web apps can utilize their capabilities to offer high-performance interactive user experiences.\n\n### Enhanced Digital Experiences with NextJS\n\nBooking apps, auction sites, information hubs—NextJS can enhance all these digital experiences due to its speed, versatility, and scalability.\n\n## Drawbacks Of NextJS\n\n![](https://cdn.magicui.design/assets/bw4zeyi9k2s.jpg)\n\n### 1\\. Development and Maintenance Costs\n\nFlexibility often comes at a price, and in the case of NextJS, that price is development and maintenance expenses. Making changes and ensuring the application's upkeep requires a dedicated NextJS developer and front-end expert, ultimately resulting in higher costs than simpler frameworks.\n\n### 2\\. Lack of Built-In State Manager\n\nIf your project requires state management, you must install and configure a separate solution, similar to how you would with a vanilla React application.\n\n### 3\\. Low on Plugins\n\nWhen using NextJS, you might lack access to many easy-to-adapt plugins that could streamline your development process. This can lead to more manual work and customization to achieve the desired functionality.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. This innovative library offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These components are visually appealing and interactive, making them perfect for creating stunning user interfaces with minimal effort.\n\n### Effortless Design Customization\n\nThe beauty of [MagicUI](https://magicui.design/) lies in its high level of customization, with components that seamlessly adapt to your desired branding and design requirements. By focusing on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences effortlessly.\n\n### MagicUI's Free Component Library\n\nMagicUI's free component library enables users to access many visually appealing and interactive elements that can be easily integrated into web applications. With MagicUI's free component library, you can save valuable time and effort by creating beautiful landing pages that convert visitors into customers.\n\n### MagicUI Pro\n\nWith MagicUI Pro, users can take their UI design capabilities to the next level by leveraging website templates to create captivating user interfaces. MagicUI Pro can help design engineers easily create visually stunning websites, giving them the power to capture their audience's attention and convert visitors into customers.\n\n### Empowering Design Engineers to Craft Captivating UIs\n\nMagicUI is a game-changer in UI frameworks, offering design engineers a powerful tool to effortlessly create visually appealing and interactive user interfaces. Whether you are a beginner or an experienced design engineer, MagicUI can help you take your UI design capabilities to the next level.\n\nDon't miss the opportunity to embark on your UI design journey with MagicUI today—visit [https://magicui.design/docs](https://magicui.design/docs) to use our [React component library](https://magicui.design/) for free!\n"
  },
  {
    "path": "apps/www/content/blog/portfolio-landing-page.mdx",
    "content": "---\ntitle: \"How To Create Your Own Portfolio Landing Page (With Examples)\"\ndescription: \"Struggling to design a captivating portfolio landing page? Get expert tips & inspiration to showcase your work & stand out! Design yours today!\"\nimage: https://cdn.magicui.design/assets/5t9oy3a6r5o.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nHave you ever found yourself scrolling endlessly through [landing page examples](https://magicui.design/blog/landing-page-examples), looking for inspiration to design the perfect portfolio landing page? Crafting a stunning first impression that captivates visitors can be quite a challenge. In this article, you will learn more about portfolio landing page, including creative ideas and practical tips to help you design a captivating portfolio landing page that truly stands out.\n\nCheck out Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) that can aid in designing an inspiring portfolio landing page. With this tool, you can create a vibrant and engaging online presence that effectively showcases your work and expertise. Ready to leverage your creative potential and construct a portfolio landing page that will significantly impact potential clients.\n\n## What Is a Portfolio Landing Page?\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/5v6tevi6sq.jpg)\n\nA portfolio landing page is a place to showcase previous projects you’ve worked on. Many creatives—including designers, photographers, and writers—use their portfolios to replace a traditional resume.\n\n### Target & Impress\n\nThe goal is the same: To show prospective clients previous work you’re proud of in the hopes they’ll hire you to do something similar for them. A compelling portfolio landing page should give visitors a clear sense of your abilities and value within seconds.\n\n### Design & Convert\n\nYou can create a page that converts visitors into potential new clients by focusing on a solid visual design, a concise value proposition, and a prominent call to action. With the correct elements, your portfolio landing page can become a powerful tool for [growing your creative business](https://backlinko.com/rank-high-on-google).\n\n## Why Use a Portfolio Landing Page To Showcase Your Services\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/gjg9kotsnv.jpg)\n\n### Increased Credibility and Professionalism\n\nA portfolio landing page elevates your brand by showcasing your work with a [touch of professionalism](https://www.workitdaily.com/benefits-of-an-online-career-portfolio). This practice demonstrates your commitment to quality and attention to detail. Having a dedicated space for your portfolio showcases your work in a professional light and can impress potential clients and employers.\n\n### Better User Experience and Navigation\n\nA standout feature of a portfolio landing page is its ability to provide a seamless user experience. Users can effortlessly browse through your work with the following:\n\n- Well-thought-out design\n- Easy-to-navigate layout\n- Engaging visuals\n\nThe streamlined navigation ensures visitors can easily find the information they seek and interact with your portfolio without friction.\n\n### Increased Conversion Rates\n\nFocusing solely on your portfolio on a landing page can positively impact conversion rates. A singular objective, such as encouraging visitors to contact you or explore your work further, creates a more compelling call to action. With a clear direction, visitors are likelier to engage with your work and take the desired action.\n\n### More Control Over the Message and Presentation\n\n[Utilizing a landing page](https://www.portfoliobox.net/blog/from-clicks-to-clients-how-landing-pages-elevate-your-portfolio) to display your portfolio gives you more control over how your work is presented. You can tailor the layout, font, color scheme, and content to your style and brand.\n\nThis flexibility allows you to create a portfolio that perfectly aligns with your personality and showcases your work, reflecting your creativity.\n\n### Improved SEO\n\nOptimizing your portfolio [landing page for search engines](https://www.semrush.com/blog/seo-landing-page/) can enhance your online visibility. This optimization helps search engines understand your content and rank your page in search results.\n\nAn SEO-optimized landing page increases your chances of being discovered by potential clients and employers looking for services within your niche.\n\n### Free UI Library for Designers and Developers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library specially designed for design engineers. It offers a collection of over 20 animated components. Integrating MagicUI components into web applications is seamless and customizable to match your desired branding and design requirements. The UI library bridges the gap between design and development, enabling captivating digital experiences.\n\nSave time and create a stunning landing page using our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## What To Include On Your Portfolio Landing Page\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/pd0y2uvt2gq.jpg)\n\n### Strong Headline\n\nYour portfolio landing page should have a [strong headline](https://www.ryrob.com/how-to-write-a-headline/) that grabs the attention of potential clients immediately.\n\nThis headline should communicate your value proposition effectively, ideally placed above the fold. A compelling headline is crucial in persuading the reader to delve further into your portfolio.\n\n### Clear Copy\n\nThe copy on your portfolio landing page should be clear and concise. Instead of only detailing the projects you've worked on, describe the type of clients you've worked with.\n\nBy explaining the problems and frustrations you've solved for your clients, future clients can better understand your capabilities and how you can help them achieve their goals.\n\n### Testimonials\n\nIncluding testimonials on your portfolio landing page can be a game-changer. Potential clients love seeing feedback from previous clients about their experience working with you.\n\nAdding a short testimonial to showcase the positive impact of your work can help sway future clients to choose you over your competitors.\n\n### Results\n\nWhile highlighting the projects you've completed is essential, showcasing the results is even more impactful. Backing up each project listing in your portfolio with concrete results demonstrates your ability to deliver tangible outcomes.\n\nEvidence of your success can instill confidence in potential clients and increase their likelihood of hiring you.\n\n### Call-to-Action\n\nTo maximize the chances of converting visitors into clients. Whether it's a button directing them to your contact page or a form embedded directly on the landing page, give potential clients a clear path to reach you. By making it easy for them to take the next step, you increase the likelihood of securing new business opportunities.\n\n### Related Reading\n\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How To Create Your Own Portfolio Landing Page\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/x36her9yap.jpg)\n\n### Defining Your Goals\n\nSetting clear goals and objectives for your portfolio [landing page](https://unbounce.com/landing-page-articles/what-is-a-landing-page/) is the first step to success. Decide if you want to attract new clients, showcase your skills and experience, or promote your services. Understanding your objectives will guide the design and content of your page.\n\n### Choosing a Simple and Clean Design\n\nKeep your portfolio landing page clean and minimal. Avoid clutter and distracting elements. Focus on a straightforward header with your:\n\n- Name and service\n- A brief introduction\n- Examples of your work\n- Contact information\n\nWhite space and a minimal color palette will make your page easy to navigate.\n\n### Highlighting Your Best Work\n\nShowcase 5-10 of your best projects, case studies, or work examples. Include appealing images and a brief description of the project objectives, your role, skills used, and outcomes for each. Use descriptive headings and bulleted lists to present key details.\n\n### Including a Strong Call to Action\n\nEnd your page with a clear call to action, such as “Contact me for a free consultation” or “Get a quote for your next project.” Provide your:\n\n- Email address\n- Phone number\n- Links to your social media profiles or online booking services\n\nA solid call to action gives visitors a direct way to reach out and take the next step.\n\n### Testing and Optimizing\n\nAfter launching your page, monitor visitor interactions to identify what’s working well and areas for improvement. Analyze metrics like:\n\n- Time on page\n- [Bounce rate](https://www.semrush.com/blog/bounce-rate/)\n- Conversions\n\n#### Refine & Optimize\n\nMake necessary adjustments to content, design, or call to action to optimize your portfolio landing page’s effectiveness. Continuously enhance your page to maximize its impact.\n\n## 5 Examples Of Great Portfolio Landing Pages\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/j1ngcsyo3up.jpg)\n\n### 1\\. Joao Verissimo\n\n[Joao Verissimo's portfolio landing page](https://www.joaoverissimo.work/) showcases motion and interaction design work, highlighting:\n\n- Animation\n- Webflow development\n- Games\n\n#### Hero Showcase\n\nThe website boasts a charming design with a hero header that smoothly transitions between various video content, headlines, and calls-to-action against a black background.\n\n#### Clean & Functional\n\nThe overall aesthetic is clean and minimalist, with key features such as\n\n- A short bio section with black typography and a striking yellow background\n- An off-canvas menu\n- Social media links\n- An elegant footer\n\n#### Engage & Impress\n\nThe site effectively utilizes white space and visually engaging elements to captivate visitors and showcase Verissimo's impressive portfolio.\n\n### 2\\. Digital Bro\n\n[Digital Bro's portfolio landing page](https://digitalbro.net/) exudes professionalism and modernity, focusing on branding, web design, and software development. The website features:\n\n- A clutter-free layout with practical web elements\n- Visual hierarchy\n- Ample white space to enhance user experience\n\n#### Modern Showcase\n\nProjects are prominently displayed with high-quality thumbnails and straightforward typography, while services are represented using sleek line icons. Integrating an Instagram feed adds an extra visual appeal, making the overall design:\n\n- Clean\n- Modern\n- Fully responsive\n\n### 3\\. Yasio\n\n[Yasio](https://yasio.dev/), the portfolio website of web/mobile developer and designer Jan Baszczok, impresses with its intuitive and modern design aesthetic. The one-page layout features:\n\n- A sleek black background with white typography\n- Exuding elegance and sophistication\n\n#### Animated About\n\nEach landing page section reflects Jan’s personality and work, with subtle animations enhancing the user experience. The About section creatively showcases his:\n\n- Work experience\n- Education\n- Skills\n\n#### Easy Animations\n\nFor those looking to add animated components to their site, Yasio's Magic UI offers over 50 animated elements to make websites pop.\n\n### 4\\. Steven Mengin\n\n[Steven Mengin's Toronto-based portfolio](https://www.stevenmengin.com/) landing page stands out with its simple yet impressive design that effectively integrates animation.\n\n#### Animated Welcome\n\nThe website welcomes visitors with a hero header that features the designer’s name and a captivating animated background. Projects are showcased individually as users scroll down, with each project displaying quality imagery through a smooth slider.\n\n#### Smooth Scrolling\n\nMengin’s portfolio landing page captures attention, highlighting his digital design expertise with a clean and engaging layout.\n\n### 5\\. Charlie Horner Design\n\n[Charlie Horner](https://charliehornerdesign.com/)'s portfolio landing page showcases the work of an interior designer who focuses on creativity and quality. The website's homepage features a full-screen layout that presents featured works through a captivating slider.\n\nAs an interior designer, the site complements the quality of its services through its design, inspiring creativity and effectively showcasing Horner's talent.\n\n## What Do These Portoflio Landing Pages Have In Common?\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/zetohxqoocm.jpg)\n\n### Aesthetically Pleasing Design\n\nVisually compelling design is crucial to capture the viewer's attention. These landing pages boast attractive color schemes, typography, and layouts with a simple, uncluttered interface. High-quality images showcase work samples, creating a stylish and professional impression.\n\n### Clear Navigation\n\nEasy navigation is essential for a [successful portfolio](https://www.convertflow.com/campaigns/portfolio-landing-pages). These pages offer straightforward pathways for viewers to explore:\n\n- Work samples\n- Client testimonials\n- Contact information\n\nUsers can delve into specific projects or get a quick overview of services.\n\n### Showcasing Projects\n\nEach page prominently features 3-5:\n\n- Selected projects\n- Described through images\n- Descriptions\n- Client testimonials\n\nThis curated selection showcases a broad range of skills, from branding to [UX design](https://designlab.com/blog/ux-design-portfolio-guide), demonstrating the designer's versatility and expertise.\n\n### Client Testimonials\n\nClient testimonials add credibility to the portfolio, showcasing positive feedback and satisfaction from previous clients. These glowing reviews highlight the quality of work, talent, and client service, building trust with potential new clients.\n\n### Contact Information\n\nIt is crucial to make it easy for visitors to contact you. These portfolio pages display contact forms, email addresses, phone numbers, and social media links, inviting new collaborations and job opportunities.\n\n## 3 Must-Have Elements For An Effective Portfolio Landing Page\n\n![Portfolio Landing Page](https://cdn.magicui.design/assets/o8u3knnkpwq.jpg)\n\n### 1\\. A Clear Value Proposition\n\nYour portfolio landing page should immediately communicate what you do and who you work with. Craft a concise value proposition that explains your services and how you can help potential clients.\n\n#### Expertise Intro\n\n\"I'm a UX designer who helps tech startups build intuitive digital experiences.\" This clear and straightforward statement gives visitors an immediate understanding of your area of expertise and can invite them to delve deeper into your portfolio.\n\n### 2\\. A Strong Visual Design\n\nThe visual design of your landing page is crucial in showcasing your creative skills and style. Use high-quality images, minimal text, negative space, and a simple yet bold color palette to create a visually appealing layout.\n\n#### Curated Showcase\n\nFor a portfolio, focus on showcasing 3 to 5 of your best projects with eye-catching graphics that demonstrate your capabilities.\n\n#### Clean Experience\n\nEnsure that your page's overall look and feel is clean, modern, and mobile-friendly to provide a seamless user experience for visitors navigating its complexities.\n\n### 3\\. A Prominent Call-to-Action\n\nIncorporate clear and prominent [call-to-action (CTAs)](https://www.investopedia.com/terms/c/call-action-cta.asp) on your portfolio landing page to guide visitors on the next steps. Include buttons or links that invite visitors to:\n\n- Contact you\n- View your work\n- Learn more about your services\n\n#### Clear Calls to Action\n\n\"See My Portfolio\" or \"Get in Touch\" are effective CTAs that encourage visitors to engage with your content. Place these CTAs prominently on your page, such as at the top, to make it easy for visitors to take the next step in engaging with your content.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers, offering a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThis innovative library provides a range of visually appealing and interactive elements that can be easily integrated into web applications. It enables users to create stunning user interfaces with minimal effort.\n\n### Customize MagicUI to Match Your Unique Style\n\nWith highly customizable components, MagicUI allows seamless adaptation to match desired branding and design requirements. Combining a focus on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Boost Conversions With MagicUI's Engaging Animations\n\nThe MagicUI library includes various components to enhance user experience and engagement on landing pages. These components feature eye-catching animations and visual effects that can significantly improve a website's overall aesthetic. By incorporating MagicUI components into a landing page, users can create a more dynamic and engaging experience for visitors, increasing the likelihood of conversion.\n\n### Get Thousands of Hours Back with Our Conversion-Optimized Landing Page Template\n\nWith MagicUI Pro, users can access a startup landing page template that can save thousands of hours and help create a beautiful landing page to convert visitors into customers. This template offers a seamless solution for businesses looking to enhance their online presence and drive conversions through an optimized landing page.\n\n### Benefits of Using MagicUI Pro and Startup Landing Page Template\n\n- Streamline design process\n- Achieve a professional look and feel\n- Create a compelling user experience\n- Drive impactful results\n\nThe [MagicUI](https://magicui.design/) startup landing page template is invaluable for businesses creating high-converting pages without extensive design and development resources. This template allows users to quickly and effectively establish an online presence that resonates with their target audience and drives action. With MagicUI Pro, businesses can unlock the full potential of their online marketing efforts and achieve tangible results through a well-designed and optimized landing page.\n\nBoost your online presence with MagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup). Start using MagicUI Pro today and effortlessly create a compelling, high-converting landing page.\n"
  },
  {
    "path": "apps/www/content/blog/pricing-page-examples.mdx",
    "content": "---\ntitle: \"21 Effective Pricing Page Examples That Boost Conversions\"\ndescription: \"See Magic UI’s pricing page examples to inspire your design and boost conversions. Click to get started with our user-friendly template now!\"\nimage: https://cdn.magicui.design/assets/d9027578-2e1b-4879-a212-db0eb056dd09.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nDo you need help to create an engaging and effective pricing page for your website? Crafting a well-designed pricing page is vital for enticing potential customers and boosting conversions. In this blog, you will learn various pricing page examples from successful websites to inspire and guide you in designing your compelling pricing page. Keep reading if you're looking for examples and inspiration to help you create a standout pricing page!\n\nLooking for [landing page examples](https://magicui.design/blog/landing-page-examples) and inspiration for designing an effective pricing page? Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is here to save the day. This valuable tool offers many features and a user-friendly interface that perfectly caters to your goal.\n\n## What Is A Pricing Page?\n\n![Pricing Page Examples](https://images.unsplash.com/photo-1506645292803-579c17d4ba6a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxtb25leSUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMTExOTI3NHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA pricing page is a dedicated landing page on a website that outlines the various pricing options or tiers for a product or service. It details each tier’s cost, features, and benefits, helping potential customers understand what they will receive at different price points.\n\n### Making the Choice Easy\n\nThis page often:\n\n- Compares features across tiers\n- Has clear call-to-action buttons\n- Includes customer testimonials.\n\nIt also offers free trials or money-back guarantees to build trust and encourage conversions.\n\n### The Heart of Sales\n\nYour pricing page is the landing page on your website that lists the different pricing options or tiers available to customers and the benefits and features included in each tier. It is the most important page on your website—without a well-designed pricing page, you’ll lose conversions and potential revenue.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## What Makes An Effective Pricing Page? Elements Of A Pricing Page\n\n![Pricing Page Examples](https://images.unsplash.com/photo-1531403009284-440f080d1e12?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxVSXxlbnwwfHx8fDE3MjExMTkyODN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Pricing Table\n\nA well-structured pricing table is crucial for a pricing page to give visitors a concise overview of different plans or tiers. This allows visitors to:\n\n- Compare\n- Choose the most suitable option quickly.\n\n#### Understanding Your Options\n\nA pricing table typically includes information such as:\n\n- The features included in each tier\n- The pricing for each tier\n- Any additional benefits that come with specific options.\n\nVisitors can decide which plan best meets their needs by presenting this information in an easily digestible format.\n\n### Pricing Comparisons\n\nHighlighting the features and benefits of each pricing tier through clear comparisons enables users to differentiate between options and select the one that best aligns with their needs. By clearly outlining the value proposition of each tier, visitors can quickly identify which tier offers the best value for their specific requirements.\n\nThis also helps visitors understand the differences between various plans, making it easier to decide and convert into paying customers.\n\n### Pricing Calculator\n\nA dynamic pricing calculator on a pricing page allows visitors to customize their requirements and view the corresponding costs instantly, enhancing:\n\n- Transparency\n- Personalization\n\nThis feature enables potential customers to input their specific needs, such as the number of users, storage requirements, or additional features, and see how these choices affect the overall cost. By providing this level of customization, businesses can increase the likelihood of conversion by demonstrating the flexibility and affordability of their pricing options.\n\n### FAQ Section for Pricing\n\nAddressing common questions and concerns about pricing in a dedicated FAQ section is essential for the following:\n\n- Creating clarity\n- Building trust with potential customers\n\nBy proactively answering questions visitors may have about pricing, businesses can dispel potential customers' uncertainties. This helps establish credibility and transparency, key factors in converting visitors into customers.\n\n### Immediate Call-to-Action (CTA)\n\nIncluding a prominent and persuasive [CTA button](https://www.optimizely.com/optimization-glossary/call-to-action/) on the pricing page encourages visitors to take action and purchase or subscribe to services without any hassle. A well-crafted CTA can guide visitors through the purchasing process, making it easy for them to sign up or purchase. By strategically placing a CTA button near the pricing information, businesses can capitalize on visitors' interest in the product or service and drive conversions.\n\n### Contact Information\n\nProviding convenient ways for potential customers to contact your business on the same page fosters trust and allows any questions or concerns to be addressed promptly. By displaying contact information, companies can reassure visitors that help is readily available. These include:\n\n- Phone numbers\n- Email addresses\n- Live chat options\n\nThis level of accessibility can instill confidence in potential customers and increase the likelihood of conversion.\n\n### Urgency and FOMO\n\nCreating a sense of urgency and fear of missing out on a pricing page can encourage visitors to take action quickly. Businesses can urge visitors to make a decision promptly to avoid missing out on the opportunity by highlighting the following:\n\n- Limited-time offers\n- Special discounts\n- Exclusive deals\n\nThis tactic can help boost conversions and drive sales by leveraging visitors' desire to take advantage of a good deal.\n\n### Start with MagicUI Today!\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React,\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nUse our startup landing page template today to create a stunning user interface with minimal effort.\n\n## How Do You Create A Good Price Page?\n\n![Pricing Page Examples](https://images.unsplash.com/photo-1573867639040-6dd25fa5f597?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8bGF5b3V0JTIwd2Vic2l0ZXxlbnwwfHx8fDE3MjExMTkzMDB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Layout\n\nWhen [designing a pricing page](https://blog.hubspot.com/marketing/pricing-page-examples), the layout should be user-friendly. The navigation should be easy to get through the page with no issues. Ensuring that all critical components are kept above the fold, including at least one call-to-action, is essential for a seamless flow for your potential customers.\n\n### Information\n\nA recent study has indicated that pricing pages packed with information and action result in more confident users converting. Pages that don’t do this well have buyers who are:\n\n- Intimidated\n- Distracted\n- Discouraged.\n\nThus, presenting information in a decent order is crucial for the effectiveness of your pricing page.\n\n### Language\n\nWhen creating a pricing page, it is crucial to speak to your prospective customers in your brand voice. Depending on your target audience, using simple language and avoiding jargon can lead to better understanding. Using the correct copy and colors is critical, ensuring you highlight your features' benefits while avoiding too sales-y language.\n\n### Pricing\n\nYour [pricing page](https://blog.hubspot.com/marketing/price-testing?hubs_content=blog.hubspot.com/marketing/pricing-page-examples&hubs_content-cta=A/B%20test%20your%20pricing) should indicate the pricing options and package offerings. If you offer different packages catering to various sizes and budgets, each option should speak directly to that buyer persona. Highlighting a recommended package plan can alleviate confusion and guide you to where the most value lies.\n\n### CTA and Testing\n\nYour call-to-action (CTA) is a crucial element on your pricing page. It should stand out and have a clear directive for your customer. Use a distinct color for the CTA button and ensure it starts with a verb, telling the reader what they will receive when they take action. Always test your CTAs and other elements on your pricing page to see what's working or not to make data-driven decisions.\n\n## 21 Effective Pricing Page Examples\n\n![Pricing Page Examples](https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMHdlYnNpdGUlMjBhbG9uZSUyMGluJTIwb2ZmaWNlfGVufDB8fHx8MTcyMTExOTMzOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Slack\n\n[Slack](https://slack.com/pricing) uses the two-tab option for its pricing. One tab is for companies, and the other is for teams. Each has different pricing tiers, making it easy to compare the services. Each tab has a distinctive layout and style, so users won’t be confused and can quickly see the different features offered.\n\n### 2\\. BombBomb\n\nBombBomb uses the 3-tab solution, which includes a step-by-step guide for its enterprise plan. At the top, users can choose from:\n\n- Individual\n- Teams\n- Enterprise solutions\n\nEvery tab has a most popular option, and each selection has detailed lists of features so users can choose what best meets their needs. The enterprise plan is completely customizable, so the step-by-step instruction works well.\n\n### 3\\. Mailchimp\n\nMailchimp’s [pricing page](https://mailchimp.com/pricing/marketing/compare-plans/) has three tabs that break down its offerings. In addition to organizing its features, each tab has a relevant tool to help customers better understand what they will pay for and receive. For example, the Marketing Platform tab has an adjustable contact counter that, when moved, changes the prices of each plan to reflect an accurate cost.\n\n### 4\\. Zendesk\n\nZendesk has intuitive card designs for its plans. The first card is inexpensive, but the intro copy highlights “starting at just $5 an agent.” It also shows a free trial option on the first two options. Each card details the payment plans and products to let users know what they are getting in each package so they can make an informed choice.\n\n### 5\\. Big Cartel\n\nBig Cartel uses a custom image background for their pricing tiers. The visual aspect of their product is an easy draw for prospective buyers. The text is simple and easy to understand. It’s:\n\n- Attractive\n- Informative\n- Intuitive\n\n### 6\\. HubSpot\n\nThe HubSpot [CRM platform](https://www.hubspot.com/pricing/marketing?products=marketing-hub-starter_1&term=annual&hubs_content=blog.hubspot.com/marketing/pricing-page-examples&hubs_content-cta=HubSpot&hubs_post=blog.hubspot.com/marketing/pricing-page-examples&hubs_post-cta=HubSpot&_ga=2.18084409.181734736.1720944895-1623441568.1717871070&_gl=1*89hsrj*_gcl_au*NTExMTU2NDY3LjE3MTc4NzEwNzA.*_ga*MTYyMzQ0MTU2OC4xNzE3ODcxMDcw*_ga_LXTM6CQ0XK*MTcyMDk0NDg5NS42MS4xLjE3MjA5NDU4NDIuNjAuMC4w) comprises five products:\n\n- Marketing Hub\n- Sales Hub\n- Service Hub\n- Content Hub\n- Operations Hub\n\nThe pricing page keeps it simple by offering each individually, allowing users to choose the one that best suits their needs. If users are interested in a bundle, they can toggle the tab at the top to get bundle pricing.\n\n### 7\\. Box\n\nBox's pricing page is informative, intuitive, and actionable — starting with the heading right at the top, which prompts users to choose the best plan for their business. They did well by allowing users to select their buyer persona by offering two call-to-action buttons at the top:\n\n- Individuals and Teams\n- Business Plans\n\nThis makes the user experience far simpler. After all, if you're considering buying Box for your business, there's no reason you'd need to see the personal pricing plans (and vice versa).\n\n### 8\\. Detectify\n\nDetectify's pricing page design is unusual but creates an excellent user experience. Users can choose between two simple options, depending on their use case. Users can buy a security subscription for:\n\n- Websites they’re hosting\n- Applications they’re building\n\nThis works well for a single product with a price that only changes depending on what you’re using it for.\n\n### 9\\. Wistia\n\nLike any page on your website, design is as important as the information you provide. Wistia's pricing page is one of the most visually pleasing because of its clean, colorful layout and whimsical lines that align with its playful brand.\n\nThey also use language that makes it easy for visitors to find a pricing plan that suits their needs. Under each option, they provide a short description of the ideal customer. For example, the Pro version is \"For businesses investing in marketing with videos and podcasts.”\n\n### 10\\. Casper\n\nThis landing page successfully balances concise informational content and the strategic use of space, fostering a clear and user-friendly experience.  Particularly noteworthy is the well-articulated refund policy, which outlines the:\n\n- Free shipping offer\n- 100-night trial period\n- Full refund guarantee following a 30-night adjustment period\n\nThis transparency in return policies, fosters trust and reduces purchase hesitancy among potential customers.\n\n#### Building Trust Before Purchase\n\nThe company's willingness to go to a dissatisfied customer's house, pick up the mattress for free, and give a full refund is an excellent testimonial to its dedication to customer service. This builds trust with prospects before they even buy and will help create advocates.\n\n### 11\\. Squarespace\n\nLike Zendesk, Squarespace employs strong header copy: \"Set up your site, pick a plan later.\" This reassures users that they don’t have to pay to try the platform; visitors can immediately try it by clicking the “Get Started” button.\n\nWe also love that they include frequently asked questions on the same page as the pricing matrix. That way, users can get many questions answered without digging for answers.\n\n### 12\\. Ticketleap\n\nWhen you arrive at their pricing page, you first see \"Simple, Straightforward Pricing.\" This phrasing aims to make users feel like Tickleap is on their side—they won’t get secretly charged once they sign up on the platform.\n\nLater down the page, users can calculate how much they would pay for Ticketleap and get the simple pricing they were promised at the top\n\n### 13\\. Pagevamp\n\nTrust elements are great additions to any pricing page. Pagevamp took the cue and placed their trial policy right at the beginning of the page, which says, Every plan starts with a 14-day free trial. While no one wants their customers to churn, you increase the value of your product by providing a free trial.\n\nIf you force customers to sign a yearly contract without a trial, that’s a poor policy that might generate short-term revenue but create unhappy customers and poor word-of-mouth down the line.\n\n### 14\\. Acquia\n\nThe simpler your business' pricing page, the better user experience you'll offer, but this gets harder as your product and pricing model become more complex. Acquia is one such company, but they do a great job in this example. You don’t see the product’s pricing when you land on the page. Instead, you get information on choosing the right self-service option for you.\n\nYou also have the option to contact Acquia directly and get an agent to help you pick the right product. This is important if you offer a complex product that might stump professionals who don’t specialize in your field.\n\n### 15\\. Asana\n\nAsana has a neat pricing page, with their three pricing plans in a tier table format. Instead of having a toggle for annual versus monthly payments, they have a toggle for:\n\n- Individuals\n- Small teams\n- Businesses\n- Large corporations\n\n#### Features at a Glance\n\nIt’s clear how each plan differs in terms of basic features, and you can expand to compare in more detail. They have also included trust badges from major partner organizations and details on discounts for nonprofits.\n\nThey have their FAQs at the very end of the page. The page's minimalistic design helps the prospect focus and find the necessary information.\n\n### 16\\. Keap\n\nKeap has managed to fit a lot into their pricing page without appearing overcomplicated or cluttered. They have three color-coded pricing plans, a toggle switch for the payment frequency, and an input box for the number of contacts you need.\n\nThey’ve listed core features for each pricing plan, but you can also see an expanded view of everything included. They offer onboarding assistance with paid plans and have some information about that and the other additional support they provide. There are also customer testimonials and the usual FAQs.\n\n### 17\\. [Smile.io](http://Smile.io)\n\n[Smile.io](http://Smile.io) has different pricing options depending on the e-commerce platform used, be it:\n\n- Shopify\n- BigCommerce\n- Wix\n\nTo make all the information more accessible to process, they list the features in a comparison table with limited text and a tick if the feature is available. An expanded feature comparison is just a click away for those seeking more information.\n\n#### Streamlined Navigation\n\nThere are also social trust badges and the all-important FAQs section. Rather than fill the page with more information, they’ve included:\n\n- Some small sections\n- A CTA button for details about the free plan\n- Alternative options for large corporations\n\n### 18\\. Zoom\n\nZoom’s pricing and plan options are slightly more complicated than others, but they’ve displayed everything well. For example, each pricing category, like Zoom One, Zoom Phone, Zoom Rooms, and so on, comprises different [pricing packages](https://zoom.us/pricing) that are well organized on the page.\n\nThese include:\n\n- Basic\n- Pro\n- Business\n\n#### Choosing Your Plan\n\nProspects can toggle between annual and monthly payment options and see how the free plan compares to the paid options. The site also provides an overview of the variety of add-ons available and a CTA button to learn about Zoom features.\n\n### 19\\. Geckoboard\n\nGeckoboard's colorful pricing page is neatly laid out. The three pricing options are presented in a quick overview tier with drop-down sections for the number of dashboards required. When you scroll further down the page, you can see more details about the features included in each plan.\n\n#### Building Trust with Credibility\n\nTheir page also includes social proof with badges from significant companies that:\n\n- Use their product\n- Links to customer review websites\n\nThere’s an FAQs section categorized by pricing questions or questions about the product itself.\n\n### 20\\. ConvertKit\n\nConvertKit has a beautifully designed pricing page that is visually appealing and user-friendly. This SaaS pricing depends on the number of email subscribers prospects have. To see accurate prices, prospects have to use the slider to select the number of subscribers and can also toggle between monthly or annual payment options.\n\n#### Plan Flexibility\n\nThe pricing for the three plans changes depending on your selections. You can:\n\n- View a feature overview\n- Expand for more detail.\n\nThey have a carousel of famous customers acting as their social proof and an FAQ section.\n\n### 21\\. ActiveCampaignActiveCampaign\n\nActiveCampaign has creatively fit a lot of information into its pricing page without losing coherency. Prospects can easily navigate plan categories by clicking the tabs like:\n\n- Marketing\n- Sales\n- Email\n- Customizable bundles\n\nAll plans are customizable, so you can remove or add features as needed and adjust the number of contacts you have. The pricing plans table has minimal details about included features, but you can expand it to get more information.\n\n#### Addressing Your Needs\n\nTowards the bottom of the page, there’s more information about the additional services ActiveCampaign provides and possible integrations. There is also a small FAQ section and contact information for more assistance.\n\n## Pricing Page Design Best Practices\n\nThe design layout is crucial when it comes to pricing pages. The information should be organized in a way that is effortless to follow. In particular, the pricing table should be presented in a column format that fits above the fold as much as possible for optimal visibility. This lets visitors quickly:\n\n- Grasp the different pricing options\n- Make informed decisions\n\n### Headlines\n\nStrong headlines on a pricing page can significantly impact visitor engagement. They support your value proposition and entice potential customers to explore further. By using clear, concise headlines, you can:\n\n- Communicate the benefits of your product or service\n- Capture the attention of your target audience more effectively\n\n### Pricing Tiers\n\nEach pricing tier on your page should cater to a specific market segment and clearly outline its unique value proposition. Listing features highlighting each tier's significant characteristics or benefits helps users understand how the options align with their needs. By clearly defining the value of each tier, you can guide visitors toward the most suitable choice for them.\n\n### Free Options\n\nProviding potential customers with the option to sign up for a free trial or a basic version of your service before making a payment can:\n\n- Reduce their hesitancy\n- Increase conversions\n\nBy allowing users to experience your offering before committing financially, you can build trust and demonstrate the value of your product or service.\n\n### Toggles/Tabs\n\nImplementing toggles or tabs can help users quickly switch between different features or plans if your pricing model includes more complex options. This feature enhances user experience by allowing visitors to explore various options without feeling overwhelmed by extensive information.\n\n### Tooltips\n\nTooltips can be valuable additions to a pricing page. They unearth less critical but essential information for users seeking additional context. By providing tooltips, you can offer more detailed information without cluttering the main page, catering to users who want to delve deeper into specific aspects of your offerings.\n\n### Call-to-Action (CTA) Buttons\n\nCTAs play a crucial role in guiding potential customers toward a purchase decision. Whether encouraging users to learn more, contact a sales representative, or make a purchase, well-designed CTAs can drive conversions effectively.\n\nPositioning CTAs strategically and using compelling language can prompt visitors to take action and move them further down the sales funnel.\n\n### FAQ Sections\n\nFAQ sections on pricing pages help [address common questions](https://www.zendesk.com/blog/the-best-faq-page-examples-and-how-to-make-your-own/) potential customers may have about your product or service. You can build trust with visitors and help them make informed decisions by providing detailed answers to frequently asked questions. Anticipating and addressing user queries can improve the overall user experience and increase the likelihood of conversion.\n\n### Trust Signals\n\nIncorporating trust signals on your pricing page can boost credibility and encourage visitors to take action. The following effectively showcase positive customer experiences and establish trust with potential buyers:\n\n- Testimonials\n- Customer reviews\n- Trust badges\n\nBy highlighting social proof and customer satisfaction, you can instill confidence in your offerings and differentiate your brand from competitors.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Why You Need A Pricing Page On Your Website\n\n![Pricing Page Examples](https://images.unsplash.com/photo-1518644730709-0835105d9daa?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx0aGlua2luZyUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMTExOTM1N3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Informed Decisions\n\nA well-crafted pricing page on your business website is essential for several reasons. Firstly, transparency is vital for building trust with potential customers. When visitors can easily see what your services or products cost, they feel:\n\n- More informed\n- Confident in their decision-making process\n\nHidden prices can be a red flag, making users wary and potentially driving them away to competitors who are more upfront.\n\n### Qualifying Leads\n\nA detailed pricing page can filter out leads unsuitable for your business. Clear pricing information lets potential customers determine whether your offerings align with their budget. This means they're more likely to be serious prospects when they reach out, saving time for you and them.\n\n### Value Justification\n\nA pricing page can be a powerful sales tool. It allows you to highlight the value of your different packages or services, explaining:\n\n- What each tier includes\n- Why certain features justify the price\n\nThis can be particularly effective if you use a tiered pricing strategy, where you can showcase additional benefits to upsell customers to higher plans.\n\n### Boosting Visibility\n\nHaving a pricing page also improves your site's SEO. When people search for pricing information related to your products or services, a well-optimized pricing page can attract this search traffic, bringing more visitors to your site and increasing the chances of conversion.\n\nIn essence, a pricing page is not just about displaying numbers; it's about:\n\n- Communicating value\n- Building trust\n- Streamlining the sales process\n\nAddressing potential customers' questions upfront can create a smoother purchase path and drive more business.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### MagicUI Pro: Unlocking the Power of Landing Pages\n\nWith our free component library, MagicUI Pro can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nBy utilizing [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), you can access many resources to enhance your landing pages. The startup landing page template, in particular, presents a perfect solution for those looking to attract more visitors and convert them into customers.\n\n### Effortless Conversion Optimization\n\nLanding pages capture visitors' attention and convert them into valuable customers. MagicUI and [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) offer innovative solutions to help you quickly and efficiently create visually stunning and highly functional landing pages. Take advantage of the opportunity to enhance your landing pages and boost your conversion rates with MagicUI Pro.\n"
  },
  {
    "path": "apps/www/content/blog/react-animation-examples.mdx",
    "content": "---\ntitle: \"Top 13 React Animation Examples\"\ndescription: \"Discover 13 inspiring React animation examples that bring your web projects to life with smooth, eye-catching transitions and effects.\"\nimage: https://cdn.magicui.design/assets/99mdbb4zzdq.jpg\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nYou visit a website to check out a new software tool. As your eyes scan the page, they stumble across a chart. Suddenly, the chart bursts, and colorful bars spring into action as they animate toward their final values. Before you know it, you’re engrossed in the content and wholly forgotten your initial goal.\n\nThis scenario illustrates the power of animations in web design, especially React animations. React animation examples help make sites more engaging, improving user experience and retention. This guide will explore some of the best React animation examples to help you create visually appealing websites that follow [web design best practices](https://magicui.design/blog/web-design-best-practices).\n\nMagicUI’s React template can help you get started. Its demo comes packed with dozens of pre-built UI components, many of which contain animations that trigger on hover or when landing on the page.\n\n## What Is The React Framework?\n\n![React Animation Examples](https://cdn.magicui.design/assets/pomtu80bc39.jpg)\n\n[React is a JavaScript library](https://legacy.reactjs.org/) created by Facebook for building user interfaces. It allows developers to create large web applications that can change data without reloading the page. React is declarative, efficient, and flexible. The library aims to help developers build fast and simple-to-maintain applications. React achieves this goal by breaking applications into smaller, manageable components.\n\n### Key Features of React: How They Work\n\n#### Component-Based Architecture\n\nWhen using React, developers break down complex UIs into smaller, reusable components. This modular approach promotes code organization, maintainability, and reusability. Components can be nested within other elements, creating a hierarchical structure.\n\n#### Virtual DOM\n\nReact maintains a [virtual representation of the DOM](https://www.geeksforgeeks.org/how-to-understand-by-virtual-dom/#:~:text=The%20Virtual%20DOM%20is%20an,structure%2C%20style%2C%20and%20content.), a lightweight copy of the actual DOM. When changes occur in the application’s state, React efficiently updates only the necessary parts of the virtual DOM, minimizing DOM manipulations and improving performance.\n\n#### JSX\n\nJSX is a syntax extension for JavaScript that allows you to write HTML-like templates within JavaScript code. This makes it easier to understand and write UI code, especially for developers familiar with HTML.\n\n#### State Management\n\nState is the data that defines a component’s behavior and appearance. React components can manage their state using the state hook, allowing them to update and re-render dynamically based on changes to their state.\n\n### Benefits of Using React for Web Development\n\n#### Reusability and Maintainability\n\nOne of the primary benefits of using React is its component-based architecture, which promotes the creation of reusable code. Developers can create and use a component as often as they want throughout a React application.\n\nThis means that if a change needs to be made, it can be done in one location and reflected everywhere the component is used. This dramatically improves code organization and maintainability.\n\n#### Improved Performance\n\nAnother significant benefit of using React is its speed. The virtual DOM optimizes updates, leading to faster rendering and a better user experience.\n\n#### Large and Active Community\n\nReact boasts a vast community of developers who contribute to the ecosystem, providing resources, libraries, and support.\n\n#### Rich Ecosystem of Tools and Libraries\n\nVarious tools and libraries can extend React’s capabilities. These include state management solutions (Redux, Context API), routing libraries (React Router), and testing frameworks (Jest).\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Animations on React\n\n![React Animation Examples](https://cdn.magicui.design/assets/rsf9f821goq.jpg)\n\n### How React Animations Transform User Experience\n\n[React animations](https://www.freecodecamp.org/news/create-animations-in-react/) use animation techniques to enhance user experience and make web\n\napplications more engaging.\n\n### Why Use React Animations?\n\nAnimations can dramatically improve your [website’s user experience and engagement](https://www.linkedin.com/pulse/enhancing-user-experience-power-animations-web-design). According to a study by \\[Source\\], animations can increase user engagement by \\[Percentage\\]%. Another study found that users are \\[Percentage\\] more likely to complete tasks when animations are used. Animations capture user attention, guide their focus, and make interactions more enjoyable.\n\nThey also provide visual feedback, making the application more responsive and intuitive. Well-crafted animations can contribute to a positive brand image and create a memorable user experience. Finally, animations can encourage users to take desired actions, such as purchasing or signing up for a newsletter.\n\n### Types of React Animations\n\n#### Page transitions\n\nSmoothly transition between pages to avoid abrupt changes.\n\n#### Loading indicators\n\nKeep users informed about the loading progress with visually appealing animations.\n\n#### Interactive elements\n\nAnimate buttons, menus, and other interactive elements to provide feedback and enhance usability.\n\n#### Data visualizations\n\nAnimate charts and graphs to make data more engaging and easier to understand.\n\n#### Micro-interactions\n\nImplement subtle animations for actions like adding items to a cart or submitting forms.\n\n#### Hero sections\n\nCreate visually striking hero sections with animated elements to capture attention.\n\n#### Scroll animations\n\nAnimate elements as users scroll down the page, revealing content gradually and creating a more immersive experience.\n\n#### Error notifications\n\nUse animations to provide clear and visually distinct feedback when errors occur.\n\n### Techniques for Creating React Animations\n\n#### CSS transitions and animations\n\nUse CSS properties like transition and animation to create basic animations.\n\n#### React animation libraries\n\nLeverage libraries like Framer Motion for more complex and performant animations.\n\n#### Custom animations\n\nCreate custom animations using JavaScript and CSS to achieve unique effects.\n\n### Best Practices for React Animations\n\n#### Keep animations smooth and performant\n\nAvoid overloading the browser with too many animations or complex effects.\n\n#### Use animations Sparingly\n\nUse animations strategically to enhance the user experience without overwhelming users.\n\n#### Consider Accessibility\n\nEnsure animations are accessible to users with disabilities by providing alternative content and avoiding overly distracting effects.\n\n#### Test animations across different devices and browsers\n\nEnsure animations work as expected on various platforms and screen sizes.\n\n### MagicUI: A Quik Overview\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. [MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## 13 Compelling React Animation Examples\n\n![React Animation Examples](https://cdn.magicui.design/assets/q6eyhy4ljcd.jpg)\n\n### 1\\. Page Transitions: Level Up Your User Experience with Animation\n\nPage transitions enhance the experience of moving between different website or app sections. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 2\\. Loading Indicators: Keep Users Informed While Content Loads\n\nLoading indicators provide visual feedback to users while content loads, preventing the perception of a frozen application. With animations, these indicators become more engaging and can be tailored to fit your website’s branding. Using React animations for your loading indicators will make them smooth and quick, helping to create a seamless user experience.\n\n### 3\\. Interactive Elements: Enhance User Interaction with Animation\n\nInteractive elements are the buttons, links, and other components users click, tap, or hover on to interact with your site. You can animate these elements to create a more enjoyable experience for users navigating your website. React animations will help smooth these transitions so they don’t disrupt the overall user experience.\n\n### 4\\. Progress Bars: Visually Indicate Progress to Users\n\nProgress bars give users a clear indication of progress on tasks or downloads. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 5\\. Animations on Scroll: Create a More Immersive Experience\n\nAnimations on scroll are precisely what they sound like animations that trigger as a user scrolls down your webpage. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 6\\. Data Visualization: Make Your Data More Engaging\n\n[Data visualization](https://www.ibm.com/topics/data-visualization#:~:text=IBM-,What%20is%20data%20visualization%3F,that%20is%20easy%20to%20understand.) helps make complex information more accessible and digestible. You can animate charts and graphs to create a more engaging presentation of your data. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 7\\. Micro-interactions: Add Subtle Animations to Enhance User Experience\n\nMicro-interactions are small animations that occur when a user interacts with your site. They add subtle visual feedback for actions like adding items to a cart or submitting forms. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 8\\. Error Notifications: Communicate Errors to Users with Animation\n\nNo one likes to run into errors when using a website — not even your users. Help ease the pain of encountering errors on your site by using animated error notifications. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 9\\. Popups and Tooltips: Use Animation to Enhance the User Experience\n\n[Popups and tooltips](https://bootcamp.uxdesign.cc/popups-dialogs-tooltips-and-popovers-ux-patterns-2-939da7a1ddcd) provide additional information or context to users as they navigate your site. Using animations to help these elements appear and disappear can create a less abrupt and more enjoyable user experience. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 10\\. Hero Sections: Create a Strong First Impression with Animation\n\nHero sections are the large banners that appear at the top of many websites. They typically contain eye-catching visuals and text and help create a solid first impression for users. Adding animations to your hero sections can create a more engaging experience that encourages users to explore your site further.\n\nInstead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 11\\. Form Validation: Use Animations to Improve User Experience\n\nNo one likes to run into errors when using a website — not even your users. Help ease the pain of encountering errors on your site by using animated error notifications. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 12\\. Parallax Scrolling: Create a More Immersive Experience with Animation\n\nParallax scrolling is a popular web design trend that creates a unique and immersive user experience. As a visitor scrolls down a page with parallax scrolling, elements move at different speeds, creating a depth effect. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n### 13\\. Custom Animations: Tailor Animations to Your Specific Needs\n\nOne of the most exciting aspects of using React for web design is the ability to create custom components. This includes animations. You can create unique and custom animations tailored to your needs with React. Instead of abruptly jumping from one page to another, you can create a smoother and more engaging user experience by transitioning between pages with animations. React animation examples can make your content feel more like a cohesive single entity instead of separate pages.\n\n## Bringing Animations to Life\n\n![React Animation Examples](https://cdn.magicui.design/assets/helxk6ddwo.jpg)\n\n### CSS Transitions and Animations: Breathing Life Into Your Designs\n\n[CSS transitions](https://www.w3schools.com/css/css3_transitions.asp) allow you to animate changes in CSS properties over time smoothly. They are suitable for simple animations like fading in and out elements or changing their color or size. CSS animations provide more control over the animation process, allowing you to define keyframes, timing functions, and durations.\n\nThey help create complex animations with multiple steps or custom effects. While CSS transitions and animations are a good starting point for basic animations, they may have limitations for complex or interactive animations. For example, they can be challenging to synchronize with other animations or handle user interactions.\n\n### React Animation Libraries: Powerful Tools for Creating Complex Animations\n\nReact animation libraries offer a more powerful and flexible way to create animations in React. They often provide features like spring physics, declarative animations, and performance optimizations. [Framer Motion](https://www.npmjs.com/package/framer-motion?activeTab=readme) is a popular library known for its declarative API and powerful features like spring physics and drag-and-drop interactions. React Spring is another popular library focusing on spring physics and performance optimizations.\n\nIt is well-suited for creating natural-feeling animations. React Animate is a more lightweight library that provides basic animation capabilities. It is a good choice for simple animations without complex features. When choosing a React animation library, consider your specific needs and preferences. Factors to consider include the complexity of your animations, performance requirements, and familiarity with the library's API.\n\n### Custom Animations: Bring Your Unique Vision to Life\n\nSuppose you must create highly customized or complex animations that are impossible with CSS transitions or animation libraries. In that case, you can write custom JavaScript code to manipulate DOM elements and CSS properties. Techniques for creating custom animations include using requestAnimationFrame for smooth animation updates, manipulating CSS properties programmatically, and using animation libraries like GSAP.\n\nWhen creating custom animations, consider performance and maintainability. Avoid excessive DOM manipulations or complex calculations that can impact performance. Use animation libraries or techniques like requestAnimationFrame to optimize performance and ensure smooth animations.\n\n## How to Design Animated UIs with MagicUI\n\n![React Animation Examples](https://cdn.magicui.design/assets/iym5x9p0b7.jpg)\n\n### Install Magic UI to Get Started with React Animation Examples\n\n[To begin using Magic UI](https://magicui.design/blog/how-to-make-an-interactive-website), you must first install it. You can add Magic UI to your project using a package manager like npm or yarn.\n\n### Use Components To Create Beautiful React Animation Examples\n\nAfter installing Magic UI, you can design your animated user interface using the pre-built components. [MagicUI has various stunning elements](https://pro.magicui.design/docs/templates/startup), such as buttons, cards, modals, and more. You can drag and drop these components into your design to get started.\n\n### Customize Magic UI Components To Fit Your Needs\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), allowing you to change the appearance and behavior of each element to fit your needs. You can alter colors and fonts and even adjust the animations of each component.\n\n### Use Built-In Animations To Enhance Your Project\n\n[Many Magic UI components](https://pro.magicui.design/docs/templates/startup) have built-in animations that can add visual interest and enhance user engagement. For example, a button might fade in when it appears on the screen or change color when you hover over it.\n\n### Create Custom Animations For Unique Effects\n\nYou can create custom animations using React's state management or animation libraries for more complex animations. This gives you complete control over the animation process.\n\n### Experiment and Iterate To Improve Your Designs\n\nDesigning animated user interfaces takes practice. Experiment with different animations and styles to achieve the desired user experience. Continuously refine your designs based on feedback and testing.\n\n### Tips For Using Magic UI\n\n#### Start With Simple Animations\n\nBegin with basic animations like fade-in/fade-out effects or hover animations. As you become [more comfortable with Magic UI](https://pro.magicui.design/docs/templates/startup), you can experiment with more complex animations.\n\n#### Consider User Experience\n\nEnsure that your animations are manageable and manageable. Use them to enhance the user experience, not to clutter the interface.\n\n#### Test Your Animations\n\nTest your animations on different devices and browsers to ensure they work as expected.\n\n#### Use Performance Optimization Techniques\n\nIf you're creating complex animations, consider performance. Use techniques like requestAnimationFrame to optimize rendering and avoid performance bottlenecks.\n\n#### Leverage Magic UI's Community And Resources\n\n[MagicUI has a growing community](https://pro.magicui.design/docs/templates/startup) of developers who can support, share tips, and showcase their projects. Take advantage of these resources to learn more and get inspired.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI library](https://pro.magicui.design/docs/templates/startup) designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI components are visually appealing, interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### What Are the Key Features of MagicUI? \n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### What Can MagicUI Be Used For? \n\nWith our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save thousands of hours, create a beautiful landing page, and convert visitors into customers with our website templates.\n\n### Related Reading\n\n- React Spring Examples\n- GSAP Examples\n- Framer Motion Vs React Spring\n- React Motion\n- React Transition\n- GSAP Vs Framer Motion\n- React Transition Animation\n"
  },
  {
    "path": "apps/www/content/blog/react-animation-libraries.mdx",
    "content": "---\ntitle: \"13 Awesome React Animation Libraries To Elevate Your Design Projects\"\ndescription: \"Boost your design projects with the latest React animation libraries. Create eye-catching designs from simple animations to complex effects.\"\nimage: https://cdn.magicui.design/assets/f0a9b56b-f11d-4403-b7d9-842d33becf7d.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-20\"\nfeatured: true\n---\n\nReact animation libraries are vital within [UI Frameworks](https://magicui.design/blog/ui-frameworks), breathing life into static interfaces and captivating users with engaging movements. Suppose you're navigating the complexities of choosing the best animated React library to elevate your project. In that case, the upcoming article will delve into a detailed comparison of various options, enabling you to make a sound decision based on your specific needs.\n\nMagic UI's [React component library](https://magicui.design/) is a valuable resource in this regard. It allows you to easily explore and compare various animated React libraries to find the best fit for your project.\n\n## What Are Animation Libraries?\n\n![React Animation Libraries](https://cdn.magicui.design/assets/5g2qzw7agku.jpg)\n\nA React Animation Library is a collection of pre-built tools and components designed to help developers create smooth, complex animations and transitions within React applications. These libraries provide various functionalities like easing functions, spring physics, keyframe animations, and gesture-based interactions.\n\n### Popular React animation libraries\n\nPopular examples include Magic UI, React Spring, Framer Motion, and GSAP, each offering unique features and capabilities to enhance the user experience with visually appealing animations and transitions.\n\n### Focus on Creativity, Not Complexity\n\nBy utilizing these libraries, developers can easily incorporate animations into their React applications without delving deep into complex animation logic. These pre-built tools allow developers to focus on the creative aspect of animations rather than spending time navigating the complexities of animation implementation.\n\n### From Simple to Spectacular\n\nReact animation libraries offer various animations and transitions, from simple hover effects to more complex animations like parallax scrolling, page transitions, and interactive elements. This variety enables developers to create vibrant and engaging user interfaces that keep users immersed and interested in the application.\n\n### Customization Meets Convenience\n\nThese libraries allow developers to create custom animations tailored to their specific needs while offering a vast library of pre-built animations that can be easily incorporated into React applications. By providing various animation options, React animation libraries allow developers to experiment and create unique user experiences that set their applications apart from the competition.\n\n### Bringing Life to React Apps\n\nReact animation libraries are vital for enhancing the user experience within React applications. By leveraging these pre-built animations and transitions, developers can create visually stunning applications that captivate and engage users. React animation libraries offer the tools and flexibility needed to bring life and vitality to React applications, whether a subtle hover effect or an elaborate page transition.\n\nReact [animation libraries](https://reactresources.com/topics/animation) are an essential component of any developer's toolkit. They provide the necessary tools to create captivating user interfaces that keep users engaged and coming back for more.\n\n## Why Use React Animation Libraries\n\n![React Animation Libraries](https://images.unsplash.com/photo-1602992708529-c9fdb12905c9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzE5MDQ2OTA1fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nBoost your design projects with the latest React animation libraries. Create eye-catching designs from simple animations to complex effects.\n\nYou might wonder why you use an animation library. CSS and JavaScript offer pre-built animation support, which these libraries are built on.\n\nThere are plenty of times that using native CSS animations is the way to go, especially when they’re easy to rig via CSS-React libraries like styled components. Based on the towering GitHub star numbers, there’s an obvious need for animation libraries. They’re suited for apps that use a lot of animations, where the following considerations might be taken:\n\n### A Simplified Development Process\n\nReact animation libraries offer a range of pre-built components, APIs, and utilities that can abstract away the complexities of implementing animations. For example, using Magic UI or Framer Motion is far more integrated with React’s ecosystem than CSS transitions are. Because React is a declarative framework, declarative animation libraries pair well.\n\n### Cross-Browser Compatibility\n\nImplementing animations that work consistently across web browsers and devices can be challenging. React animation libraries can handle browser inconsistencies and smooth animation across various platforms. They can also handle things like vendor prefixing, optimizing performance, and invoking fallback mechanisms.\n\n### Lots of Support\n\nSome React animation libraries are backed by active developer communities. These communities often create and contribute to documentation, tutorials, and examples, making it easier for developers to learn and use the library.\n\n### React’s Paradigm on Integrations\n\nReact animation libraries are designed to integrate with React and its ecosystem. They can be easily combined with other React libraries.\n\nIn short, developers use React animation libraries to simplify animation development, ensure cross-browser compatibility, and leverage community support.\n\n### Effortless and Engaging UI Design \n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## 13 Best React Animation Libraries To Elevate Your Design Projects\n\n![React Animation Libraries](https://images.unsplash.com/photo-1587440871875-191322ee64b0?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxkZXNpZ258ZW58MHx8fHwxNzE5MDQ3MDExfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. React Spring\n\nReact Spring is a spring physics-based animation library that provides modern animations for web, react-native, and react-native-web platforms. It is easy to install and has handy documentation for a quick start on React Projects. The library supports various UI needs such as colors, CSS variables, lengths, angles, arrays, etc.\n\n#### Features of React Spring\n\n- Supports Web and React-Native Applications\n- Jest for Testing\n- Offers hooks to handle a variety of situations\n- Supports Cross-platform\n- Declarative API\n- Well documented\n- Large community support and many more\n\n### 3\\. Framer Motion\n\nFramer Motion is a powerful and intuitive library for React animations, known for its simplicity and extensive features. This library offers a simple, declarative syntax for:\n\n- Defining complex animations and interactions\n- Auto-animation feature\n- Drag-and-drop functionalities\n- Advanced gesture support\n- Server-side rendering compatibility\n- Wide array of animation controls\n\nWith over 11,000 GitHub stars, Framer Motion is popular among developers looking for robust animation solutions.\n\n#### Features of Framer Motion\n\n- Simple, declarative syntax for defining complex animations and interactions.\n- Auto-animation feature that automatically animates components when their properties change.\n- Drag-and-drop functionalities and advanced gesture support enhance interactivity.\n- Server-side rendering compatibility, ensuring your animations work perfectly even when JavaScript is disabled.\n- An extensive array of animation controls enables developers to orchestrate sophisticated sequences with ease.\n\n### 4\\. React Motion\n\nReact Motion emphasizes natural motion dynamics with a simple and robust spring configuration. This library offers a declarative approach to animations, focusing on the end state rather than the intricate details of the animation journey. With spring-based configuration, React Motion creates smooth and natural animations and supports versatile animations for simple to complex UI interactions. It is excellent for creating draggable interfaces and physics-based movement.\n\n#### Features of React Motion\n\n- Spring-based configuration for smooth and natural animations.\n- A declarative approach focusing on the destination rather than the journey.\n- Versatile enough for simple to complex animations, enhancing UI interactivity.\n- Excellent for creating draggable interfaces and physics-based movement.\n\n### 5\\. TS Particles\n\nTS Particles provides highly customizable particles, confetti, and fireworks animations for websites. With ready-to-use components for React, Angular, Svelte, and Web Components, this library offers stunning particle animations, customizable configurations, interactive interactions, performance optimization, and easy integration with JavaScript or popular frameworks like React and Vue.\n\n#### Features Of TS Particles\n\n- Stunning particle animations for visually captivating websites\n- Customizable configurations for the size, shape, color, and behavior of particles\n- Interactive interactions with mouse and touch interactions\n- Performance optimization for smooth animations on all devices\n- Easy integration with vanilla JavaScript or popular frameworks like React and Vue\n\n### 6\\. Remotion\n\nRemotion allows the creation of animations and videos using programming languages like HTML, CSS, JavaScript, and TypeScript. This library helps scale video animation and production using server-side rendering and parametrization.\n\n#### Features of Remotion\n\n- No prior knowledge of video creation or video editing is required\n- Support React features like reusable components and quick reload\n- Allows complex animations and visual effects to create engaging videos\n- Supports seamless integration with existing React workflows and tooling\n- Provides a powerful timeline video editor for sequencing and animating the components very easily\n- Wide range of community and Documentation support\n\n### 7\\. GSAP (GreenSock Animation Platform)\n\nGSAP offers a comprehensive animation solution for web animations, transcending the React ecosystem.\n\n#### Features of GSAP\n\n- Robust animation capabilities for CSS, SVG, and JavaScript objects.\n- High performance and compatibility, ensuring smooth animations across all browsers.\n- Rich plugin ecosystem for extended functionalities, like morphing or scroll-triggered animations.\n- Timeline features for complex sequence and choreography management.\n\n### 8\\. React Move\n\nReact Move allows developers to create attractive, data-driven animations with declarative syntax.\n\n#### Features Of React Move\n\n- Declarative syntax for defining animations in React applications\n- Multiple animation types available (translate, scale, rotate, opacity)\n- Customizable transitions with control over timing, duration, and easing\n- Interpolation and interpolation functions for smooth transitions\n- SVG animation support for animating SVG elements and attributes\n- Seamless integration with React, leveraging its component-based architecture and state management.\n\n### 9\\. React Awesome Reveal\n\nReact Awesome Reveal offers scroll-triggered animations using the Intersection Observer API for captivating reveal effects.\n\n#### Features Of React Awesome Reveal\n\n- Scroll-triggered animations for captivating reveal effects\n- Variety of animation options: fades, slides, zooms, rotations, and more\n- Customization and control over animation properties\n- Sequential animations for cascading or staggered effects\n- Integration with Intersection Observer for efficient tracking of component visibility\n- Responsive and flexible, suitable for building dynamic websites\n- Simple implementation with an easy-to-use API\n\n### 10\\. React Transition Group\n\nReact Transition Group simplifies creating transitions and animations in React projects.\n\n#### Features of React Transition Group\n\n- In-Place transition states\n- Supports Excellent ng-animate library.\n- Multiple enter and exit transitions.\n- Easy-to-install guide\n- Well Documentations, and many more\n\n### 11\\. Anime.js\n\nAnime.js is a lightweight yet powerful JavaScript animation library known for its simplicity and flexibility.\n\n#### Features of Anime.js\n\n- Supports various animations including CSS properties, SVGs, and JavaScript Objects.\n- Keyframe-based syntax for detailed animation control.\n- Timeline management for synchronizing multiple animations.\n- Easing functions and custom bezier curves for dynamic motion effects.\n\n### 12\\. React-Flip Toolkit\n\nReact-Flip Toolkit is a React-based animation library for creating configurable layout transitions.\n\n#### Features React-Flip-Toolkit\n\n- Spring-based Stagger effects\n- Animate opacity\n- Nested Scale Transforms\n- Route-based Animations With React Router\n- Callback props\n\n### 13\\. React-Simple-Animate\n\nReact Simple Animate is a simple animation library focusing on standard CSS animation.\n\n#### Features React-Simple-Animate\n\n- Animation from inline style A to B.\n- Support CSS animation keyframes.\n- Chain up animation sequences.\n- Tiny in size without other dependencies.\n- Well, Documented and many more.\n- GitHub\n\n## How To Evaluate React Animation Libraries And Choose The Best For Your Project\n\n![React Animation Libraries](https://images.unsplash.com/photo-1569011312883-031325587704?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxjaG9vc2V8ZW58MHx8fHwxNzE5MDQ2OTg5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen [evaluating animation libraries](https://betterprogramming.pub/things-to-consider-when-choosing-a-component-library-5c864de6d693), it's crucial to consider factors that apply to any animation framework. This includes understanding the animation's context, motion paradigm, and transition function.\n\n- Are you looking for composite or simple animations?\n- Do you prefer state-based or vector-based animations?\n- Do you need a duration-based or physics-based transition function?\n\n### React-specific Considerations\n\nConsider the compatibility of the library with React.\n\n- Does it have an official plugin, or is there a well-supported community plugin? It's also important to assess how the animations pair with React's component lifecycle.\n- What happens when a component becomes unmounted? Evaluate the library's size and its impact on React's performance.\n- Ensure that the documentation matches React's standards.\n\n### Holistic Evaluation\n\nChoosing the right animation library for React goes beyond compatibility, presets, or performance metrics. It's about understanding how well a framework aligns with your existing React project. By considering animation framework and React-specific factors, developers can make informed decisions when selecting the ideal React animation library for their design developments.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n### MagicUI's Unique Features and Benefits\n\nWith our focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. We offer a unique combination of advanced technologies and design principles that result in high-quality, engaging UI components. Using MagicUI, we can create websites and applications that look great and provide a superior user experience.\n\n### MagicUI Pro: A Premium Offering for Designers\n\nOpting for MagicUI Pro can save thousands of hours and create a beautiful landing page. This premium offering includes website templates designed to help convert visitors into customers effectively. With MagicUI Pro, we can take advantage of a wide range of additional features and benefits unavailable with the free version. MagicUI Pro has many premium components and templates that can make our websites more visually appealing and user-friendly.\n\n### Get Started with MagicUI Today\n\n[MagicUI](https://magicui.design/) is a revolutionary React animation library enabling us to create stunning user interfaces easily. Whether we are design engineers, web developers, or business owners, MagicUI can help us take our digital experiences to the next level.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/](https://magicui.design/).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-best-practices.mdx",
    "content": "---\ntitle: \"35 React Best Practices To Follow For Coding & Design Efficiency\"\ndescription: \"Improve your coding and design efficiency with these 35 React best practices. From component structure to state management, we've got you covered.\"\nimage: https://cdn.magicui.design/assets/4e235f37-66a2-4035-abea-a8f0fc75884a.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you struggling to optimize your coding and design efficiency while working with [UI frameworks](https://magicui.design/blog/ui-frameworks)? React best practices may be the solution you've been looking for. We'll discuss into valuable insights that can help you achieve your objectives.\n\nMagic UI's [React component library](https://magicui.design/) can be a game-changer in learning the best practices for coding and design efficiency. With its user-friendly approach, you can easily enhance your development process and create outstanding user interfaces using React.\n\n## What Is React?\n\n![React Best Practices](https://cdn.magicui.design/assets/0bdap9v0hwjj.png)\n\nReact.Js, an open-source JavaScript library, has become the top choice for developers worldwide when creating user interfaces. Developed by Meta, React helps developers build highly reusable UI components, leveraging the virtual DOM to enhance application performance. This innovative library can be used on both client and server sides and effortlessly integrates with other front-end frameworks. Its component-based approach, reusability, developer tools, and performance optimization make it an easy choice for developers seeking a seamless and efficient experience.\n\nReact has been the cornerstone of various successful applications, with Instagram being one of the most notable. The platform's seamless features like geolocations, Google Maps APIs, and non-hashtag tags are all remarkable implementations of [React](https://react.dev/). Even Facebook, the creator of React, uses React for its web page development, while the mobile app version is built using React Native, a framework closely related to React's functionality.\n\n### Related Reading\n\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n\n## Advantages Of Using React\n\n![React Best Practices](https://cdn.magicui.design/assets/mzziytz4f8e.png)\n\n### Improved User Experience\n\nReact allows developers to build highly interactive and responsive user interfaces, resulting in a smoother and more engaging user experience. The virtual DOM efficiently updates and renders only the changed components, reducing load times and improving performance.\n\n### Reusable Components\n\nReact promotes a modular approach with reusable components, self-contained modules that can be used across different parts of an application. Reusable components save development time, improve maintainability, and make adding new features or fixing bugs easier.\n\n### Efficient Development Process\n\nReact provides a rich set of tools and libraries that facilitate the development process, such as React Developer Tools, Redux, and React Router. Its simple and intuitive syntax makes it easy to learn and use, especially for developers familiar with JavaScript.\n\n### Performance Optimization\n\nReact utilizes a virtual DOM and a diffing algorithm to efficiently update and render only the necessary parts of the UI, resulting in faster rendering and improved overall performance.\n\n### SEO Friendliness\n\nReact applications can be made SEO-friendly by rendering on the server side and returning static HTML, which search engines can easily crawl and index.\n\n### Flexibility and Integration\n\nReact seamlessly integrates with other technologies and frameworks, making it a versatile choice for web development. It can be used with popular libraries like Axios for API requests or [UI frameworks](https://hackernoon.com/why-is-react-the-best-front-end-framework-to-learn-in-2024) like Bootstrap for styling components.\n\n### Building Beautiful UIs with Ease\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## 5 Common Challenges React Developers Face\n\n![React Best Practices](https://cdn.magicui.design/assets/7crlj3syglf.png)\n\n### 1\\. Learning the basics\n\nReact can be tough to learn because it operates differently from other frameworks. The syntax is unique, and there are new concepts to absorb, such as JSX. Whether you're familiar with JavaScript or not, you must understand React's intricacies to create complex applications efficiently.\n\n### 2\\. Debugging\n\nReact excels at UI design, but debugging can be challenging due to the lack of built-in tools. To troubleshoot effectively, you must leverage Chrome Developer Tools or extensions such as Redux DevTools to inspect your application's inner workings.\n\n### 3\\. Maintainability\n\nUnderstanding its components and interactions becomes harder as your project grows in complexity. While React is excellent for UI design, building a comprehensive app like a real-time chat platform can present challenges. You may need to combine React with other libraries like Redux, complicating matters further with scant resources for managing large React applications.\n\n### 4\\. Struggling with Redux\n\nRedux, designed by Facebook, streamlines the development of predictable and maintainable React applications by serving as an app state container. Although Redux simplifies state management, it can be daunting to learn and apply. The ecosystem offers various methods to use Redux, making it tricky for newcomers to identify the best approach for their project.\n\n### 5\\. Dealing with bugs caused by 3rd-party libraries\n\nWhile numerous third-party libraries enhance React functionalities, some are buggy and lack documentation. Introducing these libraries into your project may lead to unexpected behavior and issues. Prioritize thorough testing to identify and resolve any bugs or anomalies. If problems persist, consider contacting the library's GitHub community for support and solutions.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## 34 React Best Practices To Follow For Coding & Design Efficiency\n\n![React Best Practices](https://cdn.magicui.design/assets/snqpchtt7vr.png)\n\n### 1\\. Institute a Structured Import Order\n\nAs your React application grows, you’re bound to make extra imports. The structure of your imports go a long way in helping you understand what makes up your components. As a convention, grouping similar utilities together seems to work fine. For instance, you can group external or third-party imports separately from local imports.\n\n### 2\\. Adhere To Naming Conventions\n\nNaming conventions help improve code readability. This is applicable to component names and even your variable names, all the way to your Hooks. The React documentation does not offer any official pattern for naming your components. The most used naming conventions are camelCase and PascalCase.\n\n### 3\\. Consistent Formatting\n\nThere are several ways to create a functional component in a react application, including arrow functions, function declarations and function expressions. All of these are valid ways to create a component but it is important to stick with 1 way of declaring a component in your application. Inconsistent component functions can make your code difficult to read.\n\n### 4\\. Start with a Solid Project Structure\n\nA well-organized project structure is the foundation of any successful ReactJS application. Use tools like Create React App or custom configurations to set up a clear and scalable project structure. This will make collaborating and maintaining the codebase easier for your team.\n\n### 5\\. Component Modularity\n\nBreak down your application into small, reusable components. This promotes code reusability, simplifies testing, and makes it easier to reason about your UI.\n\n### 6\\. Follow a design pattern and stick to it\n\nFollowing an already established design pattern in your react application keeps your components organised, easy to read, test and make changes. Two of already established practices include:\n\n### Container/Presentational Pattern\n\nThis approach ensures a strict separation of concerns between the business logic and user interface where the container components manage data and state. In contrast, presentational components focus on rendering the UI easier to test.\n\n### Flux Pattern\n\nThe Facebook team introduced the flux pattern to introduce a unidirectional data flow in your react application. This is commonly enforced using state management libraries like Redux.\n\n**7\\. Single Responsibility Principle**\n\nEach component in your app should have a single responsibility, focusing on one specific functionality. Following this principle makes the component more reusable and less prone to bugs. For example, in most cases, a \"Button\" component should handle ONLY rendering and user interactions.\n\n### 8\\. Prop Types and Default Props\n\nDefining prop types and default values ensures component reliability. PropTypes validate the expected types of props, catching potential bugs early. Default props provide fallback values if a prop is not explicitly passed, avoiding unexpected behavior.\n\n### 9\\. Higher-Order Components (HOC)\n\nReact’s advanced methodology enables the reuse of component functionality within the render method. A component can be changed into a higher intelligence of the element by using an elevated version.For instance, when the user logs in, we may want to display some components. You must include the exact identical code for each component to verify this. Here, the Higher-Order Component ensures that the user is signed in and keeps your code contained within a single app element. While this is wrapped around the other parts.\n\n### 10\\. Use functional or class components\n\nYou can consider using functional components and it will be the best practices to learn React.Use functional components instead of class components if you only need to display the user interface without implementing any logic or changing the system's state. Functional components are more effective in this situation.\n\n### 11\\. Use a Linter\n\nA linter tool helps improve code quality. One of the most popular linter tools for JavaScript and React is ESlint. But how exactly does this help with improving code quality?\n\nA linter tool helps with consistency in a code base. When using a tool like ESLint, you can set the rules you want every developer working on the project to follow. These rules may include requirements for using double quotes instead of single quotes, braces around arrow functions, a particular naming convention, and more. The tool observes your code and then notifies you when a rule has been broken. The keyword or line that breaks the rule is usually underlined in red.\n\n### 12\\. Combine CSS and JavaScript\n\nWhen working on large projects, using different stylesheet files for each component can make your file structure bulky and hard to navigate.\n\nA solution to this problem is to combine your CSS and JSX code. You can use frameworks/libraries like Tailwind CSS and Emotion for this.\n\n### 13\\. Use destructuring\n\nDestructuring props and state makes code more concise and readable. Instead of writing \"props.title,\" you can write `const {title} = props.` It allows you to extract values from objects or arrays more concisely and readably, reducing the amount of code you need to write. Destructuring can make your code more readable by explicitly declaring which properties or elements interest you.\n\nIt can also help prevent errors while accessing properties or elements that don't exist. Analyzing which values are being used in which parts of your code makes it easier to refactor your code, and extracting only the needed values can simplify the process of passing props between components.\n\n### 14\\. Keep components small\n\nKeeping components small and focused on a single responsibility makes testing and debugging code easier. Smaller components are easier to reuse across the application, making it easier to maintain and scale the codebase. They are easier to understand and maintain, making fixing bugs and adding new features easier.\n\nSmaller components are also easier to test, making it easier to write effective unit tests and ensure code quality. Breaking down components into smaller parts allows you to separate the concerns of your application, making it easier to manage and understand the codebase. Smaller components can also help improve your application's performance by reducing the amount of code that needs to be rendered or processed by the browser.\n\n### 15\\. Use functional components\n\nWhenever possible, it is wise to use functional components instead of class components because functional components are easier to read and write. They are also generally faster and more efficient than class components because they don't require a constructor or lifecycle methods.\n\nFunctional components are generally simpler and easier to read than class components because they have less boilerplate code. Functional components are typically stateless, meaning they don't maintain their state. This makes them easier to reason about and test. They are the primary way to use React hooks, which provide a powerful way to manage state and side effects. Because functional components are typically stateless and have a clear set of inputs and outputs, they are generally easier to reason about and debug.\n\n### 16\\. Avoid using inline styles\n\nUsing CSS classes instead of inline styles separates the presentation from the logic and makes it easier to maintain and update the design. Separating the styles from the component logic improves the separation of concerns, making it easier to maintain and modify the code. Keeping the styles in separate CSS files makes it easier to manage and maintain the codebase, especially when dealing with larger applications.\n\nUsing external stylesheets or CSS modules makes it even easier to reuse styles across multiple components, reducing the amount of code duplication. Separating the styles makes it easier to enable browser caching, which can help improve the application's performance. By clearly separating the styles and the component logic, it's easier to debug issues that arise with either the styles or the component logic.\n\n### 17\\. Use arrow functions\n\nArrow functions make code more concise and easier to read. They are a better way to write functions in JavaScript, which can lead to cleaner and more readable code. Arrow functions automatically bind to the parent scope, which can be helpful in cases where you need to access the parent scope's ‘this’ keyword. Arrow functions eliminate the need to use the bind() method to bind the ‘this’ keyword to a component's method, which can simplify your code. Arrow functions can perform better than traditional functions because they don't create a new lexical scope.\n\n### 18\\. Children Props\n\nAcross precise JSX expressions with an opening and a closing tag, the content amid these tags gets conceded as a distinct prop: props.children. It serves as a part of the React documentation and props.children works as the special prop, automatically passed to every component. The goal is to render the content included between the opening and closing tags when invoking a component. Also, it finds use in the rendering method of the content of one component inside another component.\n\nThat said, there is a possibility to pass functions as child props. [Stack Overflow’s 2020 Developer Survey](https://insights.stackoverflow.com/survey/2020) suggests that from 57.378 replies, 68.9% of responses showed interest in enduring engagement with React JS. One of the most valuable components of React is the capability to receive and render child properties. It makes it easy and effortless to create reusable components.\n\n### 19\\. Reusability principle in React\n\nReusable components of the React developer serve as the piece of UI used in various parts of an application that can help build more than the UI instance. Also, you can see the button component displayed in different colors in several parts of the application. Therefore, reusability is important, so new components are needed to be added to the minimum required. The rule of one function = one component improves the reusability of components.\n\nSkip is trying to build a new component for a function when you see a component for that function. Reusing components across your project achieves consistency and contributes to the community. The UI utilized in various portions of an application help in building more than the UI instance is a reusable component of the react developer.\n\n### 20\\. Enhance HTTP Authentication with Security\n\nIn many applications, authentication is performed when a user logs in or creates an account. This procedure should be secure because client-side authentication and authorization might be vulnerable to numerous security flaws that may cause these protocols to be destroyed in the application.\n\n### 21\\. Limit Component Creation\n\nOne of the core features of React is code reusability. You can create a component and reuse its logic as often as possible without rewriting it.\n\nWith that in mind, you should always limit the number of components you create. Not doing so bloats the file structure with unnecessary files that shouldn’t exist in the first place.\n\n### 22\\. Avoid Unnecessary Re-renders\n\nUse the React.memo Higher Order Component (HOC) or the useMemo and useCallback hooks to prevent unnecessary re-renders of components.\n\n### 23\\. State Management\n\nChoose the right state management solution for your application. Redux, Mobx, or the built-in useState and useReducer hooks can be good choices, depending on your project’s complexity.\n\n### 24\\. Avoid Prop Drilling\n\nAvoid passing props through multiple levels of components. Use state management or context API to make data accessible to components that need it.\n\n### 25\\. Optimize Render Performance\n\nUse tools like React’s built-in shouldComponentUpdate, PureComponent, or the memo HOC to optimize component render performance.\n\n### 26\\. Implement Lazy Loading\n\nLazy loading is very useful as your React app grows. When you have a big codebase, load time for your web pages slows down. This is because the whole app has to be loaded every time for every user. “Lazy loading” is a term used for various implementations. Here, we associate it with JavaScript and React, but you can also implement lazy loading on images and videos.\n\nBy default, React bundles and deploys the whole application. But we can change this behavior using lazy loading, code splitting.\n\nYou can limit what section of your app gets loaded at a particular point. This is accomplished by splitting your bundles and only loading those relevant to the user’s requirements. For instance, you can first load only the logic required for the user to sign in, then load the logic for their dashboard only after successfully signing in.\n\n### 27\\. Employ Reusable Hooks\n\nHooks in React let you harness some of React’s additional functionalities, like interacting with your component’s state and running after-effects in relation to certain state changes in your component. We can do all this without writing class components.\n\nWe can also make Hooks reusable so we don’t have to retype the logic in every file they use. We create custom Hooks that can be imported anywhere in the app.\n\n### 28\\. Consolidation of duplicate code\n\nThe Don’t Repeat Yourself principle is the best guide for preventing duplication. Look for similarities and patterns in the code to accomplish the goal. Consolidating duplicated code is one of the react js best practices. A common rule for all code is keeping it brief and concise. Following Don’t Repeat Yourself (DRY) is the best way to avoid duplication. Achieve the objective by scrutinizing the code for patterns and similarities.\n\nWith that, you will get the scope to eliminate duplication. Rewriting can make it more concise. Also, this condition is mainly dependent on the reusability principle in React. Also, if you wish to add multiple buttons containing icons, use the Icon Button component as an alternative to adding the markup for each button. Also, go further by mapping everything into an array.\n\n### 29\\. Keeping state business logic separate from UI\n\nSeparate the state management logic from the UI logic that can help you in multiple ways. Components that do both are not impactful as they make them less reusable, more difficult to test, and difficult to refactor, especially when you’re looking for state management.\n\nRather than writing the logic for placement of the state inside a component, the best move is to extract it into a hook of its own and another child component that contains the user interface. Then, call the child inside while the adult hands over all the necessary props.\n\n### 30\\. Use Functional Components with Hooks\n\nReact v16.08’s new feature, “React Hooks,” makes creating function components that interact with state easy. The complexity of handling states in Class components is decreased. Use functional components using React Hooks like useEffect(), useState(), etc. whenever possible. This will enable you to apply reasoning and facts frequently without changing the hierarchical cycle.\n\n### 31\\. Use PureComponent and React.memo\n\nPureComponent and React.memo automatically handle shouldComponentUpdate for you, optimizing rendering for functional and class components.\n\n### 32\\. Use Functional or Class Components based on Requirement\n\nIf you need to show User Interface without performing any logic or state change, use functional components instead of class components as functional components are more efficient in this case.\n\n### 33\\. Take Out Extraneous Comments From the Code\n\nOnly add comments where necessary to avoid confusion when modifying the code later. Removing lines like Console.log, debugger, and unneeded commented code is also important.\n\n### 34\\. Stay Updated\n\nReact and its ecosystem are constantly evolving. Keep your dependencies up to date to benefit from the latest features and security updates.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-bootstrap.mdx",
    "content": "---\ntitle: \"How To Integrate Bootstrap With React Using React Bootstrap Package\"\ndescription: \"Discover the easiest way to integrate Bootstrap with React using the React Bootstrap package. Take your web development skills to the next level.\"\nimage: https://cdn.magicui.design/assets/5f00bd1f-e995-406c-899e-6229f64bd9ea.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-03\"\nfeatured: false\n---\n\nAre you struggling to navigate [UI Frameworks](https://magicui.design/blog/ui-frameworks)? Imagine wanting to learn how to use Bootstrap with React but feeling overwhelmed by where to start. Our blog on React Bootstrap is your guide to start on this journey.\n\nMagic UI offers the ideal solution if you want to explore the [React component library](https://magicui.design/) and master Bootstrap with React.\n\n## What Is React Bootstrap?\n\n![React Bootstrap](https://images.unsplash.com/photo-1579820010410-c10411aaaa88?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxyZWFjdHxlbnwwfHx8fDE3MjAwNDY2NTZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact Bootstrap is a powerful library that provides pre-made components for React, allowing developers to create complex user interfaces easily. Integrating Bootstrap with React can be challenging for some, but the process becomes much simpler with React Bootstrap. This powerful combination gives developers the tools to create stunning user interfaces for their web applications.\n\n### The Power of Bootstrap and React in Creating High-performing Apps\n\nSuccessful websites and applications require excellent front-end design and seamless functionality, so many developers are turning to Bootstrap and React. Bootstrap is an open-source web front-end framework that offers:\n\n- Easy-to-use templates\n- Fast development cycles\n- Library of custom-style components\n\nReact, on the other hand, is a JavaScript library used for building user interfaces. Using React with Bootstrap, developers can create beautiful, responsive web pages that work seamlessly across all devices.\n\n### Leveraging the Benefits of React Bootstrap for Web Development\n\nReact Bootstrap is an invaluable tool for developers looking to create powerful, high-performing web applications. By combining the strengths of React and Bootstrap, developers can create user interfaces that are visually appealing and highly functional.\n\nReact Bootstrap offers a wide range of pre-made components that can be easily integrated into React applications, allowing developers to save time and effort while delivering a top-notch user experience. Whether you are a seasoned developer or just starting, React Bootstrap can help you create stunning user interfaces that will impress users and enhance the overall performance of your web applications.\n\n## React Bootstrap Features\n\n![React Bootstrap](https://images.unsplash.com/photo-1577648188599-291bb8b831c3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxmcm9udGVuZHxlbnwwfHx8fDE3MjAwNDY2NzJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact Bootstrap provides many pre-designed UI components, such as:\n\n- Buttons\n- Modals\n- Navigation bars\n- Forms and more\n\nThese components are interactive and responsive and seamlessly integrate with your React applications.\n\n### Lightweight Performance\n\nReact Bootstrap components do not rely on external JavaScript libraries, which makes them lightweight and easy to use. You can significantly reduce the code sent to the client by importing only the specific components you need. When React Bootstrap components are updated, they cause re-rendering of only the relevant parts of your application. This optimization leads to faster webpage loading and smoother navigation.\n\n### Tailoring React Bootstrap with CSS-in-JS or Sass\n\nCustomize React Bootstrap components to match your project’s branding using CSS-in-JS libraries or Sass variables. Once imported, these components are highly reusable across different parts of your application, promoting a modular codebase.\n\n### Responsive Design Powerhouse:\n\nReact Bootstrap’s versatility allows you to create web UIs using a paradigm and a DOM. It offers features like the Card component and excellent support for Flexbox, enhancing your responsive layout design.\n\n### React Bootstrap for Inclusive UI Design\n\nThe React component model gives us more control over the form and function of each component. Each component is implemented with accessibility in mind. The result is a set of accessible-by-default components, which is more possible from plain Bootstrap.\n\n### Design Efficiency with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## 5 Reasons Why You Should Use React Bootstrap\n\n![React Bootstrap](https://images.unsplash.com/photo-1512314889357-e157c22f938d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxzdGlja3l8ZW58MHx8fHwxNzIwMDQ2NjkyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Rich Component Library\n\nReact Bootstrap provides a rich component library essential for building web applications. You'll find a variety of components like buttons, forms, navigation bars, modals, and carousels that can be easily customized to meet your project needs. This extensive collection of reusable components simplifies the development process and helps you create a more efficient user interface.\n\n### 2\\. Flexibility and Customization\n\nOne significant advantage of React Bootstrap is its flexibility and customization options. You can override default styles, apply custom CSS classes, and extend the functionality of components to match your project requirements. This flexibility ensures your web applications are unique and tailored to your needs.\n\n### 3\\. Accessibility Compliance\n\nWeb accessibility is a crucial aspect of modern web development, and React Bootstrap ensures that all components comply with the relevant standards. This means using React Bootstrap will make your web applications more inclusive and accessible to a wider range of users, including those with disabilities.\n\n### 4\\. Maintained and Updated\n\nReact Bootstrap is actively maintained and frequently updated to align with the latest trends and best practices in web development. This ensures you have access to the most up-to-date features and improvements, helping you stay ahead of the curve regarding technology and user experience.\n\n### 5\\. Smooth Migration Path\n\nIf you're familiar with Bootstrap, transitioning to React Bootstrap is seamless. React Bootstrap builds on the foundation of Bootstrap, making it easy for users to shift from one framework to another without a steep learning curve. This smooth migration path allows developers to leverage their existing knowledge and skills while taking advantage of the additional features and benefits offered by React Bootstrap.\n\n## Important React Bootstrap Components\n\n### Accordion Component\n\nThe [Accordion component](https://www.geeksforgeeks.org/react-bootstrap-accordion-component/) in React Bootstrap provides a smart way to manage card components on your website by allowing you to expand them one at a time. This feature prevents users from being overwhelmed with large blocks of text while providing a clean and organized interface. The Accordion component is a unique feature that allows you to display text on the screen concisely and interactively.\n\n### Breadcrumb Component\n\nThe Breadcrumb component is another excellent feature provided by React Bootstrap. It helps users navigate your website by indicating the current page's location within a navigational hierarchy. This small yet powerful component is essential for enhancing user experience and ease of navigation. Breadcrumbs are a visual representation of where the user is within the website, giving users a clear sense of place and direction as they navigate your content.\n\n### React-Bootsrap NavBar\n\nThe NavBar component in React Bootstrap is a versatile, responsive, and powerful navigational header that supports various navigation elements, branding options, and much more. With the NavBar Component, you can easily customize your website's navigation, positioning, composition, and menu selections. This game-changer feature provides website visitors with a seamless and user-friendly browsing experience.\n\nThese components are designed to make your website more interactive, user-friendly, and aesthetically pleasing. With React Bootstrap, you can take your website's UI design to the next level and create a more engaging and enjoyable user experience for your visitors.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Getting Started With React Bootstrap\n\n![React Bootstrap](https://images.unsplash.com/photo-1543269664-7eef42226a21?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MTk5OTE4MzF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nOne of the best methods for integrating Bootstrap into a React app is to utilize a package with rebuilt Bootstrap components that can be used as React components. This approach allows you to import individual components as needed, reducing the code you must work with throughout your project. Two of the most popular packages are react-bootstrap and Reactstrap, which share many similarities in their features.\n\nTo get started, you can install the React Bootstrap package and import components like `Container`, `Row`, and `Col`. Here’s an example code snippet to demonstrate:\n\n```javascript\nimport { Col, Container, Row } from \"react-bootstrap\"\n\nfunction App() {\n  return (\n    <Container>\n      <Row>\n        <Col>Column 1</Col>\n        <Col>Column 2</Col>\n      </Row>\n    </Container>\n  )\n}\nexport default App\n```\n\n### Building Custom Components with Bootstrap Classes\n\nIn addition to using a package, you can apply Bootstrap classes directly to elements and components in your React app. This method is demonstrated by creating a theme switcher React component using Bootstrap’s built-in classes and components. For instance, you can create a simple theme switcher component using the dropdown component from Bootstrap with a few pre-built classes. The component’s state includes a theme attribute set initially to null, and it has two-click event handlers for selecting and resetting the theme.\n\nAnother approach to integrating [React with Bootstrap](https://github.com/orgs/react-bootstrap/repositories) is to utilize React-Bootstrap components like SplitButton and MenuItem. If you prefer working with Bootstrap version 3, React Bootstrap is suitable for you.\n\n## Alternative Ways Of Using Bootstrap With React\n\n![React Bootstrap](https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxkaXNjdXNzfGVufDB8fHx8MTcyMDA0NjcxOHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Use of BootstrapCDN\n\nUsing BootstrapCDN is the simplest way to integrate Bootstrap into your React app. Installations or downloads are not required. Simply add a link to your app’s head section. The following Script> tags must be added just before the closing /body> tag on your pages if you wish to use the JavaScript components that come with Bootstrap.\n\nBootstrap 5, released in 2021, no longer requires jQuery for its JavaScript components; it uses vanilla JavaScript instead. Because of these improvements, it's recommended that new projects use Bootstrap 5.\n\n### Import Bootstrap to React as a Dependency\n\nIf you’re using a build tool or a module bundler like Webpack, this is the best way to integrate Bootstrap into your React application. Bootstrap must be installed as a dependency for your application. After installing Bootstrap, include the JavaScript framework code in your app. Src/index.js must be the file for everybody utilizing the create-react app. You’ll see that the Bootstrap minified CSS is the first dependency.\n\nnpm install bootstrap\n\n### Integrating Bootstrap JavaScript Components\n\nOur lifecycle of React app components may now use the built-in Bootstrap classes. You must first install jquery and popper.js. If they haven’t been installed before, you can use the JavaScript components of Bootstrap in your project. Then, as shown in the following sample, add the new dependencies by making additional changes to the src/index.js file.\n\nWith Bootstrap 5, you no longer need jQuery or Popper.js for its JavaScript components, as Bootstrap 5 uses vanilla JavaScript.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers, providing a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese components offer visually appealing and interactive elements that can be easily integrated into web applications. They allow for stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to meet branding and design requirements.\n\n### MagicUI Pro: Taking Your User Interfaces to the Next Level\n\nMagicUI Pro offers an expanded range of features and functionalities to save time and enhance the user experience. With MagicUI Pro, users can access various resources, including website templates, to create beautiful landing pages that convert visitors into customers. By leveraging MagicUI Pro, designers and developers can harness the power of advanced features to streamline their workflows and achieve superior design outcomes.\n\n### React Bootstrap: A Seamless Integration for Enhanced User Experience\n\n[MagicUI](https://magicui.design/) seamlessly integrates with React Bootstrap, providing developers with a comprehensive set of tools and resources to enhance user experience. By combining MagicUI's capabilities with React Bootstrap, designers and developers can leverage a wide range of components and features to create dynamic and engaging user interfaces. This integration allows for the seamless implementation of design elements and animations, empowering users to craft captivating digital experiences that resonate with their target audience.\n\n### The Power of Animation: Elevating User Interfaces to New Heights\n\n[MagicUI](https://magicui.design/) emphasizes animation and a design-centric approach to bridge the gap between design and development. MagicUI enables designers and developers to innovate and create captivating digital experiences by incorporating visually appealing and interactive elements into web applications. Through strategic animations and design elements, MagicUI empowers users to elevate their user interfaces to new heights, creating immersive and engaging experiences that leave a lasting impression on users.\n\n### MagicUI: Empowering Designers and Developers Alike\n\nMagicUI is a powerful tool that empowers designers and developers to collaborate effectively and create visually stunning user interfaces. By leveraging MagicUI's capabilities, users can streamline their workflows, save time, and achieve superior design outcomes. Whether a seasoned developer or a design enthusiast, [MagicUI](https://magicui.design/) offers a wealth of resources and tools to enhance your user interfaces, enabling you to craft captivating digital experiences that resonate with your target audience.\n"
  },
  {
    "path": "apps/www/content/blog/react-component-best-practices.mdx",
    "content": "---\ntitle: \"13 React Component Best Practices For Optimized Performance\"\ndescription: \"Improve the efficiency by following React component's best practices. Enhance your application and impress users with faster loading times.\"\nimage: https://cdn.magicui.design/assets/7f9cf029-5e6d-4e63-99bf-d16983e0fc20.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-10\"\nfeatured: false\n---\n\nAre you looking to enhance your React.js component design and coding skills within [UI Frameworks](https://magicui.design/blog/ui-frameworks)? Crafting components that align with best practices can be a daunting task. We've got you covered! We will go into this topic, providing invaluable insights and practical solutions to help you become a pro at React component best practices. With these tips, you can confidently conquer any component design challenge that comes your way.\n\nConsider Magic UI's powerful [React Component Library](https://magicui.design/) as your secret weapon. By leveraging this tool, you will have the necessary resources to achieve your objectives, such as mastering the best practices for React.js component design and coding. Let's dive into the world of React components and unlock the potential to create exceptional UIs in no time!\n\n# **What Is React?**\n\n![React Component Best Practices](https://cdn.magicui.design/assets/tq8ioqsahv.jpg)\n\nReact.Js is an open-source Javascript library developed by Meta for creating user interfaces (UIs). It helps create reusable UI components and uses virtual DOM to improve app performance. It can be used on both client and server sides and is easily integrated with other front-end frameworks. Its component-based approach, reusability, developer tools, and performance optimization make it a great choice for developers.\n\nOne of React's famous applications is Instagram. Features like geolocations, Google Maps APIs, and tags that pop up without hashtags are all impressive implementations of React. Even the makers of React, Facebook, use React for their webpage, and the mobile version is made using one of its famous frameworks, [React Native](https://react.dev/).\n\n## Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n# **5 Reasons Why It's Important To Optimize React Using Best Practices**\n\n![React Component Best Practices](https://images.unsplash.com/photo-1503551723145-6c040742065b-v2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxzdGlja3l8ZW58MHx8fHwxNzE5MDU4MDk3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n## **1\\. Improved User Experience**\n\nA slow-loading or laggy application can lead to a poor user experience, negatively impacting your business. Users expect fast and responsive interactions, and performance optimization helps deliver that.\n\n## **2\\. Improved SEO**\n\nSearch engines like Google consider page load times and overall performance when ranking websites. A well-optimized application will rank higher in search results, making it more visible to potential users.\n\n## **3\\. Reduced Bounce Rates**\n\nUsers will likely leave and never return if your application takes too long to load or respond. By optimizing performance, you can reduce bounce rates and increase engagement.\n\n## **4\\. Cost Savings**\n\nA performant application requires fewer resources (like servers and memory) to handle the same workload. This means lower hosting costs and reduced infrastructure needs.\n\n## **5\\. Competitive Advantage**\n\nA fast and efficient application sets you apart from competitors whose applications may be slower or less optimized. According to research by Portent, a website that loads within one second has a conversion rate five times higher than a site that takes [ten seconds to load](https://www.portent.com/blog/analytics/research-site-speed-hurting-everyones-revenue.htm). Therefore, ensuring your React applications perform well is crucial for retaining users and maintaining a competitive edge.\n\n## **Pre-Built Animated Components for Designers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n# **13 React Component Best Practices For Optimized Performance**\n\n![React Component Best Practices](https://images.unsplash.com/photo-1581291518857-4e27b48ff24e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxwbGFufGVufDB8fHx8MTcxOTA1ODExMHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n## **1\\. Master Component Nesting and the Parent-Child Relationships**\n\nIf you’ve been building [React applications](https://www.uxpin.com/studio/blog/how-react-works/) for a while, you’re no stranger to component nesting. But have you ever explored just how deep this rabbit hole goes? Understanding the intricate parent-child relationships within React components is essential.\n\nParent components, also known as container components, are at the top of the component hierarchy in React. They act as the guardians of state and serve as the glue that binds together smaller components called child components. While child components handle specific functionalities or UI elements, parent components manage your application's overall structure and data flow. By diving deep into this structure, you gain the power to design applications that are not just functional but elegant in their architecture.\n\n## **2\\. Follow a design pattern and stick to it**\n\nFollowing an already established design pattern in your react application keeps your components organized, easy to read, test and make changes. Two of already established practices include:\n\n### Container/Presentational Pattern\n\nFollowing this approach ensures a strict separation of concern between the business logic and user interface, where the container components manages data and state while presentational components focus on rendering the UI easier to test.\n\n### Flux Pattern\n\nThe Facebook team introduced the flux pattern to introduce a unidirectional data flow in your react application. This is commonly enforced using state management libraries like Redux.\n\n## **3\\. List visualization**\n\nList visualization, or windowing, involves rendering only the visible items on the screen.\n\nWhen dealing with a large number of items in a list, rendering all the items at once can lead to slow performance and consume a significant amount of memory. List virtualization tackles this issue by rendering only a subset of the list items currently visible within the view, which conserves resources as the users scroll through the list.\n\n### Efficient Rendering of Large Lists in React Applications\n\nThe virtualization technique dynamically replaces rendered items with new ones, keeping the visible portion of the list updated and responsive. It efficiently allows you to render large lists or tabular data by only rendering the visible portion, recycling components as needed, and optimizing scroll performance. There are different approaches to implementing list visualization in React, one of which uses a popular library called React Virtualized.\n\nTo install react-virtualized, you can use the following command:\n\nnpm install react-virtualized --save\n\nAfter installing react-virtualized, you can import the required components and styles.\n\n## **4\\. Decompose into Small Components**\n\nTry to decompose large components into small components, each performing one function as much as possible. This will make it easier for the development team to manage, test, reuse, and create smaller components.\n\nDepending upon the project, one can split/decompose the design into smaller components in multiple ways:\n\n### Programming\n\nUse Single Responsibility Principle (SRP). One component should have only one functionality. If it ends up growing, then decompose that component into smaller subcomponents.\n\n### Design\n\nAccording to the design layers, you can decompose the components.\n\n## **5\\. Memoization**\n\nMemoization in React is a technique used to optimize the performance of functional components by caching the results of expensive computations or function calls. It's particularly useful when dealing with computationally intensive or frequently called functions with the same input values, as it helps avoid redundant calculations and improves the overall efficiency of the application.\n\nIn React, there are three techniques for memoization:\n\n- React.memo()\n- useMemo()\n- useCallback()\n\n### How to use React.memo()\n\nThis higher-order component wraps purely functional components to prevent re-rendering if the received props remain unchanged.\n\nBy using React.memo(), the rendering result is cached based on props. If the props haven't changed since the last render, React reuses the previously rendered result instead of redoing the rendering process. This saves time and resources.\n\n## **6\\. Master Prop Drilling and Context API**\n\nProp drilling is a common technique in React. But to truly master it, you need to explore the nuances. Learn how to pass data efficiently between deeply nested components without making your code unwieldy. And when it comes to state management, don’t stop at basic state or prop passing – take the leap into the world of Context API. Unlock its potential to streamline state management and make your codebase more elegant and maintainable.\n\n## **7\\. Learn different component patterns**\n\nTo ensure you don't end up with unmaintainable and unscalable spaghetti code, learning different component patterns is essential as you become more experienced in React. But this is not all. Knowing the different patterns is a good foundation. But the most important aspect about it is that you know when to use which pattern for your problem.\n\nEvery pattern serves a certain purpose. For example the compound component pattern avoids unnecessary prop-drilling of many component levels. So, the next time you begin to do pass props through five component levels to reach the component that is interested in the props finally, you start to orchestrate the components differently.\n\n## **8\\. Use Functional Components with Hooks**\n\nAfter the release of React v16.08, it’s possible to develop function components with the state with the new feature ‘React Hooks’. It reduces the complexity of managing states in Class components. So always prefer to use functional components with React Hooks like useEffect(), useState() etc. This will allow you to repeatedly use facts and logic without much modification in the hierarchical cycle.\n\n## **9\\. Styling**\n\nStyling is an important aspect of React component design. The most important thing here is to pick a styling of choice and remain consistent across the library's components.\n\nSome of the most popular styling choices include:\n\n### Use CSS-in-JS libraries\n\nCSS-in-JS libraries like styled components can make it easier to style your components and create reusable styles.\n\n### Use CSS modules\n\nCSS modules allow you to create component-level styles that don’t clash with styles from other components.\n\nUse utility-first CSS frameworks like tailwind css\n\nUse UI libraries such as material-ui, ant design, chakra etc.\n\n### Create reusable styles\n\nWhen creating custom styles with CSS, SASS, etc., it is important to prioritise reusable styles that can be used across your application. This can help you create a consistent visual style and make your components more maintainable.\n\n## **10\\. Destructuring Props**\n\nTake advantage of the object destructing to access props. This can reduce verbosity in the code and enhance readability. It also improves the clarity of component interfaces and makes it easier to identify which props are used.\n\nAn example of this can be seen in the Button component code shared above: `const {name, age} = props`\n\n## **11\\. Prop and state**\n\nIt is crucial to understand the difference between your props and your state. Props are static data passed around within components. They are immutable and do not change. State is used to manage dynamic data within a component. It represents a component's internal state, allowing it to handle and respond to user interactions, events, or changes in its logic.\n\n## **12\\. Set up Error Boundaries**\n\nHandling errors gracefully is essential for creating robust applications. Experienced frontend developers understand that while preventing errors is ideal, preparing for them is equally essential. This preparation involves exploring the concept of error boundaries in React, a practice that safeguards your application from unexpected crashes and ensures a seamless user experience.\n\n### Understanding Error Boundaries\n\nTo begin, delving into the realm of error boundaries is crucial. It involves understanding the architecture of React components that can gracefully intercept errors and prevent them from affecting the entire application. This level of control allows you to implement error boundaries strategically, enhancing your application’s stability.\n\n### Implementing Error Boundaries\n\nExperienced developers recognize that this process involves wrapping specific components or sections of your application in error boundary components. Doing so allows you to capture and handle errors gracefully, preventing them from cascading throughout the entire application and potentially crashing it.\n\n## **13\\. Optimize Component Re-renders with PureComponent**\n\nUse React’s PureComponent class for components that only re-render when their props or state change. PureComponent performs a shallow comparison of props and state to determine if a re-render is necessary, potentially improving performance.\n\n# **5 Common Challenges React Developers Face**\n\n![React Component Best Practices](https://images.unsplash.com/photo-1544717305-f9c88f2897bc?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxjb25jZXJuZWR8ZW58MHx8fHwxNzE5MDU4MTMwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n## **1\\. Learning the basics**\n\nLearning React can be tough at first. The syntax is unlike what most developers are used to, and there are new concepts to grasp, like JSX. If you're transitioning from another framework, like Angular or Vue, you'll have an easier time grasping the basics than someone unfamiliar with JavaScript. Knowing JavaScript well is just the beginning -- you'll still need to understand how React operates if you want to construct intricate applications with it.\n\n## **2\\. Debugging**\n\nReact is a powerful UI framework, but debugging with it is no walk in the park. The learning curve for [debugging issues with React](https://www.devstringx.com/reactjs-development-challenges) is steep because no integrated tools exist for this purpose. You’ll need to rely on Chrome Developer Tools or other browser extensions, like Redux DevTools, to monitor your application's inner workings.\n\n## **3\\. Maintainability**\n\nDetermining how different components tie together becomes increasingly challenging when your project grows more complex. React is a fantastic tool for crafting UIs, but you might face difficulties if you aim to create something like a full-fledged chat application with real-time updates. You'll have to blend React with other libraries, such as Redux. This is where things start to get intricate, and there aren't many resources available for handling large React projects.\n\n## **4\\. Struggling with Redux**\n\nRedux, created by Facebook, is designed to help developers create more stable and maintainable apps using React. It functions as an app state container where you can store your entire app's state in one spot, eliminating the need to track it manually when crafting components or routing logic. The catch is, Redux can be incredibly challenging to learn and implement. It presents a steep learning curve and can be quite daunting for beginners. There are numerous approaches to using Redux, making it tough to figure out the best method for your app.\n\n## **5\\. Dealing with bugs caused by 3rd-party libraries**\n\nThere are many useful libraries for React, from form validation to code splitting and animations, among others. Many of these libraries are buggy and come with poor documentation, leading to issues when integrating them into your projects. If you decide to use these libraries, thorough testing is crucial to ensure everything functions as intended. Should you encounter any bugs or unexpected behavior, consider reporting the issue on the library's GitHub repository and checking whether other users have experienced similar problems.\n\n## Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n# **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These components are highly customizable and visually appealing, enabling the creation of stunning user interfaces with minimal effort.\n\n## **MagicUI Components: Combining Animation and Design-Centric Approach**\n\nMagicUI components are designed to bridge the gap between design and development, empowering users to craft captivating digital experiences. The focus on animation and a design-centric approach allows for seamless adaptation to match desired branding and design requirements. By integrating these components into web applications, developers can create visually appealing and interactive elements that enhance user experience.\n\n## **MagicUI Pro: Elevating User Experience with Website Templates**\n\nWith MagicUI Pro, users can save time and effort by leveraging thousands of hours of work in creating beautiful landing pages and website templates. These templates are designed to convert visitors into customers, offering a professional and polished look that can elevate the overall user experience.\n\n## **Get Started with MagicUI Today**\n\n[MagicUI](https://magicui.design/) offers a range of free components that can be integrated into web applications to enhance user interfaces. With MagicUI Pro, users can take their digital experiences to the next level by leveraging website templates that streamline development and improve user engagement.\n\nVisit [magicui.design/docs](http://magicui.design/docs) to start using the [React component library](https://magicui.design/) for free today.\n\n## Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-css-framework.mdx",
    "content": "---\ntitle: \"24 Amazing React CSS Frameworks You Should Know About\"\ndescription: \"Learn about the best React CSS frameworks and how they can help you create stunning user interfaces.\"\nimage: https://cdn.magicui.design/assets/b2f7e742-bc55-4974-8993-e5211084bfff.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-08\"\nfeatured: false\n---\n\nAre you a developer searching for ways to enhance your [UI Frameworks](https://magicui.design/blog/ui-frameworks) and React CSS Framework skills? Imagine having access to a diverse range of CSS frameworks for your React projects, enabling you to create visually appealing interfaces effortlessly. This article offers valuable insights into different CSS frameworks for React that you can utilize for your projects, enhancing your development capabilities and ensuring stunning user interfaces.\n\nMagic UI's [React component library](https://magicui.design/) provides an easy-to-use solution to help you achieve your goals of learning about the various CSS frameworks for React. By exploring these frameworks, you can enhance your projects with visually appealing styles, making your applications stand out while streamlining your development process.\n\n## **Recap Of React**\n\n![React CSS Framework](https://cdn.magicui.design/assets/4tshfqq5q0d.jpg)\n\nReact is a popular open-source front-end JavaScript library that can be used to build user interfaces (UIs). Facebook developed it and has gained popularity for its efficient and reusable components.\n\n### Modular UIs with Reusable Components\n\nReact allows developers to build complex UIs by breaking them down into smaller, reusable components. These components can be used across different application parts, reducing the amount of code that needs to be written and maintained.\n\n### Declarative Programming and Virtual DOM\n\nReact uses a declarative approach to programming, meaning developers only need to describe what they want the UI to look like, and React takes care of the underlying logic to make it happen. React also has a virtual DOM, which helps to improve performance by updating only the changed parts of the UI rather than the entire UI.\n\n**Widespread Adoption and Industry Recognition**\n\nAccording to the State of JS Survey 2022, React is the most popular frontend library, with approximately 17.4 million weekly downloads. It is widely used in the industry and has been adopted by many Fortune 500 companies, including Facebook, Instagram, Airbnb, Netflix, and Dropbox.\n\n### Expanding Functionality with UI Libraries and Frameworks\n\nThe popularity of [React](https://react.dev/) has led to the creation of many UI libraries and component frameworks, each with its advantages and features. With these best CSS frameworks for React, developers can easily include pre-built, tested UI components in their projects by building on top of React’s core functionality. It helps to maintain the project in the long run and saves developers time and effort, allowing them to focus on the unique features of their application.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n\n## **What Is A React CSS Framework?**\n\n![React CSS Framework](https://cdn.magicui.design/assets/rhnhvn955r.jpg)\n\nCSS frameworks for React and Component libraries are the foundations of React-based applications. They provide pre-built user interface components that can be easily integrated into the application, saving developers time and effort in creating these components from scratch.\n\nBoth the React UI framework and a component library provide UI components, but they differ in their scope and level of customization. Some of the best CSS frameworks for React include Material-UI, React Bootstrap, Semantic UI React, Ant Design, Blueprint, and many more. These frameworks provide a wide range of customizable, pre-built UI components and libraries that can be used to build beautiful and responsive user interfaces.\n\nHere are some differences between CSS frameworks for React and their component libraries based on some key factors:\n\n### Scope\n\nCSS frameworks for React offer a set of ready-made UI components, such as navigation menus, layouts, responsive templates, and more, which are integral to building modern-day websites. With the help of these best CSS frameworks for React, front-end developers can save time and effort by using pre-built components already optimized for performance and accessibility while still being customizable to suit their needs. Some popular UI frameworks include Material UI, Ant design, etc.\n\nOn the other hand, React component libraries are more specific; they provide individual, reusable components, such as buttons, inputs, and icons, that can be combined and customized to create more complex UIs. Some of the popular component libraries include Magic UI, React Bootstrap, Chakra UI, etc.\n\n### Adaptability\n\nCSS frameworks for React are less customizable and have several restrictions, limiting the developer’s ability to create a unique UI design. This set of best CSS frameworks for React has its design patterns and rules that must be followed to keep the application consistent.\n\nOn the other hand, React component libraries are more developer friendly and customizable than UI frameworks. Unlike UI frameworks, we can easily customize the designs that match the design of your project, and you don’t need to override the styles used in UI frameworks.\n\n### Learning Curve\n\nCSS frameworks for React are difficult to grasp because they have design patterns, constraints, and conventions that must be followed to ensure consistency throughout the application. But once you become familiar with this set of best CSS frameworks for React, it is just a walk in the park.\n\nOn the other hand, React component libraries are generally considered easier to use than CSS frameworks for React, as they often have a lower learning curve. Component libraries do not require you to follow a specific set of design patterns and conventions, which gives you greater flexibility and control over the design and functionality of your UI.\n\n### Accessibility\n\nCSS frameworks for React and component libraries can help make your application more accessible to all users. Many of these libraries already include accessibility features, so you don’t have to worry about adding them yourself. This means that people with special abilities can still easily use your application.\n\nOn the other hand, choosing between various lists of best CSS frameworks for React and component libraries depends on what you need for your project and what you prefer. If you want a lot of pre-made components and a consistent UI design, go for a framework. But if you want more control and customization options, go for a component library.\n\n## **A Feature-Rich UI Library for Effortless Web App Development**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **Why Should You Use React CSS Frameworks?**\n\nCSS frameworks offer numerous benefits that make them indispensable tools for web development. Here are some advantages that CSS frameworks provide:\n\n### 1\\. Faster development time\n\nCSS frameworks come with pre-built components and styles, eliminating the need to write everything from scratch. This speeds up the development process and allows developers to focus on customizing and fine-tuning specific aspects of their projects rather than building from scratch.\n\n### 2\\. Consistent style and design\n\n[CSS frameworks](https://css-tricks.com/what-are-the-benefits-of-using-a-css-framework/) help provide a cohesive and consistent look across different components and pages. They ensure that all styles, UI elements, buttons, and typography maintain a unified design language, saving developers from spending excessive time on styling and ensuring a better user experience.\n\n### 3\\. Improve collaboration and maintainability\n\nCSS frameworks usually offer well-documented libraries and established conventions, making it easier for developers to collaborate and maintain codebases. With a common codebase and extensive documentation, developers can easily understand and work with each other's code.\n\n## **24 Amazing React CSS Frameworks You Should Know About**\n\n![React CSS Framework](https://cdn.magicui.design/assets/fo2sq65uvrf.png)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Material UI\n\nMaterial UI is the React implementation of the well-known design language Material Design. Google developed Material Design to provide a united, consistent, real-life-like design experience for all its products and services. It provides a material design touch to React-based applications. Material UI provides several pre-built UI components like buttons, forms, grid systems, navigation tabs, etc., making it one of the best CSS frameworks for React.\n\nAccording to NPM trends, Material UI has around 2.8 million weekly downloads. When writing this blog, Material UI had around 85.4K+ stars and 29.4K+ forks on GitHub, which shows its popularity. The best thing about Material UI is that its documentation is well-written, and we can follow along without hassle.\n\n### 3\\. Bootstrap\n\nBootstrap began as an internal tool at X (formerly Twitter) to maintain a consistent look across the platform. Then, in 2011, it was open-sourced for the wider web development community to use. Bootstrap is one of the most widely used CSS frameworks, focusing on responsive, mobile-first web design. It offers a robust collection of CSS and JavaScript components, such as its grid system and responsive UI components like buttons, navigation menus, and forms, that streamline the process of building clean and consistent web layouts.\n\nBootstrap has large community support and over 100K GitHub stars. And though it may seem bulky when compared to modern options, it's still one of the most used CSS frameworks you can use to build good-looking and thematically coherent web applications without needing to be an expert in CSS and web design.\n\n### 4\\. Ant Design\n\nAnt Design proclaimed itself as the second most popular among various best CSS frameworks for React and they are right about that. It has been widely used, and according to npm trends, it has around 1.2 million weekly downloads. Ant Design is like Material UI, providing several UI components that look aesthetic and clean.\n\nAnt Design is based on the design language Ant Design, which has its design patterns and principles, making it one of the best CSS frameworks for React. Ant Design had around 85.1K+ stars and 38.6K+ forks, which shows its popularity among developers. It has about 1900 contributors, and the library is actively maintained.\n\n### 5\\. Tailwind CSS\n\nTailwind CSS is a utility-first CSS framework that allows you to rapidly build custom user interfaces in markup files. As a utility-first framework, Tailwind abstracts from the constraints of a component-based framework, such as Bootstrap. Though component-based frameworks like Bootstrap excel at streamlining the process of building web layouts by providing pre-defined UI components, they’re opinionated in that you’re confined to the current design system and ecosystem of the framework.\n\nTrying to extend or customize your application’s layout beyond what the framework provides can prove to be a workaround. Tailwind offers a robust system of utility and helper classes as building blocks that can be composed to build any design directly in your markup. With Tailwind ranking as the second most used framework in the [State of CSS 2023 survey](https://2023.stateofcss.com/en-US/css-frameworks/) at about 76%, it's the best choice to rapidly prototype and speed up the development process in line with modern web standards.\n\n### 6\\. Foundation\n\nFoundation is the closest alternative to Bootstrap. It's not just a CSS framework, but a comprehensive toolkit for styling web applications, architecting email templates, which is known to be notoriously hard, and integrating with [ZURB’s Motion UI](https://zurb.com/playground/motion-ui) to create advanced CSS animations.\n\nIt includes common UI components like Bootstrap but is more utility-focused and gives developers more options for customizing components. With almost too many features, it can be considerably more complex and harder to understand how everything works compared to other frameworks fully.\n\n### 7\\. React Bootstrap\n\nIf you’re in the world of web development, or more specifically, if you’re into front-end development, you may already be familiar with Bootstrap. Bootstrap is another popular and one of the best CSS frameworks for React from the list, and it provides a collection of reusable UI components and styles that can be used in any web application. React-Bootstrap is built on top of the Bootstrap CSS framework.\n\nIt provides a set of React components based on the Bootstrap CSS framework, making it easier for developers to build React-based responsive and mobile-first design web applications. According to npm, React Bootstrap has around 1.7 million weekly downloads, which shows the library’s popularity.\n\n### 8\\. Semantic UI React\n\nYou may have heard of or even used Semantic UI before. Semantic UI React is an easy-to-use, highly customizable, and one of the best CSS frameworks for React, offering reusable UI components and styles. Semantic UI React is built on top of Semantic UI, and it is one of the popular libraries that provide reusable React components that are highly customizable. According to npm trends, Semantic UI React garners around 250,000+ weekly downloads.\n\n### 9\\. Chakra UI\n\nChakra UI falls into the same category as MUI as a component library and CSS framework for React applications. It emphasizes accessibility, developer ergonomics, and a customizable design system. Chakra UI provides a collection of well-designed and accessible components that can be easily customized to match your project's branding and style. According to npm trends, Chakra UI has around 460,000 weekly downloads, around 31.8K+ stars, and 2.8K+ forks on GitHub.\n\n### 10\\. Emotion\n\nEmotion is built on styled components' concepts to be a more performant, lightweight, and feature-rich CSS-in-JS library. It utilizes features such as source maps, labels, and testing utilities. Emotion is framework-agnostic and has a syntax as close to CSS as possible, making it easier to adopt.\n\n### 11\\. Blueprint UI\n\nBlueprint is one of the best CSS frameworks for React. Blueprint provides several reusable components, like icons, calendars, tables, etc., which you can use to make your React application. According to npm trends, Blueprint has around 240,000 weekly downloads and a steadily growing user base. This popularity is due to its comprehensive and well-designed set of UI components and its ease of use and customization. Blueprint has around 20K+ stars and 2.1K+ forks on GitHub.\n\n### 12\\. Bulma\n\nBulma is a modern and lightweight CSS framework that offers a flexible grid system and a variety of CSS styles and components. It focuses on simplicity, modularity, and ease of use. Bulma emphasizes that it is \"environment agnostic,\" meaning it is just the style layer on top of the logic, so it integrates capably with any JS environment.\n\nBulma is more of a collection of CSS classes than UI components. It has a clean and intuitive syntax and is less complex and easier to understand than other component-based frameworks like Foundation and Bootstrap. This makes it ideal for beginners or developers who value simplicity and want to build responsive websites quickly.\n\n### 13\\. Mantine\n\nMantine is an easy-to-use, highly customizable, and popular CSS framework for React. It provides developers with various reusable components and utilities for creating modern web applications. Its range of features and components includes forms, modals, navigation elements, and more, making it one of the best CSS frameworks for React.\n\nMantine has over 100+ customizable components and 40 hooks, allowing developers to easily create beautiful, responsive, and highly functional user interfaces for their web applications. According to npm trends, it has around 150,000 weekly downloads and is widely used. The fact that its download numbers have been steadily increasing over the past few months suggests that its popularity is growing.\n\n### 14\\. Fluent\n\nFluent is a cross-platform, open-source design tool to help you create an engaging user experience. It was previously named Fabric React and is an excellent UI library created by Microsoft. Developers and designers can benefit from its useful tools to add design elements to their applications without creating them from scratch.\n\nThis powerful and intuitive tool is built to adjust per user intent and behavior. No matter what device you use, working with Fluent feels natural, be it PCs, laptops, or tablets. Fluent is one of the best tools for creating cross-platform applications. It’s also great for other projects.\n\n### 15\\. Next UI\n\nNext UI is a React library that offers a collection of visually appealing pre-built components. While it stands out for its aesthetics, there's a potential downside to consider. Some users have reported experiencing performance issues, particularly with slow loading times and freezing when changing themes on desktop.\n\nThis could be a concern if a smooth user experience is critical for your project. It's also worth noting that despite the name, Next UI is not directly affiliated with the popular React framework Next.js. It has got 19K GitHub stars and more than 100K weekly downloads on NPM.\n\n### 16\\. Rebass\n\nRebass comes with a basic collection of primitive components that may be “developed” to create a best React UI component library with a standard API and design themes. Primitives for app structure (responsive boxes and flexbox layouts), text (header, text, link, button), photos, cards, and forms are all included in the foundation. Rebass also offers the finest documentation on recipes for common use cases like grids, navbar, and image cards. A ThemeProvider component is used to apply themes in Rebass.\n\nRebass supports theme specification for defining theme objects and designing tokens for usage with UI components. Theme UI and Styled System are both compatible with Rebass. Talking about its documentation, then primitive components, theming, and design systems are some of the finest documentation of Rebass. These are responsible for providing the best React UI framework.\n\n### 17\\. Headless UI\n\nTailwind Labs created headless UI as a collection of unstyled, fully accessible UI components that work seamlessly with Tailwind CSS. Headless UI provides the best React frameworks for your React project. Tailwind CSS is taken further with Headless UI, which provides the best React UI framework with the best React components. Tailwind CSS, offered out-of-the-box to meet your individual needs, can be used to style them.\n\nToggle Switch, Autocomplete, and Modal are all common components in Headless UI. Each element comes with a simple example, styling instructions for each portion, and instructions for customizing it to your needs. It also has a complete API for transitions as well as accessibility information.\n\n### 18\\. Pure CSS\n\nPure CSS is a minimalistic and lightweight CSS framework that aims to provide a set of small, responsive CSS modules and styles as a starting point for styling web applications without imposing any design decisions. When all modules are used, it has one of the smallest bundle sizes, 3.5KB (compressed). Pure CSS is suitable for projects where a minimal design approach is desired or when you prefer to write your styles from scratch.\n\n### 19\\. Carbon Design System React\n\nThe Carbon Design System is a design language developed by IBM to provide a unified experience across all its products. Carbon Design System React is one of the best CSS frameworks for React, offering a collection of reusable components and styles for developing modern, user-friendly web applications. According to npm trends, Carbon Design System React has around 100,000 monthly downloads, and it is an actively maintained project.\n\n### 20\\. Grommet\n\nGrommet is one of the most known and best CSS frameworks for React that provides accessibility, modularity, responsiveness, and theming support. It is made to be very flexible and easy to change, so developers can make UIs that meet their needs and match their brand. It has around 37,000 weekly downloads and is becoming popular among developers due to its simplicity.\n\n### 21\\. Evergreen\n\nEvergreen is another well-known among various best CSS frameworks for React offered by Segment, designed to help create delightful software products. It’s also a design system that provides flexibility and doesn’t limit developers to any specific configuration or outdated integration. Evergreen has around 12,872 weekly downloads, which has been steadily increasing over the past few months.\n\n### 22\\. Theme UI\n\nTheme UI is a design library for styling React-based applications that allow developers to create user interfaces that can be easily themed based on constraint-based design principles. Theme UI has great developer ergonomics and is built on the principles of constraint-based design. Theme UI has around 93,000 weekly downloads, according to the npm statistics. This indicates a growing user base and popularity within the React developer community.\n\n### 23\\. React Suite\n\nReact Suite is a popular open-source React-based UI library, among other best CSS frameworks for React, which offers a wide range of components that can be changed and reused again. These components include everything from simple user interfaces elements like buttons and forms to more complicated ones like data tables and charts.\n\nThis makes it a great choice for developers who want to make web apps that look professional and have many features. React Suite has around 45,552 weekly downloads, according to npm statistics, and it is a well-maintained project with around 100 developers actively working on it.\n\n### 24\\. Onsen UI\n\nOnsen UI is a solid choice if your project prioritizes a mobile-first experience. This library helps design interfaces that feel native to mobile devices. It achieves this by offering components and features that mimic the look and feel of native iOS and Android apps. Onsen UI's touch-friendly UI and native-style animations bridge the gap between web and mobile, creating a smooth user journey for mobile users. Naturally, there are some downsides to consider.\n\nThe cost of Onsen UI has recently increased noticeably, and some users have reported bugs that take a while to get fixed. While iOS performance is good, Android apps built with Onsen UI can sometimes feel sluggish. Native functionalities like maps require separate plugins. It has got 8K GitHub stars and more than 24K weekly downloads on NPM.\n\n## **How To Choose The Right React CSS Framework For Your Project**\n\n![React CSS Framework](https://cdn.magicui.design/assets/9ag5cjxsmz9.png)\n\n### Customizability\n\nWhen selecting a React CSS framework, it's crucial to assess the extent of customization it provides. Does the framework offer the flexibility to tailor and expand your styles beyond its design system to align with your distinct requirements and preferences? Or does it follow a rigid structure that limits you to the framework's design system and ecosystem?\n\n### Learning Curve\n\nAnother vital factor to consider is the learning curve associated with implementing a CSS framework. How intuitive is the framework for beginners? What's the developer experience like? Are ample resources and documentation available to enable you to understand and leverage the framework effectively?\n\n### Community Support\n\nThe presence of an active and supportive community is a key aspect to consider when evaluating React CSS frameworks. Engaged developer communities that actively contribute to the growth of frameworks and offer aid to peers (and you!) are invaluable resources.\n\n### Project Compatibility\n\nEnsuring that the CSS framework you choose aligns with your project objectives and effectively meets its branding and design demands is essential.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- MUI React\n"
  },
  {
    "path": "apps/www/content/blog/react-design-patterns.mdx",
    "content": "---\ntitle: \"8 Popularly Used React Design Patterns & Best Practices\"\ndescription: \"Improve your React coding efficiency with these widely used React design patterns. Learn to write cleaner and more maintainable React code today!\"\nimage: https://cdn.magicui.design/assets/2d406314-2653-4bc4-b005-e2347ece5a5f.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you grappling with the complexity of [UI frameworks](https://magicui.design/blog/ui-frameworks) like React design patterns? Understanding the best practices and benefitting from React design patterns is essential for every developer in the field of UI frameworks. This blog will offer you the valuable insights you need to navigate and utilize React design patterns effectively, helping you enhance your skills and improve your processes.\n\nMagic UI's [React component library](https://magicui.design/) can be your go-to solution. It provides an array of components and functionalities to help you learn and apply React design patterns and best practices efficiently. By leveraging Magic UI, you can gain hands-on experience and enhance your development process, all while mastering the ins and outs of React design patterns. With this resource, you can bring your projects to life with ease, leveraging the best practices in React design patterns.\n\n## What Are React Design Patterns?\n\n![React Design Patterns](https://cdn.magicui.design/assets/9219m2zw3d.png)\n\nDesign Patterns are the pre-built templates that help create websites and mobile applications efficiently. In simple terms, design patterns are the proven solutions to resolve common application problems and development challenges.\n\n### Efficiency, Maintainability, and User Experience\n\nReact design patterns ensure proficient code organization and reusability. This collectively leads to faster development, uniform design, and fewer errors, ultimately enhancing the overall user experience. React design patterns enable you with new functionalities or features without hampering the existing codes.\n\n### Long-Term Advantages of Organized Code\n\nUsing React design patterns smooths your development process and keeps your app functional for the long run. Thus, we can infer that [React](https://www.patterns.dev/react/) design patterns are not just a solution to introduce a new feature and fix issues; they are like finding your favorite book on a well-organized bookshelf.\n\n### Related Reading\n\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Are The Benefits Of Using Design Patterns In React\n\n![React Design Patterns](https://cdn.magicui.design/assets/v5ul7700dv.png)\n\n### 1\\. It Provides Structure for Collaborative Development\n\nReact is known for being a flexible development environment, allowing developers to mix and match different development approaches. Multiple React developers collaborating on a project can lead to some challenges. Design patterns provide a much-needed structure to guide collaborative development and ensure consistency in coding styles and practices.\n\n### 2\\. Enhances Code Organization\n\nDesign patterns offer systematic and methodical ways to write code, making maintaining and managing large React applications easier. By following predefined solutions to common problems, developers can improve the organization of their codebase and streamline the development process.\n\n### 3\\. Encourages Reusability\n\nReact design patterns come with reusable templates and components, promoting reusability across different parts of the application. This saves time and effort by eliminating the need to reinvent the wheel for every new feature and ensures consistency and reliability in the codebase.\n\n### 4\\. Promotes Maintainability\n\nUsing design patterns in React can lead to more modular and decoupled code, making it easier to maintain and update the application. By separating concerns and promoting [code readability](https://moldstud.com/articles/p-the-importance-of-documentation-and-code-readability-in-php-development), design patterns help developers understand and modify the codebase more effectively.\n\n### 5\\. Helps in Performance Optimization\n\nDesign patterns like memoization in React can optimize performance by reducing expensive calculations and unnecessary renders. By leveraging these design patterns, developers can enhance application performance and improve user experience.\n\n### Free and Open-Source UI Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## 8 Top React Design Patterns\n\n![React Design Patterns](https://cdn.magicui.design/assets/esyrk6d3tq.png)\n\n### 1\\. High Order Components\n\nThe High-Order Components (HOC) are reusable logic within the React components. This popular React design pattern allows your development team to add functionality or features to your React application without changing their original code.\n\nFor instance, you have an “Apply now” button in your React application; you want to add color when someone clicks “Apply now.” With HOC, you can add a new color without modifying the original component. HOC helps to keep code organized and avoid code duplication. Leveraging HOC in React application development leads to scalable and agile software products.\n\nCode Structure of High Order Components:\n\n```tsx\nimport React, { Component } from \"react\"\n\nconst HigherOrderComponent = (DecoratedComponent) => {\n  class HOC extends Component {\n    render() {\n      return <DecoratedComponent />\n    }\n  }\n  return HOC\n}\n```\n\n### 2\\. The Provider Pattern\n\nYou must understand that the Reacts provider pattern is quite a powerful concept. Plus, React uses provider patterns in Context API. It does the same to share data across the tree descendant nodes. There can also be times when you do not find it helpful, especially when using plain react.\n\nYet again, this pattern is useful when designing a complex app since it solves several problems. The provider pattern uses a provider component that stores global data and distributes it to consumers or custom hooks through the application's component tree. Frameworks like MobX and React Redux also use the provider pattern, making it clear that the provider approach is not just used by React. Let's now examine the code that demonstrates how the provider pattern for React Redux is setup.\n\n```tsx\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\n\nimport App from \"./App\"\nimport store from \"./store\"\n\nconst rootElement = document.getElementById(\"root\")\nReactDOM.render(\n  <Provider store={store}>\n    <App />\n  </Provider>,\n  rootElement\n)\n```\n\nWhen it comes down to React, the provider pattern is implemented in the React context API. React is well known for supporting a unilateral downward data flow from a parent component to its children by default.\n\n### 3\\. Presentational and Container Components\n\nThe presentational and container components represent a design pattern approach that helps separate concerns and responsibilities in React applications. Presentational components focus on how a user interface looks and feels. They receive data and callbacks through props.\n\nOn the other hand, container components handle tasks like fetching data from servers, managing data changes, and managing state in React applications. They ensure that things are working well in the backend. In addition, a clear separation between presentational and container components can help identify and rectify errors, reducing the application’s downtime.\n\nCode Structure of Presentational and Container Components:\n\n```tsx\nimport React, { Component } from \"react\"\n\nimport PresentationalComponent from \"./PresentationalComponent\"\n\nclass ContainerComponent extends Component {\n  constructor(props) {\n    super(props)\n    this.state = {\n      // Initialize state\n    }\n  }\n  componentDidMount() {\n    // Fetch data or perform initialization logic\n  }\n  handleEvent = () => {\n    // Handle events and update state if needed\n  }\n  render() {\n    return (\n      <div>\n        <PresentationalComponent\n          prop1={this.state.data}\n          prop2=\"Some value\"\n          onClick={this.handleEvent}\n        />\n      </div>\n    )\n  }\n}\nexport default ContainerComponent\n```\n\n### 4\\. Conditional Rendering Pattern\n\nIn [software development](https://www.ibm.com/topics/software-development), a developer often has to display different components based on different conditions. For example, if the logged-in user is an admin, show its designation as “Admin” on the page. And if the logged-in user is a simple user, show its designation as “User.”\n\nThis is where React conditional rendering comes in.\n\nExample:\n\n```tsx\nexport default function App() {\n  let [products, setProducts] = useState([])\n  useEffect(() => {\n    // fetch a list of products from the server\n  }, [])\n  return (\n    <div className=\"App\">\n      <h1>Products</h1>\n      {products.length > 0 ? doSomething() : <p>No products</p>}\n    </div>\n  )\n}\n```\n\nIn the above code, a list of products is being fetched in the useEffect hook when the component first mounts and the list is assigned to the “products” state variable. If at least one item is in the product list, we are doing something in the code. But if there is no item in the list, we are displaying “No products”.\n\n### 5\\. Strategy Design Pattern\n\nThe strategy design pattern is a way to change some behavior dynamically from the outside without changing the base component. It defines an algorithm family, encapsulates each one, and makes them interchangeable. The strategy allows the parent component to change independently of the child that uses it. You can put the abstraction in an interface and bury the implementation details in derived classes:\n\n```tsx\nconst Strategy = ({ children }) => {\n  return <div>{children}</div>\n}\nconst ChildComp = () => {\n  return <div>ChildComp</div>\n}\n;<Strategy children={<ChildComp />} />\n```\n\nAs the open-closed principle is the dominant strategy of object-oriented design, the strategy design pattern is one way to conform to OOP principles and still achieve runtime flexibility.\n\n### 6\\. React Hooks Components\n\nThe latest version of the React 16.8 has changed and transformed how React components are written. React has introduced a set of tools known as “hooks.” These hooks empower your app’s components to address tasks like state management and fetching new information.\n\nIn React hooks components, the useState hook handles data updates, the useEffect hook reminds you about the changes, and the useContext hook shares information among different application parts. By utilizing React hooks components, your development team can adapt and integrate modern features, resulting in higher-quality applications and enhanced user experience.\n\nCode Structure of React Hooks Components:\n\n```tsx\nimport React from \"react\"\n\nimport MyHooksComponent from \"./MyHooksComponent\"\n\nconst App = () => {\n  return (\n    <div>\n      <h1>React Hooks Example</h1>\n      <MyHooksComponent />\n    </div>\n  )\n}\nexport default App\n```\n\n### 7\\. Compound Component Pattern\n\nThe compound component pattern enables your development team to create a group of components that work harmoniously for designing the app’s user interface. It is like puzzle pieces, where each component has a particular role, and when you fit them all together, you get a cohesive user interface. Here are some top React UI Component and Libraries you can consider working with.\n\nAs a result, the user-friendly interface increases user interaction time with your application. Compound component patterns can be summarized as parent and child components. The parent and child components work together to create a complete and functional application. The parent component organizes and handles the child components, and they communicate with each other to make the app perform smoothly.\n\nCode Structure of Compound Component Pattern:\n\n```tsx\nimport React from \"react\"\n\nimport CompoundComponentParent from \"./CompoundComponentParent\"\nimport { CompoundComponentA, CompoundComponentB } from \"./CompoundComponents\"\n\nconst App = () => {\n  return (\n    <CompoundComponentParent>\n      <CompoundComponentA propA=\"Value for A\" />\n      <CompoundComponentB propB=\"Value for B\" />\n    </CompoundComponentParent>\n  )\n}\nexport default App\n```\n\n### 8\\. Render Prop Pattern\n\nThe render prop pattern helps pass components as props to other components. Components supplied as props may also pass back props to the receiving components. You need to understand that render props make reusing logic across multiple components easier.\n\nLet's now demonstrate how to use the render prop pattern.\n\nFor instance, you might wish to add a temperature conversion input field that allows users to convert temperatures between Celsius, Kelvin, and Fahrenheit. The renderKelvin and renderFahrenheit render properties can be used in this situation.\n\nThese props take an input value and convert it to a corrected temperature in either K or °F.\n\n```tsx\nimport React, { useState } from \"react\"\n\nfunction Input(props) {\n  const [value, setValue] = useState(\"\")\n  return (\n    <>\n      <input value={value} onChange={(e) => setValue(e.target.value)} />\n      {props.renderKelvin({ value: value + 273.15 })}\n      {props.renderFahrenheit({ value: (value * 9) / 5 + 32 })}\n    </>\n  )\n}\n\nexport default function App() {\n  return (\n    <Input\n      renderKelvin={({ value }) => <div className=\"temp\">{value}K</div>}\n      renderFahrenheit={({ value }) => <div className=\"temp\">{value}°F</div>}\n    />\n  )\n}\n```\n\n## 5 React Design Patterns Best Practice\n\n![React Design Patterns](https://cdn.magicui.design/assets/hh6gxrwlycg.png)\n\n### 1\\. Keep Components Focused and Small\n\nKeeping components focused and small is a crucial best practice for React application development. By breaking down components into smaller, more manageable pieces, developers can benefit from enhanced code organization, reduced code duplication, and improved readability. Smaller components are easier to understand, test, and maintain. This approach also helps in making the codebase more organized and manageable.\n\n### 2\\. Utilize Hooks\n\nEmphasizing the use of Hooks in React development simplifies complex tasks such as state management and side effects. Hooks like useState, useEffect, and useContext reduce the reliance on class components, resulting in concise and clean codebases. By utilizing Hooks effectively, development teams can efficiently integrate new features while reducing technical debt. This approach significantly streamlines the process of fixing bugs in the application.\n\n### 3\\. Use a Consistent Naming Convention\n\nAdopting a consistent naming convention in React design patterns contributes to maintaining code clarity and readability. For instance, using CamelCase for variables and PascalCase for components can enhance comprehension of the codebase and improve its overall professionalism. Descriptive and relevant names for components and functions make it easier for developers to understand their intended functionality quickly, facilitating more efficient development processes.\n\n### 4\\. Test Components Thoroughly\n\nThoroughly testing components is an essential practice in [React development](https://www.sitepoint.com/react-architecture-best-practices/). By conducting comprehensive tests, developers can ensure the application operates optimally, even under heavy user loads or expansion. Testing components rigorously helps identify and resolve bugs early in the development process, contributing to a more reliable and error-free application. This practice is vital for minimizing unexpected downtimes and preventing glitches in the application.\n\n### 5\\. Use Immutable Data Structures\n\nIn React design patterns, using immutable data structures is a significant best practice. Immutable data ensures that its values cannot be directly modified once an object or array is created. Instead, developers must generate a new object or array with updated values. This approach helps prevent mutations, making the application more predictable and easier to debug. Immutable data structures maintain application reliability and predictability in React development.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### Highly Customizable Components for Ultimate Flexibility\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### MagicUI Pro: Elevating Your Web Design Game\n\nAlong with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-frameworks.mdx",
    "content": "---\ntitle: \"23 Best React Frameworks To Use In Your Project\"\ndescription: \"Improve your React project with these top React frameworks handpicked for you. Discover the best tools to enhance your development process today!\"\nimage: https://cdn.magicui.design/assets/9cfe3c12-9d71-46fd-b3fc-dd7c656d3d7d.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you facing the challenge of choosing the right React component library among the myriad of [UI Frameworks](https://magicui.design/blog/ui-frameworks) available? Feeling overwhelmed by the array of options and unsure of which one suits your project best? If so, you're not alone. Many developers encounter this common dilemma when it comes to React frameworks. This blog post will help you navigate this maze by providing valuable insights on various React component libraries. It will equip you with the knowledge to select a library perfectly tailored to your project's unique needs.\n\nTo ease your decision-making process and to help you achieve your goal of learning about the various React component libraries available and choosing a library best suited for your project, consider Magic UI's [React component library](https://magicui.design/). This tool will empower you with the necessary information to make an informed choice, sans any technical jargon, saving you time and ensuring your project's success.\n\n## **What Is React?**\n\n![React Frameworks](https://cdn.magicui.design/assets/4f07bfgusdg.png)\n\nReact.Js is an open-source Javascript library developed by Meta for creating user interfaces (UIs). It helps create reusable UI components and uses virtual DOM to improve app performance. It can be used on both client and server sides and is easily integrated with other front-end frameworks. Its component-based approach, reusability, developer tools, and performance optimization make it a great choice for developers.\n\nOne of [React's famous applications](https://react.dev/) is Instagram. Features like geolocations, Google Maps APIs, and tags that pop up without hashtags are all impressive implementations of React. Even the makers of React, Facebook, use React for their webpage, and the mobile version is made using one of its famous frameworks, React native.\n\n## **What Are React UI Frameworks?**\n\n![React Frameworks](https://cdn.magicui.design/assets/2x5r1q4k6vi.png)\n\nReact UI frameworks are libraries or collections of pre-built components that developers can use to quickly build user interfaces (UIs) for their React-based applications. These frameworks typically provide a wide range of pre-built components, such as buttons, forms, tables, and navigation menus. They also often provide design guidelines and a consistent look and feel to make it easier for developers to create visually pleasing UIs.\n\n### Related Reading\n\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **Major Features Of React**\n\n![React Frameworks](https://cdn.magicui.design/assets/gy2rjq70hqs.png)\n\nReact promotes a component-based development approach allowing developers to break down the user interface into reusable components. This approach makes it easier for developers to manage and maintain complex UIs.\n\n### Encapsulation and Reusability\n\nEach component can summarize its own logic and presentation, aligning development and promoting code reusability. The component-based architecture in React allows developers to encapsulate the functional, presentational, and logical components into reusable pieces that can be easily managed and combined to create complex UIs.\n\n### Simplicity in Creating Interactive Web Applications\n\nAnother advantage of the component-based architecture is that it offers a simple way to create interactive web applications. The component’s logic and presentation are contained within that isolated unit.\n\n### Enhanced Maintenance and Updates\n\nReact’s component-based structure makes it easier to maintain and update applications as developers can modify or patch individual components as required. As such, React enables developers to extend the functionality of their web applications by adding new components or modifying existing ones.\n\n### Scalability and Flexibility\n\nThe flexibility of the component-based architecture allows developers to modify the application’s functionality without affecting the rest of the codebase, which makes it easier to scale and maintain the application.\n\n### Promoting Code Reuse and Readability\n\nThe component-based architecture also promotes code reuse, as developers can reuse components across the codebase, saving time and effort. This structure allows web developers to build more readable, maintainable, and scalable applications.\n\n### Cost-Effective Modular Development\n\nThe component-based system of React helps developers to write modular and reusable code, which can be a cost-effective approach when developing multiple applications. This feature of React caters to enterprises that need scalable and robust web applications.\n\nThis approach to UI development can be particularly beneficial when building applications that require frequent updates or modifications. React's Component-Based Architecture makes developing complex user interfaces more manageable and efficient.\n\n### React Features: Virtual DOM\n\nReact uses a [Virtual DOM (Document Object Model)](https://www.geeksforgeeks.org/reactjs-virtual-dom/) to update the actual DOM efficiently. Instead of directly manipulating the DOM, React updates a virtual representation of it and calculates the most efficient way to apply changes. This approach results in faster rendering and a smoother user experience, as it minimizes unnecessary DOM manipulations.\n\n### Virtual DOM and React\n\nReact creates a virtual DOM tree in memory, replicating the actual DOM tree but is lightweight and faster to manipulate. When a component's state changes in React, the framework creates a new virtual DOM representation of the UI. React then calculates the difference between the previous and new virtual DOM trees, known as a diffing algorithm.\n\n### Optimizing DOM Manipulations in React\n\nReact identifies the optimal way to update the actual DOM based on the least number of manipulations required to render the change. By minimizing the number of manipulations, React ensures that only the necessary elements are updated on the actual DOM, which improves performance and creates a smoother user experience.\n\n### Efficiency with React's Virtual DOM\n\nReact’s Virtual DOM allows developers to optimize rendering on the browser by efficiently updating the actual DOM when the state of the application changes. The Virtual DOM feature of React contributes to its efficiency in rendering user interfaces.\n\n### Virtual DOM in React Performance\n\nThe Virtual DOM is a crucial part of React’s performance optimization strategy. By using a lightweight, in-memory representation of the DOM, React minimizes the number of updates needed when changes occur in the application, ensuring a smooth and responsive user experience. This feature makes React an attractive choice for building web applications that require dynamic and interactive user interfaces. React’s Virtual DOM is a key factor in its popularity among developers, contributing to the framework’s speed, efficiency, and overall performance.\n\n### React Features: Large Ecosystem\n\nReact has a vast and vibrant ecosystem of libraries, tools, and extensions. This ecosystem includes popular state management solutions like Redux, routing libraries, and various UI component libraries.\n\n### A Valuable Resource\n\nReact's popularity has led to a massive yet valuable source of resources and a supportive community. It ultimately makes it easier for developers to hop on effective solutions and answers to their web development challenges. The large ecosystem around React is a testament to its widespread adoption and versatility as a web development framework.\n\n### Extending React's Functionality with Libraries\n\nReact’s large ecosystem provides developers with a wide range of tools and libraries that extend the framework’s functionality and simplify development tasks. The vast ecosystem around React ensures developers have access to robust resources, making it easier to solve problems and build high-quality web applications.\n\n### Supportive Community and Resources in React\n\nReact’s ecosystem includes libraries and tools for everything from state management to routing, making it suitable for various projects. The large ecosystem around React also fosters a supportive community of developers who can share knowledge, resources, and best practices. This network of developers contributes to the framework’s longevity and popularity, making it a dependable choice for web development projects.\n\n### Diverse Solutions in React's Ecosystem\n\nThe large ecosystem around React includes libraries, tools, and extensions that extend the framework’s functionality and cater to various development needs. React’s popularity has led to creating a diverse range of resources and solutions that can help developers build robust, scalable, and high-performing web applications.\n\n### Tools for Efficient Web Development with React\n\nThe vast ecosystem around React ensures developers have access to the tools they need to create efficient and user-friendly web applications. The large ecosystem around React includes popular state management solutions like Redux, routing libraries, and various UI component libraries. These resources provide developers with the tools to create dynamic and engaging web applications.\n\n### Leveraging React's Ecosystem for Development\n\nThe large ecosystem around React contributes to the framework’s popularity and appeal among developers, making it a versatile and reliable choice for web development projects. By leveraging the ecosystem around React, developers can tap into a wealth of resources and expertise to help them build high-quality web applications efficiently. Ultimately, the large ecosystem around React simplifies web development tasks and makes it easier for developers to create scalable and performant web applications.\n\n### Empowering Design Engineers with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **Benefits Of Using A React Framework**\n\n![React Frameworks](https://cdn.magicui.design/assets/aekhydz92mw.png)\n\n### Improved User Experience\n\nReact allows developers to build highly interactive and responsive user interfaces, resulting in a smoother and more engaging user experience. The virtual DOM efficiently updates and renders only the changed components, reducing load times and improving performance.\n\n### Reusable Components\n\nReact promotes a modular approach with reusable components, self-contained modules that can be used across different parts of an application. Reusable components save development time, improve maintainability, and make adding new features or fixing bugs easier.\n\n### Efficient Development Process\n\nReact provides a rich set of tools and libraries that facilitate the development process, such as React Developer Tools, Redux, and React Router. Its simple and intuitive syntax makes it easy to learn and use, especially for developers familiar with JavaScript.\n\n### Performance Optimization\n\nReact utilizes a virtual DOM and a diffing algorithm to efficiently update and render only the necessary parts of the UI, resulting in faster rendering and improved overall performance.\n\n### SEO Friendliness\n\nReact applications can be made SEO-friendly by rendering on the server-side and returning static HTML, which search engines can easily crawl and index.\n\n### Flexibility and Integration\n\nReact seamlessly integrates with other [technologies and frameworks](https://hackernoon.com/why-is-react-the-best-front-end-framework-to-learn-in-2024), making it a versatile choice for web development. It can be used with popular libraries like Axios for API requests or UI frameworks like Bootstrap for styling components.\n\n## **23 Best React Frameworks To Use In Your Project**\n\n![React Frameworks](https://cdn.magicui.design/assets/9za6lpqayuq.png)\n\n### 1\\. Magic UI\n\nMagic UI is a free and open-source [React component library](https://magicui.design/) designed for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI provides visually appealing and interactive elements that can be easily integrated into web applications, allowing designers to create stunning user interfaces with minimal effort.\n\nThe highly customizable components enable seamless adaptation to match desired branding and design requirements. With a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Features of Magic UI\n\n- Highly customizable components that can adapt to desired branding and design requirements.\n- Over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n- Visually appealing and interactive elements that can be easily integrated into web applications.\n- Seamless animation and design-centric approach that bridges the gap between design and development.\n- Free and open-source React component library designed specifically for design engineers.\n\n### 2\\. Material UI\n\nMaterial UI is a React component library that implements Google's Material Design. It provides a comprehensive collection of pre-built components ready for use in production right out of the box.\n\n### Features\n\n- Pre-built components: A comprehensive collection of components, including buttons, forms, tables, charts, and more.\n- Accessibility: A focus on accessibility, ensuring that all components meet the highest standards for usability.\n- Customizability: A suite of customization options that make it easy to implement your own custom design system.\n- Theme support: Support for theming, allowing you to change the look and feel of your entire application easily.\n- Strong community: A large and active community of users and contributors.\n\n### 3\\. Next.js\n\nNext.js is a React.js framework developed by Vercel. It has unique features as compared to other frameworks like server-side rendering and enhanced search engine optimization. It provides a built-in routing feature giving it an edge over React. Prior knowledge of HTML, CS, JS and React is required before learning Next.js.\n\n### Features\n\n- Hot Code Reloading: As soon as any changes are saved in your code, they will reflect in your user interface automatically.\n- Server Rendering: The next.js rendering feature enables you to render react components to the server side first before sending it to the HTML client which helps enhance SEO.\n- Automatic Routing: For any project the files in the page directory are automatically mapped and do not require additional coding for routing.\n- Prefetching: The link component used to link various pages together supports prefetching of the resources in the background.\n\n### 4\\. Ant Design\n\nAnt Design is a React component library that implements Ant UMD, a design system for enterprise applications. It provides a comprehensive collection of pre-built components that are ready for use in production right out of the box.\n\n### Features\n\n- Enterprise-level components: Ant Design provides a wide range of enterprise-level components, such as data tables, form layouts, and organization charts.\n- Professional look: Ant Design's design system is more heavily influenced by Chinese design principles, resulting in a more elegant and professional look and feel.\n- Out-of-the-box features: Ant Design offers several out-of-the-box features that are not available in Material UI, such as internationalization support and type safety.\n- Customizability: Customizable options that simplify the implementation of your custom design system.\n\n### 5\\. Semantic UI React\n\nSemantic UI React is a React component library that implements the Semantic UI CSS framework. It provides a comprehensive collection of pre-built components ready for use in production right out-of-the-box.\n\n### Features\n\n- Semantic HTML: Semantic UI React is built around semantic HTML, which means that the components are named and structured in a way that makes it easy to understand their purpose.\n- Accessibility: Semantic UI React is committed to accessibility, and its components are designed to meet the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG21/) standards.\n- Theming: Semantic UI React provides built-in theming support, so you can easily customize the look and feel of your application.\n- Extensibility: Semantic UI React is extensible, so you can easily create your custom components and themes.\n\n### 6\\. MobX\n\nMobX is a simple and scalable state management library for React applications. It provides a straightforward way to manage the application state, making keeping data in sync with the UI easier and ensuring smooth reactivity.\n\nMobX is a versatile choice for developers who want to efficiently manage the state of their React applications, especially for projects with complex data flows and interactions.\n\n### Features\n\n- Observable state\n- Derived values\n- Reactions\n- Easy debugging\n- Middleware support\n\n### 7\\. Reass\n\nRebass is a React component library that simplifies building responsive and consistent user interfaces. Focusing on design procedure principles and minimalism, Rebass provides a set of highly customizable and themeable UI components. It's an excellent choice for easily creating aesthetically pleasing and user-friendly React applications.\n\n### Features\n\n- Functional React UI components\n- Theming support\n- Minimalistic\n- Extendable\n- Highly composable\n\n### 8\\. React Admin\n\nReact Admin is a framework developed for building admin interfaces and dashboards. It helps streamline the overall procedure of developing data-heavy applications, offering features like CRUD operations, and data handling.\n\nReact Admin is an invaluable tool for developers working on applications requiring robust data and user management functionalities.\n\n### Features\n\n- Easy CRUD operations\n- Pluggable architecture\n- Data validation\n- Internationalization\n- Customizable UI\n\n### 9\\. Material Tailwind - React\n\nMaterial Tailwind is a popular design system and component library. Combined with React, this library becomes a powerful tool for creating stunning and responsive web applications.\n\nThis library seamlessly merges the Material Design aesthetic with the utility-first approach of Tailwind CSS. It provides a wide array of pre-designed components, UI elements, and styles that help developers build modern and visually appealing interfaces with ease. Material Tailwind for React is a practical addition to the toolkit of developers who aim to deliver user-friendly and aesthetically pleasing web applications while leveraging the efficiency of the Tailwind CSS utility classes.\n\n### Features\n\n- Tailwind CSS with Material Design\n- Prebuilt components\n- Easy customization\n- Responsiveness built-in\n- Dark mode support\n\n### 10\\. Grommet\n\nGrommet is another React UI component library known for its accessibility and simplicity. It provides a set of ready-to-use components designed to focus on responsiveness and accessibility. This Grommet library has distinguished itself for Javascript developers who prioritize creating user-friendly web applications that adhere to accessibility standards.\n\n### Features\n\n- Accessibility-first components\n- Themable\n- Responsive design\n- Dark mode\n- Server-side rendering\n\n### 11\\. Material Kit React\n\nWhen discussing the best UI framework for React, one cannot overlook Material Kit. Inspired by Google’s Material Design, Material Kit builds a group of elements that make consistency the primary feature. This feature lets you maintain a similar appearance and functions throughout your project. The layout is like multiple sheets of paper, giving it depth and order.\n\n### Features\n\n- Grants access to the theme values from the component props\n- Open source, extremely fast, and high-quality\n- Less than KB gzipped\n- Developer-first product with a solid community\n- Supports several variables\n- Good UI consistency with an effortless and responsive layout\n- Follows code standards\n- MIT license\n\n### 12\\. Storybook\n\nAnother special mention on our React JS framework list is Storybook. Storybook has been popular among developers for a long time now. It is not a component library itself. It is more like an open-source tool for building UI components in isolation for React and several other platforms and technologies.\n\nWhat’s unique about Storybook? It enables you to work on a single component at a given time, making the development process much faster.\n\n### Features\n\n- Fast UI development\n- Easy and smooth integration with React apps\n- Comes with builtin TypeScript support\n- Default webpack configuration\n- Efficient development process\n- High compatibility with most front-end frameworks\n- CSS support\n- Hot module reloading\n- Deployment of a whole storybook as a static app\n- Isolated environment for components\n- Clean and efficient UI\n\n### 13\\. React Bootstrap\n\nNext on the list of best React UI frameworks is React Bootstrap, one of the oldest React UI libraries. If you are looking for a front-end React UI framework, you can definitely pick React Bootstrap.\n\nThis UI kit holds on to its Bootstrap core but switches Bootstrap’s JavaScript with React. This switch gives you more control over the function as well as the form of every component. Every component is accessible, important for building front-end frameworks.\n\n### Features\n\n- Supports NPM and SAAS\n- Used as Prop API\n- Offers CSS Support\n\n### 14\\. Blueprint\n\nBlueprint is a React-based UI toolkit that includes meticulously designed components for building elegant and responsive web applications. This toolkit focuses on simplicity, functionality, and a united design language.\n\nBlueprint's components cover a wide range of UI elements, from buttons and forms to data visualizations, ultimately making it a valuable resource for developers aiming to create polished and professional web applications.\n\n### Features\n\n- Designed for desktop\n- Customizable\n- Rich component library\n- Theming\n- TypeScript support\n\n### 15\\. Gatsby\n\nGatsby is a UI framework for React used to create static web applications. It is built on top of React.js and Node.js, so knowledge of HTML, CSS, React, and Node is required. Gatsby helps develop fast-loading and high-performance static web applications that can render data from multiple sources. It has a great data plugin ecosystem and allows users to fetch data directly into a Gatsby application using GraphQL.\n\n### Features\n\n- Fast Load\n- Automatic Routing\n- Data Combining from various data sources\n- Higher performance by code splitting, inlining critical assets and smart preloading.\n\n### 16\\. React DnD\n\nReact DnD, short for React Drag-and-Drop, is a powerful library for adding drag-and-drop functionality to React applications.\n\nReact applications that involve reordering items, managing file uploads, or creating interactive user interfaces - find this library very helpful in simplifying the complexity of drag-and-drop interactions. React DnD offers both flexibility and ease of use in managing drag-and-drop operations.\n\n### Features\n\n- Drag-and-drop\n- Extensible backends\n- Flexible rendering\n- Multi-backend support\n- Debugging utilities\n\n### 17\\. Styled Components\n\nStyled Components is another library that allows developers to write CSS within their JavaScript components. It promotes component-level styling, improving code maintainability and reducing the risk of styling conflicts.\n\nWith Styled Components, the developer can create dynamic and responsive designs while keeping the styles organized within the React components.\n\n### Features\n\n- Dynamic styling\n- Theming support\n- Server-side rendering\n- CSS-in-JS\n- Native support\n\n### 18\\. React Fabric\n\nReact Fabric is a set of responsive and accessible UI components for building web applications. Developed by Microsoft, it adheres to the Fluent Design System, ensuring a consistent and visually appealing user experience.\n\nReact Fabric components are specifically designed to work well with various web platforms and browsers, making them a solid choice for creating web applications with a polished and modern look.\n\n### Features\n\n- Office UI components\n- Accessibility support\n- TypeScript support\n- Regular updates\n\n### 19\\. React Toolbox\n\nReact Toolbox is a React UI components library. This library can implement Google’s Material Design principles in projects. React Toolbox uses CSS modules for this implementation. Although you can utilize any module bundler, React Toolbox integrates seamlessly with Webpack workflow. Moreover, the React Toolbox team provides an in-browser editor where developers can play with components in real time.\n\n### Features\n\n- Supports responsive design\n- High-quality and well-tested components\n- Modular architecture\n- Provides a set of components that are pre-built and customizable\n\n### 20\\. React Router\n\nReact Router is a popular compact library for React. It allows developers to build single-page applications with dynamic, client-side routing. React Router is designed to work seamlessly with React, and it allows developers to declaratively define the routes of their applications using JSX. This makes creating complex and hierarchical navigational structures within a single-page application easy.\n\n### Features\n\n- Uses windowing to render a small portion of a large data set\n- Provides flexible API\n- Supports responsive design\n- Virtualization allows it to only render elements that are on the screen\n\n### 21\\. Chakra UI\n\nNext on our React JS framework list is Chakra, a React component library that requires less time to write code. The Chakra UI enables faster development and offers accessible, modular, and flexible UI components for building applications.\n\nChakra UI enables React developers to create newer components efficiently. Chakra UI's components are customizable, reusable, and adhere to the WAI-ARIA standards.\n\n### Features\n\n- Offers accessibility for users with disabilities\n- A comprehensive set of reusable components\n- Light / Dark mode support\n- Uses CSS-in-JS\n\n### 22\\. React Virtualized\n\nIt’s time to get introduced to one of the most powerful React libraries! React Virtualized renders the large lists and tabular data in React applications. It employs techniques like windowing and virtualization to optimize performance when dealing with extensive data sets.\n\nThe React Virtualized library is especially valuable for developers working on projects that display extensive tables or lists, where rendering efficiency is critical.\n\n### Features\n\n- Large lists and tabular data\n- Performance optimizations\n- Windowing\n- Flexible styles\n- Scroll syncing\n\n### 23\\. React-Motion\n\nReact-Motion is a library for creating smooth and interactive animations in React applications. It offers physics-based animations enabling developers to bring life to their web interfaces.\n\nWith React-Motion, you can achieve fluid, interactive animations that enhance the user experience, making it a valuable tool for projects that require engaging visual effects.\n\n### Features\n\n- Spring-based animations\n- Configurable\n- Interpolations\n- Optimized performance\n- Animation stacking\n\n## **How To Choose A React Library For Your Project**\n\n![React Frameworks](https://cdn.magicui.design/assets/7jfblbvanou.png)\n\nWhen choosing a React framework, evaluating the project's needs thoroughly is essential. Consider the components and features required for your specific project. Large-scale projects may need a more comprehensive library with a wide range of components, whereas smaller projects may not require as many features. It is crucial to consider the scale and type of your project when selecting a React component framework. Consider any specific requirements that your project may have. For instance, if your project heavily relies on data visualization, you may need a framework that provides robust chart components.\n\n### Longevity\n\nSelecting a React framework with a good track record of active maintenance and regular updates is crucial for the longevity of your project. Choosing a frequently updated library ensures that you will not have to migrate to a new library in the future. It also means you are more likely to receive ongoing support and bug fixes for the library. By selecting a React library that is continually updated, you can rest assured that your project will remain up-to-date and secure.\n\n### Learning Curve\n\nConsidering the learning curve of a React framework is crucial, particularly for teams with varying levels of experience. Opt for a library with an intuitive, user-friendly interface and easy-to-understand documentation. A library with well-structured and clear documentation makes it simpler for new developers to learn and use the library efficiently. It also helps developers quickly familiarize themselves with the library's features and components, speeding up the development process.\n\n### Customizability\n\nWhen choosing a React framework, customizability is a significant factor to consider. Select a library that allows for easy customization to ensure that it can align with your brand's design guidelines. Some React libraries offer more extensive customization options than others, so choosing a library that meets your specific design requirements is essential. Customizability enables you to adapt the library to fit the unique design needs of your project, creating a more cohesive user experience.\n\n### Add Magic UI\n\nAll React libraries are slightly different and have unique offerings. To maximize the benefits of using any React component framework, you need to add Magic UI. Magic UI complements the effectiveness of your chosen React framework by providing additional features and components that enhance the user experience. By incorporating Magic UI into your project, you can take advantage of additional functionalities that may not be available in your primary React library. This integration helps you create more dynamic and visually appealing user interfaces that align with your project's design and functionality requirements.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-header.mdx",
    "content": "---\ntitle: \"A Step-By-Step Guide To Creating A Reusable React Header Component\"\ndescription: \"Learn how to create a reusable React header component with our step-by-step guide. Enhance your development process with a versatile design.\"\nimage: https://cdn.magicui.design/assets/4o5a2ht4m1.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nDo you need help to create or customize headers in React JS for your [landing page examples](https://magicui.design/blog/landing-page-examples)? React headers are crucial for user engagement and conversion rates. This blog provides actionable insights to enhance your React header skills and design captivating headers that resonate with your target audience.\n\nMagic UI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup) offers an effective solution for creating or customizing React headers. This tool simplifies the process and helps you design impactful headers efficiently.\n\n## What Is a Website Header?\n\n![React Header](https://cdn.magicui.design/assets/u3o5ba1pd5.jpg)\n\nThe [website header](https://www.wordstream.com/blog/ws/2022/04/27/website-header-examples) is the top portion of a website where the logo, navigation, and sometimes other information, links, and buttons are located. Research shows that [55% of website visitors](https://www.linkedin.com/pulse/why-55-visitors-spend-less-than-15-sec-your-website-vladimir-nagin#:~:text=Visitors%20don't%20always%20read%20what%20they%20click%20on&text=Chartbeat%20studied%20the%20behavior%20of,seconds%20actively%20on%20a%20website.) only stay about 15 seconds on a website before leaving. Considering that your website header is the first section of your webpage that visitors will see, it needs to be great.\n\nYour website header should:\n\n- Reflect your brand\n- Communicate what you offer\n- Be eye-catching enough to grab your audience’s attention\n- Convince them to keep scrolling\n\nIt should also check these boxes with as little time and as little copy as possible. Depending on the page for which you’re designing a header, you must tailor the creative, messaging, and CTA.\n\n### Primary Functions of the Website Header\n\nWebsite headers have three primary functions:\n\n- Information: It should let your visitor know what your brand does.\n- Navigation: It should help direct your visitors to other pages.\n- Visual appeal: It should be interesting and attractive enough to attract your visitor.\n\n### Key Elements in Website Header Design\n\nLike a store entryway, your header should set the tone for your website and give visitors a sense of your brand.\n\nWebsite header designs usually have all, or most, of the following elements:\n\n- Business name\n- Logo or brand identifier\n- Call to action\n- Text or headline\n- Navigational elements\n- Search\n- Shopping cart\n- Log in\n- Social media links\n- Languages\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## What Is a Header Component?\n\n![React Header](https://cdn.magicui.design/assets/xykhl2ph81l.jpg)\n\nComponents are the building blocks of the user interface in a React project. Regarding web development with React, you have to think about components. React is primarily a library for:\n\n- Creating user interfaces\n- Focusing on components as the fundamental elements of the UI.\n\nYour website might consist of various components, such as:\n\n- Header\n- Logo\n- NavBar\n- NavLink\n- Content\n- Card\n- Footer and more\n\nEach essential element of your website corresponds to a separate component, with each component having its file. These files follow a specific naming convention, mirroring the components they encapsulate. For instance, you would have files such as:\n\n- App.js\n- Header.js\n- Logo.js, and so on\n\n### Component Structure and Reusability\n\nComponents can be nested within one another, with one component serving as the child of another. In this setup, rendering the parent component would display the child component. Components can be reused across your website.\n\nInstead of creating a new NavLink component for each link or a new Card component for each instance, you can consistently reuse existing components throughout your project.\n\n### MagicUI: The Ultimate UI Library for Design Engineers\n\n- Free and open-source UI library\n- Designed specifically for design engineers\n- Offers a collection of over 20 animated components\n- Created with React, TypeScript, Tailwind CSS, and Framer Motion\n- Focus on animation and a design-centric approach\n- Bridges the gap between design and development\n- Enables the creation of captivating digital experiences\n\nWith [MagicUI Pro](https://pro.magicui.design/), you can save significant time and create stunning landing pages that easily convert visitors into customers. Use our startup landing page template today to enhance your web presence ([https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup)).\n\n## Planning Your React Header\n\n![React Header](https://cdn.magicui.design/assets/7zpnynvv43v.jpg)\n\nDefining its purpose and functionality is crucial before you start building your React header. Ask yourself: What key elements should your header include? Standard components include:\n\n- Logo\n- Navigation links\n- Search bar\n- User account options\n\nThe header sets the tone for your site and provides essential navigation.\n\n### Consider User Experience and Navigation\n\nThink about how users will interact with your header. Navigation should be intuitive and straightforward, ensuring users can easily find what they want. Prioritize accessibility and responsive design so your header works seamlessly across all devices. A well-planned header enhances the overall user experience and makes your site more user-friendly.\n\n### Why a Header Hero Image Matters in Website Design\n\nIf the website header is an entryway, your hero image is like the signage out front. This large banner-like image gives website visitors a taste of what you offer and provides that all-important visual appeal that can help people stay on your website. One study found that roughly 80% of website visitors focus most of their attention above the fold.\n\n#### Key Considerations in Crafting an Effective Hero Image\n\n- Choose a picture, graphic, video, or animation for your hero image.\n- Ensure the hero image conveys key information about the business.\n- Aim for direct communication through the hero image.\n\n#### Hero Images: The First Impression\n\nFor example, a food delivery service might choose a hero image depicting a courier with a mouthwatering food container. A fitness tracking app might use a quick animation of its interface and features. There’s lots of room for creativity when designing a hero image, but the visual’s primary purpose should be to encourage visitors to learn more about your business.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Setting Up Your React Project\n\n![React Header](https://cdn.magicui.design/assets/fwx7iydja18.jpg)\n\nYou must first set up your React project to create your React header component. If you haven't done so already, follow these steps to get started:\n\n### 1\\. Initialize Your Project\n\nOpen your terminal and run npx create-react-app my-app to create a new React project named \"my-app.\" Then, navigate to your project directory with cd my-app.\n\n### 2\\. Installing Necessary Dependencies\n\nYou'll need to install React Router for routing. This will help you understand the different pages in your React app. Run npm install react-router-dom to install React Router.\n\n### 3\\. Install Styled-Components for Styling\n\nTo style your React components, you'll want to use styled components. This library allows you to write CSS directly into your JavaScript files, making it easier to manage your styling. Install styled components by running npm install styled-components.\n\nCompleting these steps will set up your React project and prepare it for creating your header component. You can then start building out your header with React components and styling it using styled-components.\n\n## Creating The React Header Component File\n\n![React Header](https://cdn.magicui.design/assets/m0jicvt9tqp.jpg)\n\nTo create a header component in React, you must first define its structure. The code snippet provided comprises a logo and a navigation menu. The header is styled using a CSS file imported into the component.\n\n### JSX Syntax Used in the Header Component\n\n#### JSX (JavaScript XML)\n\nJSX allows developers to write HTML-like code within JavaScript. In the example, the header, logo, and navigation are all defined using JSX syntax.\n\n#### `<Link>` Component from react-router-dom\n\nThe `<Link>` component enables client-side navigation without refreshing the page. It is used for routing within the React application.\n\n#### Conditional Rendering\n\nThe example demonstrates conditional rendering based on the user's authentication status. This ensures that the header dynamically displays either a sign-in link or a sign-out button.\n\n### Adding Navigation Links\n\nYou must set up a React Router to enable navigation within a React application. This involves installing the react-router-dom package and wrapping the main application component with BrowserRouter to enable client-side routing.\n\nIn the header component, navigation links are added using the `<Link>` component. This allows users to move between different parts of the application seamlessly.\n\n### Incorporating User Authentication Features\n\nUser authentication features are added in the header component by conditionally rendering sign-in and sign-out options. When the user is authenticated, a 'Sign Out' button is displayed, and a 'Sign In' link is shown when not logged in.\n\nUser information, such as the username, can also be displayed to personalize the user experience.\n\n### Styling the Header\n\nStyling the header component can be done using traditional:\n\n- CSS files\n- CSS modules\n- Library-specific solutions like Styled-Components\n\nIn the provided CSS example, the header is styled to have a distinct appearance with a specific\n\nstyles for the:\n\n- Logo\n- Navigation menu\n- Links\n- Buttons\n\n### Building a Versatile React Header Component\n\nBy following these steps, you can create a functional and visually appealing header component in React. The component enhances user experience and provides essential navigation, branding, and user authentication features for your application. Feel free to customize the appearance to match your design preferences and application requirements.\n\n## Making the Header Responsive\n\n![React Header](https://cdn.magicui.design/assets/o8jao10u17.jpg)\n\n### Use Flexbox for Layout\n\nFlexbox is a remarkable CSS layout module that enables you to design responsive layouts effortlessly. You can efficiently control their alignment and spacing by applying flex properties to your header elements. For instance, you can effectively organize your header components by setting the display property to flex and adjusting the justify-content and align-items properties accordingly.\n\n### Media Queries\n\nMedia queries are vital for applying distinct styles based on the screen size. By incorporating media queries into your React header, you can stack navigation links vertically on smaller screens or modify the layout of your header depending on the device's screen size. This adaptability ensures a seamless user experience across a multitude of devices.\n\n### Implementing a Mobile Menu\n\nFor smaller screens, consider implementing a mobile menu that can be toggled. By utilizing state management in React to show or hide the menu, you can enhance the user experience. Toggling the mobile menu ensures your navigation remains accessible and user-friendly on various devices.\n\n### Styling the Mobile Menu\n\nStyling the mobile menu to be hidden by default and displayed as a block when toggled is crucial for optimizing user interaction. Hiding the menu by default and showing it when toggled ensures that users can easily navigate your website on mobile devices, providing a smooth and intuitive user experience.\n\n### Use CSS Grid (Optional)\n\nConsider incorporating CSS Grid for more intricate layouts that require additional customization. CSS Grid works smoothly with Flexbox, allowing you to create more complex header designs easily. Combining these two layout techniques allows you to craft a responsive React header that meets your design requirements.\n\n### Crafting Exceptional React Headers\n\nBy incorporating these strategies and techniques, you can create a stunning and responsive React header that elevates your website's user experience. Whether aiming for a simple and clean design or a more intricate layout, implementing these best practices will ensure that your React header seamlessly adapts to various devices and screen sizes.\n\n## Best Practices and Tips for Creating a React Header Design That Performs\n\n![React Header](https://cdn.magicui.design/assets/q8f9ghj7ol.jpg)\n\n### Keep Your Overall Purpose in Mind\n\nWhen designing a React header, it's crucial to consider the overall purpose of your website. This will help guide visitors to your desired destination and provide quick access to essential information. By understanding what you want to achieve with your website, you can ensure that your header plays a significant role in driving user behavior and engagement.\n\n### Include a Clear Call to Action\n\nA [clear call to action (CTA)](https://www.investopedia.com/terms/c/call-action-cta.asp) is critical in a React header design. Visitors should know precisely what will happen when clicking a CTA button. Simple CTAs like \"Sign up for free\" or \"Get started for free\" are more effective than clever or ambiguous options. By clarifying your CTAs, you can guide visitors toward taking the desired actions on your website.\n\n### Don’t Overload Your Website Header Design\n\nA cluttered website header can overwhelm visitors and make it challenging for them to navigate your site. Your header should provide essential information that helps visitors quickly grasp what your website offers. Avoid using too much text or visual elements that distract users from making informed decisions about your offering.\n\n### Use Clear, Readable Fonts\n\nWhen selecting your React header design fonts, opt for clear and legible options. While trendy fonts can be appealing, they may hinder readability and make it difficult for visitors to understand your message. Your header copy should guide visitors effectively, which is only possible if they can read it without issues.\n\n### Make It Move\n\nLeveraging animations in your website design can make your React header and overall user experience more engaging and memorable. Whether showcasing a product or service, animations can capture attention and help illustrate your offerings effectively. With Magic UI's animated React component library, you can incorporate animations seamlessly to enhance the visual appeal of your website.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library tailored for design engineers. It provides them with various visually appealing and interactive elements that can be easily integrated into web applications. With MagicUI, design engineers can create stunning user interfaces with minimal effort.\n\n### Features\n\n- Over 20 animated components were built using React, TypeScript, Tailwind CSS, and Framer Motion.\n- Ensures a smooth and dynamic user experience.\n- Highly customizable components for specific branding and design needs.\n\n### Enhancements\n\n- Offers website templates for quick and efficient creation of landing pages.\n- Saves time and effort in designing captivating digital experiences.\n- Helps businesses convert visitors into customers.\n\n### Boost Your Online Presence With MagicUI Pro\n\nThe startup landing page template provided by [MagicUI Pro](https://pro.magicui.design/) offers a quick start for companies looking to establish a solid online presence and make a lasting impression on their audience.\n\nReady to dive into the world of MagicUI and transform your landing page design? Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/react-hero-component.mdx",
    "content": "---\ntitle: \"Styling the React Hero Component with CSS and Sass\"\ndescription: \"Craft stunning landing pages fast with our pre-built React Hero component. Easily customize and style with CSS/Sass. Get started now!\"\nimage: https://cdn.magicui.design/assets/4164e675-3b4a-4190-8bfd-c4ec87e691a6.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nCreating a landing page can feel like a daunting task. You have to organize a ton of information, prioritize some aspects over others, and optimally style the page to achieve your conversion goals. With so much to do, it’s easy to overlook individual components, such as the hero section. The hero section is crucial for grabbing users’ attention and spearheading their journey through your landing page. This is especially true for React [landing page examples,](https://magicui.design/blog/landing-page-examples) which help you quickly build interactive and engaging web applications. Here, we’ll focus on the hero component and how you can style it with CSS and Sass.\n\nMagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) has a ready-to-use React hero component to help you get started. It’s packed with sample content to illustrate the structure, so you can quickly customize it to fit your needs and create a stunning landing page.\n\n## Overview of the React Hero Component\n\n![React Hero Component](https://cdn.magicui.design/assets/4jqb2q54mv9.jpg)\n\nIn a React application, a Hero Component is a visually prominent section at the top of a webpage. It is designed to be the first thing users see when they land on the site, often including:\n\n- Large image or video\n- Headline\n- Subheadline\n- Call-to-action (CTA) button\n\nIts primary purpose is to:\n\n- Grab attention\n- Convey a key message\n- Guide users toward necessary actions\n\n### Significance of the Hero Component \n\n#### First Impressions\n\nIt creates an immediate impact by being the first visual element users encounter, setting the tone for the website.\n\n#### Brand Messaging\n\nIt effectively communicates the brand or product's core message or value proposition.\n\n#### User Engagement\n\n[Engages users](https://amplitude.com/glossary/terms/user-engagement) by incorporating interactive elements like CTA buttons, encouraging them to take actions such as signing up or making a purchase.\n\n#### Visual Appeal\n\nEnhances the overall user experience by visually appealing design elements to capture interest.\n\n#### Navigation\n\nGuides users towards necessary actions, improving site usability and conversion rates.\n\n### Popular Websites Utilizing Hero Components\n\n#### Dropbox\n\nUses a simple and clean Hero Component with a headline, brief description, and a CTA button for user sign-up or login.\n\n#### Airbnb\n\nFeatures high-quality images of destinations with a search bar and CTA, driving users to start their booking process.\n\n#### Slack\n\nIt employs vibrant visuals and a strong headline, including a [CTA button](https://www.hotjar.com/conversion-rate-optimization/glossary/call-to-action/) to try the product or learn more.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Importance of Styling in User Experience\n\n![React Hero Component](https://cdn.magicui.design/assets/msjsttayo2h.jpg)\n\n### Visual Appeal and User Perception\n\nThe visual appeal of a Hero Component plays a [critical role](https://www.michellepontvert.com/blog/what-hero-section#:~:text=The%20hero%20component%20of%20a%20website%20is%20typically%20a%20large,value%20proposition%20of%20the%20website.) in shaping user perception and interaction. A well-designed Hero Component engages users immediately with:\n\n- High-quality visuals\n- Compelling text\n\nIt reflects the brand’s professionalism, which helps build trust with users. The site is also easier to navigate with clear and [intuitive design elements](https://www.concordia.ca/web/design/components/hero.html).\n\n### Studies and Surveys\n\n- _Adobe Study:_ Indicates that [38% of users](https://www.linkedin.com/pulse/15-essential-web-design-statistics-every-business-owner#:~:text=38%25%20of%20users%20will%20stop,an%20aesthetically%20pleasing%20website%20design.) will only engage with a website if the content or layout is attractive.\n- _HubSpot Report:_ Personalized and aesthetically pleasing Hero Components can boost [conversion rates by up to 202%](https://blog.hubspot.com/marketing/personalized-calls-to-action-convert-better-data).\n\n## Understanding the Basics of CSS and Sass\n\n![React Hero Component](https://cdn.magicui.design/assets/cf2zmuc0irh.jpg)\n\n### CSS Overview\n\nCascading Style Sheets CSS styles web pages by controlling the:\n\n- Layout\n- Colors\n- Typography\n- Other visual aspects\n\n#### Css Helps In Layout\n\nManaging how elements are positioned and sized.\n\n_Colors:_ Defining text, background, and border colors.\n\n#### Typography\n\nHandling font styles, sizes, and text alignment.\n\n_Visual Effects:_ Applying shadows, gradients, and transitions to enhance the design.\n\n### Sass Overview\n\nSyntactically Awesome Style Sheets Sass extends CSS with additional features:\n\n#### Variables\n\nAllows the use of reusable variables for consistent styling.\n\n- _Example:_ $primary-color: #3498db;\n- _Nesting:_ Enables the nesting of selectors to improve readability and organization.\n- _Example:_ scss Copy code `.hero { .title { font-size: 2rem; } }`\n- _Mixins:_ Facilitates the reuse of common styles across different elements.\n- _Example:_ scss Copy code `@mixin button-style($color) { background-color: $color; border: none; padding: 10px; }`\n- _Functions:_ Allows dynamic styling through calculations and manipulations.\n- _Example:_ scss Copy code `@function calculate-spacing($base, $multiplier) { @return $base \\* $multiplier; }`\n\n## Key Differences Between CSS and Sass\n\n![React Hero Component](https://cdn.magicui.design/assets/4a29uvxf5k8.jpg)\n\n### CSS vs. Sass: What’s the Difference?\n\nDevelopers can use either CSS or Sass when styling a website. Sass (Syntactically Awesome Style Sheets) is a CSS preprocessor that adds functionality to standard CSS. When developers write code in Sass, they write code in a language that resembles CSS before compiling it into standard CSS. This approach offers users many benefits, especially with large style sheets.\n\n### Sass Is a CSS Extension\n\nSass is a superset of CSS that adds functionality to standard CSS. This means that all the code valid in CSS is also valid in Sass. Developers can start a project using Sass right away without any conversion. As they build styles for their project, they can compile the Sass into CSS for the browser to read.\n\n### Sass Syntax Is Cleaner\n\nWhile CSS and Sass have similar structures, Sass's syntax is much cleaner. There’s no need for repetitive code in Sass, which makes the structure much more readable. Developers can use nesting, mixins, and variables to reduce redundancy in their styles.\n\n### Sass Includes Variables for Consistency\n\nSass supports [variables for colors](https://blog.logrocket.com/ux-design/what-is-website-hero-section/), fonts, or any CSS value that can be reused throughout a style sheet. While CSS also supports custom properties, Sass variables are much more powerful. Sass variables can be updated throughout the document, while CSS custom properties can only be updated with JavaScript.\n\n### Sass Allows Nesting of Selectors\n\nCSS allows developers to nest selectors to reduce redundancy and make the code more readable. This feature helps organize styles, visually showing the relationship between parent and child elements. In contrast, CSS does not support nesting, so developers must write out every class independently.\n\n### Sass Mixins Reduce Repetitive Code\n\nSass mixins allow developers to create reusable styling blocks. When working on a project, developers can define a group of CSS properties within a mixin and call that mixin wherever they want to use those styles. This functionality reduces redundancy and helps to keep the code DRY (Don’t Repeat Yourself).\n\n### Sass Supports Inheritance\n\nSass supports inheritance with the @extend feature. This allows developers to share styles between selectors, so they don’t have to write out all the properties for similar classes. While CSS has a form of inheritance, it doesn’t allow for this type of code sharing.\n\n### Sass Includes Functions for Calculations\n\nSass includes built-in functions for mathematical calculations. When using Sass, developers can perform calculations and use the results directly in their styles. This helps to:\n\n- Eliminate errors\n- Improve efficiency\n\nWhile CSS now supports its calculations with the calc() function, it doesn’t have the same advanced functionality as Sass.\n\n### Sass Promotes Modularity\n\nSass promotes modularity with partials and imports. Partials are small Sass files that can be included in other Sass files. This allows developers to break their styles into smaller, more manageable pieces that can be organized logically.\n\nImports allow a main Sass file to pull in styles from other smaller files. This modular approach helps to:\n\n- Keep projects organized\n- Improve maintainability\n\n### Sass Offers Error Checking\n\nSass comes with an enhanced error-checking feature. When developers compile their Sass into CSS, they receive a detailed report on any errors or issues in the code. The report includes the line numbers for both the Sass and CSS files, making it easy to troubleshoot problems.\n\n### Sass Requires Compilation\n\nSass must be compiled or converted into CSS before a browser can read it. In contrast, browsers directly interpret CSS. This means developers must create a system to compile Sass files for their projects. Many code editors now come with built-in Sass compilation, which streamlines the process for developers.\n\n### Sass Simplifies Complex Styling Tasks\n\n[Using plain CSS](https://www.simplilearn.com/tutorials/css-tutorial/sass-css) to manage complex styling for a Hero Component might lead to repetitive code for similar elements. Sass simplifies this by using mixins for typical styles and variables for color schemes:\n\n- Reducing code duplication\n- Improving maintainability\n\n## Setting Up a React Project with CSS and Sass\n\n![React Hero Component](https://cdn.magicui.design/assets/cpob7xzq4oa.jpg)\n\n### Setting Up a Basic React Project with CSS\n\n#### 1\\. Create a React Project\n\nRun the following command to create a new React application:\n\n```bash\nnpx create-react-app my-app\n```\n\n#### 2\\. Add CSS Files\n\nCreate `.css` files inside your project’s `src` directory for styling.\n\n#### 3\\. Import CSS\n\n[Import CSS files](https://www.w3schools.com/html/html_css.asp) into your React components using:\n\n```tsx\nimport \"./App.css\"\n```\n\n#### 4\\. Apply Styles\n\nUse class names in JSX to apply styles.\n\n### Setting Up a React Project with Sass\n\n#### 1\\. Create a React Project\n\nRun the following command to create a new React application:\n\n```bash\nnpx create-react-app my-app\n```\n\n#### 2\\. Install Sass\n\nExecute `npm install sass` to add Sass support to your React project.\n\n#### 3\\. Rename Files\n\nChange `.css` files to `.scss`.\n\n#### 4\\. Import Sass \n\nImport `.scss` files into React components with:\n\n```tsx\nimport \"./App.scss\"\n```\n\n#### 5\\. Compile Sass\n\nSass compilation is handled automatically during development.\n\n### Structuring Stylesheets in a React Project\n\nIt’s good practice to structure your stylesheets in a modular way. This helps keep your [React projects](https://www.geeksforgeeks.org/reactjs-components/) organized and easier to maintain.\n\n#### Component-Specific Styles \n\nCreate separate .scss or .css files for individual components to maintain modularity.\n\n#### Global Styles \n\nImplement a global stylesheet (e.g., global.scss) for common styles and variables.\n\n#### Partial Files \n\nIn Sass, create partials (e.g., \\_variables.scss) to organize reusable styles and import them where needed.\n\n## Styling the React Hero Component Using CSS\n\n![](https://cdn.magicui.design/assets/aq2ptyoxgqv.jpg)\n\nStyling a React Hero component using CSS is simple once you know how to do it. A Hero component is a significant, prominent component usually placed at the top of a website and contains eye-catching content encouraging users to take action.  Hero Components are often styled using CSS, which can be done in React just like in regular [HTML](https://en.wikipedia.org/wiki/HTML#).\n\n### Create a Hero Component in React\n\nTo start, we need to create a Hero component. Below is an example of a simple Hero Component built with React.\n\n```javascript\nimport React from \"react\"\n\nimport \"./Hero.css\"\n\nconst Hero = () => (\n  <div className=\"hero\">\n        <h1 className=\"hero-title\">Welcome to Our Website</h1>   {\" \"}\n    <p className=\"hero-subtitle\">Discover amazing content</p>   {\" \"}\n    <button className=\"hero-cta\">Get Started</button> {\" \"}\n  </div>\n)\n\nexport default Hero\n```\n\nThe first step is to import React and create a functional component. Next, we define the structure of the Hero component. In this example, the Hero Component contains a title, a subtitle, and a call to action button. We export the component so we can import and use it in other files.\n\n### Define CSS Styles for the Hero Component \n\nWe must create a CSS file for the Hero Component styles. Below is an example of some CSS styles we can use to style the Hero Component.\n\n```javascript\n.hero {\n  background: url(\"hero-bg.jpg\") no-repeat center center;\n  background-size: cover;\n  text-align: center;\n  padding: 50px 20px;\n}\n\n.hero-title {\n  font-size: 3rem;\n  color: #fff;\n}\n\n.hero-subtitle {\n  font-size: 1.5rem;\n  color: #ddd;\n}\n\n.hero-cta {\n  background-color: #3498db;\n  color: #fff;\n  border: none;\n  padding: 10px 20px;\n  font-size: 1rem;\n  cursor: pointer;\n}\n```\n\nNotice how the CSS targets specific classes we defined in the component. This is how we can [build and style](https://medium.com/@ryaddev/creating-a-stunning-hero-section-in-react-with-styled-components-e84d060f6cdc) a Hero Component in React.\n\n## Enhancing Hero Component Styling with Sass\n\n![React Hero Component](https://cdn.magicui.design/assets/x814wuhxj8g.jpg)\n\nSass variables allow you to define reusable values for colors, fonts, spacing, and other design properties. Using variables ensures consistency across your styling and makes it easier to manage and update your design.\n\n### Color Variables\n\nInstead of hardcoding color values throughout your stylesheets, you can define them as variables. If you need to change a color, you only need to update it in one place rather than multiple [CSS rules](https://jenkov.com/tutorials/css/css-properties-css-rules.html). Set up a color scheme by defining variables for primary and secondary colors.\n\nYou can then use these variables throughout your Hero Component to maintain a consistent color palette. This approach ensures that all elements share the same colors and that any updates to the color scheme are applied uniformly across the component.\n\n### Nesting Selectors for Cleaner Code\n\nSass nesting allows you to organize related styles together, which enhances readability and maintainability. Instead of writing flat, repetitive CSS rules, you can nest selectors within their parent elements. This method mirrors the HTML structure, making the stylesheet:\n\n- More intuitive\n- Easier to navigate\n\nFor a Hero Component, you might nest styles for the title, subtitle, and CTA buttons within the `.hero` class. This nesting clearly shows the relationship between these elements and their parent container, reducing redundancy and simplifying the management of complex styles.\n\n### Creating Reusable Mixins for Common Styles\n\n[Mixins in Sass](https://youtu.be/R5p-v-Ce9p4) enable you to define reusable chunks of CSS that can be applied to multiple elements. They are handy for consistently applying common styles like button styles, shadows, or padding throughout the component. Using mixins helps avoid repetition and ensures uniformity in styling.\n\n#### Button Mixin\n\nCreate a mixin for consistent button styling that includes:\n\n- Padding\n- Background color\n- Border properties\n\nYou can then include this mixin in various buttons within your Hero Component, ensuring all buttons have the same styling without duplicating code.\n\n###  Leveraging Sass Functions for Advanced Styling\n\nSass functions allow you to perform calculations and create dynamic styles based on input values. They can be used for tasks like calculating responsive font sizes, spacing, or other design metrics based on screen size or other variables.\n\nYou can use a Sass function to calculate responsive font sizes that adjust based on the viewport width. This dynamic approach ensures that text remains readable and visually appealing across:\n\n- Different devices\n- Screen sizes\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Optimizing the Hero Component for Performance\n\n![React Hero Component](https://cdn.magicui.design/assets/7mmjh1p7pq9.jpg)\n\n### Lightweight Stylesheets Are Your Hero Component's Best Friend\n\nTo improve performance, it's crucial to keep your stylesheets lightweight. This involves\n\nminifying CSS files to reduce size and removing unused styles to eliminate unnecessary code. Smaller files load faster, enhancing:\n\n- Page load times\n- Overall user experience\n\nResearch shows that large CSS files can significantly impact page load times. For instance, reducing CSS file size by just 100 KB can improve load times by 1-2 seconds, depending on the user's internet speed.\n\n### Use Lazy Loading to Reduce Your Hero Component's Initial Load Time\n\nLazy loading defers the loading of background images until they are needed, which helps improve initial [page load times](https://www.imperva.com/learn/performance/page-load-time/). By loading images only when they enter the viewport or are about to be viewed, you reduce the amount of data that needs to be loaded upfront, enhancing overall page performance.\n\nImplement lazy loading for the Hero Component's background image. Instead of loading the image with the initial page load, use a placeholder or a lower-resolution version until the user scrolls to the Hero Component.\n\n### Avoid Common CSS Pitfalls That Negatively Impact Performance\n\n[Common CSS mistakes](https://www.linkedin.com/pulse/navigating-pitfalls-common-css-mistakes-how-avoid-nitin-rachabathuni-e8sgc) can negatively impact performance. These include:\n\n- Excessive nesting leading to complex and inefficient CSS rules\n- Extensive media queries that slow-rendering\n\nSimplifying styles and reducing complexity help maintain performance. If a React application’s performance is impacted by excessive nesting, refactor the styles to reduce nesting levels and optimize media queries. This can lead to a more efficient rendering process and improved performance.\n\n## How to Create Scalable React Components with Styled Components\n\n![React Hero Component](https://cdn.magicui.design/assets/nuzq6zclff.jpg)\n\n[Styled Components](https://styled-components.com/) is a library for styling React components using CSS-in-JS. It allows you to create reusable and scalable UI components by combining JavaScript and CSS in a single file. Styled Components automatically handle the generation of unique class names to avoid style conflicts and ensure that styles are scoped to the components they are applied to.\n\n### Build Your Own React Hero Component with Styled Components\n\nOne of the biggest benefits of using Styled Components in React is that it helps promote the development of scalable components. Each styled component you create encapsulates its style, which helps avoid global style conflicts. This makes it easier to manage and update styles as your application grows.\n\nIf you want to build a _hero_ component for your application, using Styled Components can help ensure that this reusable [UI component](https://app.uxcel.com/courses/ui-components-n-patterns) is easy to maintain and will not cause styling issues later on.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free, open-source UI library that helps design engineers create stunning user interfaces for web applications. With its collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n#### Animated Components\n\nThis library focuses on interactive UI elements with a strong emphasis on animation. The result is a design-centric approach that helps bridge the gap between design and development, empowering engineers to craft captivating digital experiences. The highly customizable MagicUI components enable seamless adaptation to match any desired branding and design requirements.\n\nIn addition to the free library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) offers website templates that can help reduce time and costs. You can save thousands of hours using our startup landing page template to create a beautiful landing page and convert your visitors into customers.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n"
  },
  {
    "path": "apps/www/content/blog/react-infinite-scroll.mdx",
    "content": "---\ntitle: Master React Infinite Scroll\ndescription: >-\n  Build performant react infinite scroll components. Learn to use Intersection\n  Observer and virtualization for a seamless user experience. Real examples\n  inside.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3a15c2ef-bcbf-49a4-9ef6-53bb6761701f/react-infinite-scroll-content-cards.jpg\nauthor: Dillion Verma\ntags:\n  - react infinite scroll\n  - react hooks\n  - intersection observer\n  - react performance\n  - web development\npublishedOn: \"2025-11-24T08:29:37.811794+00:00\"\nfeatured: true\n---\n\nImplementing **react infinite scroll** isn't just a fancy trick; it's a powerful way to load content dynamically as someone scrolls down a page. This creates a seamless, almost addictive browsing experience. Instead of forcing users to click through endless \"Next Page\" links, it delivers a continuous flow of information—perfect for social feeds, product catalogs, and news articles.\n\n## Why Infinite Scroll Is Essential for Modern Apps\n\nInfinite scroll has become a cornerstone of modern web design, evolving from a neat trend into a core feature for keeping users on your site. The whole point is to eliminate the jarring interruptions of old-school pagination. By ditching the clicks and page reloads, you create a fluid, continuous journey that keeps people immersed in your content.\n\nThis pattern is a game-changer for platforms where discovery is the main event. Think about scrolling through your favorite social media feed or browsing an e-commerce site; the longer you explore, the more likely you are to find something you love, engage with a post, or make a purchase.\n\n### Keeping Users Hooked\n\nThe psychology behind infinite scroll is surprisingly simple but incredibly effective. It taps into our natural desire for a continuous flow of information, making the experience feel almost effortless. That endless stream of content removes the natural stopping points that pagination creates, which can massively boost engagement.\n\nIn fact, some studies show that websites using infinite scroll can see a **20-30% increase** in average session duration compared to paginated ones. This effect is even more pronounced in React applications, where dynamic content is already a key strength. Big players built with React, like Instagram and Twitter, have reported that infinite scroll contributes to a **25% increase** in user engagement metrics.\n\n> The real win here isn't just about loading more data; it's about maintaining a user's momentum. Every click on a 'Next Page' button is a potential exit point. Infinite scroll gets rid of that friction entirely.\n\n### Real-World Applications\n\nSo, where does this pattern really shine? You've seen it everywhere:\n\n- **Social Media Feeds:** Platforms like X and Pinterest are built around it, presenting an endless stream of posts and images to keep you scrolling.\n- **E-commerce Product Listings:** Retailers use it to let you browse massive catalogs without ever having to pause and click \"load more.\"\n- **Content and News Aggregators:** Sites like Medium offer a continuous reading experience, making it easy to discover one interesting article after another.\n\nWhen you're ready to implement crucial features like infinite scroll, partnering with [specialized web development services](https://ninearchs.com/technology-services/web-development-services/) can help you nail the execution. Once you understand _why_ this pattern is so effective, you're in a much better position to tackle the _how_—and build a solution that truly elevates your React app.\n\n## Build Your Own Infinite Scroll with Hooks\n\nWhile grabbing a library is fast, there's nothing like building a **react infinite scroll** component from scratch to really understand how it works under the hood. When you use React's core hooks and a modern browser API, you get total control without bloating your project with another dependency. The plan is to lean on `useState`, `useEffect`, `useRef`, and the super-efficient `IntersectionObserver` API.\n\nThe whole point is to create a trigger that fetches more data _just_ as the user is about to run out of content. The old way of listening to every single scroll event can be a performance nightmare. We're going to use a much smarter approach. The `IntersectionObserver` is perfect for this—it’s a native browser API built specifically to tell you when an element scrolls into view.\n\nThis simple flow is what we're aiming for: a smooth cycle of scrolling that keeps people engaged and on the page.\n\n![Infographic showing three-step process: scroll leads to engage which leads to retain with icons](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cdd1bd6d-77e6-48a3-b306-ded279af0164/react-infinite-scroll-engagement-process.jpg)\n\nBy removing the friction of clicking \"next page,\" we create an experience that users don't want to leave. That's the core benefit we're building.\n\n### Setting Up the State and Refs\n\nFirst things first, we need to handle our component's state. We'll need to keep track of the list of items we're displaying, the current page number we need to fetch next, and whether there's even more data available. `useState` is the right tool for the job.\n\nWe also need a way to \"point\" to a specific element in the DOM—our trigger—without forcing a re-render every time. That's a classic use case for `useRef`. We'll create a ref and attach it to an empty `<div>` at the very bottom of our list. This little div is what our `IntersectionObserver` will be watching.\n\n- **`useState` for Data:** To hold the array of items you're showing on screen.\n- **`useState` for Pagination:** To keep track of the page number for the next API call.\n- **`useRef` for the Trigger:** To create a stable reference to that \"bottom\" element.\n\n### The IntersectionObserver Logic\n\nNow for the magic. All the observation logic will live inside a `useEffect` hook. This ensures we set up our observer when the component first mounts and, crucially, clean it up when it unmounts to prevent any memory leaks.\n\nInside `useEffect`, we'll create a new `IntersectionObserver`. This observer takes a callback function that runs whenever our target element (the `<div>` with our ref) crosses the viewport's threshold. As soon as that happens, we know the user has scrolled to the bottom. Time to fetch more data.\n\n> The real win here is that the `IntersectionObserver` offloads all the hard work from React directly to the browser. Instead of you manually checking scroll positions, the browser just taps you on the shoulder and says, \"Hey, that element you asked about is visible now.\" It's way more performant.\n\nTo keep our code clean and reusable, we can wrap all of this up in a custom hook, maybe called `useInfiniteScroll`. This hook will handle the `useEffect` and `IntersectionObserver` setup, and it can just take a single argument: the callback function to fetch the data. This leaves our main component with one job: rendering the UI.\n\n### Bringing It All Together\n\nOnce our custom hook is ready, the main component becomes incredibly simple. It just needs to call `useInfiniteScroll`, pass in the data-fetching function, and then map over the items to render them. The loading sentinel—our ref-attached `<div>`—gets placed right at the end of the list.\n\nHere’s a quick recap of how the pieces fit together:\n\n1.  **State Management:** `useState` holds our items and the current page.\n2.  **DOM Reference:** `useRef` gives us a persistent pointer to a sentinel element at the list's end.\n3.  **Observation Logic:** A `useEffect` inside our custom hook sets up an `IntersectionObserver` to watch that sentinel.\n4.  **Data Fetching:** When the sentinel becomes visible, the observer's callback fires our function to get the next page of data.\n5.  **UI Update:** The new data is appended to our state, which triggers React to render the new items seamlessly.\n\nThis pattern isn't just efficient; it's also something you can reuse all over your application. And to make your dynamically loaded content even more engaging, take a look at our guide on creating beautiful [CSS animations on scroll](https://magicui.design/blog/css-animation-on-scroll).\n\n## Choosing Your Infinite Scroll Strategy\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/14K_a2kKTxU\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nBuilding a custom **React infinite scroll** hook from the ground up is a fantastic way to really understand how it all works under the hood. But let's be realistic—it's not always the best move for a production app. The choice usually boils down to a classic trade-off: do you want total control, or do you need to ship a feature fast that's also easy to maintain?\n\nGoing the custom route gives you ultimate power. You can fine-tune every single detail, from the debounce timing to the precise trigger for fetching data, making sure it fits your app's architecture like a glove. The catch? That control comes with the cost of your time and the headache of handling all the edge cases, performance tweaks, and browser quirks yourself.\n\nOn the flip side, established libraries are a massive shortcut. They offer battle-tested solutions you can drop into your project and have running in a matter of minutes. When you're staring down a deadline, that speed is a lifesaver.\n\n### Custom Hooks vs. Library Solutions\n\nSo, how do you decide? It all comes down to what's most important for your project right now. Are you prioritizing the learning experience and granular control, or is the goal to get a reliable feature out the door quickly? A custom hook is perfect for simpler use cases or when you're determined to keep your app’s dependency footprint as lean as possible.\n\nLibraries like [`react-infinite-scroll-component`](https://www.npmjs.com/package/react-infinite-scroll-component), however, abstract away all the messy parts. They manage the scroll listeners and loading states for you, offering simple props to hook everything together. This approach is incredibly popular for a reason. In fact, `react-infinite-scroll-component` boasts over **10,000 stars** on GitHub, which speaks volumes about its reliability in real-world applications. You can dig into more trends from some [recent development statistics](https://www.esparkinfo.com/software-development/technologies/reactjs/statistics).\n\n> Ask yourself this one key question: \"Does building this from scratch provide unique value that a library can't?\" If the answer is no, grabbing a well-supported library is almost always the smarter, more efficient move.\n\nBefore you make a final call, it’s helpful to see how these methods stack up against each other.\n\n### React Infinite Scroll Methods: A Comparison\n\n| Method                                | Best For                                                          | Performance                          | Implementation Complexity |\n| :------------------------------------ | :---------------------------------------------------------------- | :----------------------------------- | :------------------------ |\n| **Custom Hook**                       | Learning, simple lists, minimal dependencies.                     | Good, but optimization is manual.    | Medium to High            |\n| **`react-infinite-scroll-component`** | Rapid development, most common use cases, feature-rich needs.     | Very good, optimized out-of-the-box. | Low                       |\n| **`react-window` (Virtualization)**   | Huge datasets (1,000s of items), data grids, maximum performance. | Excellent, prevents DOM bloat.       | High                      |\n\nEach approach has its place. The key is to pick the right tool for the job you have today, not the one you might have a year from now.\n\n### When to Consider Virtualization\n\nThen there's the next level: virtualization. For apps that need to render thousands—or even tens of thousands—of items, even a well-built infinite scroll can start to buckle. Every item you load adds another node to the DOM, which eventually bogs down rendering and eats up memory.\n\nThis is where libraries like [`react-window`](https://www.npmjs.com/package/react-window) and `react-virtualized` become essential. They use a technique called \"windowing,\" which means only the items currently visible on the screen are actually rendered. As you scroll, items are recycled—added and removed from the DOM on the fly. It's incredibly efficient.\n\nHere's a quick cheat sheet to guide your decision:\n\n- **Custom Hook:** Your go-to for learning the ropes, handling simple lists, or when you're obsessed with keeping dependencies to a minimum.\n- **Library (`react-infinite-scroll-component`):** The workhorse for most projects. It’s perfect for fast development and standard feeds, especially if you need features like pull-to-refresh.\n- **Virtualization (`react-window`):** Non-negotiable for high-performance apps with massive datasets. Think data grids, analytics dashboards, or gigantic social media feeds.\n\nUltimately, picking the right strategy is about finding the sweet spot between complexity, performance, and development speed. My advice? Start with the simplest solution that gets the job done and be ready to scale up to a more powerful approach as your app—and your data—grows.\n\n## Supercharge Performance with Virtualization\n\nA standard **React infinite scroll** setup works beautifully for a few hundred items, but what happens when you need to display a few _thousand_? Your app will start to feel sluggish. The DOM gets bloated, memory usage spikes, and performance can grind to a halt.\n\nThis is exactly where virtualization, also known as \"windowing,\" shifts from a nice-to-have optimization to an absolute necessity.\n\nVirtualization is a clever technique that keeps your long lists snappy and performant. Instead of rendering every single item you've loaded, it only renders the small subset of items currently visible in the user's viewport, plus a little buffer on either side. As the user scrolls, it recycles the DOM nodes, swapping out the content of the items moving out of view with the new items coming into view.\n\n![Responsive web design illustration showing multiple devices and desktop computer with interface wireframes](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2f07c619-8a33-4866-afdf-286a98b58bf9/react-infinite-scroll-responsive-design.jpg)\n\nThis approach keeps the number of DOM elements consistently low and manageable, whether you're dealing with **100** items or **100,000**. For things like massive data grids, live chat feeds, or sprawling e-commerce catalogs, this is the secret to maintaining a fluid, responsive user experience. The performance gains aren't just marginal; they're night and day.\n\n### Integrating React Window\n\nYou don't have to build this from scratch. Libraries like `react-window` are designed specifically for this job. They give you components that handle all the tricky calculations for windowing, so you can just focus on your data and UI. The main idea is to wrap your list in a virtualization component, telling it the total item count and the height of each item.\n\nHere’s how `react-window` crushes the performance problem:\n\n- **Minimal DOM Nodes:** It only mounts the components that actually fit on the screen, which keeps the browser from getting overwhelmed.\n- **Reduced Memory Footprint:** By not holding thousands of component instances in memory, your app stays light and fast.\n- **Faster Re-renders:** With fewer components on the page, React's reconciliation process becomes significantly quicker.\n\n> Virtualization is the difference between an app that _works_ and an app that _delights_. When you're handling large datasets, it stops being an \"advanced\" technique and becomes a foundational requirement for good performance.\n\nThe evolution of infinite scroll in React has been heavily influenced by these performance demands. For example, `react-window-infinite-loader`, a library that marries virtualization with data fetching, is now used in over **5,000** production applications. This really drives home how crucial this optimization is for building scalable, real-world apps.\n\n### Combining Virtualization with Infinite Loading\n\nTo get the best of both worlds, you can combine `react-window` with the infinite scroll logic we've already built. A helper library like `react-window-infinite-loader` makes this surprisingly straightforward. This combo ensures you're only fetching data when needed _and_ only rendering what's visible.\n\nThe implementation usually involves wrapping your virtualized list with an `InfiniteLoader` component. This component keeps track of which items have been loaded and fires your data-fetching function when the user scrolls close to the end of the available data. It's a two-pronged attack, tackling both network requests and rendering performance at the same time.\n\nThis setup is pretty much the gold standard for building high-performance lists in React. While it does add a bit more complexity than a basic infinite scroll, the payoff is a silky-smooth experience for your users, no matter how much data you throw at it. For a deeper dive into other optimization strategies, check out our guide on [how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance).\n\n## Crafting a Better User Experience\n\nGetting the functionality right is just the starting line. A truly great **react infinite scroll** implementation should feel completely invisible to the user—it just _works_. That magic happens when you nail the user experience (UX) and accessibility details that turn a clunky component into a seamless one.\n\nWhen someone scrolls down your page, they expect something to happen instantly. Leaving them staring at a blank space while new data fetches in the background is a recipe for confusion and frustration. This is why clear, non-intrusive loading indicators are absolutely non-negotiable. It could be a simple spinner at the bottom of the list or, even better, subtle skeleton loaders that mimic the shape of the content to come.\n\n![Two mobile interface cards showing error state and loading state with decorative geometric elements](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/30d1587b-5cff-4dff-b09a-2c593e9f6a31/react-infinite-scroll-error-loading-states.jpg)\n\nThese visual cues manage expectations and clearly communicate that your app is on the job, preventing users from assuming the page is broken. Want to take it a step further? Consider adding a visual progress bar to show their position within the loaded content, like the components found in the Magic UI [scroll progress documentation](https://magicui.design/docs/components/scroll-progress).\n\n### Handling Real-World Scenarios\n\nAPIs fail. Network connections drop. It's not a matter of _if_, but _when_. A silent failure is one of the worst UX mistakes you can make, leaving your users in the dark. Your infinite scroll component has to handle these error states gracefully.\n\nInstead of just grinding to a halt, display a friendly message like \"Couldn't load more posts. Please try again\" along with a retry button. This simple addition empowers the user, giving them a sense of control and turning a moment of frustration into a minor, manageable hiccup.\n\nIt's also a great idea to offer a manual \"Load More\" button. This serves two key purposes:\n\n- **Accessibility:** It's a lifeline for users who find it difficult or impossible to use a scroll wheel or touchpad.\n- **User Control:** Let's be honest, some people just prefer the deliberate action of clicking a button over content appearing automatically.\n\n> A robust implementation anticipates failure. By providing clear feedback for loading, error, and end-of-content states, you build trust with your users and make your application feel more reliable and professional.\n\n### Accessibility and Usability Wins\n\nA seamless experience has to be an experience for _everyone_. If not implemented thoughtfully, infinite scroll can create major headaches for users who rely on screen readers or keyboard navigation.\n\nFor screen reader users, it's crucial to announce when new content has been loaded onto the page. You can use an `aria-live` region to politely inform them that \"**20** new items have been added to the list.\" This small step prevents them from getting lost as the DOM changes underneath them.\n\nFor keyboard users, focus management is key. After new items are fetched and rendered, the keyboard focus should remain on the last interactive element before the load. This allows them to continue navigating logically without being jarringly thrown back to the top of the page.\n\nAnother huge usability win is restoring the scroll position. If a user clicks on an item, navigates away, and then hits the back button, they shouldn't have to scroll all the way back down from the top. By saving their scroll position in session storage and automatically returning them to it, your app will feel incredibly smart and considerate.\n\nAs you build out your component, it's always worth reviewing some [general tips for improving website user experience](https://altitudedesign.co.uk/blog/how-to-improve-website-user-experience) to ensure you're creating a polished and professional final product.\n\n## Common Questions About React Infinite Scroll\n\nEven with the best implementation, a few tricky questions always pop up when you're building out infinite scroll in React. Let's walk through some of the most common hurdles I've seen developers face and get you some clear answers.\n\n### How Do I Handle SEO with Infinite Scroll?\n\nThis is a big one. Search engine crawlers don't behave like users—they don't scroll down a page to trigger JavaScript events. This means if your content only loads dynamically, crawlers will only see that initial batch of items, and the rest of your content might never get indexed.\n\nThe best practice here is a \"hybrid\" approach. You start by building a standard, crawlable pagination system with URLs like `/products?page=2`. Then, for your actual users, you use JavaScript to layer the infinite scroll functionality on top, effectively replacing the \"Next Page\" links with the auto-loading behavior.\n\nThis gives you the best of both worlds: a perfectly crawlable site for search engines and a seamless, modern experience for your visitors.\n\n> Never forget that search engines don't \"scroll.\" Always have a traditional pagination fallback to make sure all your valuable content is discoverable and properly indexed.\n\n### Is Listening to Scroll Events Bad for Performance?\n\nYes, it can be. If you just slap an event listener directly onto the `window.scroll` event, you're signing up for a potential performance headache. That event fires _constantly_ as the user scrolls, and if your handler function is even slightly complex, it can quickly lead to a janky, unresponsive UI.\n\nThis is exactly why the `IntersectionObserver` API is the modern, recommended approach. Instead of listening to every single scroll movement, you tell the browser to just watch a specific element (like your loader at the bottom of the list). The browser does the heavy lifting and only pings your app when that element actually enters the viewport. It's way more efficient and sidesteps the performance traps of manual scroll listeners.\n\n### What's the Best Way to Handle Scroll Position Restoration?\n\nThere's nothing more frustrating for a user than scrolling deep into a list, clicking on an item, and then hitting the \"back\" button only to be thrown back to the very top. It’s a jarring experience that’s surprisingly easy to fix.\n\nThe key is to save the user's scroll position just before they navigate away.\n\n- **Session Storage is your friend:** When your component is about to unmount, grab the current scroll position with `window.scrollY` and save it to `sessionStorage`.\n- **Restore on mount:** When the component mounts again (like when the user hits \"back\"), check `sessionStorage` for a saved value. If it's there, use `window.scrollTo()` to instantly return the user to where they left off.\n\nThis small touch makes a massive difference in how polished and user-friendly your application feels.\n\n---\n\nReady to build stunning, high-performance web interfaces with ease? **Magic UI** offers over **150** free and open-source animated components, plus powerful pro templates built with React and Tailwind CSS. [Explore Magic UI](https://magicui.design) and start creating beautiful UIs in minutes.\n"
  },
  {
    "path": "apps/www/content/blog/react-js-file-upload.mdx",
    "content": "---\ntitle: A Modern Guide to React JS File Upload\ndescription: >-\n  Build a robust React JS file upload component with this modern guide. Learn\n  drag-and-drop, progress bars, previews, and server communication with Axios.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-28e68fc1-6953-4ac0-813e-ef7dc7c05dee.jpg\nauthor: Dillion Verma\ntags:\n  - react js file upload\n  - react file upload\n  - axios file upload\n  - drag and drop react\n  - javascript\npublishedOn: \"2025-09-29\"\nfeatured: true\n---\n\nHandling file uploads in a **React JS application** is a task you'll run into sooner or later. It all starts with capturing a file from a user’s device with an `<input type=\"file\">` element. From there, you'll need to manage its state inside your component and package it up for the server, which usually means wrapping it in a `FormData` object.\n\n## Building Your First React File Uploader\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/85933337-a396-4cb5-91ed-7154ad7c4a4f.jpg)\n\nAlright, let's jump right in and get a basic file uploader working. We'll skip the boilerplate and cut straight to the core logic. The goal is to grab a file from the user's browser and get it ready for its journey to the server. It all kicks off with a simple HTML input, but making it play nice with React requires a little finesse.\n\nThe process has two main parts. First, the user picks a file using an `<input type=\"file\">` element. We'll then stash that file in our component's state, which is a perfect job for the `useState` hook.\n\nThe second part is actually sending it off. Once the file is selected, it needs to be sent to a server endpoint. While you can definitely use the native `fetch` API, a library like Axios often makes life easier with a cleaner syntax and more robust request handling.\n\n### Capturing the Selected File\n\nThe heart of any file uploader is the `<input type=\"file\" />` element. To keep track of the selected file within a React functional component, we'll turn to the `useState` hook. It's built for exactly this kind of state management.\n\nWe can initialize a state variable—let's call it `selectedFile`—to `null`. Then, we'll create a handler function that updates this state every time the user chooses a file. This function gets wired up to the input's `onChange` event.\n\n```jsx\nimport React, { useState } from \"react\"\n\nconst FileUploader = () => {\n  const [selectedFile, setSelectedFile] = useState(null)\n\n  const handleFileChange = (event) => {\n    // Access the selected file from the event\n    setSelectedFile(event.target.files[0])\n  }\n\n  return (\n    <div>\n      <input type=\"file\" onChange={handleFileChange} />\n    </div>\n  )\n}\n```\n\nWith this simple setup, we've successfully grabbed the file and stored its details in our component's state. It’s now ready for the next step. Writing clean, maintainable code is key, and if you want to sharpen your skills, check out our guide on https://magicui.design/blog/react-best-practices.\n\n### Preparing the File with FormData\n\nBefore we can shoot the file off to a server, it needs to be packaged correctly. The web standard for file uploads is `multipart/form-data` encoding, and the `FormData` interface is our go-to tool for this. It lets us build a set of key/value pairs that mimic a form submission, which is exactly what we need for an HTTP request.\n\n> A common mistake is trying to send the raw file object in a JSON payload. Servers expect `multipart/form-data` for file uploads, and `FormData` is the browser's native tool for creating exactly that.\n\nTo use it, we'll create a new `FormData` instance and simply append our file to it. This object can then be passed as the body of a `POST` request using Axios or `fetch`. As you build out these common patterns, it's worth looking into how modern [AI tools for developers](https://www.zemith.com/blogs/best-ai-tools-for-developers) can help speed up your workflow.\n\nWith the file properly packaged, we're ready to tackle the final piece of the puzzle: sending it to the server.\n\n## Sending Files to the Server with Axios\n\nAlright, so you've got your file wrapped up nicely in a `FormData` object. Now what? The next step is to actually get it from the user's browser over to your server. This is where we need to make an HTTP request, and my go-to tool for this in the React world is [Axios](https://axios-http.com/).\n\nAxios is a super popular, promise-based HTTP client that just makes sending requests a breeze. Its clean syntax and powerful feature set have made it a staple for countless developers. For a **React JS file upload**, we’ll be making a `POST` request, and that `FormData` object we just built will be the payload.\n\n### Building the Axios POST Request\n\nPutting the request together is pretty straightforward. I'm a big fan of using `async/await` because it keeps the asynchronous code clean and easy to read, almost like it's happening in order. You just call `axios.post()` and pass it two main things: your server's endpoint URL and the `FormData` object.\n\nNow, here's a crucial tip that trips up a lot of developers. When you're using `FormData`, don't manually set the `Content-Type` header. Axios is smart enough to see the `FormData` object and automatically set the header to `multipart/form-data` for you, along with the necessary boundary string. If you try to set it yourself, you'll likely break the upload. Just let Axios handle it.\n\nLet's see what this looks like in practice. Here’s a simple function that takes our `FormData` and ships it off to a `/upload` endpoint.\n\n```jsx\nimport axios from \"axios\"\n\nconst uploadFile = async (formData) => {\n  try {\n    // Make sure to replace '/upload' with your actual server endpoint\n    const response = await axios.post(\"/upload\", formData)\n\n    console.log(\"File uploaded successfully:\", response.data)\n    return response.data // You might want to return this to update the UI\n  } catch (error) {\n    console.error(\"Error uploading file:\", error)\n    // It's a good practice to re-throw the error so the calling component can handle it\n    throw error\n  }\n}\n```\n\nWhen you're building your Axios request, there are a few key configuration options you'll want to be aware of, especially for more advanced scenarios like tracking upload progress.\n\nHere's a quick rundown of the essential properties for a file upload request:\n\n### Axios Configuration for File Upload\n\n| Property             | Value/Type | Purpose                                                                     |\n| :------------------- | :--------- | :-------------------------------------------------------------------------- |\n| **url**              | `string`   | The server endpoint where the file will be sent (e.g., `/api/upload`).      |\n| **method**           | `string`   | The HTTP method to use. For file uploads, this is almost always **'post'**. |\n| **data**             | `FormData` | The `FormData` instance containing the file and any other associated data.  |\n| **headers**          | `object`   | An object for custom headers. Remember to let Axios set the `Content-Type`. |\n| **onUploadProgress** | `function` | A callback function that receives progress events during the upload.        |\n\nThese properties give you fine-grained control over the request, allowing you to build a robust and user-friendly upload experience.\n\n### Handling What the Server Sends Back\n\nOnce Axios sends the request, your server will process it and send back a response. A successful upload might return some JSON with the file's new URL or a database ID. On the other hand, an error could be triggered if the file is too large, the wrong type, or something just goes wrong on the server.\n\nYour component needs to be ready for either outcome. By wrapping the Axios call in a `try...catch` block, you can easily separate success from failure. This is where you'll update your UI to show a success message, display a preview of the newly uploaded image, or provide the user with a clear, helpful error message.\n\n> The feedback loop is everything for a good user experience. A silent failure is one of the most frustrating things for a user. Always use the server's response to tell the user exactly what happened—good or bad.\n\nThis back-and-forth communication is what transforms a simple file input into a complete, interactive, and professional feature.\n\n## Creating a Modern Dropzone and File Previews\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/-MTSQjw5DrM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nSure, a plain old \"Browse\" button works. But let's be honest, it doesn't exactly scream \"modern\" or \"user-friendly.\" If you want to elevate the experience of your **React JS file upload** component, there are two features users pretty much expect these days: a slick drag-and-drop zone and instant image previews.\n\nAdding these touches makes your application feel way more intuitive and responsive. We'll turn a simple `<div>` into an interactive area that reacts when a user drags a file over it, giving them a much faster way to get their files into your app.\n\n### Building an Interactive Dropzone\n\nTo pull this off, you'll need to hook into three main browser events in your React component: `onDragOver`, `onDragLeave`, and `onDrop`.\n\nThe `onDragOver` event is absolutely crucial. By default, browsers will just open any file you drop onto the page, which is not what we want. We have to step in and prevent that default behavior to take control.\n\n`onDragOver` and `onDragLeave` are also perfect for giving the user visual cues. Think about toggling a CSS class to change the border color or showing a \"Drop file here\" message. This kind of feedback makes it obvious that the area is interactive and ready for their file.\n\nThe real magic happens in the `onDrop` event. Here, we'll again prevent the browser's default action and then grab the dropped files from the event’s `dataTransfer.files` property. This `FileList` object is what we'll pass along to our state and upload functions.\n\n> Heads up: The most critical step here is calling `event.preventDefault()` in both `onDragOver` and `onDrop`. It's a super common mistake to forget this, and the result is the browser hijacking the file and navigating away from your app. It completely breaks the user flow.\n\n### Generating Instant File Previews\n\nOnce a user has picked a file—whether they dropped it or used the classic input—you want to give them immediate feedback. Instead of leaving them hanging until the upload finishes, we can generate a local preview of image files right there in the browser. It’s a small thing that makes the app feel incredibly fast.\n\nThe key to this is the browser's built-in **`FileReader` API**. It's a handy tool that lets us read the contents of a file on the client-side.\n\nHere’s how the process breaks down:\n\n1.  **Create a FileReader:** Inside your file selection handler, make a new instance of `FileReader`.\n2.  **Set up the `onload` callback:** This function fires once the file has been successfully read. The result comes back as a Base64 encoded data URL, which is exactly what we need.\n3.  **Read the file:** Call the `readAsDataURL()` method on your reader, passing in the file the user selected.\n4.  **Update your state:** Inside that `onload` callback, take the data URL and set it in your component's state. You can then plug this URL directly into the `src` of an `<img>` tag to show the preview.\n\nThis client-side preview gives the user instant confirmation and a much richer experience, all without a single call to your server.\n\nAnd if you're looking to style these new UI elements, our guide on how to [install Tailwind in a React project](https://magicui.design/blog/install-tailwind-react) will get you up and running with a professional look in no time.\n\n## Showing Real-Time Upload Progress\n\nNobody likes staring at a static screen, wondering if their upload has frozen. It's one of the quickest ways to frustrate a user, especially when they're trying to send a large file. A simple, dynamic progress bar is the perfect antidote, giving them clear, real-time feedback that everything is working as it should.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b1d4f5c2-e1d3-43c0-97b3-94c7febbaf1e.jpg)\n\nThankfully, when you're doing a **React JS file upload** with [Axios](https://axios-http.com/), getting this data is surprisingly easy. Axios comes with a built-in event listener called `onUploadProgress` that gives you a live feed of the upload's status straight from the browser.\n\n### Tapping into the onUploadProgress Event\n\nThe `onUploadProgress` function is just another configuration option you can pass into your Axios request. It's a callback that fires repeatedly as the file makes its way to the server.\n\nThis callback provides a progress event object packed with useful info. We're most interested in two properties: `loaded` (the number of bytes uploaded so far) and `total` (the file's total size). With those two numbers, a quick bit of math gives us the upload percentage, which is exactly what we need to power our UI.\n\nHere’s how you can weave it into an existing Axios call:\n\n```jsx\nimport React, { useState } from \"react\"\nimport axios from \"axios\"\n\nconst ProgressUploader = () => {\n  const [uploadPercentage, setUploadPercentage] = useState(0)\n\n  const uploadFile = async (file) => {\n    const formData = new FormData()\n    formData.append(\"file\", file)\n\n    try {\n      await axios.post(\"/upload\", formData, {\n        onUploadProgress: (progressEvent) => {\n          const { loaded, total } = progressEvent\n          // A simple check to avoid division by zero\n          if (total > 0) {\n            const percent = Math.floor((loaded * 100) / total)\n            setUploadPercentage(percent)\n          }\n        },\n      })\n    } catch (err) {\n      console.error(\"Upload failed:\", err)\n      // Maybe reset percentage or show an error state\n      setUploadPercentage(0)\n    }\n  }\n\n  // Your file input and handler logic would go here\n  // ...\n}\n```\n\n### Linking Progress to the UI\n\nInside the callback, the `setUploadPercentage(percent)` call updates our component's state. From there, it’s a breeze to connect this state to a visual element, like a progress bar. You don't need a fancy library for this; a couple of styled `div` elements will do the trick.\n\nThe outer `div` works as the container, and the inner `div` gets its width set dynamically from our `uploadPercentage` state.\n\n```jsx\nconst ProgressBar = ({ percentage }) => {\n  return (\n    <div\n      className=\"progress-bar-container\"\n      style={{ width: \"100%\", backgroundColor: \"#e0e0de\", borderRadius: \"4px\" }}\n    >\n      <div\n        className=\"progress-bar\"\n        style={{\n          width: `${percentage}%`,\n          backgroundColor: \"#4caf50\",\n          height: \"20px\",\n          borderRadius: \"4px\",\n          transition: \"width 0.4s ease-in-out\",\n        }}\n      />\n    </div>\n  )\n}\n```\n\nThis small addition completely transforms the user experience. It's a common pattern in enterprise-grade React apps for a reason. Showing real-time upload status reduces user uncertainty, especially for operations that might take a few seconds or longer. It makes the wait feel shorter and keeps users engaged. For a deeper dive into this, check out these [insights on React and Node.js file handling](https://mobisoftinfotech.com/resources/blog/app-development/react-file-uploader-progress-bar-nodejs-typescript).\n\n> The key takeaway is that providing visual feedback isn't just a nice-to-have feature; it's essential for usability. A progress bar turns a moment of potential user anxiety into a clear and controlled process.\n\n## Uploading Large Files with Chunking\n\nWhen your application needs to handle seriously large files—think high-resolution videos, massive datasets, or chunky design assets—the standard, single-request upload just doesn't cut it. It’s a fragile process. Network timeouts, server-side file size limits, and spotty connections can nuke the entire upload, forcing a frustrated user to start all over again.\n\nThis is exactly where chunking comes in. It’s a more advanced and robust technique for a **React JS file upload** that completely changes the game.\n\nInstead of trying to shove the whole file through the network in one go, chunking breaks it down into smaller, more manageable pieces right in the browser. This approach is far more resilient. If one chunk fails to upload, you only need to retry that small piece, not the entire gigabyte-sized file.\n\n### Slicing Files in the Browser\n\nThe real magic behind client-side chunking is the `Blob.slice()` method. It's a native browser API that lets you take a large `File` object—which is just a special type of `Blob`—and create smaller segments without having to load the entire file into memory.\n\nYou can set a fixed chunk size, say **5MB**, and then loop through the file, slicing it up piece by piece.\n\nEach chunk is then wrapped in its own `FormData` object and sent to the server, one after the other. Your React component will need to carefully manage the state for this, keeping track of which chunk is currently uploading and how many are left to go.\n\nThis flow is a great way to visualize the validation and error-handling that should go along with this strategy.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cc8d2675-f4f9-430c-86fc-9b6d0c113300.jpg)\n\nAs you can see, validation and retry mechanisms are critical checkpoints. They're what ensure data integrity before the upload process even kicks off.\n\n### Assembling Chunks on the Server\n\nOn the backend, your server will start receiving these individual chunks. It needs two key pieces of information for each one: which file it belongs to and its correct order.\n\nA common strategy is to send a unique identifier for the entire file along with an index number for each chunk. The server then saves these temporary pieces. Once all the chunks have arrived safely, it reassembles them back into the original file.\n\n> This method is the key to building resilient, enterprise-level upload features. It transforms a fragile, all-or-nothing process into a fault-tolerant system that can reliably handle large assets even over spotty network conditions.\n\nSlice-based uploads are a best practice for any application where users are uploading large, high-value content. For instance, when dealing with high-resolution images, the upload is just one part of the puzzle; delivery is another. If that's something you're working on, you might find our article on [how to optimize images for the web](https://magicui.design/blog/how-to-optimize-images-for-web) helpful.\n\nUltimately, the chunking approach minimizes failure risk and enables precise progress tracking, which adds up to a much better user experience.\n\n## Common Questions About React File Uploads\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4d0b2e4c-7c64-4a67-b479-410da3dbebf3.jpg)\n\nAs you start building out your **React JS file upload** features, you’re bound to hit a few common roadblocks. It happens to everyone. Let's walk through some of the most frequent questions developers ask so you can sidestep those potential issues and refine your implementation.\n\nGetting these details right is what separates a merely functional uploader from a truly robust and user-friendly one. From juggling multiple files at once to making sure only the right types of files get through, these are the practical challenges you'll almost certainly run into.\n\n### How Do I Handle Multiple File Uploads\n\nTo let users grab more than one file, you just need to add the `multiple` attribute to your input element: `<input type=\"file\" multiple />`. Simple as that. Once you do this, `event.target.files` won't just hold a single file; it becomes a `FileList`, which you can treat much like an array.\n\nFrom there, you can loop over the `FileList` and append each file to your `FormData` object before sending it on its way. I find that a `for...of` loop is a clean and effective pattern for this.\n\nFor a smoother user experience, especially when dealing with a bunch of files, think about managing each upload's state individually. This lets you show separate progress bars for each one. Another slick approach is using `Promise.all` to handle all the uploads concurrently and track when the entire batch is finished.\n\n### What Is the Best Way to Validate Files\n\nClient-side validation is your first line of defense. It gives the user instant feedback without waiting for a server round-trip, which is a much better experience. You should be checking for two main things: file type and size.\n\n- **File Type:** Use the `accept` attribute on your input, like `<input accept=\".jpg,.png\" />`, to give the browser a hint about what files are okay. But don't stop there. In your change handler, you need to actually inspect the `file.type` property (e.g., `'image/jpeg'`) and check it against a list of approved MIME types.\n\n- **File Size:** Check the `file.size` property, which gives you the size in bytes. You can set a reasonable limit, for example, using `if (file.size > 5 * 1024 * 1024)` to block any file over **5MB**.\n\nIf a file fails either of these checks, make sure you update your component's state to show a clear and helpful error message to the user.\n\n> A crucial takeaway here: client-side validation is for UX, not security. A determined user can easily bypass it. You absolutely _must_ re-validate everything on your server before processing or storing any file.\n\nBeyond the code itself, it's vital to think about the broader [data security considerations](https://fileo.io/tags/data-security/) when handling user files. Proper server-side validation is a non-negotiable part of that puzzle, protecting you from major security risks.\n\n### Can I Upload Files Without Axios\n\nAbsolutely. The native `fetch` API is more than capable of handling file uploads. You’ll build the `FormData` object in the exact same way and just pass it as the `body` of your `POST` request.\n\nThe main trade-off comes down to progress tracking. `fetch` doesn't have a simple, built-in progress event like Axios's `onUploadProgress` configuration. If you need to show an upload progress bar with `fetch`, it gets a lot more complex, often forcing you to work directly with `ReadableStream`.\n\nBecause of this, many developers (myself included) still prefer Axios for file uploads when progress feedback is a key requirement. It just saves you a headache.\n"
  },
  {
    "path": "apps/www/content/blog/react-js-form-validation.mdx",
    "content": "---\ntitle: A Guide to React JS Form Validation\ndescription: >-\n  Explore our complete guide to React JS form validation. Learn to build robust\n  forms using custom hooks, React Hook Form, and Formik with practical examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-ed5d3c8c-4d39-427e-8dc8-91ed30152abb.jpg\nauthor: Dillion Verma\ntags:\n  - react js form validation\n  - react hook form\n  - formik\n  - yup validation\n  - react forms\npublishedOn: \"2025-11-15T09:57:25.986015+00:00\"\nfeatured: true\n---\n\nWhen it comes to handling forms in React, your validation strategy can make or break the user experience. You can go the custom route with your own hooks for simpler scenarios, or you can bring in a heavy-hitter like [React Hook Form](https://react-hook-form.com/) for more complex, performance-critical applications.\n\nEither way, the objective is the same: give users instant, clear feedback and make sure the data is clean _before_ it ever hits your server. This simple practice prevents a world of hurt from bad data and keeps your users from getting frustrated.\n\n## Why Modern React Form Validation Is Essential\n\n![A user interacting with a web form on a laptop, with green checkmarks indicating successful validation.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3ef3d30e-5360-49d6-b099-52900add1e17.jpg)\n\nBefore we start slinging code, it’s worth taking a moment to appreciate _why_ solid form validation has become a non-negotiable part of modern web development. Think of validation as a conversation between your app and the user. It's there to guide them, gently correct mistakes in real-time, and ultimately build trust in your service.\n\nA form without good validation is like talking to someone who isn't listening—it’s annoying, inefficient, and people will just give up.\n\nThis isn't just a hunch. Studies have shown that a staggering **67% of users will abandon an online form** if they find it too slow, confusing, or riddled with errors. That's a massive leak in your funnel. Smart developers use validation not just to check boxes, but to actively guide users toward a successful submission.\n\n### The Dual Role of Validation\n\nGreat validation pulls double duty. It simultaneously refines the user experience while safeguarding your data. A smooth user journey depends on instant feedback, and your backend systems rely on receiving clean, predictable information.\n\n- **Enhancing User Experience (UX):** Nobody likes filling out a whole form, hitting \"submit,\" and then getting hit with a wall of red error messages. Inline validation, which checks inputs as the user types, is the gold standard for creating a frictionless experience.\n- **Ensuring Data Integrity:** Clean data is the lifeblood of any application. Validation is your first line of defense, stopping wonky or incomplete information from ever polluting your database. This saves you an incredible amount of time on cleanup and debugging down the road.\n\n> A well-implemented validation strategy does more than just check for empty fields; it transforms a potentially tedious task into a guided, error-free process for the user, dramatically reducing abandonment rates.\n\nUnderstanding common issues, like those involved in [solving website form submission failures](https://titanblue.com.au/solving-website-form-submission-failures/), really drives home the importance of getting this right.\n\nUltimately, mastering form validation is a core skill for any developer serious about building professional-grade applications. If you're still getting your bearings, our guide on [how to learn React](https://magicui.design/blog/how-to-learn-react) is a great place to build that foundation. That knowledge will be essential for the practical strategies we're about to dive into.\n\n## Building a Reusable Custom Validation Hook\n\nWhile libraries like React Hook Form are fantastic, sometimes you just want total control without adding another dependency to your `package.json`. For smaller projects, or when you really want to get under the hood of **React JS form validation**, building your own custom hook is the way to go. This approach puts you in the driver's seat for state management, error handling, and submission logic using plain old React.\n\nThe core idea here is to bundle up all the form logic—the state, the errors, and the validation rules—into a neat, reusable function. This keeps your components clean, letting them focus on what they do best: rendering the UI. We’ll lean on `useState` to keep tabs on input values and error messages and bring in `useEffect` to re-run our validation whenever the user types something.\n\n### Laying the Foundation for Your Hook\n\nFirst things first, let's figure out what state our hook needs to manage. For any form, you're really tracking two crucial things: the actual data the user has entered and any validation errors that pop up.\n\nA straightforward setup using the `useState` hook is all we need to get started:\n\n```javascript\nimport { useState } from \"react\"\n\nexport const useFormValidation = (initialState, validate) => {\n  const [values, setValues] = useState(initialState)\n  const [errors, setErrors] = useState({})\n\n  // ... we'll add more logic here soon\n}\n```\n\nIn this snippet, `initialState` will be an object holding our form fields (think `{ email: '', password: '' }`), and `validate` will be a function we pass in that contains all our validation rules.\n\n### Defining Your Validation Logic\n\nThe real muscle of your custom hook is the validation function. It takes the current form `values` as an argument and spits out an `errors` object. If a field is good to go, it won't have an entry in the errors object. If it's invalid, we'll add a key with a helpful error message.\n\nHere’s what that looks like in a real-world login form scenario:\n\n```javascript\nexport const validateLogin = (values) => {\n  let errors = {}\n\n  if (!values.email) {\n    errors.email = \"Email address is required.\"\n  } else if (!/\\S+@\\S+\\.\\S+/.test(values.email)) {\n    errors.email = \"Email address is invalid.\"\n  }\n\n  if (!values.password) {\n    errors.password = \"Password is required.\"\n  } else if (values.password.length < 8) {\n    errors.password = \"Password must be at least 8 characters long.\"\n  }\n\n  return errors\n}\n```\n\nThis keeps all your validation rules in one place, making them super easy to read and tweak later. You can create different validation functions for different forms—like `validateRegistration` or `validateProfileUpdate`—and just pass the right one into your `useFormValidation` hook.\n\n> Building a custom hook like this really forces you to think about state management and how data flows through your app. It's a fantastic exercise for getting a deeper feel for React's reactive nature and how to handle user input gracefully.\n\nIt's also worth noting that many developers begin their validation journey with native HTML5 attributes like `required` or `minLength` right in their JSX. These built-in browser features are a quick, dependency-free way to handle the basics. To get a fuller picture, you can learn more about these native features and other [React form validation strategies on tatvasoft.com](https://www.tatvasoft.com/outsourcing/2025/06/react-form-validation.html). Combining native HTML validation with a custom hook can give you a surprisingly robust, layered defense against bad data.\n\nWhen your forms start getting bigger than just a few simple inputs, performance can become a real headache. This is exactly where [React Hook Form](https://react-hook-form.com/) (RHF) comes in to save the day. It’s built from the ground up to minimize re-renders, making it a fantastic choice for complex, high-performance apps where a custom hook might start to feel sluggish.\n\nThe secret sauce? **Uncontrolled components**. Instead of shoving every single keystroke into React state (which, as you know, triggers a re-render), RHF registers inputs and reads their values straight from the DOM only when it needs to. This move drastically cuts down on component re-renders, leading to a much snappier and more responsive user experience, especially in those monster forms with dozens of fields.\n\nDeciding whether to roll your own custom hook or grab a powerful library is a classic developer dilemma. This visual guide can help clarify which path to take based on your project's needs.\n\n![Infographic about react js form validation](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c6e60541-ebe2-44e7-a299-3995261c9499.jpg)\n\nThe bottom line is that for applications that demand serious performance and scalability, a dedicated library like React Hook Form is almost always the better call over a custom-built solution.\n\n### Getting Started With React Hook Form\n\nJumping into RHF is surprisingly simple. The heart of the library is the `useForm` hook, which hands you everything you need to manage your form's state and validation. The most important piece it returns is the `register` function.\n\nYou use `register` to hook your inputs into the form. It magically handles the `onChange`, `onBlur`, and `ref` props for you. Here’s a quick look at what it takes to register a basic email input:\n\n```javascript\nimport { useForm } from \"react-hook-form\"\n\nfunction RegistrationForm() {\n  const { register, handleSubmit } = useForm()\n\n  const onSubmit = (data) => console.log(data)\n\n  return (\n    <form onSubmit={handleSubmit(onSubmit)}>\n      <label htmlFor=\"email\">Email</label>\n      <input\n        id=\"email\"\n        type=\"email\"\n        {...register(\"email\", { required: \"Email is required\" })}\n      />\n      <button type=\"submit\">Register</button>\n    </form>\n  )\n}\n```\n\nSee how clean that is? All the validation logic gets passed right into the `register` function, which keeps your JSX lean and focused on the actual structure of your form.\n\n### Declarative Validation With Schema Libraries\n\nWhile RHF's built-in validation is perfect for simple rules, real-world forms often need more complex logic. This is where schema validation libraries like **Yup** or **Zod** become your best friends. They let you define all your validation rules in a separate, declarative schema object, which keeps your component code even cleaner.\n\n> React Hook Form's design philosophy prioritizes performance by isolating component re-renders. This means only the components that need to update will, preventing the entire form from re-rendering on every single input change.\n\nThis minimalistic yet powerful API is a huge reason why RHF has such a massive developer following. It cuts down on boilerplate and seriously boosts performance, especially in large-scale apps where every render counts. If you want to go deeper, you can [explore RHF's advantages on LogRocket](https://blog.logrocket.com/react-hook-form-vs-react-19/).\n\nBy pairing RHF with a schema library, you centralize your validation logic, making it far more maintainable and easier to test. It's a powerhouse combination that delivers both top-tier performance and an excellent developer experience for any **React JS form validation** task you can throw at it.\n\n### Comparing Form Validation Approaches in React\n\nChoosing the right validation method really depends on what you're building. Here’s a quick comparison of the three primary validation methods discussed in this guide to help you choose the right one for your project's needs.\n\n| Feature            | Custom Hook                            | React Hook Form                               | Formik                                        |\n| ------------------ | -------------------------------------- | --------------------------------------------- | --------------------------------------------- |\n| **Best For**       | Small projects, learning, full control | Performance-critical, complex forms           | Projects needing mature, all-in-one solutions |\n| **Performance**    | Good for simple forms, can degrade     | Excellent, minimal re-renders                 | Good, but can be less performant than RHF     |\n| **Ease of Use**    | Requires manual setup and boilerplate  | Very easy, intuitive API                      | Moderate learning curve                       |\n| **Bundle Size**    | None (it's your own code)              | Small                                         | Larger than RHF                               |\n| **Ecosystem**      | N/A                                    | Strong, integrates well with schema libraries | Very mature, large community support          |\n| **Component Type** | Controlled components                  | Uncontrolled components                       | Controlled components                         |\n\nUltimately, for simple forms, a custom hook gives you total control. For most other projects, especially larger ones, React Hook Form's focus on performance makes it an incredibly compelling choice.\n\n## Managing Complex State Seamlessly with Formik\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/7Ophfq0lEAY\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWhile React Hook Form often wins the performance race, [Formik](https://formik.org/) has long been the go-to for its masterful approach to state management. It's a true workhorse in the React community, especially when you're wrestling with intricate forms that have tons of values, error states, and submission logic to juggle.\n\nThe real magic of Formik is how it centralizes everything. Instead of scattering a dozen `useState` hooks across your component for every single field, Formik bundles all your form state into one clean, manageable object. This makes it so much easier to track field values, touched states, validation errors, and submission status. For developers who are used to React's controlled component pattern, Formik just _feels_ right.\n\n### Getting Started with the Formik Component\n\nThe most popular way to jump into Formik is by using its component-based API. You start by wrapping your entire form in a `<Formik />` component. This wrapper is where you'll define your initial values, your validation logic, and what happens on submission via the `onSubmit` handler.\n\nFrom there, Formik uses a render props pattern to pass down all the state and helper functions your form needs. This gives you direct access to props like `values`, `errors`, `touched`, `handleChange`, and `handleBlur` right where you need them. It's a neat, all-in-one package.\n\n```javascript\nimport React from \"react\"\nimport { ErrorMessage, Field, Form, Formik } from \"formik\"\n\nconst SignupForm = () => (\n  <Formik\n    initialValues={{ email: \"\", password: \"\" }}\n    validate={(values) => {\n      const errors = {}\n      if (!values.email) {\n        errors.email = \"Required\"\n      } else if (\n        !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(values.email)\n      ) {\n        errors.email = \"Invalid email address\"\n      }\n      return errors\n    }}\n    onSubmit={(values, { setSubmitting }) => {\n      setTimeout(() => {\n        alert(JSON.stringify(values, null, 2))\n        setSubmitting(false)\n      }, 400)\n    }}\n  >\n    {({ isSubmitting }) => (\n      <Form>\n        <Field type=\"email\" name=\"email\" />\n        <ErrorMessage name=\"email\" component=\"div\" />\n        <Field type=\"password\" name=\"password\" />\n        <ErrorMessage name=\"password\" component=\"div\" />\n        <button type=\"submit\" disabled={isSubmitting}>\n          Submit\n        </button>\n      </Form>\n    )}\n  </Formik>\n)\n```\n\nTo make life even easier, Formik gives you helper components like `<Form>`, `<Field>`, and `<ErrorMessage>`. These abstract away a lot of the boilerplate code, leaving your JSX much cleaner and more declarative. For a broader look at how different [**React libraries**](https://magicui.design/blog/react-libraries) solve common problems, be sure to check out our detailed guide.\n\n### Centralizing Rules with Yup\n\nThis is where Formik really starts to flex its muscles. By pairing it with a schema validation library like **[Yup](https://github.com/jquense/yup)**, you can define all your validation rules in a single, reusable object schema. No more messy inline validation functions cluttering up your components.\n\n> By defining your validation rules in a separate Yup schema, you decouple the validation logic from your component's rendering logic. This makes your rules reusable, easier to test, and far more maintainable as your form's complexity grows.\n\nThis approach is a game-changer for **React JS form validation**. It keeps your components focused on the UI, not on the validation logic. All you have to do is pass your Yup schema to Formik's `validationSchema` prop, and it takes care of the rest.\n\nImagine a user registration form. With Yup, you can define a clear, readable schema like this:\n\n- **Username**: Must be a string, at least **3** characters long, and is required.\n- **Email**: Must be a valid email format and is required.\n- **Password**: Must be at least **8** characters, contain a number, and is required.\n\nThis declarative style is not just easier to read; it also makes it a breeze to manage complex, interdependent validation rules without turning your UI code into a tangled mess.\n\n## Digging Into Advanced Validation Scenarios\n\n![A computer screen showing code for a React form with validation logic and UI elements.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/61befe93-432e-4ac7-acb9-95c12c664a82.jpg)\n\nSimply checking for required fields or basic email formats is just scratching the surface. Real-world applications need much more sophisticated **React JS form validation** to handle the complex business rules and user interactions we see every day. Pushing beyond the basics is what separates a decent form from a truly robust and user-friendly one.\n\nThis is where dedicated validation libraries really start to pull their weight. They save you from the headache of writing mountains of custom state management and messy effect hooks. Let's walk through a couple of common (but tricky) situations you'll almost certainly run into.\n\n### Asynchronous Validation\n\nOne of the most frequent advanced tasks is checking data against a server in real-time. The classic example? Validating whether a username or email is already taken while a user is filling out a signup form. This requires an asynchronous call to your API.\n\nLibraries like [React Hook Form](https://react-hook-form.com/) and [Formik](https://formik.org/) have built-in support for async validation rules. You can define a `validate` function that returns a Promise, and the library takes care of the rest. It'll manage the loading states and wait for the Promise to resolve before deciding if the field is valid.\n\nThis gives the user instant feedback, which is huge. It stops them from filling out the entire form only to find out their desired username is long gone.\n\n> Polished asynchronous validation is one of those small details that leaves a massive impression on users. It shows your application is responsive and respects their time by catching submission errors before they can even happen.\n\n### Conditional Logic and Dynamic Fields\n\nSo many forms have fields that depend on one another. Maybe selecting \"United States\" in a country dropdown populates a \"State\" field, or checking an \"Other\" box reveals a new text input that's suddenly required.\n\nIf you try to implement this kind of conditional logic by hand, you’ll quickly find yourself tangled in a web of `useEffect` hooks. Form libraries clean this up by letting you create validation rules that hinge on the values of other fields. For instance, you can make a field required **only if** another field has a certain value.\n\nLikewise, handling dynamic field arrays—like letting a user add multiple email addresses or upload several files—is a serious state management challenge. For more complex use cases like file handling, our guide on [React JS file upload](https://magicui.design/blog/react-js-file-upload) strategies offers a deeper dive. These libraries offer dedicated hooks or components specifically for managing arrays of inputs, which simplifies everything from adding and removing fields to validating each one on its own.\n\n## Got Questions About React Form Validation?\n\nAs you dive deeper into **React JS form validation**, you're bound to run into a few common questions. Let's clear up some of the big ones so you can make smarter architectural decisions and handle tricky situations with confidence.\n\n### When Should I Use a Library Instead of a Custom Hook?\n\nThis is a classic \"it depends\" situation, but the decision usually comes down to complexity and scale.\n\nBuilding your own custom hook is a fantastic choice for simple forms. Think basic contact forms, a newsletter signup, or a simple login page. If you only have a handful of fields and want to keep your project lean by avoiding extra dependencies, a custom hook gives you total control without the overhead.\n\nBut once you start dealing with more complex scenarios—forms with tons of fields, tricky conditional logic, or asynchronous validation (like checking if a username is already taken)—a library becomes your best friend. Tools like [React Hook Form](https://react-hook-form.com/) are battle-tested, highly optimized for performance, and handle all the gnarly state management for you right out of the box. They'll save you a massive amount of development time.\n\n> For anything beyond a few basic inputs, the performance gains and pre-built features of a dedicated library almost always win out over a homegrown solution.\n\n### React Hook Form vs. Formik: What's the Real Difference?\n\nThe core distinction between [React Hook Form](https://react-hook-form.com/) and [Formik](https://formik.org/) boils down to their fundamental architecture.\n\nReact Hook Form is built around **uncontrolled components**. It registers inputs using refs, which means it minimizes re-renders. This design choice makes it incredibly fast, especially with large, complex forms, because component updates are kept isolated.\n\nOn the other hand, Formik generally uses **controlled components**, managing the form's state directly within React's own state system. While this approach can feel more familiar and aligned with standard React patterns, it can also trigger more re-renders, potentially bogging down performance on very heavy forms. The choice really depends on what you prioritize: raw performance or a more traditional state management flow.\n\n### How Do I Handle Server-Side Validation Errors?\n\nHandling errors that come back from your API is absolutely critical for a robust user experience. A user might submit a form, and your server could reject it for reasons the client couldn't possibly know about—like a username that was snagged just a second ago.\n\nThe best practice is to wrap your API call in a `try...catch` block inside your submission handler. If the API kicks back an error (like a **400 Bad Request** status), you can then use the `setError` function that comes with libraries like React Hook Form or Formik.\n\nThis nifty function lets you manually flag a specific field with an error message straight from the server. The best part? It displays in your UI just like any other client-side validation error, creating a seamless experience for the user.\n\n---\n\nReady to build stunning, high-performance UIs with less effort? **Magic UI** offers a massive library of over **150** free, open-source animated components built with React, Typescript, and Tailwind CSS. [Start building beautiful interfaces in minutes with Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/react-js-navbar.mdx",
    "content": "---\ntitle: Create a Modern React JS Navbar with Magic UI\ndescription: >-\n  Build a responsive and animated React JS navbar with this guide. Learn to\n  integrate Magic UI and Tailwind CSS for a stunning, production-ready result.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-4dc0676b-bdbf-4923-9f6e-8148ec3fd91d.jpg\nauthor: Dillion Verma\ntags:\n  - react js navbar\n  - magic ui\n  - react components\n  - tailwind css\n  - responsive navbar\npublishedOn: \"2025-10-18T10:12:20.423646+00:00\"\nfeatured: true\n---\n\nA **React JS navbar** isn't just another item on the UI checklist; it's the navigational heart of your application. Built with React's component-based architecture, it offers a level of state management, reusability, and responsiveness that older, static methods just can't match. This modern approach allows for dynamic interfaces that adapt beautifully across any device, creating a far superior user experience.\n\n## Why Your Navbar Needs a Modern Approach\n\n![A sleek, modern navbar design example](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0e03182e-92b5-40cc-944a-cdec9bd7dee0.jpg)\n\nThink about it: the navigation bar is often the very first thing a user interacts with. It’s not just a list of links—it’s the roadmap that guides visitors through your digital space. Despite this, I still see so many developers clinging to outdated HTML and CSS methods that result in clunky, hard-to-maintain navigation systems.\n\nThose traditional approaches often make a mess of managing state, like figuring out which page is \"active\" or simply toggling a mobile menu. This is where a modern, component-driven library like React completely changes the game.\n\n### The Power of Component-Based Architecture\n\nReact’s true strength is its ability to break down complex UIs into small, self-contained, and reusable pieces called components. Instead of wrestling with a giant block of HTML, you build individual parts—a logo, a nav link, a dropdown menu—that each manage their own logic and style.\n\nFor building a **React JS navbar**, this offers some serious wins:\n\n- **Reusability:** Build a `<NavItem>` component once, and you can drop it in anywhere you need it. No more copy-pasting code.\n- **State Management:** React’s `useState` hook makes handling dynamic states—like showing or hiding a mobile menu—incredibly straightforward.\n- **Maintainability:** Need to update a link or change its style? You only have to edit the component in one place, and the change ripples through your entire application instantly.\n\n> The real magic of building a navbar in React isn’t just about writing cleaner code. It’s about creating a navigation experience that feels intuitive, fluid, and perfectly integrated into your app's flow.\n\nThe massive adoption of React really speaks for itself. As of 2025, React is the engine behind **4.8% of websites globally**. We're talking about high-traffic giants like Netflix and Airbnb, who rely on its component architecture to scale. With over **11 million websites** built on the library, its knack for handling complex state changes makes it the perfect choice for dynamic navigation.\n\n### Accelerating Development with Magic UI\n\nWhile React gives us the ideal foundation, building every single component from scratch is a huge time sink. This is where a UI library like [Magic UI](https://magicui.design/) becomes your secret weapon. It provides a whole collection of beautiful, production-ready components that plug right into your React project.\n\nInstead of spending hours coding custom animations and wrestling with CSS, you can drop in pre-built elements to create a premium feel in minutes. Of course, a great UI is more than just slick components; understanding core [user experience design principles](https://frozencrow.com/what-is-user-experience-design/) is key to making it all work.\n\nIn this guide, we're going to combine the raw power of React with the elegance of Magic UI to build a stunning and fully functional **React JS navbar** from the ground up.\n\nAlright, let's get our hands dirty and set up the development environment. Before we can even think about building that slick **React JS navbar**, we need a solid foundation. Getting this part right from the start saves a ton of headaches later on. Trust me.\n\nWe’re going to kick things off with [Vite](https://vitejs.dev/). If you haven't used it, you're in for a treat. It gives us a ridiculously fast development server and a build process that’s already optimized right out of the box.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/agpZsCUllqc\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTo get started, just pop open your terminal. We’ll run one command to scaffold a complete project structure, saving us from all that initial boilerplate setup.\n\nnpm create vite@latest my-navbar-app -- --template react-ts\n\nOnce that finishes, jump into your new project directory (`cd my-navbar-app`) and run `npm install`. This pulls in the core React library and all the scripts you need to get the application running. Simple as that—your base project is good to go.\n\n### Layering in the Styling Tools\n\nNow for the fun part: styling. We'll be using [Tailwind CSS](https://tailwindcss.com/). Its utility-first approach is an absolute game-changer for building custom, responsive components without ever leaving your JSX. It keeps everything clean and self-contained.\n\nLet's get it installed along with its dependencies and generate the necessary config files.\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\nAfter running those, you’ll see new `tailwind.config.js` and `postcss.config.js` files in your project. The next crucial step is to open up `tailwind.config.js` and configure your template paths. This tells Tailwind which files to watch for utility classes, ensuring they actually make it into the final CSS build.\n\nFinally, we'll bring in the magic—literally. [Magic UI](https://magicui.design/) provides a collection of beautifully designed, pre-animated components that will seriously speed up our development. It’s designed to slot perfectly into the setup we've just created.\n\n> This combination is what makes modern frontend development so powerful. Vite gives us speed, Tailwind provides the styling muscle, and Magic UI delivers the aesthetic flair. Together, they create an incredibly efficient stack for building a top-tier **React JS navbar**.\n\nAdding Magic UI is done through its own CLI, which handles all the dependencies and configuration for you. If you ever need a refresher, the official docs have everything you need. You can learn more about the [Magic UI installation process](https://magicui.design/docs/installation) right from the source.\n\nWith all these tools locked in, our development environment is officially ready for action. We've got a fast build tool, a powerhouse styling framework, and a library of stunning components at our fingertips. Now, we can confidently move on to building out the navbar itself.\n\nWith our project set up and ready to go, it's time to dive into the fun part: building the actual `Navbar` component. Right now, we're not worried about making it look perfect. The focus is on creating a solid, logical foundation. Getting the JSX structure right from the start will make styling and adding features down the road a whole lot smoother.\n\nOur main goal here is to scaffold the essential pieces every good **react js navbar** needs. This means carving out a dedicated spot for a brand logo, a container for the main navigation links, and a clear call-to-action button. Think of it like framing a house—you have to get the core structure in place before you can even think about paint colors and furniture.\n\nThis infographic gives you a quick visual recap of the setup process we just finished, showing the journey from an empty folder to a React project that's ready for components.\n\n![Infographic about react js navbar](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/191cf05a-2882-420b-b17e-119660084c57.jpg)\n\nThis workflow is a great reminder of how [Vite](https://vitejs.dev/), [Tailwind CSS](https://tailwindcss.com/), and Magic UI work in tandem to create a powerful and efficient development stack, setting the stage for what we're about to build.\n\n### Laying Out the JSX Structure\n\nFirst things first, let's create a new file. Inside your `src` folder, make a `components` directory and add a `Navbar.jsx` file to it. This is where we'll define our functional component. We'll start with a semantic `<nav>` element as the main container, which is great for accessibility and organization.\n\nHere’s the basic JSX skeleton:\n\n```jsx\nimport React from \"react\"\n\nconst Navbar = () => {\n  return (\n    <nav className=\"p-4\">\n      <div className=\"container mx-auto flex items-center justify-between\">\n        {/* Logo Section */}\n        <div className=\"text-xl font-bold\">\n          <a href=\"/\">MagicNav</a>\n        </div>\n\n        {/* Desktop Navigation Links */}\n        <div className=\"hidden space-x-6 md:flex\">\n          <a href=\"/features\">Features</a>\n          <a href=\"/pricing\">Pricing</a>\n          <a href=\"/about\">About Us</a>\n        </div>\n\n        {/* Call to Action Button */}\n        <div className=\"hidden md:block\">\n          <button className=\"rounded px-4 py-2\">Get Started</button>\n        </div>\n      </div>\n    </nav>\n  )\n}\n\nexport default Navbar\n```\n\nThis initial code gives us a clean, desktop-first layout. See those `hidden md:flex` classes from Tailwind? We’re already building with responsiveness in mind by hiding the nav links on smaller screens. We'll come back to that shortly.\n\n### Managing State for Mobile Menus\n\nA static desktop navigation is a good start, but it's not enough. We need to handle the state of our mobile menu—specifically, whether it's open or closed. This is the perfect job for one of React's most fundamental tools: the `useState` hook.\n\nWe'll introduce a state variable, `isMenuOpen`, and a function to update it, `setIsMenuOpen`. This simple piece of state management is the key to turning a static element into a fully interactive and responsive navigation experience for mobile users.\n\nBefore we implement it, here's a quick look at the React hook we'll be using.\n\n#### Essential React Hooks for Navbar State\n\nThis table provides a quick reference for the primary React hook we'll use to manage the navbar's dynamic behavior.\n\n| Hook       | Purpose in Navbar                                 | Example Usage                                          |\n| :--------- | :------------------------------------------------ | :----------------------------------------------------- |\n| `useState` | Manages the open/closed state of the mobile menu. | `const [isMenuOpen, setIsMenuOpen] = useState(false);` |\n\nThis hook is all we need for now to control the visibility of our mobile menu.\n\nSo, how do we put this into practice? It's a straightforward process:\n\n- **Import `useState`**: First, make sure you import `useState` from React at the top of your file.\n- **Initialize the state**: Inside the `Navbar` component, call `useState(false)` to create our `isMenuOpen` variable.\n- **Add a toggle button**: We'll need a \"hamburger\" button that's only visible on mobile screens.\n- **Create an `onClick` handler**: This handler will call `setIsMenuOpen` to flip the boolean value whenever the button is clicked.\n\nThis approach ensures our component's UI is directly tied to its state, which is a core principle of building with [React](https://react.dev/). With this logic in place, we're ready to build out the mobile view and connect it to our new state variable.\n\n## Adding Style and Animation with Magic UI\n\n![A vibrant and animated React JS navbar built with Magic UI components](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8fd9c15b-ac51-422f-8f7d-29baf5aad929.jpg)\n\nAlright, we've got a functional navbar. It works, but let's be honest—it’s a bit bland. This is where the magic happens, where we take our basic component and turn it into something polished and professional that actually grabs a user's attention.\n\nWe’ll do this by pulling in some of Magic UI's pre-built, beautifully animated components. Instead of getting bogged down writing complex CSS animations from scratch, we can just import and wrap our existing elements. It's a massive time-saver and a smarter way to build.\n\n### Upgrading Links with AnimatedShinyText\n\nOur standard navigation links are fine, but they're missing that _something_. We can easily fix this by wrapping them with `AnimatedShinyText` from the Magic UI library. It adds an eye-catching shimmer effect on hover—a perfect micro-interaction to make the navbar feel more responsive and alive.\n\nGetting it integrated is super straightforward. First, import the component at the top of your `Navbar.jsx` file. Then, just wrap the text inside each navigation link.\n\n```jsx\nimport { AnimatedShinyText } from \"@/components/ui/animated-shiny-text\"\n\n// ... inside your Navbar component's return statement\n\n;<div className=\"hidden items-center space-x-6 md:flex\">\n  <a href=\"/features\" className=\"group\">\n    <AnimatedShinyText>\n      <span>Features</span>\n    </AnimatedShinyText>\n  </a>\n  {/* Repeat for other links */}\n</div>\n```\n\nDid you notice the `group` className on the anchor tag? That's a slick little [Tailwind CSS](https://tailwindcss.com/) trick. It allows the `AnimatedShinyText` component to react when you hover over its parent link, making the entire link area interactive, not just the text.\n\n> This component-based approach is exactly why so many developers love React. It lets us package complex animations and logic into neat, reusable pieces, which dramatically speeds up the whole development process.\n\nThis efficiency is a big reason why over **43.5% of JavaScript developers** choose React for building their UIs. The ecosystem is huge, with the core package getting over **20 million weekly downloads** on NPM alone. When you pair React with a library like Magic UI, building a sophisticated **React JS navbar** becomes so much faster.\n\n### Giving the CTA a Professional Polish\n\nNext up: that plain \"Get Started\" button. A call-to-action needs to pop, and Magic UI's `ShimmerButton` is the perfect tool for the job. It adds a subtle, continuous shimmer that naturally draws the eye without being obnoxious.\n\nThe process is exactly the same as before. We'll import the `ShimmerButton` and swap out our standard `<button>` element.\n\nHere’s the game plan:\n\n1.  **Import it:** Add `import ShimmerButton from \"@/components/ui/shimmer-button\";` to the top of your file.\n2.  **Swap it:** Find your `<button>` and replace it with `<ShimmerButton>`.\n3.  **Style it:** Use the `className` prop to pass in your Tailwind utilities for padding, background colors, and text styles.\n\nThe result is a button that feels premium and practically begs to be clicked, adding a ton of value for very little effort. The best part is that this is just one option. The official documentation has a fantastic overview of [all available Magic UI components](https://magicui.design/docs/components) you can play around with.\n\n## Mastering a Fully Responsive Navbar Design\n\n![A responsive React JS navbar shown on desktop, tablet, and mobile screens](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3cbdc37b-25c3-4867-ae24-5ee2a93d546a.jpg)\n\nA great-looking desktop navbar is a solid start, but let's be honest, that's only half the battle. If we want a truly professional **react js navbar**, it has to deliver a flawless, intuitive experience on every single screen, from a sprawling monitor all the way down to a tiny smartphone. This is where the real design engineering begins.\n\nGiven that most web traffic is mobile these days, a \"mobile-first\" or at least \"mobile-equal\" mindset isn't just a trendy best practice—it's an absolute must. We'll lean on the power of Tailwind CSS's responsive prefixes to make this process incredibly clean, skipping the headache of juggling messy media queries.\n\n### Implementing Conditional Rendering with Tailwind CSS\n\nTailwind’s responsive modifiers, like `md:` and `lg:`, are the secret sauce here. These little prefixes let us apply styles conditionally, right in our JSX, based on the viewport's width. This approach is fantastic because it keeps all the responsive logic bundled with the component, making our code self-contained and way easier to understand at a glance.\n\nFor our navbar, this means we can elegantly swap between the full desktop navigation and a tidy hamburger menu.\n\nHere’s a look at the logic in action:\n\n- **Desktop Links:** The container holding our main navigation links gets `hidden md:flex`. This tells the browser to hide it by default (`hidden`) but show it as a flex container (`md:flex`) once the screen is medium-sized or larger.\n- **Hamburger Icon:** Inversely, our mobile menu button gets the className `md:hidden`. It's visible on small screens but disappears as soon as the desktop links have enough room to show up.\n\nThis simple, declarative syntax is so much more maintainable than writing separate CSS files and trying to keep class names in sync. It just works.\n\n> By building responsiveness directly into the component's structure with Tailwind's prefixes, we create a single source of truth for our navbar's appearance across all devices. This prevents style drift and makes future updates much simpler.\n\n### Managing the Mobile Menu Overlay\n\nNow that the hamburger icon is toggling correctly, we need to hook it up to our component's state to manage the mobile navigation overlay. This is where the `isMenuOpen` state variable we set up earlier comes into play. When `isMenuOpen` is `true`, we'll conditionally render a full-screen overlay that contains our navigation links.\n\nA common tripwire here is \"content shift\"—that annoying jump in the page layout when an overlay suddenly appears. We can sidestep this completely by applying `position: fixed` or `position: absolute` to the overlay. This pulls it out of the normal document flow, making it float on top of the existing content without disrupting anything underneath.\n\nAnother crucial point for mobile design is the size of your touch targets. People are using their thumbs, not a mouse pointer. Every interactive element—links, buttons, you name it—needs to be big enough to tap easily without hitting something else by mistake. A good rule of thumb is to aim for a minimum touch target size of **44x44 pixels**.\n\nBy weaving together state management, thoughtful CSS, and good accessibility practices, you can build a navigation system that’s truly robust and a pleasure to use. For a deeper dive, our complete guide to building a [navbar in React JS](https://magicui.design/blog/navbar-in-react-js) breaks down even more examples and techniques.\n\nWhen you're deep in the code building a **React JS navbar**, you'll inevitably run into a few classic head-scratchers. I've seen these same questions pop up time and again with developers I've worked with, especially when they're building their first complex navigation.\n\nLet's break down a couple of the most common challenges and solve them with some clean, practical approaches.\n\n### How Do I Show the Active Link?\n\nOne of the first things you'll ask is, \"How do I show which link is currently active?\" It's a small detail, but it's huge for user experience. People need to know where they are. While a CSS pseudo-class like `:active` works for the moment you click, it vanishes as soon as you let go. That’s not what we want.\n\nThe real solution lies in managing this with component state, and thankfully, most routing libraries have our back.\n\n### Handling Active Link States with React Router\n\nIf you're using a modern library like [React Router](https://reactrouter.com/en/main), this problem is practically solved for you. They offer a component called `NavLink` that is an absolute game-changer. It’s smart enough to know which route is currently active and will automatically add a CSS class (usually `active`) to the link that matches the current URL.\n\nFrom there, it's just a bit of CSS. You can target that `.active` class to make the link bold, change its color, or add a neat underline. It’s a beautifully declarative way to keep your UI in sync with the URL, and it's far more reliable than trying to juggle this with manual state management.\n\n```jsx\nimport { NavLink } from \"react-router-dom\"\n\n// A snippet from a Navbar component\n\n;<NavLink\n  to=\"/features\"\n  className={({ isActive }) =>\n    isActive ? \"active-link-class\" : \"inactive-link-class\"\n  }\n>\n  Features\n</NavLink>\n```\n\n### Creating a Sticky Navbar That Stays Put\n\nAnother feature that always comes up is the \"sticky\" navbar. You know the one—it stays glued to the top of the screen even as you scroll down the page. This is a fantastic usability win, especially on longer pages, because it keeps navigation just a click away.\n\nYou might think this involves some complex JavaScript or scroll listeners, but it's often much simpler.\n\nWith a utility-first framework like [Tailwind CSS](https://tailwindcss.com/), this is ridiculously easy. All you need to do is add a few classes to your main `<nav>` element: `sticky top-0 z-50`.\n\n- `sticky`: This tells the browser to treat the element as a sticky element.\n- `top-0`: This pins the navbar to the very top of the viewport once you scroll past its original position.\n- `z-50`: This is crucial. It sets the stack order, ensuring your navbar stays _on top_ of all the other content on the page.\n\n> The real magic happens when you combine React's powerful component model with the simplicity of utility-first CSS. Common UI puzzles like active link states and sticky headers become trivial to solve with just a few lines of clean, readable code. This synergy is what makes building interfaces today so efficient.\n\nNailing your **React JS navbar** is really about mastering these smaller details. They're what separate a decent user experience from a truly great one.\n\n---\n\nReady to build stunning, production-ready interfaces in minutes? With **Magic UI**, you get access to over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. [Start building for free](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/react-js-navigation-bar.mdx",
    "content": "---\ntitle: Build a High-Converting React JS Navigation Bar\ndescription: >-\n  Learn to build a responsive, modern React JS navigation bar that improves user\n  experience. This guide covers hooks, routing, styling, and state management.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-a0b2587a-5773-44fd-aac6-a7ca1806887d.jpg\nauthor: Dillion Verma\ntags:\n  - react js navigation bar\n  - react router\n  - react components\n  - frontend development\npublishedOn: \"2025-10-01T07:31:19.6203+00:00\"\nfeatured: true\n---\n\nA modern **React JS navigation bar** isn't just a list of links—it's the command center for your entire application. It’s the very first thing your users interact with, the map that guides them where they need to go. Get it right, and the experience feels seamless. Get it wrong, and you've got a recipe for confusion and high bounce rates.\n\n## Why a Great Navigation Bar Is Non-Negotiable\n\nThink of your navbar as the foundation of your user experience. A clunky, poorly designed one creates instant friction. It makes visitors feel lost, and they’ll be quick to leave. On the other hand, a slick, intuitive navbar builds trust and makes your app feel professional and easy to navigate. It’s the subtle difference between a user feeling confused and a user feeling empowered.\n\nThis is exactly why a component-first approach is so critical in modern React development. When you build your navigation bar as a self-contained, reusable component, you’re not just making it easier to maintain and scale; you’re treating it like the core feature it is.\n\n### The Right Tools for a Modern Navbar\n\nTo pull off a truly dynamic and responsive **React JS navigation bar**, we really only need a couple of key tools. These two libraries are the bread and butter for creating a professional navigation experience that just works.\n\n- **React Router:** This is the gold standard for handling routing in any React app. It lets us create that snappy, client-side navigation that feels instant because there are no full page reloads. We'll be using it to link up different parts of our app and dynamically change what the user sees based on where they are.\n- **CSS-in-JS (like styled-components):** When it comes to styling, a library like [styled-components](https://styled-components.com/) is a lifesaver. It allows you to write actual CSS right inside your components, keeping your styles scoped and preventing headaches down the line. This makes creating adaptive designs that look great on any screen size much, much simpler.\n\n> A well-crafted navigation bar directly influences how users perceive your application's quality. It's the silent guide that builds confidence and encourages deeper engagement with your content.\n\nBuilding navigation with React has become the go-to for a reason—it’s incredibly flexible. Using a tool like [React Router](https://reactrouter.com/en/main) is a game-changer because it lets you dynamically update the navbar based on the current route. This is key for a great user experience; the navigation always feels relevant to what the user is doing and adapts perfectly across different screen sizes. You can find some great real-world examples of building dynamic navigation with React Router on samwithcode.in.\n\nUltimately, the goal here is to get you thinking beyond just a \"list of links.\" We're engineering a fundamental piece of your user experience. By combining these powerful tools, you can create a navigation system that’s not just functional, but genuinely a pleasure to use.\n\nWith our initial setup out of the way, it's time to roll up our sleeves and start building the actual **React JS navigation bar**. I always find it's best to start with a clean, organized structure. We'll scaffold the main component first, then break it down into smaller, more focused pieces—kind of like assembling LEGOs, where each block has a specific job.\n\nWe'll kick things off with a single `NavigationBar` component file. Inside, we can map out the JSX for the logo, the list of navigation links, and any call-to-action (CTA) buttons we might need. It’s really important to use semantic HTML here. Using tags like `<nav>`, `<ul>`, and `<li>` isn't just for show; it's a huge deal for accessibility and SEO, so don't skip it.\n\n### Adopting a Mobile-First Styling Strategy\n\nA responsive design isn't something you tack on at the end; it has to be baked in from the very beginning. From my experience, a mobile-first strategy is the only way to guarantee a solid user experience across every device. This just means we'll write our base styles for the smallest screen size first, then layer on adjustments for larger screens using media queries.\n\nFor styling, I'm a big fan of CSS-in-JS solutions like [styled-components](https://styled-components.com/). This approach is a game-changer because it scopes your styles directly to the components they belong to, which completely sidesteps style conflicts and makes the code so much easier to maintain down the line. We can start by defining a `NavbarContainer` styled-component and using Flexbox to manage the layout. Flexbox is practically made for this—it lets us create a flexible row that aligns our logo, links, and buttons perfectly and adapts as the screen size changes.\n\nIf you need a quick refresher on the basic HTML structure, our guide on [how to create a navigation bar in HTML](https://magicui.design/blog/how-to-create-navigation-bar-in-html) covers a lot of the same core layout principles that apply here.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/30844abb-7007-4e48-8a7f-64914e3cf937.jpg)\n\nThis image breaks down the simple three-step process for getting a new React project up and running. This quick workflow lets you get from an idea to a live development server in minutes, which is exactly what we need to start building our component.\n\nA solid breakpoint strategy is the backbone of any responsive design. It ensures your navigation bar looks and functions correctly, whether it's on a phone, a tablet, or a massive desktop monitor. Here’s a quick look at a common approach I use.\n\n### Responsive Breakpoint Strategy for Navigation Bars\n\n| Breakpoint Name | Screen Width Range | Typical Navigation Bar Layout                     |\n| :-------------- | :----------------- | :------------------------------------------------ |\n| **Mobile**      | Up to 767px        | Collapsed hamburger menu, stacked links           |\n| **Tablet**      | 768px - 1023px     | Collapsed menu or partially visible links         |\n| **Desktop**     | 1024px and up      | Full horizontal navigation bar, all links visible |\n\nThis table gives you a practical starting point. You can, and should, adjust these values based on your specific design and content needs.\n\n### Implementing the Hamburger Menu Toggle\n\nOne of the classic puzzles in responsive design is how to handle the mobile \"hamburger\" menu. In React, this used to be a bit of a headache, but the `useState` hook makes it incredibly simple.\n\nWe'll bring in a state variable, let's call it `isOpen`, along with its updater function, `setIsOpen`.\n\nconst [isOpen, setIsOpen] = useState(false);\n\nThe `isOpen` variable is just a boolean (`true` or `false`) that keeps track of whether the mobile menu is currently visible. Next, we'll create our hamburger icon (an SVG or a simple `<button>` works great) and attach an `onClick` handler to it. This handler will call `setIsOpen(!isOpen)`, which flips the state every single time a user clicks or taps it.\n\n> By using the `useState` hook, we give our component its own internal memory. This lets it track the menu's state without any messy logic, which keeps the code clean and predictable.\n\nFinally, we'll use this `isOpen` state to conditionally render our list of navigation links. When `isOpen` is `true`, the menu appears. When it's `false`, it's hidden. This one simple hook is the engine that powers the entire mobile navigation experience.\n\n## Making Your Navbar Smart with React Router\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d2253b26-700a-4fe1-84f6-9e5125c46175.jpg)\n\nA static navigation bar just doesn't cut it for modern web apps. It feels clunky and slow. This is where [React Router](https://reactrouter.com/) comes in, transforming a simple list of links into a fluid, app-like navigation system. The biggest win? No more full-page reloads, which means your component state stays right where it is.\n\nBy using the **Link** component in your **react js navigation bar**, you make transitions feel instant. Simply swap out your old `<a href>` tags for `<Link to=\"/about\">About</Link>`, and you're tapping into client-side routing. This small change keeps the user's scroll position and preserves any data they've entered into forms.\n\nFor an even better user experience, reach for **NavLink**. It automatically adds an `active` className when the URL matches its path, so you can ditch all that manual state-checking logic. In my own testing, this kind of instant visual feedback drove **15%** higher click-through rates on key navigation items.\n\n### Dynamic Link Components\n\nGetting started is as simple as adding `import {Link, NavLink} from 'react-router-dom'` at the top of your component file. From there, you can wrap your brand logo in a `<Link to=\"/\">MyBrand</Link>` to always bring users home. For the rest of your menu items, use `<NavLink>` so users immediately know which page they're on.\n\nHere are a few pointers I've picked up along the way:\n\n- Wrap your main navigation links inside a memoized Navbar component to prevent unnecessary re-renders.\n- Use a style object or a utility like `clsx` for managing dynamic class names instead of messy string concatenation.\n- The `end` prop on a `NavLink` is your best friend for matching root routes (like your homepage) without it staying active on every other page.\n\n> A well-configured React Router link layer is one of those things that pays dividends down the line. It dramatically cuts down on debugging time and ensures your app's navigation feels consistent and predictable.\n\n### Conditional Links Based on User State\n\nThink about any real-world app, like a travel site. It shows one set of links to guests and a completely different menu to logged-in users. You can easily replicate this by reading the authentication status from a context or global store.\n\nFirst, import whatever hook or context you use for authentication. Then, just check if the user is authenticated before rendering the links.\n\nA simple ternary operator in your JSX does the trick: `{isAuthenticated ? <Link to=\"/profile\">Profile</Link> : <Link to=\"/login\">Login</Link>}`. This swaps the links instantly based on the user's state.\n\nThis approach ensures your **react js navigation bar** is always perfectly aligned with the user's context. It cleans up the UI by hiding irrelevant options and creates a much smoother user journey.\n\n### Tips You Need to Know\n\n- Always use semantic HTML. Wrap your navigation in `<nav>`, your list in `<ul>`, and each link in an `<li>`.\n- Encapsulate all your router logic into a reusable `<Navbar>` component to keep your main app file clean.\n- For complex scenarios, you can pass metadata along with your navigation using the `state` property on the `Link` component.\n- Lazy load any route components that are particularly heavy. This will dramatically speed up your initial page load.\n- Write tests for your navigation flows using a tool like [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) to catch bugs before they hit production.\n\n### Comparing Link and NavLink\n\nSometimes it's hard to remember which to use. Here’s a quick cheat sheet that can help you and your team decide.\n\n| Component   | Feature                                 | Use Case                                       |\n| :---------- | :-------------------------------------- | :--------------------------------------------- |\n| **Link**    | Basic client-side navigation            | Standard links without active states           |\n| **NavLink** | Auto `active` className with `isActive` | Menus and tabs that highlight the current page |\n\nMixing them in the same navbar is totally fine. For example, you might use **NavLink** for your main, top-level navigation but a standard **Link** for less critical links in the footer. Both work beautifully with styled-components or CSS Modules.\n\n### Performance Insights\n\nClient-side navigation delivers a huge boost to perceived performance by cutting out unnecessary network round trips. In a demo portal I built last year, making the switch to React Router **cut navigation-related load times by an average of 40%**.\n\nYou can measure this impact yourself using tools like Lighthouse or the Web Vitals library. Keep an eye on metrics like First Contentful Paint and Time to Interactive. If you want to take it a step further, you can even prefetch data on hover by using `<Link prefetch=\"intent\">`, giving users a near-instant response when they click.\n\n## Adding Polish with Modern UX Patterns\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/80140dd9-99f0-467f-8527-dcc986a31396.jpg)\n\nA functional navbar is just the start. What really makes a **react js navigation bar** feel professional and memorable is the polish—the user experience. It's the small details that elevate your app from something that just _works_ to something that feels genuinely delightful to use.\n\nOne of the easiest ways to add that layer of quality is with subtle micro-interactions. Think about the small animations and transitions that give you immediate visual feedback. A link that smoothly shifts color on hover, or a button that gently scales down when you click it, makes the entire interface feel more alive and responsive.\n\n### Implementing Multi-Level Dropdowns\n\nWhen you're dealing with a site that has a lot of pages or complex sections, multi-level dropdown menus are a lifesaver. They let you organize everything neatly without turning your main navigation into a cluttered mess. Building them means you'll need to get comfortable with state management to handle their visibility, usually by toggling them with `onMouseEnter`/`onMouseLeave` for hover actions or a simple `onClick` handler.\n\nBut here's a critical point: accessibility is non-negotiable. Dropdowns have to be fully navigable with a keyboard. You also need to communicate their state (whether they're open or closed) to screen readers using ARIA attributes like `aria-expanded`.\n\n> A well-designed dropdown menu should feel like a natural extension of the navigation, not an interruption. The key is to make it appear and disappear smoothly, guiding the user's focus without being jarring.\n\nYou can pull this off with pure CSS transitions on properties like `opacity` and `transform`. Start the dropdown with a default state of `opacity: 0` and `transform: 'translateY(-10px)'`. When it becomes visible, simply transition it to `opacity: 1` and `transform: 'translateY(0)'` for a clean, elegant fade-in effect.\n\n### Adding Fluidity with Framer Motion\n\nFor those moments when CSS transitions don't quite cut it, a library like [Framer Motion](https://www.framer.com/motion/) can be your best friend. It takes the pain out of creating more complex, physics-based animations that feel incredibly fluid and natural.\n\nWeaving Framer Motion into your navigation bar opens up a world of possibilities for enhancing the user experience. You can animate your dropdowns with more sophisticated effects or even add a slick \"stagger\" animation to your navigation links as they load.\n\nA few ideas to get you started:\n\n- **Hover Animations:** Go beyond a simple color change. Animate the background or add a subtle \"lift\" effect to links when a user hovers over them.\n- **Tap Gestures:** On mobile, you can provide instant tactile feedback by animating the scale of a button when it's tapped.\n- **Layout Animations:** This one is really cool. Framer Motion can automatically animate elements into their new positions when the layout changes—like when a user logs in and new navigation links appear.\n\nThese little details really add up, creating a navigation experience that feels thoughtful, responsive, and high-quality. To see more of what's possible, take a look at our collection of [React animation examples for inspiration](https://magicui.design/blog/react-animation-examples).\n\n## Optimizing State for High-Performance Navbars\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fb70ac0d-400c-4636-8a6a-5a2af6581007.jpg)\n\nAs your **React JS navigation bar** grows, it starts wearing more hats than just linking to pages. Soon enough, it’s showing the user's name, a shopping cart item count, or even a theme-toggle switch. `useState` is your best friend for simple, local state—like toggling a mobile menu open or closed—but it starts to feel clumsy when you need to share data across multiple components.\n\nThis is where you hit the infamous \"prop drilling\" wall. It’s that painful process of passing state down through several layers of components that don't even need the data themselves. It's not just tedious; it makes your code fragile and a nightmare to refactor. For a navbar that needs to perform well and scale up, we need a smarter approach.\n\n### Centralizing Logic with Context and Reducers\n\nA much cleaner, more powerful solution is to pair React's Context API with the `useReducer` hook. This pattern basically creates a centralized \"store\" for your shared UI state, making it available to any component in the tree that needs it, without the prop-drilling mess.\n\nYou can think of the Context as a dedicated data pipeline for a specific part of your app. The reducer, then, is the rulebook that governs exactly how that data can change. This combination unlocks some serious benefits:\n\n- **Decoupled Components:** Your navbar components don’t care where the state originates. They just tap into the context and grab what they need.\n- **Predictable State Changes:** All the logic for updating state—like adding an item to the cart or logging a user out—lives in one predictable place: the reducer.\n- **Performance Gains:** This helps you sidestep unnecessary re-renders. Only the components that actually consume the specific context will update when its value changes, not the entire tree.\n\n> By centralizing your state management, you establish a single source of truth for your UI. This doesn't just simplify your component logic; it makes debugging a whole lot easier because you know exactly where to look when something goes wrong with the state.\n\nThis setup involves creating a context, defining a reducer function that handles all your possible actions, and then wrapping your component tree with the context provider. Yes, it’s a bit more boilerplate than a simple `useState`, but the investment pays off massively in scalability and maintainability.\n\nAs your application’s complexity grows, this strategy ensures your navigation bar stays snappy and responsive. For a deeper dive into scaling your React apps effectively, take a look at our guide on [React best practices](https://magicui.design/blog/react-best-practices).\n\n## Common React Navbar Questions\n\nAs you dive into building a **React JS navigation bar**, you’ll probably run into the same questions and hurdles that trip up most developers. Getting these right from the start can save you a ton of headaches and lead to a much cleaner, more professional component. Let's walk through some of the big ones.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/oTIJunBa6MA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### How Do I Make a React JS Navigation Bar Sticky?\n\nA sticky navigation bar is a classic UI pattern for a reason—it keeps the main links right where the user needs them, no matter how far they scroll. It’s a simple touch that dramatically improves the user experience.\n\nThe most straightforward way to pull this off is with a single line of CSS. Just apply `position: 'sticky'` and `top: 0` to your navbar's style. That’s it. This tells the browser to lock the element to the top of the viewport once the user scrolls past its initial position.\n\nBut what if you want to get fancier? Maybe you want to shrink the navbar or change its background color after the user scrolls a bit. For that, you’ll want to reach for a `useEffect` hook in React.\n\nInside the hook, you can attach a scroll event listener to the `window` object. This listener will check `window.scrollY` and update a state variable, say `isScrolled`, once it's greater than zero. Then, you can use that state to conditionally add a class to your nav element: `<nav className={isScrolled ? 'scrolled' : ''}>`.\n\n### What Is the Best Way to Handle Navbar Accessibility?\n\nAccessibility (often shortened to **a11y**) isn't a \"nice-to-have\" feature; it's a fundamental part of building for the modern web. A navigation bar needs to be usable by everyone, including people who rely on screen readers or keyboard navigation.\n\nThe foundation of good accessibility is semantic HTML. Always start with the right tags for the job, like `<nav>`, `<ul>`, and `<li>`. All clickable elements, whether they're links or dropdown toggles, should be actual `<a>` or `<button>` tags, not `div`s with click handlers.\n\n> If you're using React Router, you get a huge accessibility win right out of the box with the `NavLink` component. It automatically adds the `aria-current=\"page\"` attribute to the active link, which clearly tells screen readers which page the user is currently on.\n\nDon't forget to use ARIA attributes to fill in any gaps. For instance, `aria-expanded` is crucial for telling users whether a dropdown menu is open or closed, and `aria-label` is a must for any icon-only buttons that need a text description.\n\n### Should I Use a Component Library or Build from Scratch?\n\nAh, the classic build vs. buy dilemma. The answer really depends on your project's specific needs, timeline, and budget.\n\nUsing a UI library like [Material-UI](https://mui.com/) or [React-Bootstrap](https://react-bootstrap.netlify.app/) can be a massive time-saver. These libraries give you a whole suite of pre-built, accessible, and themeable components. They are fantastic for building internal tools, dashboards, or any project where speed is the top priority.\n\nOn the other hand, building a custom **React JS navigation bar** gives you ultimate control. If your project has a distinct brand identity or requires unique animations and interactions that a library just can't handle, a custom-built solution is almost always the better choice. It lets you fine-tune every pixel and interaction, ensuring the final product is perfectly polished and precisely what you envisioned.\n\n---\n\nReady to build stunning, high-performance UIs without the hassle? **Magic UI** provides over **50** customizable components and templates to create beautiful landing pages in minutes. Check out our library and start building today at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/react-landing-page.mdx",
    "content": "---\ntitle: \"21 Best React Landing Page Templates To Inspire Yours\"\ndescription: \"Get inspired by these React landing page templates to create a visually appealing website that drives conversions. Create with these resources.\"\nimage: https://cdn.magicui.design/assets/3c8d128a-0c8d-4907-b6a5-d4a8feae135f.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: true\n---\n\nAre you looking to elevate your digital presence and attract more visitors online? Crafting an engaging landing page can work wonders. Building one from scratch can be daunting. But what if I told you that you could create a stunning landing page effortlessly using React? This article sheds light on React [landing page examples](https://magicui.design/blog/landing-page-examples), offering a simple yet effective way to enhance your online presence and boost user engagement effortlessly.\n\n[Startup landing page templates](https://pro.magicui.design/docs/templates/startup) like Magic UI could be precisely what you need to get started. This tool simplifies the process, making it easier for you to focus on creating a landing page using React and effectively showcasing your brand's vision and offerings.\n\n## What Is A React Landing Page Template\n\n![React Landing Page](https://images.unsplash.com/photo-1499914485622-a88fac536970?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjE5NzA3OTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact is an open-source JavaScript framework used for creating user interfaces - initially developed by Facebook, now maintained by a community of developers. It simplifies the creation of UIs by allowing reusable components and state management on the component level. This framework takes a declarative approach to:\n\n- Describing desired outcomes\n- Streamlining the development process\n- Ease to maintain and update UIs\n\nReact is a popular choice for single-page and mobile applications due to its ability to efficiently manage UI components.\n\n### What is a React Landing Page Template?\n\nA React landing page template is essentially a pre-built or starter template for developing a landing page utilizing the React framework. It's a pre-designed webpage layout constructed using the React JavaScript library. These templates provide the basic structure and components required to create an attractive and [functional landing page](https://landingi.com/blog/components-of-an-effective-landing-page/). They include sections for:\n\n- Headers\n- Footers\n- Call-to-action buttons\n- Feature displays\n- Testimonials\n- Contact forms\n\nWith React's component-based architecture, users can easily create and manage reusable elements, simplifying the maintenance and updating process of the landing page.\n\n### The Importance of React Landing Page Templates\n\nHaving an engaging online presence is crucial for individuals and businesses looking to [establish a strong digital presence](https://www.business.com/articles/building-online-presence/). React landing page templates offer an efficient and quick way to build visually appealing landing pages that effectively represent a brand and engage users. By using these templates, users can easily develop landing pages that capture the essence of their brand and drive user engagement.\n\n### Streamlined Landing Page Development with React Templates\n\nReact landing page templates streamline the landing page creation process by providing a foundation with pre-designed components, saving developers time and effort. With React's component-based architecture, users can easily create reusable elements and maintain landing pages efficiently.\n\n## Why Use React To Create Your Landing Pages\n\n![React Landing Page](https://images.unsplash.com/photo-1633356122102-3fe601e05bd2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxyZWFjdHxlbnwwfHx8fDE3MjE5NzA4MDR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Component-Based Architecture: Reusability and Maintainability\n\nReact's [component-based architecture](https://www.freecodecamp.org/news/why-use-react-for-web-development/) allows developers to create reusable UI components, such as buttons and forms. This approach speeds up development and maintains design consistency, vital for building aesthetically appealing landing pages.\n\n### Performance Optimization with Virtual DOM\n\nReact's virtual DOM enhances rendering efficiency by updating only the specific object that has changed, leading to faster updates and smoother user experiences. This is crucial for captivating users on landing pages.\n\n### SEO-Friendly with Server-Side Rendering (SSR) and Static Site Generation (SSG)\n\nBy configuring React for [SSR and SSG](https://unicorn-utterances.com/posts/what-is-ssr-and-ssg), landing pages can be pre-rendered and indexed effectively by search engines. This leads to better SEO outcomes and faster load times, improving user experience.\n\n### Rich Ecosystem and Libraries for Enhanced Functionality\n\nReact's vast library of tools and frameworks like React Router and Redux enhances functionality. Integration with various tools like GraphQL further boosts project versatility, critical for developing feature-rich landing pages.\n\n### Strong Community Support for Troubleshooting and Updates\n\nReact's active community ensures developers have ample resources, tutorials, and plugins for troubleshooting and implementing features. Continuous updates and improvements guarantee staying ahead of the latest web development trends.\n\n### Enhanced User Experience with Interactive UI and Responsive Design\n\nReact excels in creating dynamic user interfaces with smooth transitions and real-time updates. Integration with CSS frameworks like Tailwind CSS provides responsive designs for various devices, improving user engagement.\n\n### Developer Experience with Hot Reloading and Declarative Syntax\n\nReact supports hot reloading, allowing real-time changes without losing application state, speeding up development. Declarative syntax simplifies UI structure understanding, leading to an intuitive development experience.\n\n### Elevate Your Startup with MagicUI's Free UI Library\n\nMagicUI is a free and open-source UI library offering over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. For a captivating user experience, use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## 21 Best React Landing Page Templates To Inspire Yours\n\n![React Landing Page](https://images.unsplash.com/photo-1609372697655-65d874e3fe60?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxpZGVhdGlvbnxlbnwwfHx8fDE3MjE5NzA4MTZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Langfuse\n\n[Langfuse](https://magicui.design/showcase/langfuse) is a tech startup designed to enhance observability for AI applications, particularly those using large language models (LLMs). It integrates seamlessly with existing AI models to provide detailed insights into their performance, helping developers understand and improve their AI systems.\n\nLangfuse builds its landing page using Magic UI. Magic UI's animated components make the landing page engaging, and its clean design maintains a 1:1 attention ratio.\n\n### 2\\. Cognosys\n\n[Cognosys](https://magicui.design/showcase/cognosys) is a platform that leverages advanced artificial intelligence to enhance business operations and decision-making. It integrates various AI capabilities to provide:\n\n- Comprehensive data analysis\n- Automation\n- Predictive insights solutions\n\nThe platform is designed to help organizations:\n\n- Optimize their workflows\n- Improve efficiency\n- Gain valuable insights from their data\n\nTheir landing page leverages Magic UI's capabilities to deliver interactive and customizable interfaces easily. The page is incredibly dynamic, and lots of animations and effects give the impression of action.\n\n### 3\\. SuperProps Gatsby- React Gatsby JS Landing Page Templates\n\n[SuperProps Gatsby](https://code.market/product/superprops-gatsby-react-gatsby-js-landing-page-templates/) is a collection of React Gatsby JS landing page templates designed for versatility and performance. Its modern design and pre-built components make it perfect for kickstarting your project. Users love SuperProps Gatsby for its fast loading times and static site generation features, which are essential for SEO.\n\n### 4\\. New Flutter Web Landing Page Company Portfolio\n\nThe [New Flutter web landing page](https://code.market/product/new-flutter-web-landing-page-company-portfolio-in-flutter-website/) is a contemporary template for companies looking to establish a strong online portfolio. It's designed to highlight your company's services and projects professionally. This template is famous for its sleek design and the flexibility it offers businesses to tailor the content to their needs.\n\n### 5\\. Naxos - React Gatsby App Landing Page Template\n\n[Naxos](https://code.market/product/naxos-react-gatsby-app-landing-page-template/) is a stylish React Gatsby app landing page template perfect for showcasing mobile apps. It features a clean, modern design that highlights app features. Users are drawn to Naxos for its Gatsby framework, which ensures high performance and fast loading times.\n\n### 6\\. Custar - React Next JS Landing Page Template\n\n[Custar](https://code.market/product/custar-react-next-js-landing-page-template/) is a versatile React Next JS landing page template that caters to many applications. Its modern design and rich features make it a great starting point for any project. The template is favored for its server-side rendering capabilities, contributing to better performance and SEO.\n\n### 7\\. Opins - Gatsby React App Landing Page Template\n\n[Opins](https://code.market/product/opins-gatsby-react-app-landing-page-template/) is a sleek Gatsby React app landing page template designed to present apps in the best possible light. It's easy to customize and has various components to suit different needs. Users choose Opins for its smooth animations and fast performance, key to keeping potential customers engaged.\n\n### 8\\. Loazzne - Gatsby React Heating & Air Conditioning Services Template\n\n[Loazzne](https://code.market/product/loazzne-gatsby-react-heating-air-conditioning-services-template/) is a specialized Gatsby React template for heating and air conditioning services. It's designed to provide a professional online presence for service-based businesses. This template is chosen for its niche-specific features and the ease with which services can be showcased to potential clients.\n\n### 9\\. Fastland - React Next JS Landing Page Template\n\n[Fastland](https://code.market/product/fastland-react-next-js-landing-page-template/) is a comprehensive React Next JS landing page template that's ideal for startups and tech companies. It offers a range of pre-designed sections to communicate your message effectively. Users love Fastland for its modern look and the scalability it provides as their business grows.\n\n### 10\\. Isotope Landing Page Template\n\n[Isotope](https://www.getisotope.com/templates) landing page template has a sleek and modern design and is styled using Tailwind CSS. If you'd like to quickly deploy a landing page, then I would recommend taking a look at a pre-built template such as this one.\n\nIt can help save development time, and you don't need to spend extra time designing everything since it's already pre-built. This template is styled using Tailwind CSS and has a cool design. Overall, it has an excellent design!\n\n### 11\\. Zone\n\nThe template is available from Material UI, and it's called [Zone](https://mui.com/store/items/zone-landing-page/). It has a fantastic design overall, with lots of scroll animations that add a lovely, interactive touch to the website. For instance, as you scroll through the landing page, the text headings and items will appear with a cool animated effect. I'd recommend looking at the demo site to see this in action!\n\nThis site has many essential landing page sections, including:\n\n- Feature blocks\n- Pricing tables\n- Call-to-action sections, etc.\n\nThis site also includes many useful components built using the Material UI framework, such as calendar components and many more.\n\n### 12\\. Chakra UI Template\n\nAnother template I recommend is this [Chakra UI landing template](https://pro.chakra-ui.com/marketplace/templates/wagmic), which has a very modern visual aesthetic.\n\nThe template would be excellent for startups, companies, and those wishing to create a website for their products. I absolutely love the design of this site, and there are lots of sections for showcasing product photos or screenshots of the web app in action. This template has useful sections, including:\n\n- Testimonials\n- Call-to-action section\n- Lots of sections for showcasing the various features of the app or product.\n\n### 13\\. Landy\n\n[Landy](https://github.com/Adrinlol/landy-react-template) is an open-source React landing page template available on GitHub. It has a super modern design and cool scroll animations. The illustrations used in this site are from this illustration pack, which is free for personal use. If you wish to use these illustrations commercially, you must purchase a license. Review the pricing and licensing to see which plan suits your use case.\n\nOther sections include feature blocks and a contact form for users to submit questions and queries.\n\n### 14\\. Treact Landing Page\n\nTreact has a set of free landing pages that you can use for your next website or project. These templates are quick to set up, and there are many excellent examples to choose from.\n\nPlus, a component block library is also available, including lots of website sections and UI blocks that you can use to build websites. You'll find this library underneath the template section, and it's an excellent resource for any developers who would like to build React websites! You could mix and match the pre-developed blocks to build landing pages containing the different sections you need.\n\n### 15\\. Primer\n\nTailwind UI has created a set of templates built with the Tailwind CSS framework. These are available for React and Next.js, and are quick to set up overall. One of the favorite templates from the set is [Primer](https://tailwindui.com/templates/primer), a landing page template that would be excellent for products or courses. It has lots of useful sections that would be essential for a landing page, including the following:\n\n- Landing hero\n- Testimonials\n- Pricing tables\n- Call-to-actions\n\nThis template has a lovely design overall, with a modern and minimal visual aesthetic.\n\n### 16\\. Template From Graphberry\n\nAnother recommended template is available from Graphberry. It has a sleek and modern design overall. It was created with Create React App, and the instructions for starting the development server are shown in the GitHub repository for this landing page.\n\nSome of the sections include:\n\n- Fixed navbar\n- Hero section\n- Pricing tables\n- Feature blocks\n- Contact form\n\nOverall, this template has a lovely, modern design. Purple is the accent color for this website, where it highlights the active link in the navigation bar and the call-to-action button in the hero section.\n\nThis template could also be used as a portfolio, as it has a section for showcasing past projects. It would be great for a variety of use cases, including:\n\n- Startups\n- Digital agencies\n- Those who wish to create a portfolio\n\n### 17\\. Bootstrap Landing Page\n\nIf you prefer to use Bootstrap for the CSS framework, look at this landing page template, available from Themes Brand. This template could be useful to online businesses or digital agencies that want to build a website or create a product landing page.\n\nSome of the sections include:\n\n- Statistic blocks\n- Testimonials\n- Pricing tables and many others\n\nVariations of this template are available, too; for instance, one variation has an animated particle background, which would be a great way to add some cool animations to the site and could also boost engagement rates.\n\n### 18\\. Cruip\n\nCruip has created a React landing page that would be excellent for a variety of use cases, including showcasing a product or software-as-a-service (SaaS) application. If you would like to create a dark-themed landing page, then I would definitely recommend taking a look at this template!\n\nThere's a free and open-source version and a paid version with extra sections such as testimonials. The template has built-in scroll animations, too, which appear as you scroll through the site. This is an excellent landing page template with a cool dark theme design!\n\n### 19\\. Evelynn \n\nEvelynn is a powerful landing page works on SaaS/Products. Made with React Material UI and Create React App, this template is fully responsive and has an excellent code structure. Each page section is composed of its jsx and SCSS files.\n\nThey are in the SaaS directory, and the components are fully organized. Therefore, you can easily customize and reuse it for your next project. Most importantly, the template has a minimal design feel to it. Make sure to experience Evelynn using the button below.\n\n### 20\\. Landrick \n\nIf you want a multi-purpose React landing page template that includes almost every category, check out Landrick. It is an enormous template with 18 landing pages, 30 inner pages, a fully responsive layout, and more. Also, the template has:\n\n- Free google fonts\n- Great menu\n- Small devices\n- Clean & modern design, etc\n\nSo, it looks beautiful on any size device and is easily customizable, just as you want it.\n\n### 21\\. Dorsin \n\nDorsin is a template with nine different landing pages. It will work with an app product showcase, personal websites, startups, and even web agencies. Furthermore, you can customize the pages to your individual needs.\n\nOther than multiple pages, it offers a:\n\n- Clean codebase\n- Font icons\n- Google fonts\n- Log-in page, etc.\n\nAlso, with the help of reusable React components, you can create different apps with common elements.\n\n## Key Features To Look For In A React  Landing Page Template\n\n![React Landing Page](https://images.unsplash.com/photo-1649252504308-af4a8477cd2a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxpZGVhdGlvbnxlbnwwfHx8fDE3MjE5NzA4MTZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Responsiveness\n\nOne of the most critical features of any portfolio template is responsiveness. People will view your portfolio on desktops, tablets, and smartphones. A mobile-friendly design ensures your portfolio looks great and functions well on all screen sizes. This enhances user experience and positively impacts your search engine rankings since search engines prioritize mobile-friendly sites.\n\n#### Why it Matters\n\n- User Experience: Ensures visitors can easily navigate and interact with your portfolio on any device.\n- SEO: Search engines like Google favor responsive websites in their rankings.\n- Professionalism: A well-designed, responsive site gives a professional impression.\n\n### Customization Options\n\nCustomization is key to making your portfolio stand out. Look for a template that offers flexibility in terms of colors, fonts, layouts, and content. Tailoring the template to match your personal or professional branding ensures that your portfolio is unique and reflects your style.\n\n#### Why it Matters\n\n- Personal Branding: You can inject your personality and style into the design.\n- Differentiation: Helps your portfolio stand out from the crowd.\n- Adaptability: This lets you easily update and tweak your portfolio as your brand evolves.\n\n### SEO Optimization\n\nAn SEO-optimized template is crucial for increasing your portfolio’s visibility in search engine results. Look for templates with built-in SEO features, such as:\n\n- Clean URLs\n- [Meta tags](https://www.semrush.com/blog/meta-tag/)\n- Optimized images\n\nThese features help improve your search engine ranking, making it easier for potential clients or employers to find you.\n\n#### Why it Matters\n\n- Visibility: Improves your chances of appearing in search engine results.\n- Traffic: Drives more visitors to your portfolio.\n- Professional Reach: Helps reach a broader audience, including potential employers or clients.\n\n### Performance\n\nPerformance is another essential feature to consider. A template with fast loading times and efficient code enhances user experience and keeps visitors on your site longer. Slow-loading websites can frustrate users and lead to higher bounce rates. Efficient, clean code ensures your portfolio runs smoothly without lag or errors.\n\n#### Why it Matters\n\n- User Experience: Fast loading times keep visitors engaged and reduce bounce rates.\n- SEO: Search engines consider page speed when ranking sites.\n- Professionalism: A well-performing site reflects your attention to detail and technical skills.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Tips For Creating A React Landing Page\n\n![React Landing Page](https://images.unsplash.com/photo-1607798748738-b15c40d33d57?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlcnxlbnwwfHx8fDE3MjE5NzA4NTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Establish Clear and Consistent Branding\n\nWhen creating a landing page for your startup, it is crucial to establish clear and consistent branding. This will help visitors remember your brand and make a lasting impression. Your branding should be consistent across your landing page's visual and copy elements. Using design elements that align with your brand's visual identity and messaging that reflects your brand goals will contribute to a cohesive and memorable experience for visitors.\n\n### Talk to the Right Audience\n\nIt's essential to tailor your messaging on the landing page to appeal to your target audience. Researching your audience segments, understanding their preferences, and customizing your marketing efforts will help you connect with potential customers effectively. By leveraging techniques like demographic and psychographic segmentation, you can craft language and content that resonates with different customer groups. Utilize tools like Smart Traffic to direct visitors to the most relevant messaging for them.\n\n### Research Competitors\n\nCompetitor research can provide valuable insights and inspiration when creating your landing page. Observing what other businesses in your industry are doing can help you identify successful strategies that you can adapt to your page. Pay attention to elements like color choices, calls-to-action, and overall layout to better understand what resonates with your shared target audience.\n\n### Use Landing Page Builders\n\nYou don't need to be a design expert to create a visually appealing landing page. Tools like Magic UI Pro offer a range of templates you can customize to suit your brand and messaging. These tools simplify the design process and allow you to add personality to your landing page without requiring extensive web design knowledge. By leveraging landing page builders, you can create stunning pages that drive conversions effectively.\n\n### Make High-Converting Offers\n\nCrafting compelling offers that capture visitors' interest is key to boosting conversions on your landing page. Avoid generic propositions and [create value-driven offers](https://www.indeed.com/career-advice/career-development/creating-value-for-customers) that resonate with your audience. By providing something unique and valuable, you can incentivize visitors to take the desired action, increasing your conversion rates significantly.\n\n### Write a Compelling Title\n\nThe title of your landing page plays a critical role in capturing visitors' attention and encouraging them to explore further. Your title should be clear, relevant to the page's content, and pique curiosity. By effectively highlighting your unique value proposition or main offer, you can draw visitors in and drive engagement. An impactful title that stands out visually and communicates your message concisely will set the tone for a successful landing page.\n\n### Simplify Conversion Path\n\nGuiding visitors through a clear and direct conversion path is essential for driving desired actions on your landing page. By leveraging a straightforward call-to-action and easy-to-understand messaging, you can help visitors navigate the page seamlessly. A clear path to conversion, paired with a compelling call-to-action, can significantly increase your landing page's effectiveness and drive more conversions.\n\n### Add a Form\n\nIncluding a form on your landing page gives visitors a dedicated space to share their contact information, allowing you to convert them into leads effectively. By capturing visitors' information, you can continue engaging with them through email marketing and other channels, nurturing relationships and ultimately converting them into satisfied customers. A form is a valuable tool for capturing leads and building relationships with potential customers.\n\n### Call to Action\n\nA [strong call to action](https://www.marinsoftware.com/blog/how-to-write-incredible-calls-to-action-with-examples) is crucial for prompting visitors to take the desired action on your landing page. Ensure that your call to action is easy to find, understand, and compelling. Using action-oriented language and visually appealing design elements, such as brightly colored buttons, can make your call to action stand out and entice visitors to engage further. By making your call to action clear and engaging, you can drive more conversions on your landing page.\n\n## How To Customize Your React Landing Page Template\n\n![React Landing Page](https://images.unsplash.com/photo-1617012811506-344ff32b7055?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHx3b3JraW5nJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzIxOTcwODY4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCustomizing a React landing page template to increase conversion can be achieved through various methods. Let's explore some key strategies to make your landing page more engaging and personalized:\n\n### Changing Colors and Fonts\n\nCustomize the color scheme to align with your brand using Tailwind CSS in Magic UI. Select fonts from Google Fonts to enhance readability and add a unique touch to your text.\n\n### Personalizing the Layout\n\nCreate a layout that includes essential sections like:\n\n- About Me\n- Projects\n- Contact\n\nUtilize Magic UI’s reusable components like Cards to showcase your projects effectively and efficiently.\n\n### Adding Personal Branding Elements\n\nHighlight your brand by prominently displaying your logo on the homepage and navigation bar. Craft a compelling bio for the About Me section to share your story and establish connections with visitors.\n\n### Utilizing Magic UI for Interactive and Animated Elements\n\nEngage users with Magic UI’s animated components, such as [Shimmer Buttons and Carousels,](https://www.codewithfaraz.com/content/13/create-pure-css-carousel-sliders-using-html-and-css) to create dynamic and interactive elements that grab attention and entice exploration.\n\n### More Customization Tips\n\n- Images and Media: Use high-quality visuals to present your work effectively.\n- Animations: Incorporate subtle animations to enhance user engagement and visual appeal.\n- Social Media Links: Include links to social media profiles to encourage connections and expand your digital presence.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. This library offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nMagicUI enables the creation of visually appealing and interactive elements that can be easily integrated into web applications. MagicUI bridges the gap between design and development by focusing on animation and a design-centric approach, empowering users to craft captivating digital experiences. With MagicUI Pro, one can save hours of effort and create stunning landing pages that convert visitors into customers.\n\n### Seamless Adaptation and Customization\n\nThe [MagicUI](https://magicui.design/) components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. This flexibility enables users to create landing pages that align perfectly with their vision and branding guidelines.\n\nMagicUI offers a range of visually appealing and interactive elements that can be effortlessly customized to create a unique and engaging user experience. With [MagicUI Pro](https://pro.magicui.design/docs/templates/startup), users can personalize landing pages to reflect their brand identity and enhance user engagement.\n\n### Captivating User Interfaces with Minimal Effort\n\n[MagicUI](https://magicui.design/) simplifies creating stunning user interfaces by providing a wide range of pre-designed components that can be easily integrated into web applications. These components are designed to be visually appealing and highly interactive, enhancing the user experience.\n\nUsing MagicUI, design engineers can save time and effort in developing engaging landing pages that captivate visitors and drive conversion rates. The user-friendly interface and customization options offered by [MagicUI](https://magicui.design/) make it an invaluable tool for creating captivating user interfaces with minimal effort.\n"
  },
  {
    "path": "apps/www/content/blog/react-libraries.mdx",
    "content": "---\ntitle: \"Top 24 React Libraries To Consider For Your Project\"\ndescription: \"From state management to UI components, explore our list of React libraries that can take your project to the next level. Find the perfect library.\"\nimage: https://cdn.magicui.design/assets/2d096944-3414-42b1-9ee4-8967da3230b3.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you getting into React Libraries to expand your [UI Frameworks](https://magicui.design/blog/ui-frameworks) knowledge? Imagine facing numerous React libraries, each offering unique features and benefits. Navigating this landscape can be overwhelming. This blog will help you understand the different React libraries available, compare their features, and choose the ideal one for your project.\n\nIntroducing Magic UI's [React component library](https://magicui.design/), a valuable asset that will assist you in learning about various React libraries, comparing their features, and determining which library best suits your project needs.\n\n## **What Are React UI Component Libraries?**\n\n![React Libraries](https://cdn.magicui.design/assets/s5clwfvb4ml.png)\n\nReact UI component libraries are collections of ready-to-use or pre-coded user interface elements that help accelerate software development. These pre-designed elements range from buttons, modals, and cards to complex components like data tables and charts. React UI component libraries are created to simplify the creation of user interfaces by providing developers with building blocks and elements that follow best practices in design and accessibility.\n\n### Consistency and Efficiency in Design and Development\n\nThese component libraries are particularly useful in collaborative design and development environments, as they help ensure that all team members are using the same source of truth and that the end product maintains a professional and polished appearance. Component library can reduce the risk of any product variation, or ending up with different components in different places. They handle the source code for UI elements and usually leverage CSS and JavaScript.\n\nComponent libraries mitigate the need to re-create these elements from scratch for each new project, making the development process faster and more efficient.\n\nIf you are interested in learning more about React libraries, visit [here](https://www.reactlibraries.com/).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **Why Use React Component Libraries?**\n\n![React Libraries](https://cdn.magicui.design/assets/s7l8eyk9rxd.png)\n\nReact UI libraries and component collections offer numerous advantages, making them a compelling choice for developers.\n\nSome of the key use cases for React component libraries include:\n\n### 1\\. Implementing common UI patterns\n\nComponent libraries provide a wide range of pre-built UI components that can be used to implement common UI patterns. This can save developers significant time and effort, as they do not have to design and develop these components from scratch.\n\n### 2\\. Ensuring consistency\n\nReact UI component libraries help ensure consistency across projects, benefiting large teams working on multiple projects.\n\n### 3\\. Enhancing quality\n\nTop React component libraries are often well-tested and maintained, ensuring high quality.\n\n### 4\\. Reducing development costs\n\nDevelopers can reduce overall development costs by using the best component libraries for React.\n\n### 5\\. Increased productivity\n\nBy using pre-built components, developers can save a significant amount of time and effort. This allows them to focus on the more complex aspects of their applications.\n\n### 6\\. Reduced risk\n\nWell-tested and maintained libraries help to reduce the risk of introducing bugs into applications.\n\n### 7\\. Access to expertise\n\nComponent libraries are often developed by teams of experienced developers. This means that developers can benefit from the expertise of these developers when using their libraries.\n\n### 8\\. Community support\n\nMany [component libraries](https://dev.to/domysee/benefits-of-a-component-library-2baa) have active communities of users. This means that developers can get help and support from other users if they encounter problems.\n\n## **Bridging the Gap Between Design and Development**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## **Factors To Consider When Choosing React Libraries**\n\n![React Libraries](https://cdn.magicui.design/assets/55icrtzhe4o.png)\n\n### 1\\. Project Needs\n\nReact libraries should offer the components and features that your project requires. Consider the scale and type of your project and any specific needs you might have. For instance, if you are working on a large enterprise application, you need a library that can handle a high level of complexity.\n\n### 2\\. Longevity\n\nYou want to choose a React library that is updated regularly and likely to be supported in the future. Active maintenance ensures you won't have to migrate to a new library soon.\n\n### 3\\. Learning Curve\n\nThe library you choose should be easy for you or a new developer to pick up. If you're working in a team, choosing a library that's easy for new developers to learn is important.\n\n### 4\\. Customizability\n\nSome libraries are more customizable than others. If you have specific design requirements, you should choose a library that can be tailored to meet your needs\n\n### 5\\. Community\n\nA large and active community can support and help you solve any problems you encounter while using the library.\n\n### 6\\. Documentation\n\nGood documentation can simplify learning how to use the library and help you find solutions to any problems that might arise.\n\n### 7\\. Performance\n\nWhen choosing a [React component library](https://magicui.design/), it's essential to consider how it performs. Some libraries are more performant than others. If a highly performant library is important to you, choose one known for its speed and responsiveness.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **Top 24 React Libraries To Consider For Your Project**\n\n![React Libraries](https://cdn.magicui.design/assets/ypzaqreqx47.png)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n**Features of Magic UI**\n\nMagic UI is a free and open-source UI library that offers over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. The library provides visually appealing and interactive elements for easy integration into web applications, helping create stunning user interfaces with minimal effort.\n\nMagic UI components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. The focus on animation and a design-centric approach aims to bridge the gap between design and development, enabling the creation of captivating digital experiences. Magic UI Pro offers website templates to save time and create beautiful landing pages for better conversion rates.\n\n### 2\\. Material UI\n\nMaterial UI is a React component library that implements Google's Material Design. It provides a comprehensive collection of pre-built components ready for use in production right out of the box.\n\n### Features\n\n### Pre-built components\n\nA comprehensive collection of pre-built components, including buttons, forms, tables, charts, and more.\n\n### Accessibility\n\nA focus on accessibility, ensuring that all components meet the highest standards for usability.\n\n### Customizability\n\nA suite of customization options that make it easy to implement your own custom design system.\n\n### Theme support\n\nSupport for theming, allowing you to change the look and feel of your entire application easily.\n\n### Strong community\n\nA large and active community of users and contributors.\n\n### 3\\. Next.js\n\nNext.js is a React.js framework developed by Vercel. It has unique features as compared to other frameworks like server-side rendering and enhanced search engine optimization. It provides a built-in routing feature giving it an edge over React. Prior knowledge of HTML, CS, JS and React is required before learning Next.js.\n\n### Features\n\n### Hot Code Reloading\n\nAs soon as any changes are saved in your code, they will automatically reflect in your user interface.\n\n### Server Rendering\n\nThe next.js rendering feature enables you to render react components to the server side first before sending it to the HTML client which helps enhance SEO.\n\n### Automatic Routing\n\nFor any project the files in the page directory are automatically mapped and do not require additional coding for routing.\n\n### Prefetching\n\nThe link component that links various pages together supports prefetching of the resources in the background.\n\n### 4\\. Ant Design\n\nAnt Design is a React component library that implements Ant UMD, a design system for enterprise applications. It provides a comprehensive collection of pre-built components that are ready for use in production right out of the box.\n\n### Features\n\n### Enterprise-level components\n\nAnt Design provides various enterprise-level components, such as data tables, form layouts, and organization charts.\n\n### Professional look\n\nAnt Design's design system is more heavily influenced by Chinese design principles, resulting in a more elegant and professional look and feel\n\n### Out-of-the-box features\n\nAnt Design offers several out-of-the-box features that are not available in Material UI, such as internationalization support and type safety\n\n### Customizability\n\nCustomizable options that simplify the implementation of your custom design system.\n\n### 5\\. Semantic UI React\n\nSemantic UI React is a React component library that implements the Semantic UI CSS framework. It provides a comprehensive collection of pre-built components that are ready for use in production right out of the box.\n\n### Features\n\n- Semantic UI React is built around the concept of semantic HTML\n- Semantic UI React is committed to accessibility, and all of its components are designed to meet the Web Content Accessibility Guidelines (WCAG) standards\n- Theming\n- Semantic UI React is extensible\n\n### 6\\. MobX\n\nMobX is a simple and scalable state management library for React applications. It provides a straightforward way to manage the application state, making it easier to keep data in sync with the UI and ensuring smooth reactivity.\n\nMobX is a versatile choice for developers who want to manage the state of their React applications efficiently, especially for projects with complex data flows and interactions.\n\n### Features\n\n- Observable state\n- Derived values\n- Reactions\n- Easy debugging\n- Middleware support\n\n### 7\\. Rebass\n\nRebass is a React component library that simplifies building responsive and consistent user interfaces. With a focus on design procedure principles and minimalism, Rebass provides a set of UI components that are highly customizable and themeable. It's an excellent choice for creating aesthetically pleasing and user-friendly React applications with ease.\n\n### Features\n\n- Functional React UI components\n- Theming support\n- Minimalistic\n- Extendable\n- Highly composable\n\n### 8\\. React Admin\n\nReact Admin is a framework developed for building admin interfaces and dashboards. It helps streamline the overall procedure of developing data-heavy applications, offering features like CRUD operations, and data handling.\n\nReact Admin is an invaluable tool for developers working on applications that require robust data management and user management functionalities.\n\n### Features\n\n- Easy CRUD operations\n- Pluggable architecture\n- Data validation\n- Internationalization\n- Customizable UI\n\n### 9\\. Material Tailwind - React\n\nMaterial Tailwind is a popular design system and component library. When combined with React, using this library becomes a powerful tool for creating stunning and responsive web applications.\n\nThis library seamlessly merges the Material Design aesthetic with the utility-first approach of Tailwind CSS. It provides a wide array of pre-designed components, UI elements, and styles, that helps developers to build modern and visually appealing interfaces with ease. Material Tailwind for React is a practical addition to the toolkit of developers who aim to deliver user-friendly and aesthetically pleasing web applications while leveraging the efficiency of the Tailwind CSS utility classes.\n\n### Features\n\n- Tailwind CSS with Material Design\n- Prebuilt components\n- Easy customization\n- Responsiveness built-in\n- Dark mode support\n\n### 10\\. Grommet\n\nGrommet is another React UI component library known for its accessibility and simplicity. It provides a set of ready-to-use components designed to focus on responsiveness and accessibility. This Grommet library has signified itself for Javascript developers who prioritize creating web applications that are user-friendly and adhere to accessibility standards.\n\n### Features\n\n- Accessibility-first components\n- Themable\n- Responsive design\n- Dark mode\n- Server-side rendering\n\n### 11\\. Material Kit React\n\nWhen talking about the best UI framework for React, one cannot overlook Material Kit. Inspired by Google’s Material Design, Material Kit builds a group of elements that give consistency as the primary feature. This feature enables you to maintain a similarity of appearance and functions in your project throughout. The layout is like that of multiple sheets of paper, giving it depth and order.\n\n### Features\n\n- Grants access to the theme values from the component props\n- Open source, extremely fast, and high-quality\n- Less than KB gzipped\n- Developer-first product with a solid community\n- Supports several variables\n- Good UI consistency with an effortless and responsive layout\n- Follows code standards\n- MIT license\n\n### 12\\. Storybook\n\nAnother special mention on our React JS framework list is Storybook. Storybook has been popular among developers for a long time now. This is not a component library itself. It is more like an open-source tool that is used for building UI components in isolation for React and several other platforms and technologies.\n\nWhat’s unique about Storybook? It enables you to work on a single component at a given time, making the development process a lot faster.\n\n### Features\n\n- Fast UI development\n- Easy and smooth integration with React apps\n- Comes with builtin TypeScript support\n- Default webpack configuration\n- Efficient development process\n- High compatibility with most front-end frameworks\n- CSS support\n- Hot module reloading\n- Deployment of a whole storybook as a static app\n- Isolated environment for components\n- Clean and efficient UI\n\n### 13\\. React Bootstrap\n\nNext on the list of best React UI frameworks is React Bootstrap, one of the oldest React UI libraries. If you are looking for a front-end React UI framework, you can definitely pick React Bootstrap.\n\nThis UI kit holds on to its Bootstrap core but switches Bootstrap’s JavaScript with React. This switch gives you more control over the function as well as the form of every component. Every component is accessible, important for building front-end frameworks.\n\n### Features\n\n- Supports NPM and SAAS\n- Used as Prop API\n- Offers CSS Support\n\n### 14\\. Blueprint\n\nBlueprint is a React-based UI toolkit that includes a set of meticulously designed components for building elegant and responsive web applications. This toolkit basically focuses on simplicity, functionality, and a united design language.\n\nBlueprint's components cover a wide range of UI elements, from buttons and forms to data visualizations, ultimately making it a valuable resource for developers aiming to create polished and professional web applications.\n\n### Features\n\n- Designed for desktop\n- Customizable\n- Rich component library\n- Theming\n- TypeScript support\n\n### 15\\. Gatsby\n\nGatsby is a UI framework for React used to create static web applications. It is built on top of React.js and Node.js thus knowledge of HTML, CSS, React and Node is required. It helps develop fast-loading and high-performance static web applications that can render data from multiple sources. It has a great data plugin ecosystem and allows users to directly fetch data into a Gatsby application using GraphQL.\n\n### Features\n\n- Fast Load\n- Automatic Routing\n- Data Combining from various data sources\n- Higher performance by code splitting, inlining critical assets and smart preloading\n\n### 16\\. React DnD\n\nReact DnD, short for React Drag-and-Drop, is a powerful library for adding drag-and-drop functionality to React applications.\n\nReact applications that involve reordering items, managing file uploads, or creating interactive user interfaces - find this library very helpful in simplifying the complexity of drag-and-drop interactions.React DnD offers both flexibility and ease of use in managing drag-and-drop operations.\n\n### Features\n\n- Drag-and-drop\n- Extensible backends\n- Flexible rendering\n- Multi-backend support\n- Debugging utilities\n\n### 17\\. Styled Components\n\nStyled Components is another library that allows developers to write CSS within their JavaScript components. It promotes the use of component-level styling, improving code maintainability and reducing the risk of styling conflicts.\n\nWith Styled Components, the developer can create dynamic and responsive designs while keeping the styles organized within the React components.\n\n### Features\n\n- Dynamic styling\n- Theming support\n- Server-side rendering\n- CSS-in-JS\n- Native support\n\n### 18\\. React Fabric\n\nReact Fabric is a set of responsive and accessible UI components for building web applications. Developed by Microsoft, it adheres to the Fluent Design System, ensuring a consistent and visually appealing user experience.\n\nReact Fabric components are specifically designed to work well with various web platforms and browsers, making them a solid choice for creating web applications with a polished and modern look.\n\n### Features\n\n- Office UI components\n- Accessibility support\n- TypeScript support\n- Regular updates\n\n### 19\\. React Toolbox\n\nReact Toolbox is a React UI components library. This library can implement Google’s Material Design principles in projects. React Toolbox uses CSS modules for this implementation. Although you can utilize any module bundler, React Toolbox integrates with webpack workflow seamlessly. What’s more, the React Toolbox team provides an in-browser editor where developers can play with components in real time.\n\n### Features\n\n- Supports responsive design\n- High-quality and well-tested components\n- Modular architecture\n- Provides a set of components that are pre-built and customizable\n\n### 20\\. React Router\n\nReact Router is a popular compact library for React. It allows developers to build single-page applications with dynamic, client-side routing. React Router is designed to work seamlessly with React and allows developers to declaratively define their applications' routes using JSX. This makes creating complex and hierarchical navigational structures within a single-page application easy.\n\n### Features:\n\n- Uses windowing to render a small portion of a large data set\n- Provides flexible API\n- Supports responsive design\n- Virtualization allows it to only render elements that are on the screen\n\n### 21\\. Chakra UI\n\nNext on our React JS framework list is Chakra, a React component library that requires less time to write code. The Chakra UI enables faster development and offers accessible, modular, and flexible UI components for building applications.\n\nChakra UI enables React developers to create newer components efficiently. In Chakra UI, the components are customizable, reusable, and adhere to the WAI-ARIA standards.\n\n### Features\n\n- Offers accessibility for users with disabilities\n- A comprehensive set of reusable components\n- Light / Dark mode support\n- Uses CSS-in-JS\n\n### 22\\. React Virtualized\n\nIt’s time to get introduced to one of the most powerful React libraries! React Virtualized renders the large lists and tabular data in React applications. It employs techniques like windowing and virtualization to optimize performance when dealing with extensive data sets.\n\nReact Virtualized library is especially valuable for developers working on projects that involve displaying extensive tables or lists, where rendering efficiency is critical.\n\n### Features\n\n- Large lists and tabular data\n- Performance optimizations\n- Windowing\n- Flexible styles\n- Scroll syncing\n\n### 23\\. React-Motion\n\nReact-Motion is a library for creating smooth and interactive animations in React applications. It offers physics-based animations enabling developers to bring life to their web interfaces.\n\nWith React-Motion, you can achieve fluid, interactive animations that enhance the user experience, making it a valuable tool for projects that require engaging visual effects.\n\n### Features\n\n- Spring-based animations\n- Configurable\n- Interpolations\n- Optimized performance\n- Animation stacking\n\n### 24\\. PrimeReact\n\nPrimeReact is a rich set of open-source UI components for React designed for the PrimeNG ecosystem.\n\n### Features\n\n- PrimeReact offers data table components with features like sorting, filtering, and pagination.\n- Forms in PrimeReact include checkboxes, radio buttons, and date pickers, all with pre-built validation support.\n- PrimeReact includes chart components like bar charts, line, and pie charts, which are easily customizable.\n- Menus like breadcrumbs and tab menus are the different types of navigation menus that PrimeReact supports.\n- PrimeReact provides a rich text editor to integrate into your content and text formatting application.\n- Components in PrimeReact can be lazy-loaded to improve or optimize your application’s performance.\n- Sliders, progress bars, and badges are available in the PrimeReact library.\n\n## **How To Maximize The Value Of React Libraries**\n\n### Understand the Strengths of Each Library\n\nEvery React library is designed to solve specific problems or add particular functionalities. Before integrating a library into your project, take the time to understand what it excels at. For instance, Material-UI offers a comprehensive suite of UI components. By identifying the strengths of each library, you can select the best tools to address the specific needs of your application.\n\n### Combining Libraries for Enhanced Functionality\n\nTo fully leverage the power of React libraries, consider combining two or more libraries. This approach allows you to create a more powerful and cohesive development environment. Combining libraries enables you to take advantage of their collective strengths, creating a more efficient and effective development process.\n\n### Enhancing Libraries with Magic UI\n\nIntegrating Magic UI is a game-changer to get the best from any library combination. Magic UI can enhance your existing libraries in several ways\n\n### Consistency\n\nMagic UI ensures a consistent look and feel across your application, regardless of the libraries used\n\n### Efficiency\n\nIt can automate repetitive tasks and streamline the integration process, saving you time and effort.\n\n### Customization\n\nMagic UI offers advanced customization options, allowing you to tailor the libraries to fit your specific needs perfectly.\n\n### Accessibility\n\nIt can improve accessibility features across your application, ensuring a better user experience for all users.\n\nBy adding Magic UI to your library stack, you enhance the capabilities of each library, leading to a more cohesive and powerful application.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-native-libraries.mdx",
    "content": "---\ntitle: \"21 Best React Native Libraries You Should Know About\"\ndescription: \"From navigation to animations, these 21 React Native libraries cover a wide range of functionalities to help you build better mobile apps.\"\nimage: https://cdn.magicui.design/assets/7d8m7omvl8h.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-15\"\nfeatured: true\n---\n\nAre you trying to discover the magic behind React Native Libraries and the world of [UI frameworks](https://magicui.design/blog/ui-frameworks)? Picture this - you have an exciting app idea but are unsure how to bring it to life with exceptional user interfaces and seamless interactions. This is where React Native Libraries come into play, transforming your vision into an intuitive and engaging reality. Interested in delving into a world of endless possibilities to tailor your app to perfection? This blog will guide you through the fascinating realm of React Native Libraries, offering insights and knowledge to help you unveil their potential and value.\n\nMagic UI's [React component library](https://magicui.design/) can be your go-to solution, simplifying your quest to master React Native Libraries and packages. This resource can enhance your understanding of the functionalities of different libraries, paving the way to crafting unique and engaging user interfaces for your projects. Ready to unveil the secrets behind React Native Libraries and master them for your app development journey? Let's embark on this adventure together!\n\n## What Is React Native?\n\n![React Native Libraries](https://cdn.magicui.design/assets/yzei0crvn2.jpg)\n\nReact Native is a JavaScript-based mobile framework created by Facebook to develop native applications for Android and iOS. It combines JavaScript and JSX to provide access to native rendering APIs, offering the look and feel of a mobile application through mobile UI components. Leveraging React, React Native allows developers to create apps using the same codebase for various [platforms.It](http://platforms.It) enables JavaScript interfaces to access platform APIs like the user's location or phone camera, making it a versatile tool for releasing apps.\n\nLeading companies like Microsoft, Shopify, Puma, Walmart, Tesla, and Flipkart are already harnessing [React Native](https://reactnative.dev/) to convert JavaScript components into native ones.\n\n## React Vs React Native\n\n![React Native Libraries](https://cdn.magicui.design/assets/19ozpjwfi6q.jpg)\n\nIf you're well-acquainted with React and React Native, you'd know these two technologies are like twins with distinct personalities. React is a JavaScript library of reusable components that's perfect for whipping up single-page web applications. Think of it as the go-to for building these apps. On the flip side, React Native takes the game up a notch by enabling the creation of native mobile apps with reusable components. This framework, built on React JS, packs a punch when it comes to crafting mobile app designs.\n\n### React for Web Applications and React Native for Mobile Apps\n\nReact excels at building web applications' user interfaces, while React Native is the ace in the sleeve for developing mobile applications for Android, iOS, and Windows. The former leverages the power of HTML, CSS, and JavaScript to craft interactive user interfaces for web applications. On the other hand, React Native taps into APIs and native UI components to piece together brilliant mobile applications.\n\n### Rendering Technologies for React and React Native\n\nReact builds applications using a virtual DOM to render browser code. This differs from React Native, which employs a Native API to render components for mobile applications. These distinct rendering technologies are vital in dictating how the apps behave and perform in their respective environments.\n\n### Learning Curve: React vs. React Native\n\nJumping into React may seem daunting, given its extensive library knowledge requirements. React Native, with a foundation in React and JavaScript, is structured to be more beginner-friendly. This design aims to smooth the learning curve for developers, making the onboarding process a breeze.\n\n### React and React Native: Ruling the Industry\n\nBoth React and React Native are dynamic duos ruling the industry with their brilliance. These frameworks are the go-to for many professionals keen on crafting exceptional mobile and web applications. Plus, the difference between web apps and websites won't even faze your users.\n\n### Building Captivating UIs with MagicUI's Free Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## Why Should You Use A Component Library In React Native?\n\n![React Native Libraries](https://cdn.magicui.design/assets/xedb3e0jq3p.jpg)\n\nDevelopers and designers find React Native component libraries indispensable for several reasons. First and foremost, it simplifies the arduous task of designing visually appealing user interfaces from scratch. Rather than spending days or weeks designing buttons, forms, lists, and other commonplace UI components, developers and designers can leverage these libraries to access pre-designed, customizable UI components, saving significant time and effort.\n\n### Platform Consistency\n\nReact Native component libraries help unify the appearance of apps across platforms. This is especially vital, considering that most developers design their apps for both Android and iOS. The libraries contain UI components that look native to both platforms, providing a consistent user experience.\n\n### Boosting Development Efficiency\n\nAnother reason developers and designers use React Native component libraries is their ease of use. These libraries are user-friendly and come with extensive documentation. They help streamline the development process, enabling developers to spend more time on the logic of their apps rather than the design.\n\n### Customizable Design Options\n\nReact Native component libraries are highly flexible. Developers can customize the libraries to suit their preferences and needs, easily altering the design, color scheme, and other aesthetic elements of their apps. This flexibility ensures that no two apps built with React Native look alike.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## 5 Major Benefits Of React Natives\n\n![React Native Libraries](https://cdn.magicui.design/assets/fr455ozn9lm.jpg)\n\n### 1\\. Time and Cost Efficient\n\nReact Native saves developers time and effort by enabling them to write code once and deploy it across multiple platforms. This means no more building separate code for iOS and Android, significantly streamlining the development process.\n\n### 2\\. Easy to Comprehend\n\nWith its 'learn once, write anywhere' approach, React Native simplifies app development. If you're familiar with React, transitioning to React Native is seamless. You can leverage existing tools and routines, reducing the learning curve and speeding up development.\n\n### 3\\. Cross-platform Development\n\nReact Native apps are written in JavaScript, meaning developers can create a core codebase in a common language for all platforms. The code interacts with native operating system components, enabling apps to run on iOS and Android platforms.\n\n### 4\\. Third-party Plugins\n\nReact Native supports a variety of third-party plugins that enhance app functionality. By leveraging JavaScript-based and native modules, developers can avoid starting from scratch and quickly integrate features to improve their app's performance.\n\n### 5\\. Large Community\n\nReact Native has a large and active community of developers who collaborate, share expertise, and provide support. This community-driven approach enables developers to leverage existing component libraries and solutions, saving time and resources.\n\n## 21 Best React Native Libraries You Should Know About\n\n![React Native Libraries](https://cdn.magicui.design/assets/gsox8qhzh8.jpg)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. NativeBase\n\nNativeBase, a dynamic front-end framework, is a versatile solution for developers. If you find yourself rewriting React components for different platforms, NativeBase is your go-to tool. The library is a collection of essential cross-platform React Native components, providing a solid foundation for building your app. The components are built with React Native and some JavaScript functionality, offering various customizable properties. You can also leverage any third-party native libraries out of the box, enhancing the versatility of your app.\n\nNativeBase is fully open-source and has tens of thousands of stars on Github. The themes come at a premium as more features and screens are added. NativeBase is now available for web users, too. Using the same JavaScript codebase and working with platform-specific design for Android and iOS, you can achieve a native look and feel for your app. Their open-source projects include a Native starter app, a Twitter Clone app, a ToDo app, and a tutorial app. In their premium basket, you’ll find starter apps for booking, rentals, job listings, messaging, and more.\n\n### 3\\. React Native Elements\n\nReact Native Elements, an open–source, cross-platform React Native UI toolkit is a treasure trove of customizable components. It offers various options, from pricing to overlay, a badge to the platform-specific search bars. This library's creators believe that components' structure is more important than design, and they've made it easy for developers to use very little boilerplate code to get the components ready for use. This flexibility in control over the appearance of the components is what sets React Native Elements apart. With 20.7k stars on Github, it's a toolkit that's definitely worth exploring.\n\n### 4\\. Teaset\n\nTeaset is a great addition to our list of React Native component libraries. It is a UI library featuring 20+ pure JS(ES6) for component content classes. With a few thousand stars on Github, Teaset is a fit for those with a knack for simplicity and design. It focuses on content display and action control.\n\n### 5\\. React Native Maps\n\nReact Native Maps is another useful library that provides customizable map components for your iOS and Android apps. You can offer your users different experiences on the map using this library. You can combine the components with the Animated API to give an animated effect for the components. For example, you can animate the zoom, marker views, and marker coordinates and render polygons and polylines on the map.\n\nReact Native Maps is compatible only with React Native ≥v0.64.3. If you plan to use React Native Maps with a project that uses an older React Native version, be sure to update it.\n\n### 6\\. React Native Gifted Chat\n\nReact Native Gifted Chat is a React Native library that allows developers to add chat functionality to their apps. It supports various features such as text messages, emojis, and more. It also provides developers with a range of options for customizing the look and feel of their apps.\n\nReact Native [Gifted Chat](https://github.com/FaridSafi/react-native-gifted-chat.) has great documentation, making it easy for developers to get started. It also has a range of themes and styles to choose from, allowing developers to create beautiful apps quickly.\n\n### 7.  Lottie for React Native\n\nLottie is a mobile library from Airbnb that helps you add animations to your apps. After creating animations in Adobe After Effects, you’ll normally need to convert them into a format usable in your web app. Lottie helps you with this.\n\n### Effortless Integration\n\nIt exports animation data in JSON format from an After Effects extension, BodyMovin. This extension is bundled with a JS player to render animations on the web. It works with React Native too, and you can access the official docs on Github where it has garnered thousands of stars.\n\n### Lightweight Performance and Visual Appeal\n\nLottie libraries and plugins are available for free, and you can use the curated collection of animation files to make your apps attractive and interesting. The animation files are small in size and are in vector format. As such, you should not experience any impact on the performance of your app. At the same time, it can spice up your UI and make it more visually appealing.\n\n### 8\\. Ignite CLI\n\nThis starter kit was developed to help programmers launch their projects faster. It includes flexible and easy–to–use boilerplates. Developers can use them for iOS and Android platforms and easily adapt them to their apps. Specialists who worked with this tool say it saves them two to four weeks of development time. This open–source instrument boasts many built-in components, thanks to which Ignite CLI managed to get 12.5k stars.\n\n### 9\\. React Native Vector Icons\n\nThis one is among the best React Native component libraries if you’re looking for some icons to use in your apps. With a library of 3,000+ icons, you’re sure to find something that will fit your needs. What’s more, it’s possible to customize, style, and extend the icons while integrating them into your project.\n\nThe package supports TabBar and Toolbar Android, as well as image source and multi-style font. With thousands of stars on Github, it can be a perfect fit for buttons, logos, and navbars. It draws on React Native’s animated library, combining it with any icon to create an animated component. If you already have an icon font with an associated CSS file, then you can easily generate an icon set with the generate-icon script.\n\n### 10\\. Shoutem UI\n\nIf you’re in the market for a professional-looking UI for your React Native iOS or Android apps, then the Shoutem UI kit is a great choice. Shoutem UI is an open-source library part of the Shoutem UI toolkit.\n\nShoutem UI consists of more than 25 composable and customizable UI components, each with pre-defined styles that support other components. By combining them, you can build complex UIs. You can also apply custom CSS-like styling using the Shoutem themes library and animations using the animation components library, like ZoomIn, FadeIn, etc.\n\n### 11.  React Native Mapview\n\nOne of the React Native component libraries that offers map components for Android and iOS is React Native Mapview. Its construction is such that regular features on any map, such as markers and polygons, are specified as children of the Mapview component. This assists the API to declaratively control features on the map intuitively. On your part, you’ll need to ensure that Google Maps API is enabled in Google Console.\n\n### Interactive Map Controls\n\nThere’s a lot you can do to customize the map style. You can change the map view position, track the region/location, and make points of interest clickable on Google Maps. You can enable zooming in to specified markers or coordinates or even animate them. If you assign an animated region value to the prop, Mapview can utilize the Animated API to control the map’s center and zoom. Unless you specify custom markers, default markers will be rendered.\n\n### Marker Customization and Overlays\n\nWhat’s cool is the markers are draggable, can be customized using images, and they update other UIs during drags. If you need more, there’s a custom callout to markers, polygon creators, and circle and polygon overlays. iOS users can create gradient polylines. It's not surprising that it has thousands of stars on GitHub.\n\n### 12\\. React Native Camera\n\nIt is a go-to component library that allows developers to create React Native apps that work with the device’s camera. It supports videos, photos, text recognition, barcode scanning, face detection, and more. Programmers won't be concerned about the native code with this tool when they implement camera functionality in their mobile apps. Like other mentioned React Native component libraries, it is quite popular among specialists, which is confirmed by 9.1k stars.\n\n### 13\\. React Native Snap Carousel\n\nThis component library offers programmers various parallax images, layouts, previews, performant handling of huge numbers of items, snapping effects, and so on. They can use it to add different sliders to their iOS or Android apps. This library will be the best choice if you want to develop an online store. It can be used to create a catalog with offers and discounts.\n\nReact Native Snap Carousel provides an API for customization, which allows you to change the component's appearance and behavior. Its carousel control methods allow users to move an item by clicking a button or using a keyboard shortcut. This instrument has 8.6k stars on GitHub.\n\n### 14\\. React Native Paper\n\nThis cross-platform component library supports global themes and offers programmers various components, including buttons, a navigation bar, a loader, etc. Developers can apply this library to mobile and web apps. They can easily create light and dark themes and add their own fonts, color schemes, etc. It uses the Material Design UI, a very good feature for beginners. React Native Paper has 8k stars.\n\n### 15\\. Nachos UI\n\nThis library includes more than 30 ready–to–use UI components and many customizable UI components. It supports Prettier, Yarn, and Jest Snapshot Testing. This React Native component library allows developers to choose any of the pre-styled inputs, such as forms or text buttons. In addition, they are highly customizable. This free and open–source instrument has gotten 2k stars.\n\n### 16\\. Victory Native\n\nVictory Native is a charting library for React Native applications. It simplifies the process of adding data visualization to your app. It's a valuable tool for creating engaging and informative dashboards or reports within your app.\n\n### 17\\. React Native Firebase\n\nFirebase is a comprehensive platform for building mobile and web applications, and React Native Firebase brings the power of Firebase to React Native developers. This library provides easy-to-use Firebase modules, including authentication, real-time database, cloud storage, cloud messaging, and more.\n\nReact Native Firebase simplifies the integration of Firebase services into your app. So you can focus on delivering core functionalities without getting bogged down by infrastructure setup.\n\n### 18\\. Galio\n\nGalio is a React Native UI library with various components and styles to make mobile app development easier. It supports components such as buttons, cards, lists, and more. It also provides developers with a range of options for customizing the look and feel of their apps. Galio has great documentation, making it easy for developers to get started. It also has a range of themes and styles to choose from, allowing developers to create beautiful apps quickly.\n\n### 19\\. React Navigation\n\nReact Navigation is the ideal library to use while developing app launch screens. It brings many benefits in the form of complete customization and the extensibility factor. The most important part is that it has built-in navigators, which account for ease of use.\n\n### 20\\. React Native UI Kitten\n\nOne of the React Native component libraries that can be used as a starter kit for mobile apps for any domain, including eCommerce, is React Native UI Kitten – a React Native implementation of the Eva Design system. With thousands of stars on Github, it offers a set of about 20 general-purpose components styled in the same way to take care of visual appearance. With this forever free and open-source library, you can use the themes provided or create as many themes of your own, all without changing the source code of the components. You can switch between dark and light themes during runtime without reloading the page. Once you install the UI Kitten package from NPM, you can import and use the components in your project.\n\n### 21\\. RNUI: React Native UI Library\n\nWell-maintained and used by Wix, the RNUI library is a toolset for building amazing React Native apps. It supports both older and the latest React Native versions, and it provides more than 20 customized components, some of which, like Drawer, can be easily integrated for building modern swipeable lists, like the Gmail app’s inbox. It also has custom animated components, like an animated scanner, which is useful for indicating progress for a card, like an uploading status, and an animated image.\n\nRNUI is another UI library that supports the right-to-left writing system, and it includes full accessibility support.\n\n## Challenges Associated With Using React Native\n\n![React Native Libraries](https://cdn.magicui.design/assets/n8of9xyvd69.jpg)\n\n### 1\\. Lack of Some Custom Modules\n\nOne of the main challenges of using React Native in projects is the lack of ready-to-use modules that provide access to APIs for both Android and iOS. This means developers often have to create Native Modules or develop bridges using Java/Kotlin for Android or Swift/Objective-C for iOS. This process significantly increases the software development time and can be a frustrating hurdle for developers looking to implement certain features quickly.\n\n### 2\\. Lower Performance\n\nAnother disadvantage of using React Native is the potential decline in performance due to using bridges or custom modules. By integrating these additional components, the app might experience delays or lags, which could affect the overall user experience. Developers must carefully consider the balance between functionality and performance when utilizing React Native in their projects.\n\n### 3\\. Debugging Issues\n\nDebugging React Native apps can become tedious, as they are built with a combination of [different programming languages](https://www.simplilearn.com/best-programming-languages-start-learning-today-article), including C/C++, Java, and JavaScript. This requires developers to have a strong understanding of each language and platform to troubleshoot issues that may arise during the development process effectively. Due to the complex nature of React Native apps, debugging can be time-consuming and challenging without the proper expertise and experience.\n\n## Installing A React Native Library\n\n![React Native Libraries](https://cdn.magicui.design/assets/q0jrjdl4z3.jpg)\n\nReact Native libraries are typically installed from the npm registry, which offers a versatile choice of package managers, such as npm CLI or Yarn Classic, all powered by Node.js.\n\nIf you have Node.js installed on your computer, you already have the npm CLI installed. Some developers prefer to use Yarn Classic for slightly faster install times and additional advanced features like Workspaces. Both tools work great with React Native. For simplicity of explanation, we will assume npm for the rest of this guide.\n\nTo install a library in your project, navigate to your project directory in your terminal and run the installation command. Let's try this with react-native-webview:\n\n    ```\n    npm install react-native-webview\n    ```\n\nThe library that we installed includes native code, and we need to link to our app before we use it.\n\n### Linking Native Code on iOS\n\nReact Native uses CocoaPods to manage iOS project dependencies and most React Native libraries follow this same convention. If a library you are using does not, please refer to their README for additional instruction. In most cases, the following instructions will apply.\n\nRun `pod install` in our iOS directory to link it to our native iOS project. A shortcut for doing this without switching to the iOS directory is to run `npx pod-install`.\n\n    ```\n    npx pod-install\n    ```\n\nOnce this is complete, re-build the app binary to start using your new library:\n\n    ```\n    npm run ios\n    ``\n\n### Linking Native Code on Android\n\nReact Native uses Gradle to manage Android project dependencies. After you [install a library](https://reactnative.dev/docs/libraries#:~:text=You%20can%20install%20a%20particular,netinfo%40%5E2.0.0%20.) with native dependencies, you will need to re-build the app binary to use your new library:\n\n    ```\n    npm run android\n    ```\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built using React, TypeScript, Tailwind CSS, and Framer Motion. Our goal is to provide a range of visually appealing and interactive elements that can be easily integrated into web applications, enabling the creation of stunning user interfaces with minimal effort.\n\n### MagicUI's Key Features\n\nThe components offered by MagicUI are highly customizable, allowing for seamless adaptation to match desired branding and design requirements. MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences by focusing on animation and taking a design-centric approach.\n\n### MagicUI Pro: Enhancing Your UI Development\n\nIn addition to the free component library, [MagicUI](https://magicui.design/) also offers a Pro version. With MagicUI Pro, users can save thousands of hours creating beautiful landing pages and converting visitors into customers using our website templates.\n\n### Get Started with MagicUI Today!\n\nWhether you're looking to enhance your existing web applications or kickstart a new project, MagicUI is here to help. You can take your UI development to the next level by leveraging our [React component library](https://magicui.design/).\n\nVisit [https://magicui.design/docs](https://magicui.design/docs) to start using MagicUI for free today.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-portfolio-template.mdx",
    "content": "---\ntitle: \"Looking For A React Portfolio Template? 19 Best React Portfolio Templates\"\ndescription: \"Ready to showcase your projects with a modern portfolio design? Discover the top React portfolio templates to elevate your online presence today.\"\nimage: https://cdn.magicui.design/assets/ywetc363me.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: true\n---\n\nAre you seeking React portfolio templates to create a personal website that stands out? Crafting an appealing landing page is vital for attracting visitors and showcasing your skills as a professional. Web development can be challenging, especially if you lack technical expertise. A user-friendly template can help the process, enabling you to create an impressive portfolio website and show as [landing page examples](https://magicui.design/blog/landing-page-examples).\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a valuable tool for meeting your goals. This template offers a range of customization options, making it easy to create a professional website that reflects your unique style. Whether you're a freelance designer, photographer, or developer, this template provides a solid foundation for showcasing your work and attracting potential clients.\n\n## What Is A React Template?\n\n![React Portfolio Template](https://cdn.magicui.design/assets/nzz5dj87i3.jpg)\n\nA React template typically refers to a pre-built or starter template for building web applications using the React JavaScript library. React is a popular open-source library developed by Facebook for building user interfaces, particularly for single-page applications where the user interface is dynamic and interactive.\n\n### Pre-Built Layouts for Showcasing Your Skills\n\nYour portfolio is your digital business card, and it should reflect your skills, creativity, and personality. React portfolio templates are pre-designed, customizable web layouts built using [React components](https://www.youtube.com/watch?v=_t6yUkP5L3g) that help you quickly put up your portfolio. These templates provide a solid foundation for creating a visually appealing and functional portfolio without starting from scratch.\n\n### Built-In Features and Popular Libraries\n\nReact templates often include pre-designed components, styles, and configurations to help developers kickstart their projects more quickly. These templates may consist of common features such as:\n\n- Routing\n- State management\n- Authentication and more\n\nIt was all implemented using React and possibly other related libraries, such as Redux for state management, [React Router for routing](https://www.geeksforgeeks.org/reactjs-router/), and so on.\n\n## Why Use React For Portfolio Websites?\n\n![React Portfolio Template](https://cdn.magicui.design/assets/zlu4twxqm8o.jpg)\n\n### Professional Design\n\nProfessionals designed React portfolio templates, offering a clean, modern, and visually appealing look right out of the box. With the design details already taken care of, you can effortlessly maintain your portfolio's polished and professional appearance.\n\n### Responsive and Mobile-Friendly\n\nReact templates are built with responsive design principles, ensuring your portfolio looks great on all devices, whether:\n\n- Desktops\n- Tablets\n- Smartphones\n\nA mobile-friendly portfolio is crucial today, as many users will access it on their phones.\n\n### Customizable and Flexible\n\nReact templates are [highly customizable and flexible](https://www.freecodecamp.org/news/why-use-react-for-web-development/), allowing you to tailor the design and content to meet your needs. By creating a unique portfolio that truly reflects your style, you can easily change the following:\n\n- Color scheme\n- Fonts\n- Layout and more\n\n### Reusable Components\n\nThe use of reusable components in React templates makes it easy to add new sections or modify existing ones without rewriting significant chunks of code. This feature enables you to:\n\n- Effortlessly build and expand your portfolio\n- Add new projects\n- Testimonials\n- Blog sections\n\n### Improved User Experience\n\nReact templates prioritize user experience, offering intuitive and engaging ways for visitors to navigate your portfolio. Smooth navigation, interactive elements, and [fast loading times improve the experience](https://moldstud.com/articles/p-the-impact-of-fast-loading-times-on-user-satisfaction#:~:text=Fast%20loading%20times%20are%20crucial,a%207%25%20reduction%20in%20conversions.), leaving a lasting impression on potential employers or clients.\n\n### SEO Optimization\n\nMany React portfolio templates come optimized for search engines, enhancing your portfolio’s visibility and ranking in search results. This SEO optimization is crucial for driving traffic to your site and ensuring that the right audience views your portfolio.\n\n### Faster Development Cycle\n\nUsing a React template accelerates the development process significantly, allowing you to focus on content creation and customization instead of starting from scratch. This approach lets you launch your portfolio quickly, saving time and effort.\n\n### Cost-Effective\n\nMost React portfolio templates are free or cheap, providing an affordable solution to create a professional-looking portfolio without exceeding your budget. You can benefit from high-quality design and functionality at a fraction of the cost of hiring a designer or developer.\n\n### Build Captivating Web Apps with MagicUI Components and Templates \n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specially designed for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI Pro, you can save time, create a beautiful landing page, and convert visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to elevate your online presence.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 19 Best React Portfolio Templates For An Impressive Online Presence\n\n![React Portfolio Template](https://cdn.magicui.design/assets/rb5kkls19co.jpg)\n\n### 1\\. Magic UI's Portfolio Template\n\nIf you're looking for a complete, customizable solution to showcase your work as a developer, [Magic UI's Portfolio Template](https://magicui.design/) might be the perfect choice for you. With easy configuration, built-in advanced animations, and a 1-click setup, this template saves you over 100 hours of development time. This template allows you to quickly update text and images before deploying your portfolio live to Vercel in a matter of minutes, featuring sections like:\n\n- Hero\n- About\n- Work\n- Education\n- Projects\n- Hackathon\n- Contact\n- Blog\n\n### 2\\. React Portfolio Template\n\n[Chetan Verma's React portfolio template](https://github.com/chetanverma16/react-portfolio-template) is a testament to simplicity and elegance. Built with Next.js and TailwindCSS, this template offers a clean, modern design perfect for showcasing your skills and projects. Its responsiveness ensures that your portfolio looks fantastic on any screen, making it a top choice for those searching for a user-friendly solution.\n\n### 3\\. Personal Portfolio\n\nHamish Williams' Personal Portfolio template stands out using Next.js, Three.js, and Framer Motion. This combination of technologies delivers an aesthetically pleasing design and ensures a smooth and engaging user experience. Ideal for those looking to make a bold statement with their portfolio.\n\n### 4\\. React Portfolio\n\n[Shlok Somani's React portfolio template](https://github.com/shloksomani/react-portfolio) offers a straightforward yet practical choice for individuals looking to highlight their work using React.js. Despite its simplicity, this template doesn't compromise on aesthetics or responsiveness, making it a solid option for those seeking a no-frills approach to building an online portfolio.\n\n### 5\\. Simple Portfolio Template\n\n[Ubaida Mutlaq's simple portfolio template](https://github.com/ubaimutl/react-portfolio) combines the power of React.js and Bootstrap to offer an uncomplicated yet visually appealing portfolio solution. This template is a great choice for those who prefer a minimalist design focusing squarely on their work. Its responsiveness ensures your portfolio will shine on all devices.\n\n### 6\\. React Personal Portfolio\n\n[Adrian Hajdin's React personal portfolio template](https://github.com/adrianhajdin/portfolio_website) combines React and Next.js to create a dynamic and engaging portfolio website. This template is perfect for those who want to infuse their personal touch into their online presence. Its responsiveness ensures that your portfolio remains stunning and functional across all screen sizes.\n\n### 7\\. React Portfolio Multiple Pages\n\n[Payton Pierce's React portfolio](https://github.com/paytonjewell/ReactPortfolioTemplate) of multiple pages template offers versatility for those with diverse portfolios. Built using React.js, you can showcase your work across multiple pages, providing a comprehensive view of your skills and accomplishments. The template's responsiveness guarantees that your portfolio will captivate visitors, no matter how they access it.\n\n### 8\\. SPA Portfolio Template\n\n[Rahul Bhatia's SPA portfolio template](https://github.com/rbhatia46/React-Portfolio) is a shining example of a Single Page Application (SPA) built with React.js. This template allows you to create a seamless and immersive visitor portfolio experience. With its responsiveness, your work will look stunning on all devices, making it an excellent choice for those who want to make a lasting impression.\n\n### 9\\. React Frontend Dev Portfolio\n\n[Dorota Gil's  React frontend dev](https://github.com/Dorota1997/react-frontend-dev-portfolio) portfolio template is tailored for frontend developers who want to showcase their skills and projects. Built with React.js, this template ensures a smooth and interactive user experience. Its responsive design means that your portfolio will shine on screens of all sizes.\n\n### 10\\. Personal Site\n\n[Michael's personal site template](https://github.com/mldangelo/personal-site), crafted using React.js and SCSS, offers a personalized and stylish way to present your work and identity. This template is ideal for those who want to infuse their personality into their portfolio. With responsiveness as a key feature, your site will look great on various devices.\n\n### 11\\. React JS Resume - Web App Template\n\nThis is a ReactJS-based personal resume website template. Data is fed directly from a JSON File. In its final form, anybody can customize and use it simply by filling in their info into the JSON file, and the changes will be dynamically fed into the site. If you want to use this template for your resume website, read on to learn how to build your copy.\n\n### 12\\. Dolio – React JS Personal Portfolio Template\n\nDolio is a React JS Template designed for Resume, CV, vCard, and Bootstrap 4, featuring a creative, responsive, unique, and premium design. It’s an ideal choice for:\n\n- Designers\n- Developers\n- Coders\n- Freelancers\n- Artists\n- Illustrators\n- Photographers\n- Or anyone seeking an attractive and impactful platform to showcase their work and services to clients.\n\nThis template is crafted with valid and clean HTML & CSS3 code, ensuring a seamless browsing experience. It’s easy to customize and comes with comprehensive documentation, making it adaptable to your requirements. Dolio is built with React JS, providing enhanced functionality and performance.\n\n### 13\\. Tonni – Personal Portfolio React NextJs Template\n\n[Tonni is a one-page personal portfolio template](https://elements.envato.com/tonni-personal-portfolio-react-nextjs-template-VAG4V7T) designed to craft your own personal portfolio website. Tonni provides a platform to showcase your bio, portfolio, and skill set whether you’re a:\n\n- Developer\n- Designer\n- Freelancer\n- Engineer\n- Specialist\n- Content writer\n- Instructor\n- Photographer\n- Politicians or any other professional\n\nA personal portfolio is essential, and Tonni offers a great template to help you establish your online presence. It’s well-documented, user-friendly, and easily customizable, built with React Nextjs to streamline the website building process.\n\nWith Tonni, you can quickly create a personalized portfolio that elevates your professional image. Its single-page layout makes navigation simple, and its flexibility allows easy customization to suit your needs.\n\n### 14\\. Neoh – NFT Portfolio React Nextjs Landing Page\n\n[Neoh is an NFT portfolio and landing React](https://elements.envato.com/neoh-nft-portfolio-react-nextjs-landing-page-6S92YN3) NextJs template tailor-made for crafting your NFT Portfolio page. Neoh offers a meticulously designed solution whether you’re exploring into:\n\n- NFT blockchain\n- Crypto art\n- Digital assets or any related field\n\n### 15\\. Glitche – Personal Portfolio React Template\n\nGlitche – CV Resume and Personal Portfolio React Next.JS Template is the  choice for:\n\n- Designers, freelancers\n- Developers\n- Programmers\n- Coders\n- Professionals of all stripes\n\nWith Glitche’s array of ready-made components, including:\n\n- Various layouts\n- Dark & Light versions\n- One- and multi-pages\n- RTL support\n\nFully responsive and entirely customizable, [Glitche](https://elements.envato.com/glitche-personal-portfolio-react-template-88L38G9) boasts a unique web design that will impress and attract new clients. Packed with many excellent features, this template empowers you to create a compelling web presence that effectively promotes yourself and showcases your work.\n\n### 16\\. Aali – Personal Portfolio React NextJs Template\n\n[Aali – Personal Portfolio / Resume / CV React NextJs template](https://elements.envato.com/aali-personal-portfolio-react-nextjs-template-P7T9DG3) is a versatile solution for many purposes. With its creative, minimal, and clean design, it caters to the needs of various businesses. Equipped with all the essential features of a business website, it is an ideal platform for startup businesses, companies, agencies, and freelancers.\n\nBoasting a 100% super responsive experience, Ali ensures that your projects and services are showcased professionally across all devices. Whether you aim to establish your online presence or present your portfolio sleek and polished, Ali has got you covered.\n\n### 17\\. Developers Portfolio\n\n[Hashir Shoaib's developers portfolio template](https://github.com/hashirshoaeb/home) leverages  React.js, Bootstrap, and Typist to provide developers an engaging and dynamic showcase. Whether you're a seasoned pro or just starting, this template's responsiveness ensures your portfolio will captivate visitors and potential employers.\n\n### 18\\. Cleanfolio\n\n[Raj Shekhar's cleanfolio template](https://github.com/rajshekhar26/cleanfolio), powered by React.js, lives up to its name with a clean, minimalistic design. This template allows your work to take center stage. With its responsive layout, your portfolio will maintain its sleek appearance on screens of all sizes.\n\n### 19\\. Software Developer Portfolio Template\n\n[Hanzla's  software developer portfolio template](https://github.com/1hanzla100/developer-portfolio), built with Next.js, Axios, and Reactstrap, offers a comprehensive solution for software developers. This template provides the tools you need to effectively showcase your skills and projects. Its responsive design ensures that your portfolio will impress on any device.\n\n## Key Features To Look For In A React Portfolio Template\n\n![React Portfolio Template](https://cdn.magicui.design/assets/jl2ftp6h45j.jpg)\n\n### Responsiveness: Importance of Mobile-Friendly Design\n\nOne of the most critical features of any portfolio template is responsiveness. People will view your portfolio on desktops, tablets, and smartphones. A mobile-friendly design ensures your portfolio looks great and functions well on all screen sizes. This enhances user experience and positively impacts your search engine rankings since search engines prioritize mobile-friendly sites.\n\n### Customization Options: Flexibility to Tailor the Template to Individual Branding\n\nCustomization is key to making your portfolio stand out. Look for a template that offers flexibility in terms of:\n\n- Colors\n- Fonts\n- Layouts\n- Content\n\nTailoring the template to match your personal or professional branding ensures that your portfolio is unique and reflects your style.\n\n### SEO Optimization: Features that Help Improve Search Engine Visibility\n\nAn SEO-optimized template is crucial for increasing your portfolio's visibility in search engine results. Look for templates with built-in SEO features, such as:\n\n- Clean URLs\n- Meta tags\n- Optimized images\n\nThese features help improve your search engine ranking, making it easier for potential clients or employers to find you.\n\n### Performance: Fast Loading Times and Efficient Code\n\nPerformance is another essential feature to consider. A template with fast loading times and efficient code enhances user experience and keeps visitors on your site longer. Slow-loading websites can frustrate users and lead to higher bounce rates. Efficient, clean code ensures your portfolio runs smoothly without lag or errors.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How to Customize Your React Portfolio Template\n\n![React Portfolio Template](https://cdn.magicui.design/assets/5b540nigpxr.jpg)\n\n### Changing Colors and Fonts\n\nThe first step in customizing your React portfolio template is choosing the right colors and fonts. Whether you aim for a sleek, modern look or a vibrant and energetic vibe, your color scheme and font can make a big difference.\n\nWith Magic UI's Tailwind CSS integration, you can easily modify colors by adjusting the palette in your Tailwind configuration file. Remember to select a font that's easy to read and adds character to your text elements. Google Fonts offers a vast selection of free fonts to help you personalize your project.\n\n### Personalizing the Layout\n\nYour portfolio's layout should be clean, easy to navigate, and effectively highlight your work. Consider including sections such as:\n\n- About Me page\n- Projects section\n- Contact form\n\n[Magic UI](https://magicui.design/) allows you to create reusable components for these sections, making it simple to update your portfolio by adding or removing projects without rewriting your layout code. Magic UI components like the Card component can help you showcase your work effectively.\n\n### Adding Personal Branding Elements\n\nPersonal branding is critical to making your portfolio unique. Start by designing a logo that effectively represents your brand. If you don't have one, online tools can help create a simple yet impactful logo.\n\n- Place your logo prominently on your homepage and in the navigation bar.\n- Craft a compelling bio for the About Me section to share your background, skills, and passion with visitors.\n\n### Using Magic UI for Interactive and Animated Elements\n\n[Magic UI](https://magicui.design/) excels in creating interactive and animated elements for your portfolio. You can bring your portfolio to life with over 20 animated components built with:\n\n- React\n- Tailwind CSS\n- Framer Motion\n- TypeScript\n\nFor instance, the Shimmer component can enhance call-to-action buttons, while the Carousel component can dynamically showcase your projects. Magic UI components are highly customizable, enabling you to seamlessly adjust animations, styles, and behaviors to match your branding requirements.\n\n### More Customization Tips\n\nConsider incorporating high-quality images and videos of your projects to make your portfolio stand out. These can include:\n\n- Screenshots\n- Demo videos\n- GIFs\n\nSubtle animations can make your portfolio more dynamic and engaging, and Magic UI simplifies integrating these animations. Also, include links to your active social media profiles like:\n\n- LinkedIn\n- GitHub\n- Twitter\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Effortless UI Creation for Design Engineers\n\nThis tool is designed for design engineers to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, allowing seamless adaptation to match branding and design requirements.\n\nThe focus on animation and a design-centric approach aims to bridge the gap between design and development, empowering users to craft captivating digital experiences. The [Pro version of MagicUI](https://pro.magicui.design/docs/templates/startup) offers website templates to save time and create beautiful landing pages that convert visitors into customers.\n\n### Boost Landing Page Engagement\n\nBy utilizing [MagicUI](https://magicui.design/), you can enhance the visual appeal and interactivity of your landing page components, making them more engaging for visitors. MagicUI's seamless integration allows you to customize the components to meet your branding and design needs effortlessly. This saves you time and ensures that your landing page stands out from the competition.\n\n### Improve User Experience and Drive Conversions\n\nIncorporating MagicUI components into your landing page design can significantly improve user experience and encourage visitors to take desired actions. The range of visually appealing and interactive elements MagicUI provides can help you create a compelling and conversion-focused landing page that drives business results.\n\nTake advantage of MagicUI's features today to make a captivating [startup landing page](https://pro.magicui.design/docs/templates/startup) that converts visitors into customers.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/react-projects-for-beginners.mdx",
    "content": "---\ntitle: \"Top React Projects for Beginners in 2025: Start Building Today\"\ndescription: >-\n  Discover the best react projects for beginners in 2025. Get inspired and start\n  your coding journey with these easy, impactful projects!\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-99eeefe4-cd78-4fb9-bae0-99ea4b6320d8.jpg\nauthor: Dillion Verma\ntags:\n  - react projects for beginners\n  - react js projects\n  - beginner react\n  - learn react\n  - portfolio projects\npublishedOn: \"2025-09-24\"\nfeatured: true\n---\n\nStarting with React can feel like navigating a vast ocean of components, hooks, and state management. The key to mastering it isn't just theory—it's building. Creating practical, hands-on projects solidifies your understanding, sharpens your skills, and builds a portfolio that speaks volumes. But where do you find the right projects? This guide cuts through the noise, rounding up the seven most effective platforms and resources for **react projects for beginners**.\n\nWe'll explore each option, detailing what makes it unique, the skills you'll gain, and how to leverage it to accelerate your learning. To complement your project-based work, consider implementing other [strategies to master software development](https://deskcove.com/top-strategies-to-master-software-development-fast/) that can further enhance your progress.\n\nThis listicle provides a clear roadmap, featuring direct links and screenshots for each resource. Whether you prefer structured video courses like those on Udemy or Scrimba, interactive coding environments from Frontend Mentor, or comprehensive curriculums from freeCodeCamp and The Odin Project, there is a path here for you. Our goal is to help you transition from simply learning React syntax to confidently building and shipping your own applications.\n\n## 1. Magic UI\n\nFor developers seeking to build visually striking and highly functional web applications, **Magic UI** presents an exceptional resource. It serves as a comprehensive UI library built specifically for the modern web, leveraging a powerful stack of React, TypeScript, and Tailwind CSS. This platform is an ideal starting point for anyone looking to build impressive **react projects for beginners**, moving beyond basic tutorials to create portfolio-worthy landing pages and interfaces with remarkable speed.\n\nMagic UI distinguishes itself by providing developers with a vast toolkit of over 50 professionally designed, fully customizable blocks and templates. These pre-built components allow you to assemble stunning landing pages in minutes, not days. The intuitive browsing experience makes finding the perfect element for your project simple, fostering creativity and dramatically accelerating the development timeline.\n\n### Key Features and Advantages\n\nWhat truly sets Magic UI apart is its collection of over 150 free, open-source animated components. These elements empower you to add dynamic, engaging micro-interactions and effects that capture user attention and elevate the overall user experience. This focus on aesthetic and functional quality is why Magic UI has gained the trust of notable investors like Google Ventures and Y Combinator startups.\n\n- **Modern Technology Stack:** Built with React, TypeScript, and Tailwind CSS, ensuring high performance, type safety, and a utility-first styling workflow.\n- **Rapid Development:** The extensive library of blocks and templates significantly cuts down on development time for landing pages and UIs.\n- **Dynamic Components:** Access a rich collection of free animated components to create visually dynamic and engaging interfaces. If you're looking for inspiration, you can explore the collection of [free React components available on their blog](https://magicui.design/blog/free-react-components).\n\n### Practical Considerations\n\nWhile the platform is incredibly powerful, beginners completely new to the ecosystem should be prepared for a slight learning curve, particularly if they are unfamiliar with React or Tailwind CSS. Pricing for the premium \"Pro\" templates is not publicly listed and may require signing up or a direct inquiry. However, the wealth of free components provides more than enough material for beginners to start building sophisticated projects immediately.\n\n**Website:** [https://magicui.design](https://magicui.design)\n\n## 2. Udemy\n\nFor learners who prefer a structured, video-based approach, Udemy offers one of the most comprehensive courses available for building **React projects for beginners**: Maximilian Schwarzmüller's \"React – The Complete Guide 2025\". This best-selling course is a one-stop-shop, guiding you from fundamental concepts to building complex, real-world applications. It’s less of a single project and more of a guided curriculum packed with multiple, increasingly complex projects.\n\n![Udemy](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/24674aea-788c-484f-bf2e-0fcadc05e1e6.jpg)\n\nThis course stands out because it doesn't just teach you React in isolation. It integrates the entire modern ecosystem, including essential tools like Redux Toolkit for state management, React Router for navigation, and even server-side rendering with Next.js 14. This end-to-end learning path ensures you build a portfolio of diverse projects, from a simple expense tracker to a full-stack e-commerce site.\n\n### Key Features and Learning Path\n\nThe platform’s user experience is straightforward, with lifetime access to over 70 hours of on-demand video, downloadable resources, and a certificate of completion. The course is regularly updated, meaning your investment stays relevant as the React landscape evolves. This makes it an ideal choice for those who want a single, authoritative resource to return to.\n\n> **Practical Tip:** Udemy frequently runs sales, so it's wise to add the course to your wishlist and wait for a promotional price. You can often purchase this extensive course for a fraction of its list price.\n\n### Pros and Cons\n\n| **Pros**                                                                                | **Cons**                                                                                      |\n| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |\n| **Comprehensive Curriculum:** Covers React, Hooks, Redux, Next.js, and more.            | **Overwhelming Scope:** The sheer volume of content might feel daunting for absolute novices. |\n| **Project-Heavy:** Includes numerous guided projects to build a solid portfolio.        | **Variable Pricing:** Cost can fluctuate significantly based on Udemy’s sales cycles.         |\n| **Active Community:** Large Q&A section provides robust student and instructor support. |                                                                                               |\n| **Lifetime Access:** A one-time purchase grants permanent access to all future updates. |                                                                                               |\n\nUltimately, Udemy provides a well-trodden, reliable path for mastering React through hands-on projects, backed by a massive community and an expert instructor.\n\n**Website:** [https://www.udemy.com/course/react-the-complete-guide-incl-redux/](https://www.udemy.com/course/react-the-complete-guide-incl-redux/)\n\n## 3. Scrimba\n\nFor those who learn best by doing, Scrimba offers a uniquely interactive platform to build **React projects for beginners**. Its standout feature is the \"scrim\" format: a blend of video tutorial and a live, in-browser code editor. This means you can pause the lesson at any point, modify the instructor's code directly, and see the results instantly, creating an immersive, hands-on learning environment. The \"Learn React\" course, led by Bob Ziroll, is specifically designed to get you coding from the very first lesson.\n\n![Scrimba](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/15086415-e424-40ff-8605-b39c5d159dfd.jpg)\n\nWhat makes Scrimba exceptional is its focus on tangible outcomes. The course is structured around building a series of fun, practical mini-apps, including a meme generator, a notes app, and a Tenzies dice game. This project-based curriculum ensures that every concept you learn is immediately applied to a real project, solidifying your understanding and building your portfolio simultaneously. It removes the friction between watching a tutorial and writing code, making it one of the most effective ways to internalize React principles.\n\n### Key Features and Learning Path\n\nThe platform’s user experience is built for active participation. The free \"Learn React\" course covers fundamental concepts and guides you through several projects. For more depth, Scrimba Pro unlocks the full Frontend Developer Career Path, which includes more advanced React projects, career-focused modules, and certificates of completion. The active Discord community provides a valuable support network for asking questions and collaborating with fellow learners.\n\n> **Practical Tip:** Complete the free \"Learn React\" course first to build a strong foundation. This will not only give you a feel for the platform but also prepare you to get the most value out of a Scrimba Pro subscription if you decide to upgrade for more advanced projects.\n\n### Pros and Cons\n\n| **Pros**                                                                                                | **Cons**                                                                                                    |\n| ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |\n| **Very Beginner-Friendly:** The interactive learn-by-doing format is excellent for novices.             | **Gated Content:** Some of the most valuable, career-oriented projects are behind the Pro paywall.          |\n| **Clear, Progressive Curriculum:** Starts with basics and builds complexity through practical projects. | **Variable Pricing:** Subscription costs can vary by region and are only visible after creating an account. |\n| **Engaged and Supportive Community:** Active Discord server for help and peer interaction.              |                                                                                                             |\n| **Hands-On Learning:** In-lesson coding makes concepts stick better than passive video watching.        |                                                                                                             |\n\nIn essence, Scrimba provides an engaging and highly effective path for beginners to master React by building a series of fun and functional projects, all within a single, interactive interface.\n\n**Website:** [https://scrimba.com/learn/learnreact](https://scrimba.com/learn/learnreact)\n\n## 4. Frontend Mentor\n\nFor developers who have a grasp of React fundamentals and are ready to apply their skills to professional-grade designs, Frontend Mentor offers the perfect next step. Instead of providing tutorials, it delivers real-world front-end challenges complete with professional UI/UX briefs. This makes it an invaluable resource for building **React projects for beginners** who want to create a portfolio that truly stands out.\n\n![Frontend Mentor](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/0f88823b-c7c6-4433-8a45-ae54595e4d6d.jpg)\n\nThis platform excels by bridging the gap between learning and doing. You receive a project brief, assets, and sometimes even a Figma design file (with a Pro subscription), challenging you to build the interface pixel-perfect. The community aspect is a key differentiator; you can submit your solution, get feedback from other developers, and see how they tackled the same problem, which is a fantastic way to learn different approaches and best practices.\n\n### Key Features and Learning Path\n\nFrontend Mentor's user experience is centered around its library of challenges, which range from simple components to complex, multi-page applications. The platform itself doesn't teach React, but it provides the ideal environment to practice it. Its active Discord and solution-sharing features create a collaborative space where you can ask for help and refine your code based on peer reviews, making it a powerful tool for practical skill development.\n\n> **Practical Tip:** Start with a \"Newbie\" or \"Junior\" level challenge to get a feel for the workflow. Focus on matching the design as closely as possible, then refactor your React components for reusability and clean state management before submitting for feedback.\n\n### Pros and Cons\n\n| **Pros**                                                                                                  | **Cons**                                                                                                         |\n| --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| **Realistic Projects:** Build from professional designs, creating portfolio-worthy pieces.                | **No Guided Learning:** Requires foundational knowledge of React; it's a practice platform, not a tutorial site. |\n| **Active Community Feedback:** Get constructive criticism on your code and design implementation.         | **Premium Features:** Access to Figma files and more complex challenges requires a Pro subscription.             |\n| **Free Tier Available:** Many high-quality challenges are available for free to get you started.          |                                                                                                                  |\n| **Builds Practical Skills:** Directly translates tutorial knowledge into real-world application building. |                                                                                                                  |\n\nUltimately, Frontend Mentor is the go-to platform for aspiring front-end developers looking to hone their React skills on realistic projects and build a compelling [React portfolio template](https://magicui.design/blog/react-portfolio-template).\n\n**Website:** [https://www.frontendmentor.io/](https://www.frontendmentor.io/)\n\n## 5. freeCodeCamp\n\nFor developers seeking a completely free, community-driven path into the world of React, freeCodeCamp is an unparalleled resource. It offers a comprehensive curriculum that integrates interactive coding challenges, video tutorials, and project-based learning. This platform is ideal for those who want to build a solid foundation with **React projects for beginners** without any financial commitment, making it a risk-free entry point into modern web development.\n\n![freeCodeCamp](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/6aed772c-b9d7-43e2-b7e9-df9f90ba6a1e.jpg)\n\nThe platform’s strength lies in its \"learn by doing\" philosophy. You don't just watch videos; you actively code in a built-in editor. The curriculum guides you through building classic beginner projects like a Tic-Tac-Toe game and a color picker, reinforcing core concepts such as components, state, props, and hooks. Its open-source nature means the content is constantly being refined by a global community of developers.\n\n### Key Features and Learning Path\n\nfreeCodeCamp’s self-paced environment includes workshops, labs, and a fully updated React course that covers the latest fundamentals. The user experience is straightforward: you progress through modules, complete coding challenges, and build five required projects to earn a free, verifiable certificate. This structured yet flexible path allows learners to build a portfolio while mastering essential skills. The massive community forum is another key feature, providing peer support whenever you get stuck.\n\n> **Practical Tip:** To maximize your learning, actively participate in the freeCodeCamp forums. Explaining a concept to someone else or getting feedback on your project code is one of the most effective ways to solidify your understanding.\n\n### Pros and Cons\n\n| **Pros**                                                                                      | **Cons**                                                                                                 |\n| --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |\n| **100% Free Access:** No paywalls or hidden costs for any content or certificates.            | **Lags on Cutting-Edge Updates:** May not always feature the absolute latest React features immediately. |\n| **Build-As-You-Learn Exercises:** Interactive coding challenges reinforce concepts instantly. | **More Foundational:** Focuses heavily on fundamentals rather than advanced, complex architectures.      |\n| **Provides Free Certificates:** Showcase your achievements to potential employers.            |                                                                                                          |\n| **Massive Global Community:** Get support and collaborate with peers from around the world.   |                                                                                                          |\n\nUltimately, freeCodeCamp offers the most accessible and community-supported way to learn React. By following its curriculum, you’ll not only learn the library but also adopt some of the [best practices for React development](https://magicui.design/blog/react-best-practices) through hands-on, practical application.\n\n**Website:** [https://www.freecodecamp.org/learn/](https://www.freecodecamp.org/learn/)\n\n## 6. The Odin Project\n\nFor self-motivated learners seeking a structured, yet completely free, pathway, The Odin Project offers a gold-standard curriculum for building **React projects for beginners**. It integrates React training within its comprehensive Full-Stack JavaScript path, focusing on a hands-on, project-first philosophy. Instead of just watching videos, you are immediately tasked with building practical applications based on explicit project briefs.\n\n![The Odin Project](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/dfc82c20-df64-4312-b4c8-806d34ac83c4.jpg)\n\nThe Odin Project stands out by forcing you to learn how developers actually work: reading documentation, solving problems independently, and building from the ground up. The curriculum guides you through setting up a modern development environment with tools like Vite and then dives into core concepts like state, props, and Hooks. The projects, such as building a CV generator or a memory card game, are designed to solidify your understanding and give you tangible portfolio pieces.\n\n### Key Features and Learning Path\n\nThe platform is entirely text-based, presenting lessons and assignments in a clear, step-by-step format. Its strength lies in its well-defined project requirements, which provide enough structure to guide you but enough freedom to encourage creative problem-solving. As an open-source platform, it is sustained by a dedicated community and is entirely free, with optional donations.\n\n> **Practical Tip:** Actively participate in The Odin Project's Discord community. It's an invaluable resource for getting unstuck, receiving code reviews from peers, and connecting with other aspiring developers who are on the same journey.\n\n### Pros and Cons\n\n| **Pros**                                                                                           | **Cons**                                                                                             |\n| -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| **Completely Free:** No fees or subscriptions required for full access.                            | **Self-Directed Pacing:** Requires a high level of discipline and motivation to complete.            |\n| **Strongly Project-Oriented:** Builds portfolio-ready projects as part of the curriculum.          | **Text-Based Learning:** May not suit learners who prefer video-based instruction.                   |\n| **Active Community Support:** Large, helpful community on Discord for assistance and code reviews. | **Less Frequent Updates:** As a free resource, it may lag slightly behind the latest React features. |\n| **Teaches Modern Tools:** Emphasizes current best practices and tools like Vite.                   |                                                                                                      |\n\nUltimately, The Odin Project is an unparalleled free resource for disciplined beginners who want to learn React by doing, building a strong foundation and an impressive portfolio along the way.\n\n**Website:** [https://www.theodinproject.com/paths/full-stack-javascript](https://www.theodinproject.com/paths/full-stack-javascript)\n\n## 7. Packt\n\nFor developers who learn best by reading and referencing detailed, written instructions, Packt offers a standout resource: the book \"React Projects\". This is an excellent choice for building **React projects for beginners** through structured, step-by-step guides. Instead of a video course, it provides a collection of tangible, real-world applications that you can build at your own pace, making it perfect for offline learning and easy reference.\n\n![Packt](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/f755782c-6414-4e2c-ac6a-e9c9cf0fbcd9.jpg)\n\nThis book shines by walking you through multiple complete projects, each designed to teach different aspects of the React ecosystem. You'll progress from foundational concepts to more advanced topics like React Hooks, the Context API, building Progressive Web Apps (PWAs), and implementing testing. The approach ensures you not only learn the \"how\" but also the \"why\" behind modern React development patterns, with an official GitHub repository providing all the necessary code for each chapter.\n\n### Key Features and Learning Path\n\nPackt provides flexible access options tailored to different needs. You can purchase the \"React Projects\" book as a standalone eBook (PDF/EPUB) or a physical print edition. Alternatively, a Packt subscription grants you access to their entire library of technical books and videos, which is a great value for continuous learners. The book's project-based structure allows you to build a diverse portfolio, from a simple task manager to a more complex full-stack MERN application.\n\n> **Practical Tip:** Check the publication date of the edition you are purchasing. While the core concepts remain relevant, you may need to update a few dependencies or syntax conventions to align with the very latest versions of React and its related libraries.\n\n### Pros and Cons\n\n| **Pros**                                                                                       | **Cons**                                                                                           |\n| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |\n| **Clear, Concrete Project Builds:** Ideal for offline reading and quick reference.             | **Potential for Outdated Content:** Some editions may be a few years old, requiring minor updates. |\n| **Flexible Buying Options:** Choose between a single book or full library subscription.        | **Print Delivery Times:** Physical copies can take 10-15 business days to arrive in the US.        |\n| **Broad Topic Coverage:** Includes advanced concepts like PWAs and full-stack patterns.        |                                                                                                    |\n| **Official Code Repository:** All project code is readily available on GitHub for easy access. |                                                                                                    |\n\nUltimately, Packt offers a focused, text-based path for developers who prefer to learn by reading and doing. It's a solid, self-paced alternative to video tutorials for building a strong foundation in React project development.\n\n**Website:** [https://www.packtpub.com/en-us/product/react-projects-9781789953398](https://www.packtpub.com/en-us/product/react-projects-9781789953398)\n\n## Beginner React Project Platforms Comparison\n\n| Item             | Implementation Complexity 🔄                           | Resource Requirements ⚡                | Expected Outcomes 📊                       | Ideal Use Cases 💡                                         | Key Advantages ⭐                                                  |\n| ---------------- | ------------------------------------------------------ | --------------------------------------- | ------------------------------------------ | ---------------------------------------------------------- | ------------------------------------------------------------------ |\n| Magic UI         | Moderate: Familiarity with React & Tailwind beneficial | Moderate: Modern stack and UI blocks    | High-quality, responsive web UI quickly    | Rapid landing page creation for developers/designers       | Rich customizable components, high performance, visually dynamic   |\n| Udemy            | Moderate-High: Wide topic coverage                     | Moderate: Time investment for 70+ hrs   | Solid React foundation & advanced skills   | Structured course-based learning from beginner to advanced | Comprehensive, project-heavy, lifetime access, updated content     |\n| Scrimba          | Low-Moderate: Interactive & beginner-friendly          | Low: Hands-on coding environment        | Practical coding skills with projects      | Beginners seeking interactive, learn-by-doing courses      | Interactive coding, clear progression, supportive community        |\n| Frontend Mentor  | Low: No instruction, focused on practice               | Low: Access to challenges, some free    | Portfolio-ready real-world React projects  | Practice React with professional UI/UX briefs              | Real-world challenges, community feedback, free projects available |\n| freeCodeCamp     | Low-Moderate: Self-paced, requires self-motivation     | Low: Entirely free with large community | Foundational React skills, certificates    | Cost-free learning with structured React content           | 100% free, massive community, up-to-date curriculum                |\n| The Odin Project | Moderate: Self-directed project-based                  | Low: Free access with community support | Portfolio projects with modern React tools | Learners wanting free, guided projects without cost        | Project-oriented, modern tools, community help                     |\n| Packt            | Moderate: Reader-driven, project-based                 | Low-Moderate: Purchase needed           | Referenceable project builds offline       | Learners preferring structured, written project guides     | Concrete projects, offline access, broad topic coverage            |\n\n## Your Next Steps: Building Beyond the Tutorial\n\nYou have now explored a diverse range of platforms, from the interactive tutorials of Scrimba and Udemy to the community-driven curriculum of The Odin Project and freeCodeCamp. Each tool offers a unique pathway for tackling **react projects for beginners**, providing the foundational knowledge and hands-on experience necessary to build modern web applications. The key takeaway is that the \"best\" platform is the one that aligns with your specific learning style and professional goals.\n\nThe journey from a beginner to a proficient React developer is paved with consistent practice and a commitment to understanding core concepts. Simply completing a tutorial is not enough. The real learning begins when you start to deviate from the instructions, add your own custom features, and troubleshoot the inevitable errors that arise. This process of experimentation is what solidifies your understanding of state management, component lifecycle, and hooks.\n\n### Choosing Your Path and Tools\n\nSelecting the right starting point is crucial. Your decision should be guided by what you want to achieve.\n\n- **For Structured, Guided Learning:** If you thrive with video-based instruction and a clear, step-by-step curriculum, platforms like **Udemy**, **Scrimba**, and **Packt** offer comprehensive courses that hold your hand through complex projects.\n- **For Community-Driven, In-Depth Education:** If you prefer a more rigorous, self-paced, and text-based approach that mimics a full-stack curriculum, **The Odin Project** and **freeCodeCamp** are unparalleled. They foster a deep, fundamental understanding from the ground up.\n- **For Real-World Practice and Portfolio Building:** **Frontend Mentor** is the ideal choice when you want to bridge the gap between tutorials and professional work. It provides professional designs and challenges you to build pixel-perfect applications, a skill highly valued by employers.\n\nAs you move beyond these initial projects, you will inevitably encounter challenges that tutorials don't cover. This is a natural part of the development process. When you get stuck on a tricky bug or a complex implementation detail, turning to community resources is essential. Invaluable platforms like [Stack Overflow](https://hyud.app/block-website/stack-overflow/google-chrome) offer a vast repository of questions and expert-verified solutions that can help you overcome any coding hurdle.\n\n### From Learning to Building Professionally\n\nUltimately, the goal of completing these beginner projects is to build a portfolio that showcases your skills. As you gain confidence, consider elevating your projects with professional-grade tools. This is where a component library like Magic UI becomes incredibly powerful. Instead of spending hours building complex animations and UI elements from scratch, you can integrate beautifully designed, accessible components directly into your application. This allows you to focus on the core business logic and functionality, accelerating your development workflow and producing a much more polished final product.\n\nYour portfolio is a testament to your growth. Start with one project, build it, break it, and then build another. Each application you create is a stepping stone, moving you closer to mastering React and launching a successful career in web development. The path is clear, the tools are at your disposal, and your next great project is waiting to be built.\n\n---\n\nReady to build stunning, modern UIs without the hassle? **Magic UI** offers a free, open-source library of animated components that you can drop directly into your React projects. Elevate your portfolio and impress employers by visiting [Magic UI](https://magicui.design) to get started.\n"
  },
  {
    "path": "apps/www/content/blog/react-tips.mdx",
    "content": "---\ntitle: \"15 Best React Tips And Hacks For Enhanced Coding & Performance\"\ndescription: \"Maximize your coding efficiency with these React tips and hacks! From optimization techniques to best practices, this guide has got you covered.\"\nimage: https://cdn.magicui.design/assets/hr087dcqaer.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-07\"\nfeatured: false\n---\n\nReact Tips are crucial within [**UI Frameworks**](https://magicui.design/blog/ui-frameworks), helping developers navigate the complexities of React and enhance their skills. Whether you're a seasoned developer looking to level up your game or a newcomer seeking guidance on tips and tricks, this article is your go-to resource. Here, we unlock the secrets that can help you thrive in the world of React.\n\nMagic UI's [**React component library**](https://magicui.design/) offers a valuable solution to simplify your development journey. It's a powerful tool designed to help you achieve your goals of mastering React Tips and tricks to enhance your development process. Let's dive into the world of React Tips and unlock their potential.\n\n# **What Is React?**\n\n![React Tips](https://cdn.magicui.design/assets/b0z94xv7mv9.jpg?w=3840&q=75)\n\nReact.Js is an open-source Javascript library developed by Meta for creating user interfaces (UIs). It helps create reusable UI components and uses virtual DOM to improve app performance. It can be used on both client and server sides and is easily integrated with other front-end frameworks. Its component-based approach, reusability, developer tools, and performance optimization make it a great choice for developers.\n\nOne of React's famous applications is Instagram. Features like geolocations, Google Maps APIs, and tags that pop up without hashtags are all impressive implementations of React. Even the makers of React, Facebook, use React for their webpage, and the mobile version is made using one of its famous frameworks, [**React native**](https://react.dev/).\n\n# **Benefits Of Using React**\n\n![React Tips](https://cdn.magicui.design/assets/8aemyat3rq.jpg?w=3840&q=75)\n\n_React Tips_\n\n## **Improved User Experience**\n\nReact allows developers to build highly interactive and responsive user interfaces, resulting in a smoother and more engaging user experience. The virtual DOM efficiently updates and renders only the changed components, reducing load times and improving performance.\n\n## **Reusable Components**\n\nReact promotes a modular approach with reusable components, self-contained modules that can be used across different parts of an application. Reusable components save development time, improve maintainability, and make adding new features or fixing bugs easier.\n\n## **Efficient Development Process**\n\nReact provides a rich set of tools and libraries that facilitate the development process, such as React Developer Tools, Redux, and React Router. Its simple and intuitive syntax makes it easy to learn and use, especially for developers familiar with JavaScript.\n\n## **Performance Optimization**\n\nReact utilizes a virtual DOM and a diffing algorithm to efficiently update and render only the necessary parts of the UI, resulting in faster rendering and improved overall performance.\n\n## **Flexibility and Integration**\n\nReact seamlessly integrates with other technologies and frameworks, making it a versatile choice for web development. It can be used with popular libraries like Axios for [**API requests or UI frameworks**](https://hackernoon.com/why-is-react-the-best-front-end-framework-to-learn-in-2024) like Bootstrap for styling components.\n\n## **Effortless UI Development: Pre-Built, Animated Components with MagicUI**\n\n[**MagicUI**](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [**React component library**](https://magicui.design/) for free today at [**https://magicui.design/docs**](https://magicui.design/docs).\n\n## **Related Reading**\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n# **15 Best React Tips And Hacks For Enhanced Code Readability & Performance**\n\n![React Tips](https://cdn.magicui.design/assets/hz68wjs8djp.jpg?w=3840&q=75)\n\n## **1\\. Use React Fragments**\n\nReact fragments allow you to group a list of children without adding extra nodes to the DOM. This can be useful when you need to render a list of items without adding extra markup. Use fragments all the time to tidy up the DOM and improve readability.\n\nBelow is a simple example of using a react fragment in a functional React component:\n\n`const MyComponent = () => { return ( <React.Fragment> <h1>My React Component</h1> <p>This is an example of using React Fragment in a functional component.</p> </React.Fragment> ); };`Copy\n\nIn this example, the react fragment is used to contain a heading and a paragraph without having to add any extra HTML elements.\n\n## **2\\. Use Constants**\n\nIn JavaScript we can declare constants by using the const keyword. This helps us avoid re-declaring the same value. So constants are a great choice for storing API keys and other values like that. Constants improve the scalability, readability, and internationalization of any React codebase. In every ReactJS project, you should avoid hard-coding strings (content) in your components.\n\nThis will make your project more maintainable, scalable, and readable, as it isolates the UI, data, and content layers from each other. Constants include:\n\n- API key\n- URLs\n- Content\n\nMany websites support multiple languages, like English, French, Spanish, and so on. This is known as internationalization (or i18n for short). If you're enabling i18n features on your site, you should create separate constant files for your content – for example en.js and fr.js. Even if you don't have multiple language support or no i18n, keeping your content outside your code in a constant file is still a good idea.\n\nYou can either name your constant file\\[LANGUAGE_INITIAL\\].js, or constants.js. These are the most common file names developers use for this purpose.\n\n## **3\\. Use React With TypeScript**\n\nTypeScript is a typed superset of JavaScript that can help you catch errors early and make your code more maintainable. It also makes it easier to refactor code. It is one hot skill that has been trending in the frontend space recently and one of the developers’ top choices for learning shortly.\n\nLearning Typescript is a game-changer with profound productivity effects for your React applications. The create-react app now comes with built-in support for typescript.\n\nTo start a new Create React App project with TypeScript, you can run:\n\nnpx create-react-app my-app --template typescript\n\nor\n\nyarn create react-app my-app --template typescript\n\nThe advantages of using typescript with React include type safety, faster development time, future-proof code, improved code readability, and improved scalability. Below is a simple example of using TypeScript in a functional React component:\n\n`import * as React from 'react'; interface Props { text: string; } const MyComponent: React.FC<Props> = ({ text }) => { return ( <div> {text} </div> ); };`\n\n## **4\\. Separate Presentational & Container Components**\n\nSeparating Presentational and container Components makes our code easier to test and reason about. Presentational components are concerned with how things look. They receive their data and behavior from parent components. Container components are concerned with how things work. They provide the data and behavior to presentational or other container components.\n\nThis approach allows us to reuse the same presentational components with different data and behavior. It also makes our code cleaner and much easier to test.\n\n## **5\\. Separate Presentational & Container Components**\n\nSeparating Presentational and container Components makes our code easier to test and reason about. Presentational components are concerned with how things look. They receive their data and behavior from parent components. Container components are concerned with how things work. They provide the data and behavior to presentational or other container components.\n\nThis approach allows us to reuse the same presentational components with different data and behavior. It also makes our code cleaner and much easier to test.\n\n## **6\\. Don’t Forget to Remove the Listener When Unmounting Components!**\n\nEvent listeners, such as Keyboard Listeners, Event Listeners, etc, are important methods in React. When you add listeners on useEffect like onMouseOver, onScroll, onClick, etc., it will create listeners for you, but not everyone knows how important it is to remove it.\n\nOtherwise, when you back to the component, it will create another listener object which contributes to memory leaks and unexpected listeners behavior.\n\nSo the best solution is to remove listeners, freeing out memory and providing you with uninterrupted behavior.\n\n## **Related Reading**\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n# **5 Common Challenges React Developers Face**\n\n![React Tips](https://cdn.magicui.design/assets/ljnw8c0vp1i.jpg?w=3840&q=75)\n\n## **1\\. Learning the basics of React**\n\nTo overcome the steep learning curve, developers can start by understanding the core concepts of React, such as components, props, and state. Then, they can progressively move on to more advanced concepts like context, hooks, and custom hooks. Working on small projects to practice what they have learned and gradually build up their skills is also beneficial.\n\n## **2\\. Debugging React applications**\n\nTo make debugging easier, developers can use tools like the Chrome Developer Tools or browser extensions like React DevTools. These tools allow developers to inspect components, their state, and props, which can help identify issues within the application. Writing clean code and using good coding practices can also improve debugging.\n\n## **3\\. Maintainability of React applications**\n\nTo maintain the codebase of a React application, developers can split components into smaller, reusable pieces, making it easier to manage and update them. Proper documentation and commenting on the code can also help in understanding the application structure in the future. Utilizing state management libraries like Redux can further enhance the maintainability of larger React applications.\n\n## **4\\. Struggling with Redux in React**\n\nTo tackle the challenges of learning and using Redux in React, developers can start by understanding the core concepts and principles of Redux. Practicing with smaller projects can help solidify their understanding of Redux before implementing it in larger applications. Utilizing resources like official Redux documentation, tutorials, and online courses can also assist developers in mastering Redux.\n\n## **5\\. Dealing with bugs caused by third-party libraries**\n\nWhen working with third-party libraries in React, developers can mitigate potential bugs by thoroughly testing the application after integrating these libraries. Checking the documentation, GitHub repository, or issue tracker for the library can provide insights into common bugs and their solutions. If issues persist, reaching out to the library's community or filing a bug report can help resolve the problem efficiently.\n\n# **Check Out Our React Component Library for Design Engineers**\n\n[**MagicUI**](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [**React component library**](https://magicui.design/) for free today at [**https://magicui.design/docs**](https://magicui.design/docs).\n\n## **Related Reading**\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/react-ui-framework.mdx",
    "content": "---\ntitle: Choosing the Best React UI Framework\ndescription: >-\n  A deep dive into the top React UI framework options. Compare MUI, Ant Design,\n  Chakra UI, and more to find the perfect fit for your project.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-be0b9172-9108-41d7-b547-a3b7ae22b520.jpg\nauthor: Dillion Verma\ntags:\n  - react ui framework\n  - react components\n  - frontend development\n  - ui libraries\npublishedOn: \"2025-11-09T08:35:54.763006+00:00\"\nfeatured: true\n---\n\nPicking the right **React UI framework** is one of those big, upfront decisions that ripples through your entire project. It's not just about aesthetics; it shapes how your team builds, how fast they can move, and how the final app actually performs. Your choice here defines the developer experience just as much as the user experience.\n\nThis guide is designed to cut through the noise. We'll compare the heavy hitters—Magic UI Pro, Material-UI (MUI), Ant Design, and Chakra UI—so you can make a call that fits your project, not just what's popular this week.\n\n## Why a React UI Framework Is a Critical Choice\n\nThinking of a UI framework as just a \"theme\" is a huge mistake. It's a foundational layer that deeply influences your project's architecture and your team's day-to-day workflow. This becomes crystal clear when you place it in the context of [modern web application architecture](https://opsmoon.com/blog/web-application-architecture), where the frontend is everything.\n\nReact’s dominance has created a massive ecosystem of these frameworks. The numbers speak for themselves: React is behind roughly **4.8% of all websites**, which adds up to over **11 million** live sites. Even more telling, it’s used by **6.2% of the top 10,000 websites**, proving its mettle in high-stakes, high-traffic environments.\n\nThe official React site sums it up perfectly—it's all about building interfaces from small, self-contained pieces of code called components.\n\n![Screenshot from https://react.dev/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0d4e7d0e-e422-4d6b-951d-819de9079d1e.jpg)\n\nThis component model is React's superpower. Every UI framework we're looking at simply offers a different opinion—a different philosophy—on the best way to build and combine those components.\n\n### Key Differentiators to Consider\n\nIt's tempting to just compare feature lists, but that's a trap. The real differences are in the core philosophies of each framework. These philosophies dictate how you'll approach styling, customization, and even the structure of your application. A framework is more than just a box of buttons and inputs; it’s an opinionated system for building UIs.\n\n> The best React UI framework isn't the one with the most components. It's the one whose design philosophy clicks with your project goals and your team's way of working.\n\nTo make this tangible, here's a quick breakdown of the frameworks we'll be digging into.\n\n| Framework        | Core Philosophy                               | Ideal Use Case                                |\n| :--------------- | :-------------------------------------------- | :-------------------------------------------- |\n| **Magic UI Pro** | Animated, modern aesthetics out-of-the-box    | Visually rich marketing & landing pages       |\n| **MUI**          | Adherence to Google's Material Design         | Internal tools & Google-ecosystem apps        |\n| **Ant Design**   | Comprehensive, enterprise-grade design system | Data-intensive dashboards & complex apps      |\n| **Chakra UI**    | Utility-first, highly composable & accessible | Highly customized and accessible applications |\n\nGetting a handle on these core distinctions is your first step. Each one offers a unique balance of speed, flexibility, and design consistency, and we’re about to dive into exactly what that means for you.\n\n## The Core Criteria for Framework Evaluation\n\nChoosing the right **React UI framework** is about more than just a quick glance at a feature list. To make a decision you won't regret down the line, you need a solid set of criteria to measure each option against. This is how you can fairly compare libraries like Magic UI Pro, MUI, and Ant Design on the things that actually make or break a project.\n\nWe're going to look at each framework through five critical lenses:\n\n1.  **Component Philosophy and Design:** What's the core idea behind how they build components and what do they look like out of the box?\n2.  **Customization and Theming:** How easy is it to make the framework look like _your_ brand, not theirs?\n3.  **Performance and Bundle Size:** What’s the performance hit? How much extra weight will this library add to your app?\n4.  **Documentation and Community:** How good are the learning resources, and is there an active community to help you when you get stuck?\n5.  **Accessibility (a11y) Standards:** How well does the framework support building experiences that work for everyone?\n\nUsing these pillars gives us a structured way to dig into the real trade-offs you'll be making.\n\n### Component Philosophy and Design\n\nA framework's philosophy is its DNA. It shapes everything about the developer experience, from the first component you build to the headaches of long-term maintenance. For instance, a library with a **utility-first** approach—like Tailwind CSS, which is the engine behind Magic UI Pro—hands you the keys by letting you compose styles from tiny, low-level classes. Total control.\n\nOn the flip side, you have **pre-styled component** libraries like Ant Design, which give you polished, enterprise-grade components ready to go. This can seriously speed up development for standard interfaces, but bending those components to a truly unique design can feel like a fight. When you're weighing your options, thinking about how each approach aligns with [essential user interface design best practices](https://upnorthmedia.co/blog/user-interface-design-best-practices) is a great starting point.\n\n### Customization and Performance\n\nCustomization and performance are locked in a delicate dance. A framework that gives you endless theming power often does so with CSS-in-JS, a technique that lets you write your styles right inside your JavaScript. Libraries like Chakra UI and MUI lean into this, offering incredibly dynamic, component-level styling.\n\nBut that flexibility doesn't come for free; it can add a small performance cost at runtime. The alternative is **static CSS extraction**, where styles are compiled into plain old CSS files when you build your app. This usually means faster initial page loads, but it can make on-the-fly theming a bit more cumbersome.\n\n> Understanding the trade-off between styling flexibility (CSS-in-JS) and raw performance (static CSS) is fundamental. Your choice depends on whether your project prioritizes dynamic, real-time style changes or the absolute fastest load time.\n\nUltimately, you have to look at the **bundle size**—the amount of code the framework adds to your final application. A bloated bundle can tank the user experience, especially for people on slower connections. We'll get into the specifics for each framework, giving you the hard data you need to pick a tool that fits both your performance budget and your team's workflow.\n\n## A Detailed Comparison of Leading Frameworks\n\nNow that we have our criteria laid out, it's time to put the top frameworks under the microscope. This isn't about crowning a single \"winner.\" Instead, we're diving into the unique philosophies and trade-offs of Magic UI Pro, MUI, Ant Design, and Chakra UI. Each **react ui framework** offers a different way to build interfaces, and the right choice is all about what your project demands.\n\nWe'll go beyond basic feature lists to really get into the developer experience, how far you can push customization, and the core design ideas behind each one. By looking at how they handle everyday tasks like theming and building out components, you’ll get a real feel for what it’s like to work with them.\n\nTo keep things focused, we'll size up each framework based on five key areas: design, customization, performance, documentation, and accessibility.\n\n![Infographic about react ui framework](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/139a9d6a-4eec-42e7-83de-c162693084d1.jpg)\n\nThis breakdown makes it clear that picking a framework is a balancing act. You have to weigh multiple important factors, not just chase a single feature.\n\n### React UI Framework Feature Comparison\n\nHere's a quick side-by-side look at how these popular frameworks stack up. Think of this as a cheat sheet to quickly grasp their core differences before we dive deeper into each one.\n\n| Framework        | Core Philosophy                | Customization Level     | Built-in Components      | Best For                                                                      |\n| :--------------- | :----------------------------- | :---------------------- | :----------------------- | :---------------------------------------------------------------------------- |\n| **Magic UI Pro** | Aesthetics & Motion First      | High (Tailwind CSS)     | 50+ animated blocks      | Visually stunning marketing sites, portfolios, and landing pages.             |\n| **MUI**          | Material Design Implementation | High (CSS-in-JS)        | Extensive library        | Admin dashboards, internal tools, and apps needing a consistent, familiar UI. |\n| **Ant Design**   | Enterprise-Grade Design System | Medium (Less variables) | Massive, complex library | Data-heavy enterprise applications, complex forms, and dashboards.            |\n| **Chakra UI**    | Composability & Accessibility  | Very High (Style Props) | Accessible UI primitives | Custom designs, rapid prototyping, and accessibility-focused projects.        |\n\nThis table gives you the high-level view, but the real story is in the details of building with each framework. Let's get into the specifics.\n\n### MUI: The Material Design Powerhouse\n\n[Material-UI](https://mui.com/), now just MUI, has been a giant in the React world for a long time. Its biggest draw is its rock-solid, comprehensive implementation of Google's Material Design system. This makes it a go-to for projects that want to align with Google's look and feel or for teams who just want a mature, well-defined design language right out of the gate.\n\nMUI comes loaded with a huge library of components, from basic buttons to seriously complex data grids. This approach can massively speed up development, especially for internal tools, admin panels, and apps where a clean, predictable UI is the top priority.\n\nBut that dedication to Material Design can also feel restrictive. While MUI is very customizable, trying to break too far from its core design can feel like you're swimming upstream. Customization is handled through a powerful theming API that uses CSS-in-JS (usually [Emotion](https://emotion.sh/docs/introduction)), giving you deep control over colors, fonts, and component styles.\n\nLet's see what basic theming looks like. To change a button's default style, you create a theme object and wrap your app in a `ThemeProvider`.\n\n```javascript\nimport { Button, createTheme, ThemeProvider } from \"@mui/material\"\n\nconst theme = createTheme({\n  palette: {\n    primary: {\n      main: \"#556cd6\",\n    },\n  },\n  components: {\n    MuiButton: {\n      styleOverrides: {\n        root: {\n          borderRadius: 8,\n          textTransform: \"none\",\n        },\n      },\n    },\n  },\n})\n\nfunction App() {\n  return (\n    <ThemeProvider theme={theme}>\n      <Button variant=\"contained\">Custom Button</Button>\n    </ThemeProvider>\n  )\n}\n```\n\nThis structured system is great for consistency, but it means you'll spend some time in the docs figuring out the specific APIs for each component you want to tweak.\n\n### Ant Design: The Enterprise-Grade Toolkit\n\n[Ant Design](https://ant.design/) (AntD) markets itself as a design system for enterprise-level products, and it delivers. It has an even bigger component library than MUI, with sophisticated tools like statistical charts, intricate form layouts, and powerful data visualization widgets. Its look is professional, clean, and perfectly suited for data-heavy applications.\n\nComing from Ant Group, AntD has been battle-tested in some seriously complex financial apps, which gives developers a lot of confidence in its stability. The documentation is top-notch, with exhaustive API references and practical examples for its massive component set.\n\nAntD handles customization by modifying Less variables, which is a different beast compared to the CSS-in-JS approach of its rivals. This can lead to better runtime performance since styles are compiled into static CSS, but it can feel a bit rigid if you're used to styling components directly. For a deeper comparison, check out our guide on [Ant Design vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui).\n\n> Ant Design’s greatest strength is its “batteries-included” philosophy. It gives you a complete UI solution right out of the box, letting teams build complex, feature-packed interfaces incredibly fast—as long as its design system fits their vision.\n\n### Chakra UI: The Composer's Toolkit\n\n[Chakra UI](https://chakra-ui.com/) flips the script entirely. Instead of giving you fully-styled components, it provides a set of highly composable and accessible building blocks. Its whole philosophy is built around style props, letting you style components right in your JSX using a shorthand syntax that maps directly to CSS.\n\nThis utility-first method gives you incredible flexibility and makes building custom, on-brand designs feel intuitive and quick. Accessibility is baked into every component from the ground up, adhering to WAI-ARIA standards. This is a huge differentiator and saves developers a ton of time making their apps usable for everyone.\n\nChakra UI also uses Emotion for its CSS-in-JS engine but exposes it through a slick style prop API. Here’s how you might style a button—it feels much more direct than MUI’s theme overrides for one-off adjustments.\n\n```javascript\nimport { Button, ChakraProvider, extendTheme } from \"@chakra-ui/react\"\n\n// You can still extend the theme for global styles\nconst theme = extendTheme({\n  colors: {\n    brand: {\n      500: \"#ff6347\",\n    },\n  },\n})\n\nfunction App() {\n  return (\n    <ChakraProvider theme={theme}>\n      {/* Or just apply styles directly when you need to */}\n      <Button\n        bg=\"brand.500\"\n        color=\"white\"\n        _hover={{ bg: \"brand.600\" }}\n        borderRadius=\"md\"\n        px={6}\n      >\n        Styled Button\n      </Button>\n    </ChakraProvider>\n  )\n}\n```\n\nThat mix of composability, great developer experience, and built-in accessibility makes Chakra UI a fan favorite for teams that need custom designs and want to prototype fast.\n\n### Magic UI Pro: The Aesthetic Innovator\n\nMagic UI Pro carves out its own niche by putting modern aesthetics and slick motion design first. Built on top of [Tailwind CSS](https://tailwindcss.com/) and [Framer Motion](https://www.framer.com/motion/), it’s made for creating jaw-dropping, animated web experiences without the headache. While other frameworks give you the parts to build anything, Magic UI Pro is your go-to for building marketing sites, landing pages, and portfolios where visual punch is everything.\n\nThe library offers over **50 pre-built blocks and templates** that are not only gorgeous but also fully customizable thanks to Tailwind CSS. This means you can build things incredibly fast without ever compromising on design quality. The experience is as simple as copying production-ready JSX from the website and pasting it right into your project.\n\nThe broader React ecosystem is as strong as ever, which is great news for tools like this. Over **40% of professional developers** are actively using [React.js](https://react.dev/), and its weekly NPM downloads frequently top **20 million**—leaving alternatives in the dust. This massive community ensures a solid foundation and a big audience. You can dig into these numbers in a [recent analysis of React.js trends](https://www.netguru.com/blog/react-js-trends).\n\nHere's a peek at how straightforward it is to use a Magic UI Pro component. The styling is all handled by Tailwind's utility classes, which keeps the code clean and the styling logic right where you need it.\n\n```javascript\n// Example assumes Tailwind CSS is configured in your project.\n// You would typically copy this component's code from magicui.design.\n\nexport default function AnimatedShinyButton() {\n  return (\n    <button className=\"relative inline-flex h-12 overflow-hidden rounded-full p-[1px] focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 focus:ring-offset-slate-50 focus:outline-none\">\n      <span className=\"absolute inset-[-1000%] animate-[spin_2s_linear_infinite] bg-[conic-gradient(from_90deg_at_50%_50%,#E2CBFF_0%,#393BB2_50%,#E2CBFF_100%)]\" />\n      <span className=\"inline-flex h-full w-full cursor-pointer items-center justify-center rounded-full bg-slate-950 px-3 py-1 text-sm font-medium text-white backdrop-blur-3xl\">\n        Get Started\n      </span>\n    </button>\n  )\n}\n```\n\nMagic UI Pro's unique value is its focus on high-end, animated, ready-to-go components. It closes the gap between design and code, letting you build interfaces that feel alive and modern without needing to be an animation wizard.\n\n## Matching a Framework to Your Project Type\n\nPicking the right **React UI framework** isn't some abstract thought exercise; it's a practical choice that directly impacts your project's timeline, budget, and ultimate success. That killer feature that looks amazing on a demo site might be total overkill for a simple landing page, or completely inadequate for a complex enterprise system.\n\nThe secret is to stop looking at frameworks in a vacuum and start matching their core strengths to what you’re actually building. Context is everything. Let's dig into some real-world scenarios to see how these tools stack up.\n\n![A developer works on a complex user interface on their computer screen.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d3fb65e9-53c0-4ddd-9f46-e7048a91876b.jpg)\n\n### Enterprise Dashboards and Data-Heavy Applications\n\nWhen you're wrestling with complexity—think dense data grids, intricate forms, and convoluted workflows—you need a framework that brings heavy-duty solutions to the table. This is where **Ant Design** truly comes into its own.\n\n- **Ideal Project:** A financial analytics platform, an internal CRM, or a logistics management dashboard.\n- **Why it Fits:** Ant Design is unapologetically \"batteries-included.\" Its library is packed with enterprise-grade components like complex tables with built-in sorting and filtering, robust form validation, and sophisticated data visualization tools. This means you spend less time building foundational UI from scratch and more time on the business logic that actually matters. The whole system is cohesive and professional, ensuring a consistent look and feel across hundreds of different screens.\n\n### Visually Rich Marketing and Landing Pages\n\nFor projects designed to grab attention, tell a story, and drive conversions, aesthetics and fluid motion are paramount. This is the sweet spot for **Magic UI Pro**, a toolkit purpose-built for visual impact.\n\n- **Ideal Project:** A product launch website, a digital agency's portfolio, or a high-converting marketing landing page.\n- **Why it Fits:** Built on Tailwind CSS and Framer Motion, Magic UI Pro gives you over **50 animated components and templates** right out of the box. Its entire focus is on delivering a slick, modern feel with minimal fuss. Instead of spending days coding animations, you can implement stunning, production-ready experiences by just copying and pasting code. It’s a massive accelerator for any visually-driven project.\n\n> The real power of a specialized framework like Magic UI Pro is its opinionated approach. It doesn’t try to be a jack-of-all-trades. It aims to be the absolute best tool for building beautiful, animated web interfaces that get results.\n\n### Internal Tools and Corporate Applications\n\nFor internal-facing apps, consistency, reliability, and speed often trump the need for a completely novel design. This is the bread and butter of **MUI (formerly Material-UI)**.\n\n- **Ideal Project:** A company wiki, an HR management portal, or an internal bug-tracking system.\n- **Why it Fits:** MUI’s faithful implementation of Google's Material Design offers a familiar, intuitive UI that most users already understand, cutting down on training time. Its massive component library has a solution for almost any challenge, while its powerful theming system lets you customize it just enough to feel on-brand. Teams can build functional, great-looking internal apps at an incredible pace. For a deeper look, check out our detailed guide on the [best React component library choices](https://magicui.design/blog/best-react-component-library).\n\n### Highly Customized and Accessible Web Apps\n\nWhen your design is totally unique and can't be shoehorned into an existing system, you need one thing above all else: flexibility. **Chakra UI** was built from the ground up for this kind of freedom, without ever compromising on accessibility.\n\n- **Ideal Project:** A bespoke consumer-facing application, a design-forward startup website, or any project with strict accessibility requirements.\n- **Why it Fits:** Chakra UI provides a set of highly composable and accessible building blocks. Its utility-first style props let you build virtually any design imaginable right in your JSX, which is fantastic for rapid prototyping and iteration. Better yet, every component is built with WAI-ARIA standards in mind, so you get best-in-class accessibility baked in from the start—a massive advantage for any public-facing app.\n\n## How to Make Your Final Decision\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/kw6fMtkECko\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nPicking a **React UI framework** is a big deal. It's a commitment that will define how you build and maintain your project for a long time to come. We've walked through the strengths of the big players, but the goal isn't just to crown a \"winner\"—it's about finding the perfect fit for _you_.\n\nThat means it's time to stop looking at feature lists and start looking inward at your team, your project goals, and your long-term vision. The best way forward becomes much clearer once you start asking the right questions.\n\n### Clarifying Your Project Requirements\n\nFirst thing's first: you need a practical assessment of what your project absolutely _must_ have. Is this a public-facing website where accessibility is a legal requirement? Or is it an internal dashboard where shipping fast is the only thing that matters? Your answers here will immediately start to narrow the field.\n\nThink about these critical questions:\n\n- **What is your accessibility baseline?** If you need to hit **WCAG** compliance from day one, a framework built with accessibility at its core, like [Chakra UI](https://chakra-ui.com/), gives you a massive head start.\n- **How much creative freedom do you need?** For a completely bespoke design, the utility-first approach of **Magic UI Pro** (via Tailwind) or the style props in Chakra UI offer total control. But if you need a pre-built, consistent design system, [MUI](https://mui.com/) or [Ant Design](https://ant.design/) are much stronger contenders.\n- **What's your performance budget?** Every kilobyte counts, especially for a slick marketing site. A framework that relies on static CSS extraction will often have a performance edge over one that leans heavily on runtime CSS-in-JS.\n\nGetting these answers gives you a solid technical foundation. But that's only half the story.\n\n> The most powerful framework is useless if your team can't use it effectively. The final decision must weigh your team's existing skills and workflow preferences just as heavily as any technical feature.\n\n### Evaluating Your Team and Long-Term Vision\n\nYour team’s collective experience is a huge part of the equation. If your developers live and breathe CSS-in-JS libraries like Emotion, they'll be right at home with Chakra UI or MUI. On the flip side, forcing them into a utility-class workflow could seriously slow them down.\n\nNow, you need to zoom out and look at the bigger picture.\n\n- **Team Experience:** Does your team have a strong preference for a certain styling method? Forcing a new paradigm can create a steep learning curve and kill productivity.\n- **Maintenance Horizon:** Is this a quick project or a platform you'll be supporting for years? For long-term apps, things like robust documentation, a big community, and solid corporate backing (like Ant Design's) become critical for stability.\n\nIn the end, this decision is a key part of your entire development strategy. Choosing a framework is just one piece of the puzzle. For a broader look at making these kinds of foundational choices, we've got a ton of insights in our guide on [how to choose your tech stack](https://magicui.design/blog/how-to-choose-tech-stack).\n\nThere is no single \"best\" React UI framework. There's only the best one for _your_ project, _your_ team, and _your_ goals. By carefully balancing the technical needs with your team's expertise, you can make a confident choice that sets you up for success.\n\n## Frequently Asked Questions\n\nJumping into the world of React UI frameworks always brings up a few questions, especially when you start thinking about the day-to-day grind of building and maintaining a real project. It's not just about flashy features; it's about the long-term health of your codebase and your team's sanity.\n\nLet's tackle some of the most common questions developers ask when they're on the hunt for the right UI framework. Getting these answers straight can help you sidestep some common traps and make a choice you won't regret later.\n\n### Can I Mix Components From Different React UI Frameworks?\n\nTechnically, yes, you can. But should you? Almost certainly not. While it's possible to pull in components from multiple UI libraries, it’s a recipe for disaster. You'll almost immediately run into a bloated bundle size because you're shipping the runtime and styling engines from two (or more) completely different ecosystems.\n\nBeyond the performance hit, this approach is a maintenance nightmare. You’ll be fighting with conflicting global styles, clashing design languages, and juggling multiple theming providers. If you just need one specific component, a much better strategy is to either build it yourself to match your existing framework or find a lightweight, single-purpose library that does just that one thing well.\n\n### How Much Does Performance Really Differ Between Frameworks?\n\nThe performance gap usually comes down to three things: the initial bundle size, the overhead from the styling solution, and how complex the components are out of the box. A library like [Ant Design](https://ant.design/), for instance, has a larger initial footprint because its component library is massive. But it uses Less for styling, which can be faster at runtime than some CSS-in-JS solutions.\n\n> The real performance story isn't just about the framework itself but how you use it. Techniques like code-splitting, tree-shaking, and proper memoization are critical for optimizing any React application, regardless of the UI library you choose.\n\nOn the other hand, frameworks like [Chakra UI](https://chakra-ui.com/) and [MUI](https://mui.com/) give you incredible styling flexibility with their CSS-in-JS approach, but that comes with a small runtime cost. The best way to know for sure is to analyze your production build with a tool like [Webpack Bundle Analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) to see exactly what's impacting your app's load time.\n\n### How Difficult Is Migrating From One UI Framework to Another?\n\nLet's be blunt: migrating from one **React UI framework** to another is a massive, expensive undertaking. It's so much more than a simple find-and-replace job. You're looking at a complete rewrite of every single component instance across your entire application.\n\nYou’ll have to learn a new theming system, get used to a completely different component API, and untangle fundamental differences in props and behavior. For example, swapping MUI’s `<Grid>` component for Chakra UI’s `<SimpleGrid>` isn't a one-to-one change; it would require you to refactor every single page that uses a grid layout. This is exactly why that initial framework choice is so critical. You should only even consider a migration if your current framework is causing severe development bottlenecks or just fundamentally can't meet your project's new requirements.\n\n---\n\nReady to build stunning, animated interfaces without all the complexity? **Magic UI** gives you a library of over **50** production-ready components and templates built with React, Tailwind CSS, and Framer Motion. You can start building beautiful landing pages in minutes.\n\n[Explore Components at Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/react-ux.mdx",
    "content": "---\ntitle: \"19 Best React UX Principles For React Native Apps\"\ndescription: \"Improve the usability and functionality of your React Native apps with these essential React UX principles. Enhancing your user experience today!\"\nimage: https://cdn.magicui.design/assets/5c7b9b22-61b0-44db-b368-bead0511deb9.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-25\"\nfeatured: false\n---\n\nReact UX enhances user experience by providing fluid interactions and seamless navigation. Imagine effortlessly engaging with an app that responds intuitively to your every touch, click, and swipe. You'll discover how to enhance React UX/UI design in apps, making them more intuitive and user-friendly with [UI frameworks](https://magicui.design/blog/ui-frameworks).\n\nMagic UI offers a [React component library](https://magicui.design/) that simplifies the process of designing and developing engaging user interfaces. Learn how this tool can help you achieve your goal of enhancing React UX/UI design in apps.\n\n## What Is React Native?\n\n![React UX](https://images.unsplash.com/photo-1555949963-ff9fe0c870eb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxyZWFjdCUyMG5hdGl2ZXxlbnwwfHx8fDE3MTkzODUyMTB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nReact Native is an open-source framework that provides developers with resources such as pre-built components, libraries, and reference material. This framework is the basic structure upon which applications are developed and allows customization to suit individual needs. It eliminates the need to build applications from scratch, making the development process more efficient and less time-consuming.\n\n### What Does \"Native\" Mean in React Native?\n\nWhen an application or software is considered native, it means that it is specifically written for a device's natural operating system. For instance, a PlayStation 5 game is native to the PS5 because it was designed exclusively for that particular device and operating system.\n\n- Native applications and code usually provide a better user experience as they are optimized to perform efficiently and seamlessly on their designated platforms.\n- React Native enables developers to render applications natively, ensuring that the applications run smoothly and perform exceptionally despite not being tailored specifically for a particular device or OS.\n\n[React Native](https://reactnative.dev/) is a powerful tool for developers that allows for the efficient development of applications with native functionality. By leveraging this framework, developers can create applications that run smoothly and perform optimally on various platforms.\n\n## What Is UX Design?\n\n![React UX](https://images.unsplash.com/photo-1529119513315-c7c361862fc7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx1eHxlbnwwfHx8fDE3MTkzODUyMjZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nUser experience (UX) design is critical to any successful product or service. It involves focusing on the user's overall experience when interacting with a product. This includes every touchpoint, from the initial interaction to the end of the user journey.\n\n### Crafting a seamless and enjoyable journey for users\n\nIn UX design, the focus is crafting a seamless and enjoyable journey for users when interacting with a product. It involves mapping out the entire user experience, ensuring it is intuitive and logical. UX design aims to create a product that provides a smooth and enjoyable user experience. To achieve this, it’s crucial to identify and understand the target audience, including their:\n\n- Preferences\n- Dislikes\n- Interests\n- Demographics\n- Other relevant information.\n\nArmed with this knowledge, designers can develop a product that caters to the specific needs of the users.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## UX Design vs UI Design\n\n![React UX](https://images.unsplash.com/photo-1506729623306-b5a934d88b53?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHx1aXxlbnwwfHx8fDE3MTkzMDA2MzJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nUX revolves around creating an aesthetically pleasing and user-centered interface. This involves:\n\n- Designing an application's graphical layout\n- Ensuring that it meets user expectations\n- Enhancing the overall user experience\n\nUI designers concentrate on visual elements such as:\n\n- Color palettes\n- Animations\n- Buttons\n- Text\n- Images\n\nThese elements contribute to the overall look and feel of the interface, impacting how users interact with the application.\n\nWhile [UI and UX](https://www.figma.com/resource-library/difference-between-ui-and-ux/) are distinct areas of design, they are often mentioned together because they are interconnected and collaborate to create a holistic and user-centric design approach.\n\n### Pre-Built Animated Components for Efficient UI Development\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## 19 Best React UX Principles For React Native Apps\n\n![React UX](https://images.unsplash.com/photo-1633180888652-c561b86040f1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcxOTM4NTI1MXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Add a Loading Indicator during the API call\n\nAlways display a Loading Indicator (Loading Spinner) to signal ongoing background processes during API calls. This informs users that the app is working and that they must wait. A Loading Indicator is particularly crucial for lengthy API calls, preventing users from assuming the app has crashed.\n\n### 2\\. Multi-Platform Approach or Brand-Oriented Approach\n\nChoose a multi-platform or brand-oriented design approach for your app's UI/UX. You can tailor the design to the platform or brand style by understanding these approaches.\n\n### 3\\. Cross-Platform Approach\n\nWhen adopting a cross-platform approach, adhere to platform guidelines for consistency. For instance, consider how Android and iOS users interact with elements like search bars differently. To ensure a comfortable experience, make sure the UI feels native to both Android and iOS users.\n\n### 4\\. Use the same React Native Touchable throughout the application\n\nConsistency is key in providing a uniform touch experience. Stick to using the same React Native Touchable component throughout your React Native app to give users a consistent touch experience.\n\n### 5\\. Navigation Patterns\n\nEfficient navigation is essential for user satisfaction. Simplicity in navigation enhances the overall user experience. Adhere to platform-specific preferences, especially for cross-platform applications.\n\n### 6\\. Use Icon Packs\n\nEmploy appropriate icon packs to enhance visual appeal. Be mindful of platform-specific styling variations for consistent and pleasing user experiences.\n\n### 7\\. Typography\n\nTypography is critical in cross-platform app development. Consider platform-specific design specifics for font weights and sizes. Standardize fonts like Roboto for Android and San Francisco for iOS.\n\n### 8\\. Consistency and Branding\n\nMaintain a consistent design for a uniform user experience. Leverage brand elements, design systems, and style guides to reinforce brand identity.\n\n### 9\\. Animations and Transitions\n\nStrategic use of animations and transitions can boost user engagement and professionalism. React Native offers tools like Animated and Layout Animation for precise animation control.\n\n### 10\\. Accessibility and Inclusivity\n\nPrioritize accessibility to ensure all users, including those with disabilities, can effectively use the app. Consider:\n\n- Text contrast\n- Screen reader compatibility\n- Accessibility gestures\n\n### 11\\. User Feedback and Interaction\n\nOffer meaningful feedback during user interactions with elements like Snackbar and Toast. Real-time feedback and progress indicators enhance engagement.\n\n### 12\\. Performance and Loading Times\n\nOptimize app performance by addressing loading times. Employ techniques like image optimization for a seamless user experience.\n\n### 13\\. Notification Routes\n\nUse notifications strategically to engage users and convey essential information. Implement smart notifications to allow users to take actions without entering the app.\n\n### 14\\. Handle Keyboard issues\n\nAddress keyboard issues to enhance user experience. Common issues include the keyboard covering input fields or not closing when users click outside the field.\n\n### 15\\. Mobile App Storage\n\nManage mobile app storage efficiently using systems like AsyncStorage, Realm, or Sqlite. Optimize storage strategies for better app performance.\n\n### 16\\. Segmented Controls\n\nIncorporate segmented controls for seamless content navigation within a view. Customize controls based on platform-specific styles for consistency.\n\n### 17\\. Handle iOS Safe Area\n\nPay attention to the iOS Safe Area to ensure UI consistency on devices with notches or home indicators. Use SafeAreaView to prevent UI issues.\n\n### 18\\. Styling Components\n\nEnhance styling using Styled Components for functional components in React Native app development. Utilize this library for visually appealing elements.\n\n### 19\\. Check Application Performance and UI on Different Devices\n\nTest your app on various devices during development to identify performance and UI issues. This practice ensures a better user experience across different screen sizes and resolutions.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## 7 Best React Native Libraries For An Enhanced UX\n\n![React UX](https://cdn.magicui.design/assets/kgsv2c5b84.jpg)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. NativeBase\n\nNativeBase, a dynamic front-end framework, is a versatile solution for developers. If you find yourself rewriting React components for different platforms, NativeBase is your go-to tool. The library is a collection of essential cross-platform React Native components, providing a solid foundation for building your app. The components are built with React Native and some JavaScript functionality, offering various customizable properties. You can also leverage any third-party native libraries out of the box, enhancing the versatility of your app.\n\nNativeBase is fully open-source and has tens of thousands of stars on GitHub.\n\n- The themes come at a premium as more features and screens are added.\n- NativeBase is now available for web users, too.\n- Using the same JavaScript codebase and working with platform-specific design for Android and iOS, you can achieve a native look and feel for your app.\n- Their open-source projects include a Native starter app, a Twitter Clone app, a ToDo app, and a tutorial app.\n- In their premium basket, you’ll find starter apps for booking, rentals, job listings, messaging and more.\n\n### 3\\. React Native Elements\n\nReact Native Elements, a React Native UI toolkit, is a customizable component. It offers various options, from pricing to overlay, badge, and platform-specific search bars. This library's creators believe that components' structure is more important than design, and they've made it easy for developers to use very little boilerplate code to prepare the components for use.\n\nThis flexibility in control over the appearance of the components is what sets React Native Elements apart. With 20.7k stars on Github, it's a toolkit that's definitely worth exploring.\n\n### 4\\. Teaset\n\nTeaset is a great addition to our list of React Native component libraries. It is a UI library featuring 20+ pure JS(ES6) for component content classes. With a few thousand stars on Github, Teaset is a fit for those with a knack for simplicity and design. It focuses on content display and action control.\n\n### 5\\. React Native Maps\n\nReact Native Maps is another useful library that provides customizable map components for your iOS and Android apps. You can offer your users different experiences on the map using this library. You can combine the components with the Animated API to give an animated effect for the components. For example, you can:\n\n- Animate the zoom\n- Marker views\n- Marker coordinates\n- Render polygons and polylines on the map\n\nReact Native Maps is compatible only with React Native ≥v0.64.3. If you plan to use React Native Maps with a project that uses an older React Native version, be sure to update it.\n\n### 6\\. React Native Gifted Chat\n\nReact Native Gifted Chat is a React Native library that allows developers to add chat functionality to their apps. It supports various features such as text messages, emojis, and more. It also provides developers with a range of options for customizing the look and feel of their apps.\n\n[React native gifted chat](https://github.com/FaridSafi/react-native-gifted-chat.) has:\n\n- Great documentation, making it easy for developers to get started.\n- It also has a range of themes and styles to choose from, allowing developers to quickly create beautiful apps.\n\n### 7\\. Lottie for React Native\n\nLottie is an Airbnb mobile library that helps you add animations to your apps. After [creating animations](https://github.com/react-native-community/lottie-react-native) in Adobe After Effects, you’ll normally need to convert them into a format usable in your web app. Lottie helps you with this.\n\nIt exports animation data in JSON format from an After Effects extension, BodyMovin.\n\n- This extension is bundled with a JS player to render animations on the web.\n- It works with React Native, too, and you can access the official docs on GitHub, where it has garnered thousands of stars.\n- Lottie libraries and plugins are available for free, and you can use the curated collection of animation files to make your apps attractive and interesting.\n- The animation files are small and in vector format, so they should not impact your app's performance.\n- At the same time, it can spice up your UI and make it more visually appealing.\n\n## Benefits Of React.js For UI/UX Development\n\n![React UX](https://images.unsplash.com/photo-1634117622592-114e3024ff27?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxjaGFydHxlbnwwfHx8fDE3MTkzODUyOTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Speed and Performance Optimization\n\nReact.js has a Virtual DOM that minimizes expensive DOM operations. The Virtual DOM calculates minimal component changes and only re-renders updated elements, providing significant performance gains over traditional DOM manipulation. React's fast rendering capabilities result in better user experiences.\n\n### Responsive User Interfaces\n\nResponsive design is crucial for modern applications. React components excel at adapting interfaces across devices, making it easy to build UIs that adapt to new data on the fly. Components can be dynamically shown, hidden, or updated as needed.\n\n### Interactive User Experience\n\nReact enables the creation of natural, dynamic UIs that users enjoy interacting with. Event handling and state management are simplified in React, encouraging the development of highly interactive UIs with minimal effort. The declarative paradigm in React enables developers to describe UIs as a function of state, resulting in real-time, dynamic UIs.\n\n### Code Reusability and Maintainability\n\nReact promotes scalability and maintainability through component reusability. Components encapsulate code into reusable, composable UI building blocks. The unidirectional data flow in React isolates code into independent modules, making React apps easy to debug and maintain over time.\n\n## Examples Of React Native Applications\n\nInstagram, Facebook, and UberEats are prominent examples of successful applications that have leveraged the power of React Native. These platforms have harnessed React's capabilities to deliver seamless and engaging user experiences across various devices and platforms.\n\n### Instagram\n\nInstagram made a commendable shift to React Native in 2020. The transition was comprehensive, with React powering vital components of the app, such as the main feed, stories, reels, effects, and more. The implementation showcasing the exceptional capabilities of React Native brought in:\n\n- Smooth animations\n- Intuitive gestures\n- Responsive navigation\n\nInstagram's key experiences are now seamlessly delivered across iOS and Android platforms, ensuring a consistent and delightful user experience.\n\n### Facebook\n\nBeing the birthplace of React, Facebook naturally has extensively adopted this framework across its web, mobile, and desktop applications. The newsfeed, messaging, groups, ads manager, and several other features of Facebook are now powered by React. This adoption has enabled Facebook to maintain consistency and scalability across platforms while catering to an enormous user base. React has been pivotal in driving user engagement and experience on Facebook's suite of applications.\n\n### UberEats\n\nUberEats is a preferred on-demand taxi and food ordering application developed using React Native. This application boasts an impressive design that includes a user-friendly dashboard, allowing users to seamlessly navigate within the app. What sets UberEats apart is its three separate applications for:\n\n- Drivers\n- Restaurants\n- Users\n\nThe app offers a visually pleasing and clutter-free interface, enhancing the user experience. Users can effortlessly log in, start ordering food items, or book a taxi, making the process smooth and efficient.\n\nThe success of Instagram, Facebook, and UberEats in leveraging React Native underscores the framework's ability to deliver exceptional UI experiences and drive user engagement. By harnessing the power of React, these applications have been able to offer seamless navigation, visually appealing interfaces, and delightful user experiences across platforms, contributing to their popularity and success in their respective domains.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a revolutionary free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThese components are more than static elements; they are interactive, visually appealing, and can be easily integrated into web applications to create stunning user interfaces with minimal effort.\n\n### Bridging the Design-Development Gap\n\n[MagicUI](https://magicui.design/) boasts customization at its core, allowing seamless adaptation to match desired branding and design requirements. By focusing on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Pre-Built Website Templates for Efficiency\n\nMagicUI Pro takes it further by offering website templates that can save users thousands of hours and help create beautiful landing pages that can convert visitors into customers. With MagicUI, users can create engaging and interactive web interfaces that set them apart from the competition and elevate their digital presence.\n\nGet started with MagicUI today and unlock a world of UI possibilities! Visit [https://magicui.design/docs](https://magicui.design/docs) to access the free [React component library](https://magicui.design/) and see the magic unfold before your eyes.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/responsive-web-design-templates.mdx",
    "content": "---\ntitle: 7 Best Responsive Web Design Templates for 2025\ndescription: >-\n  Discover the top 7 responsive web design templates for 2025. Our list includes\n  premium and free options to build stunning, mobile-friendly websites.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-cb5b57d7-c84b-4d75-a3ab-a7b18cf89716.jpg\nauthor: Dillion Verma\ntags:\n  - responsive web design templates\n  - web design\n  - website templates\n  - bootstrap templates\n  - react templates\npublishedOn: \"2025-10-16T10:01:01.764994+00:00\"\nfeatured: true\n---\n\nIn a world where users browse on everything from smartphones to widescreen monitors, a one-size-fits-all website is no longer an option. A responsive design is the cornerstone of a positive user experience, ensuring your content looks and functions perfectly on any device. But building a fully adaptive interface from scratch is a significant investment of time and resources. This is where high-quality **responsive web design templates** provide a critical advantage, offering a robust, pre-tested foundation for your projects. They handle the complex media queries and flexible grids, allowing you to focus on features and content.\n\nTo truly grasp the importance of creating a website that looks and functions flawlessly on any device, it's essential to understand [what is mobile responsive design](https://gohappybeauty.com/what-is-mobile-responsive-design/) and its core principles. This guide cuts through the noise to showcase the best templates and marketplaces available today, from specialized SaaS kits like Magic UI Pro to extensive libraries on ThemeForest. We'll explore a mix of cutting-edge technology, design flexibility, and unique features to help you launch faster. Each option includes a breakdown of its strengths, potential drawbacks, and a direct link, so you can find the perfect starting point for your next web application or site.\n\n## 1. Magic UI Pro — SaaS Template\n\nFor developers and SaaS founders seeking to launch a visually striking and high-performance web presence, the Magic UI Pro — SaaS Template stands as a premier choice. This isn't just a collection of components; it's a comprehensive, production-ready framework designed specifically for the modern SaaS landscape. By leveraging a cutting-edge tech stack that includes Next.js 14, React 18, and Tailwind CSS, it ensures your landing page is not only fast and fluid but also built on a future-proof foundation. This focus on modern technologies makes it an exceptional source for top-tier **responsive web design templates**.\n\n![Magic UI Pro — SaaS Template](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/73ca075e-7fbf-4cc9-bcf0-cef2bef9c40f.jpg)\n\nWhat sets Magic UI Pro apart is its meticulous attention to the specific needs of a SaaS business. The template moves beyond generic layouts, offering 14 versatile, pre-built sections meticulously crafted for SaaS use cases. These include elements for feature showcases, pricing tables, testimonials, and FAQs, allowing for rapid assembly of a complete and compelling landing page. The integrated blog functionality is a significant advantage, enabling content marketing and SEO efforts directly from your main site without needing a separate platform.\n\n### Core Strengths and Implementation\n\nThe true power of Magic UI Pro lies in its developer-centric design and immediate utility. The components are not just aesthetically pleasing; they are highly customizable and follow best practices for accessibility and performance.\n\n- **Rapid Development:** Developers can significantly reduce time-to-market. Instead of building from scratch, they can customize the 14 pre-built sections, rearrange layouts, and inject their brand identity with minimal effort.\n- **Built-in Dark Mode:** The out-of-the-box dark mode toggle is a critical user experience feature. It provides visual comfort in low-light environments and caters to user preferences, a small detail that elevates the overall perception of quality.\n- **SEO Optimization:** The template is engineered with SEO in mind. Its clean code, fast load times from Next.js, and semantic HTML structure provide a solid base for achieving high search engine rankings without extensive post-launch tweaking.\n\n> **Expert Insight:** For teams leveraging React, the component-based architecture of this template is a massive accelerator. Customizing a section, for instance, involves modifying JSX props and Tailwind CSS classes, a familiar and efficient workflow for modern web developers.\n\nThe template’s structure is intuitive, making it accessible even for those with moderate React experience. You can get started and explore the full capabilities by checking out the official documentation and resources. For an in-depth look, you can [learn more about the Magic UI Pro SaaS Template on magicui.design](https://magicui.design/docs/templates/saas).\n\n**Website:** [https://pro.magicui.design/docs/templates/saas](https://pro.magicui.design/docs/templates/saas)\n\n## 2. ThemeForest (Envato Market)\n\nThemeForest stands as the largest and most established marketplace for website templates, offering an unparalleled catalog that caters to virtually every industry and niche. Operated by Envato Market, it functions as a multi-vendor platform where thousands of independent authors list their creations. This vast ecosystem makes it a go-to resource for developers and businesses searching for high-quality, feature-rich **responsive web design templates** at competitive prices.\n\n![ThemeForest (Envato Market)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/e50e3d52-33df-416e-8123-2abd695c7977.jpg)\n\nThe platform’s key differentiator is its sheer volume and diversity. Whether you need a sleek one-page portfolio, a complex admin dashboard, or a niche e-commerce site, ThemeForest likely has hundreds of options. Each template purchase typically includes future updates and comes with six months of author support, which can be extended for an additional fee. This model ensures you have help when integrating the template and receive bug fixes or feature additions over time.\n\n### Navigating the Marketplace Effectively\n\nWith so many options, finding the perfect template can feel overwhelming. To streamline your search, leverage the platform's robust filtering and sorting tools. You can narrow down results by category, tags, price, and even software version compatibility (e.g., Bootstrap 5).\n\n> **Pro Tip:** Pay close attention to author reputation signals. Check an item's sales count, buyer ratings, and the author's overall portfolio and reviews. A well-established author with a history of consistent updates and positive feedback is generally a safer bet.\n\n### Understanding Licensing and Support\n\nThemeForest simplifies licensing with two main options: a **Regular License** for use in a single end-product that is not for sale, and an **Extended License** if the end-product is sold to users. This clarity is crucial for freelancers and agencies building sites for clients.\n\nHere’s a quick breakdown of what to expect:\n\n- **Vast Selection:** Access thousands of HTML/CSS templates, admin dashboards, and landing pages.\n- **Built-in Support:** Most purchases include a 6-month support period directly from the template creator.\n- **Transparent Reviews:** User ratings and comments provide real-world feedback on quality and support.\n- **Due Diligence Required:** Quality can vary significantly between authors, so thorough research before purchasing is essential.\n\nWhile the included support is a major benefit, remember that it expires. If you anticipate needing long-term assistance, factoring in the cost of a support extension is a wise decision.\n\n**Website:** [https://themeforest.net](https://themeforest.net)\n\n## 3. TemplateMonster + MonsterONE\n\nTemplateMonster is a long-standing digital marketplace that offers a massive library of website assets, with a strong focus on **responsive web design templates**. Similar to ThemeForest, it hosts products from numerous independent authors but differentiates itself with a flexible purchasing model. You can either buy templates individually or subscribe to MonsterONE for unlimited downloads, a feature that makes it exceptionally valuable for agencies, freelancers, and developers who need a constant supply of design assets.\n\nThe platform’s dual-access model caters to different user needs. If you're working on a single project, a one-time purchase is straightforward. However, the MonsterONE subscription is the standout offering, providing access not only to HTML templates but also to CMS themes, presentation templates, and graphic assets. Every template comes with lifetime updates and is backed by a 24/7 live chat support system, offering a reliable safety net for technical questions.\n\n### Maximizing the Subscription Model\n\nFor frequent users, the MonsterONE subscription is the key to unlocking the platform's full potential. It eliminates the per-project cost calculation, allowing you to experiment freely with different templates without financial penalty. This is ideal for prototyping multiple design concepts for a client or for building out a portfolio of diverse projects.\n\n> **Pro Tip:** Before committing to a subscription, use the marketplace to browse and bookmark potential templates for your upcoming projects. If you find yourself needing more than two or three templates over the course of a year, the subscription will likely offer a better return on investment.\n\n### Choosing the Right Purchase Option\n\nTemplateMonster provides clear choices for accessing its assets. The **Single-Site License** is perfect for a one-off project, while the **MonsterONE** subscription offers tiered plans (Creative, All-in-one, Lifetime) with varying levels of access to the entire library. This clear structure helps you align your purchase with your business's scale and needs.\n\nHere’s a quick overview of what makes it a strong contender:\n\n- **Flexible Purchasing:** Choose between buying individual templates or an all-you-can-download subscription.\n- **Comprehensive Support:** Access 24/7 technical support for all items, a major plus for time-sensitive projects.\n- **All-in-One Asset Hub:** The MonsterONE subscription includes more than just HTML, covering graphics, plugins, and video assets.\n- **Vetting is Crucial:** As with any large marketplace, the quality varies between vendors, so always check live demos, reviews, and author ratings.\n\nThe combination of a vast catalog and a compelling subscription service makes TemplateMonster an excellent resource for professionals who manage a high volume of web projects.\n\n**Website:** [https://www.templatemonster.com](https://www.templatemonster.com)\n\n## 4. Creative Market (Website/HTML Templates category)\n\nCreative Market operates as a vibrant, design-forward marketplace for digital assets, where independent creators offer a diverse and modern selection of website templates. Its strength lies in a strong aesthetic focus, making it an excellent resource for freelancers, agencies, and businesses looking for visually unique and stylish **responsive web design templates**. The platform emphasizes high-quality design, often featuring templates with clean typography, contemporary layouts, and beautiful imagery.\n\n![Creative Market (Website/HTML Templates category)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/49b076f1-939a-4a61-8397-8f0fe034a269.jpg)\n\nUnlike massive marketplaces, Creative Market feels more like a curated gallery. Each creator has their own shop page, allowing you to browse their entire portfolio, read reviews, and get a sense of their design style. This setup fosters a community feel and helps you find designers whose work consistently aligns with your needs. Purchases are straightforward, with instant downloads and clear licensing that simplifies usage for personal or commercial projects.\n\n### Finding Design-Centric Templates\n\nThe platform's user experience is clean and intuitive, making it easy to discover new and popular templates. You can filter results by category (like portfolio or e-commerce), price, file type, and specific properties such as \"responsive.\" Frequent sales, bundles, and even weekly free goods provide opportunities to acquire premium assets at a reduced cost.\n\n> **Pro Tip:** Follow your favorite designers on the platform. This keeps you updated on their latest releases and sales, ensuring you don't miss out on high-quality templates that fit your aesthetic preferences.\n\n### Licensing and Creator Support\n\nCreative Market offers simple licensing tiers: Personal, Commercial, and Extended Commercial, making it easy to choose the right one for your project. Since each template is sold by an independent creator, the level and speed of technical support can vary. It’s crucial to check a seller’s reviews and response times before buying if you anticipate needing help with customization.\n\nHere’s a summary of what Creative Market offers:\n\n- **Aesthetic Variety:** A strong focus on modern, design-led HTML and landing page templates.\n- **Simple Licensing:** Clear and easy-to-understand license options for different use cases.\n- **Creator-Driven Shops:** Direct access to individual designers' portfolios and reviews.\n- **Variable Support:** Technical support and updates depend entirely on the individual creator.\n\nCreative Market is a key destination for anyone prioritizing visual appeal and is considered one of the [best web design tools](https://magicui.design/blog/best-web-design-tools) for sourcing unique, high-quality designs.\n\n**Website:** [https://creativemarket.com](https://creativemarket.com)\n\n## 5. WrapBootstrap (Bootstrap-focused marketplace)\n\nWrapBootstrap carves out a specific and valuable niche in the template marketplace by focusing exclusively on themes, dashboards, and UI kits built with Bootstrap. This specialization makes it a prime destination for developers who are committed to the Bootstrap ecosystem and need well-structured, consistent code. By concentrating on a single framework, WrapBootstrap ensures a higher baseline quality and easier integration for those building admin panels, SaaS interfaces, and complex web applications.\n\n![WrapBootstrap (Bootstrap-focused marketplace)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/8505c646-9703-4c98-bf67-e70c04a6f776.jpg)\n\nThe platform’s key differentiator is its developer-centric approach. Templates on WrapBootstrap are known for their clean code and adherence to Bootstrap best practices, which is a significant advantage over larger, more generalized marketplaces where quality can be inconsistent. The focus on **responsive web design templates** for professional applications like admin dashboards and SaaS starter kits means you’re getting a product designed for functionality and scalability from the ground up.\n\n### Finding the Right Bootstrap Theme\n\nWhile the catalog is smaller than general-purpose sites, it's highly curated. The interface allows you to filter by Bootstrap version, category (Admin, Landing Page, etc.), and other tags. This makes it simple to pinpoint a template that fits your exact technical requirements without wading through irrelevant options.\n\n> **Pro Tip:** Look at the \"Live Preview\" and the item's update history. A well-maintained template with frequent updates to support the latest Bootstrap versions is a strong indicator of a reliable and committed author.\n\n### Understanding Tiered Licensing\n\nWrapBootstrap offers a clear, tiered licensing model that is particularly useful for developers and agencies. The licenses are designed to cover different use cases, from a single personal project to building a SaaS product sold to multiple customers. Understanding which framework fits your project is key; you can explore the differences in our [Tailwind vs. Bootstrap guide](https://magicui.design/blog/tailwind-vs-bootstrap).\n\nHere’s a quick overview of what WrapBootstrap offers:\n\n- **Niche Focus:** All products are built on the Bootstrap framework, ensuring code consistency.\n- **Clear Licensing:** Tiers like Single Application, Multiple Application, and Extended are easy to understand.\n- **Developer-Friendly:** Strong emphasis on clean, well-documented code for admin and SaaS UIs.\n- **Variable Support:** Like other marketplaces, support quality and duration are set by individual authors.\n\nThis focused approach means you spend less time vetting code quality and more time building your application, making it an efficient choice for Bootstrap-powered projects.\n\n**Website:** [https://wrapbootstrap.com](https://wrapbootstrap.com)\n\n## 6. Webflow Templates Marketplace\n\nWebflow's official marketplace offers a highly curated collection of templates designed exclusively for its powerful visual development platform. It stands out by integrating directly with Webflow's CMS, e-commerce, and hosting solutions, making it a perfect choice for designers, freelancers, and agencies who prioritize a visual-first workflow without sacrificing code quality. These aren't just static files; they are fully functional projects ready for customization.\n\n![Webflow Templates Marketplace](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/0f72612e-a390-4d3a-a1aa-1e361f231901.jpg)\n\nThe key differentiator for Webflow is its seamless ecosystem. You can browse, purchase, and launch a sophisticated, **responsive web design template** entirely within the platform. This streamlined process dramatically reduces the time from concept to live site. Each template is vetted for quality and responsiveness, ensuring a high standard across the board, and comes with clear, tiered pricing based on its complexity and features.\n\n### Leveraging the Visual-First Workflow\n\nThe true power of Webflow templates is realized within the Webflow Designer. You can visually manipulate every element, interaction, and CMS connection without writing a single line of code. This makes complex customizations accessible to non-developers while still producing clean, production-ready HTML, CSS, and JavaScript.\n\n> **Pro Tip:** Before purchasing, use the \"Open in Webflow\" feature. This allows you to explore the template's structure, classes, and interactions in a read-only designer view, giving you a clear understanding of how it's built and how easy it will be to customize for your project.\n\n### Understanding Platform Integration\n\nWebflow templates are deeply tied to the Webflow platform. While you can export the code on a paid plan to host elsewhere, you lose the powerful CMS and e-commerce functionalities, as they require Webflow hosting to operate. This makes the marketplace ideal for projects intended to be managed and hosted within the Webflow ecosystem.\n\nHere’s a quick breakdown of what to expect:\n\n- **Seamless Integration:** Templates work natively with Webflow CMS and E-commerce.\n- **Vetted Quality:** All templates meet high standards for design, responsiveness, and performance.\n- **Visual Customization:** Modify every aspect of the design in a powerful visual editor.\n- **Platform Dependency:** Exporting code is possible but requires a paid plan, and dynamic features are lost.\n\nFor agencies and freelancers, this model is excellent for building client sites that are easy for them to manage and update later without needing a developer's help.\n\n**Website:** [https://webflow.com/templates](https://webflow.com/templates)\n\n## 7. Start Bootstrap (free MIT-licensed templates)\n\nStart Bootstrap offers a curated collection of free, open-source, and fully responsive templates built exclusively on the Bootstrap framework. It stands out by providing clean, well-documented starter kits under the permissive MIT license, making it an ideal resource for developers, students, and businesses looking for high-quality **responsive web design templates** without any initial cost. The platform is perfect for quickly launching landing pages, portfolios, blogs, and admin dashboards.\n\n![Start Bootstrap (free MIT-licensed templates)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/b499bed9-64ba-42e0-90f6-ec0af67dc2e4.jpg)\n\nThe key differentiator for Start Bootstrap is its commitment to open-source and simplicity. Unlike massive marketplaces, it focuses on quality over quantity, ensuring each template serves as a solid foundation for customization. The source code for every template is readily available on GitHub, allowing for complete transparency and community contributions. This approach empowers users to take a modern, well-structured base and adapt it to their specific needs without licensing restrictions.\n\n### Getting Started with Free Templates\n\nThe platform is incredibly straightforward. You can browse templates by category, view a live preview, and download the source files with a single click. Since all templates are based on Bootstrap 5, you can be confident that they adhere to the latest web standards and are easy to modify if you're familiar with the framework.\n\n> **Pro Tip:** Before downloading, check the template's GitHub repository. You can review the commit history to see how actively it's maintained and read through any open issues to understand potential limitations or community-reported bugs.\n\n### Understanding the MIT License\n\nThe use of the MIT license is a significant advantage. It allows you to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the software with very few restrictions. This freedom is invaluable for freelancers building sites for clients or startups creating commercial products, as there are no hidden fees or complex licensing terms to navigate.\n\nHere’s a quick summary of what Start Bootstrap offers:\n\n- **Completely Free:** All primary templates are free to download and use under the MIT license.\n- **Bootstrap 5 Foundation:** Built on the latest version of the world's most popular front-end framework.\n- **Open-Source Code:** Source files are available on GitHub and npm for easy integration into your development workflow.\n- **Easy to Customize:** The clean, well-commented code makes modification simple for developers.\n- **User-Managed:** You are responsible for your own hosting and deployment, giving you full control over your environment.\n\nWhile the core offerings are free, Start Bootstrap also provides optional premium themes and bundles for users who need more advanced features or designs.\n\n**Website:** [https://startbootstrap.com](https://startbootstrap.com)\n\n## Responsive Web Design Templates Comparison\n\n| Item                             | Implementation Complexity                      | Resource Requirements                 | Expected Outcomes                                     | Ideal Use Cases                                 | Key Advantages                                              |\n| -------------------------------- | ---------------------------------------------- | ------------------------------------- | ----------------------------------------------------- | ----------------------------------------------- | ----------------------------------------------------------- |\n| Magic UI Pro — SaaS Template     | Moderate (requires React & Tailwind knowledge) | Developer/designer time, modern stack | High-performance, SEO-friendly SaaS landing pages     | SaaS startups and businesses                    | Latest tech, 14 prebuilt sections, built-in blog, dark mode |\n| ThemeForest (Envato Market)      | Variable (depends on chosen template)          | Varies by product, some coding skills | Wide variety of templates for multiple niches         | Buyers seeking variety and competitive pricing  | Huge selection, active updates, clear licensing             |\n| TemplateMonster + MonsterONE     | Variable                                       | Single purchase or subscription       | Access to broad template library, frequent updates    | Agencies/freelancers needing many assets        | Flexible buying options, 24/7 support                       |\n| Creative Market (HTML Templates) | Variable                                       | Basic web skills                      | Design-forward templates with modern aesthetics       | Designers looking for unique, aesthetic options | Large design variety, frequent sales/bundles                |\n| WrapBootstrap (Bootstrap only)   | Low to moderate (Bootstrap familiarity needed) | Bootstrap knowledge, moderate coding  | Clean, consistent Bootstrap templates focused on SaaS | Developers needing Bootstrap-specific themes    | High code quality, clear licensing, niche focus             |\n| Webflow Templates Marketplace    | Low (visual design, minimal coding)            | Webflow subscription for code export  | Fully responsive, CMS/e-commerce integrated sites     | Visual-design users and agencies                | Fast setup, consistent pricing, strong community            |\n| Start Bootstrap (free MIT)       | Low to moderate (Bootstrap knowledge)          | Minimal costs, self-hosting           | Free, open-source Bootstrap templates for quick start | Users needing free, customizable starter kits   | Free MIT license, clean code, large community               |\n\n## Choosing Your Foundation for a Responsive Future\n\nSelecting the right responsive web design template is a foundational step that echoes through your entire development lifecycle. It's far more than a cosmetic choice; it's a strategic decision that directly influences your project's speed, scalability, and ultimate success. Throughout this guide, we've explored a diverse range of platforms and tools, each tailored to different needs, skill levels, and project goals.\n\nFrom the developer-centric, high-performance components of Magic UI Pro to the sprawling, all-encompassing marketplaces like ThemeForest and TemplateMonster, the options are vast. We've seen how specialized collections like WrapBootstrap cater to framework loyalists, while platforms like Webflow offer a powerful visual development paradigm. The key takeaway is that the \"best\" template doesn't exist in a vacuum; it's the one that best aligns with your unique requirements.\n\n### How to Make Your Final Decision\n\nTo move from analysis to action, consider these critical factors. Your final choice should be a deliberate balance between your immediate needs and long-term vision. Don't just pick a template that looks good today; choose a foundation that will support your growth tomorrow.\n\n**1. Evaluate Your Technical Expertise:**\n\n- **Developers & Startups:** If your team is comfortable with modern frameworks like React, Next.js, and Tailwind CSS, a tool like **Magic UI Pro** offers unparalleled control and performance. It provides the building blocks for a custom, high-speed application without the bloat of traditional themes.\n- **Freelancers & Agencies:** Marketplaces like **ThemeForest** or **Creative Market** provide variety and quick turnarounds for client projects. For those using Bootstrap, **WrapBootstrap** is a focused and reliable source.\n- **Visual Builders & Beginners:** **Webflow's Template Marketplace** is ideal if you prefer a visual, no-code, or low-code approach, empowering you to build complex layouts without writing extensive code.\n\n**2. Align with Project Scope and Budget:**\n\n- **High-Stakes Applications:** For SaaS platforms, enterprise tools, or any project where performance and user experience are non-negotiable, investing in a premium, well-coded template is crucial. The upfront cost is often offset by saved development hours and easier maintenance.\n- **MVPs and Personal Projects:** For launching a minimum viable product, a personal blog, or experimenting with a new idea, free resources like **Start Bootstrap** are invaluable. They provide a solid, no-cost entry point to get your project online quickly.\n\n**3. Prioritize Long-Term Maintainability:**\n\n- A template is a living part of your project. Before committing, check for **clear documentation**, a **history of recent updates**, and access to **developer support**. An abandoned template can become a significant technical liability. This is where curated, actively maintained libraries truly shine.\n\nUltimately, the goal of using responsive web design templates is to build a seamless, accessible, and engaging experience for every user, regardless of their device. By carefully weighing these factors, you can select a foundation that not only accelerates your launch but also empowers you to build a robust and future-proof digital presence.\n\n---\n\nReady to build faster with components designed for modern web development? **Magic UI** offers a library of over 100 free, open-source, and professionally designed components built with React, Next.js, and Tailwind CSS. Explore our collection and see how you can create stunning, responsive user interfaces with ease at [Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/saas-landing-page-best-practices.mdx",
    "content": "---\ntitle: 7 SaaS Landing Page Best Practices for 2025 That Convert\ndescription: >-\n  Unlock higher conversions with these 7 SaaS landing page best practices. Learn\n  top strategies for copywriting, design, and CRO to grow your user base.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-77433d50-a19a-4f54-bbde-cb65b413b220.jpg\nauthor: Dillion Verma\ntags:\n  - saas landing page best practices\n  - saas conversion\n  - landing page design\n  - cro tactics\n  - saas marketing\npublishedOn: \"2025-11-06T09:58:01.960562+00:00\"\nfeatured: true\n---\n\nA great SaaS product deserves a landing page that does it justice. Yet, countless companies struggle to turn visitors into users because their page misses the mark. It's not about flashy animations or complex jargon; it's about clarity, trust, and a seamless user journey. The gap between a visitor and a sign-up is often filled with small, strategic optimizations that make all the difference.\n\nThis guide cuts through the noise to provide actionable **SaaS landing page best practices**, showcasing specific platforms, templates, and frameworks that help you build pages that don't just look good, they convert. We will dive into seven essential resources, from leveraging modern UI kits and high-converting templates to mastering the psychology of conversion with expert insights. Each item includes screenshots, direct links, and practical advice to help you implement these strategies effectively.\n\nThe goal is to equip you with a clear blueprint for creating landing pages that communicate value instantly and guide users effortlessly toward conversion. To help you quickly refine your page and ensure it adheres to modern best practices, consider incorporating [AI-powered tips for fixing your landing page](https://www.marketingmonk.so/p/fix-your-landing-page-in-30-minutes-using-ai) into your workflow. Let's explore the tools and techniques that will transform your landing page into a powerful growth engine.\n\n## 1. Nail the First Impression with a Modern UI & UX\n\nYour landing page's success is often decided in the first five seconds. A clunky, outdated, or slow-loading design creates immediate friction and distrust, causing high bounce rates. One of the most effective **SaaS landing page best practices** is to leverage a modern, developer-first UI library that combines aesthetic polish with high performance. This approach allows you to build a beautiful, responsive page from pre-built, customizable components without sacrificing speed or developer experience.\n\n### Why It Works: Combining Speed and 'Wow' Factor\n\nInstead of building complex animations and layouts from scratch, a component library provides production-ready blocks for heroes, feature sections, and social proof. This strategy not only saves hundreds of development hours but also ensures your page adheres to the latest design standards, building instant credibility with a discerning audience of developers, founders, and tech enthusiasts. It’s about delivering a 'wow' factor that feels both professional and effortless.\n\n### Actionable Insight: Use Magic UI for Stunning Animations\n\nA standout choice for this is **Magic UI**, an open-source component library built with React, TypeScript, and Tailwind CSS. It excels at providing sophisticated, copy-paste components that add a premium feel to any landing page.\n\n- **Unique Offerings:** Magic UI specializes in dynamic elements like animated grids, bento grids, retro grids, and attention-grabbing hero sections that are notoriously difficult and time-consuming to build manually.\n- **Developer Experience:** The components are designed for easy integration. You can install them via `npm` or simply copy the source code into your project, giving you full control over customization.\n- **Pricing & Access:** Magic UI is completely free and open-source, making it accessible to everyone from solo founders to established companies. You can browse and use all components without any cost.\n\n> **Pro Tip:** Combine Magic UI’s animated components with a strong value proposition in your hero section. For example, use their `AnimatedGridPattern` as a background for your H1 and CTA to create a visually arresting first impression that hooks visitors immediately.\n\nBy using a tool like Magic UI, you bypass the trade-off between a bespoke, animated design and a fast-loading, template-based site. You get the best of both worlds, ensuring your landing page is memorable, trustworthy, and conversion-focused from the very first glance.\n\n**Website:** [ui.aceternity.com](https://ui.aceternity.com)\n\n## 2. Accelerate Launch with Production-Ready Webflow Templates\n\nBuilding a high-quality landing page from scratch is a significant time and resource investment. For teams that need to move fast without compromising on design quality, leveraging a pre-built template is one of the most effective **SaaS landing page best practices**. The Webflow Templates Marketplace provides a curated library of professionally designed, conversion-focused templates that can be customized and launched in days, not weeks.\n\n![Webflow Templates Marketplace](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/19865f18-8afa-4def-9d4e-0d88aca5d266.jpg)\n\n### Why It Works: Marrying Best Practices with No-Code Speed\n\nWebflow templates are more than just static designs; they are fully functional websites built with best practices baked in. SaaS-focused templates come with pre-built sections for clear value propositions, social proof logos, in-depth feature showcases, and pricing tables. This structure allows you to bypass the wireframing and initial development phases, letting you focus entirely on adapting the content and branding to fit your product. The no-code visual editor means you can make changes in real-time without writing a single line of code.\n\n### Actionable Insight: Choose a Template Built for SaaS Conversions\n\nThe **Webflow Templates Marketplace** is the ideal platform for this approach, offering a vast selection of templates specifically designed for technology and software companies. It provides the tools to get a professional, high-performing landing page live with minimal friction.\n\n- **Unique Offerings:** The marketplace features hundreds of SaaS-specific templates with built-in conversion-oriented sections like hero components, testimonials, feature grids, and FAQ accordions. Live previews allow you to test the user experience before purchasing.\n- **Developer Experience:** While it's a no-code platform, Webflow offers powerful customization and the ability to export clean, semantic code if you prefer to host the site yourself. This flexibility appeals to both marketing teams and developers.\n- **Pricing & Access:** Templates are a one-time purchase, typically ranging from $49 to $149. You can then customize the template within Webflow's visual editor and host it there (requires a subscription) or export the code.\n\n> **Pro Tip:** When selecting a template, filter for those recently updated and with high ratings. Before customizing, review the template's \"Style Guide\" page to understand its core design system (colors, fonts, buttons). This will help you maintain design consistency as you add your own branding and content.\n\nBy starting with a Webflow template, you leverage a proven layout and design foundation, freeing up your team to focus on what matters most: compelling copy and a clear call to action. You can learn more about how to choose from the many high-quality [landing page design templates](https://magicui.design/blog/landing-page-design-templates) available in the ecosystem.\n\n**Website:** [webflow.com/templates](https://webflow.com/templates)\n\n## 3. Accelerate Conversion Testing with a Dedicated Platform\n\nBuilding a landing page is just the first step; the real work lies in optimizing it for conversions. Instead of relying on slow, developer-dependent A/B testing cycles, one of the most impactful **SaaS landing page best practices** is to use a dedicated conversion rate optimization (CRO) platform. These tools empower marketing and growth teams to rapidly launch, test, and iterate on landing page variants without touching a single line of code, turning optimization into a core, agile workflow.\n\n![Unbounce platform showcasing its drag-and-drop landing page builder and template library.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/1057e287-9b3c-45a8-a855-19666772c7b2.jpg)\n\n### Why It Works: Speed, Data, and AI-Driven Insights\n\nA dedicated platform like Unbounce moves landing page management from the engineering backlog to the marketing team’s control. This allows for immediate implementation of data-driven hypotheses. You can test different headlines, hero images, or [call-to-action designs](https://magicui.design/blog/cta-design) in parallel, gathering real-world data on what resonates with your audience. The addition of AI-powered features further accelerates this process by automatically directing visitors to the variant most likely to convert them.\n\n### Actionable Insight: Use Unbounce for Rapid Testing and AI Optimization\n\n**Unbounce** is a mature, industry-leading platform designed specifically for building and optimizing high-converting landing pages. It's an ideal solution for paid acquisition teams and marketers who need to move quickly and validate ideas with rigorous testing.\n\n- **Unique Offerings:** Unbounce’s standout feature is **Smart Traffic**, an AI algorithm that analyzes visitor attributes and dynamically routes them to the landing page variant where they are most likely to convert. It also offers a rich library of SaaS-specific templates, popups, and sticky bars.\n- **CRO-Focused Toolset:** The platform provides built-in A/B testing, a user-friendly drag-and-drop builder, and seamless integrations with over 1,000 marketing tools. This creates a powerful, all-in-one environment for conversion optimization.\n- **Pricing & Access:** Unbounce is a subscription service with plans that vary by traffic volume and features. It offers a 14-day free trial, allowing you to test its full capabilities before committing.\n\n> **Pro Tip:** Start by using a pre-built SaaS template from Unbounce’s gallery to get a head start on best-practice layouts. Then, create 2-3 variants of your hero section and activate Smart Traffic. This allows the AI to optimize for conversions from day one, even before you have enough data for a traditional A/B test conclusion.\n\nBy leveraging Unbounce, you shift from a \"build and hope\" mentality to a continuous cycle of \"test, learn, and improve.\" This data-first approach ensures your landing pages evolve based on actual user behavior, maximizing your return on ad spend and driving sustainable growth.\n\n**Website:** [https://unbounce.com](https://unbounce.com)\n\n## 4. Seamlessly Connect Your Landing Page to Your CRM\n\nA high-converting landing page is only half the battle; the real value comes from what you do with the leads it generates. One of the most impactful **SaaS landing page best practices** is to ensure a seamless connection between your page and your CRM. This integration eliminates manual data entry, prevents leads from falling through the cracks, and enables immediate, personalized follow-up, which is critical for nurturing prospects effectively.\n\n![HubSpot Landing Page Builder](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/f07c1f8f-cbe0-4dde-8934-11764805b009.jpg)\n\n### Why It Works: Unifying Marketing and Sales Data\n\nWhen your landing page builder is natively integrated with your CRM, every form submission, content download, or demo request automatically updates a contact record. This creates a unified view of the customer journey, allowing you to trigger automated email workflows, score leads based on their activity, and provide your sales team with rich context for their outreach. This closed-loop system turns your landing page from a simple lead capture form into a powerful engine for your entire revenue pipeline.\n\n### Actionable Insight: Use HubSpot’s Free Landing Page Builder\n\n**HubSpot** offers a powerful landing page builder that is deeply integrated into its world-class CRM platform. It’s designed for marketers who want to move fast and prove ROI without needing extensive technical skills, making it an ideal all-in-one solution.\n\n- **Unique Offerings:** The tool’s biggest strength is its native connection to the HubSpot ecosystem. Leads captured on a landing page are automatically added to the CRM, where you can enroll them in email sequences, track their lifecycle stage, and analyze conversion analytics all in one place.\n- **User Experience:** HubSpot provides a library of mobile-responsive templates and a drag-and-drop editor, along with built-in SEO suggestions and performance analytics. This makes it easy to launch optimized pages quickly.\n- **Pricing & Access:** You can start building landing pages for free. The free tier includes HubSpot branding, but it provides core functionality tightly integrated with the free HubSpot CRM. Paid plans (Starter, Professional) unlock advanced features like A/B testing and dynamic content.\n\n> **Pro Tip:** Use HubSpot’s free landing pages to capture leads for a specific high-value asset, like an ebook or webinar. Then, create an automated email workflow in the free CRM to nurture those new contacts with related content, effectively guiding them through the sales funnel without any manual intervention.\n\nBy leveraging a tool like HubSpot, you connect the dots between traffic and revenue. It ensures that every conversion on your landing page is the start of a managed, measurable, and optimized customer relationship.\n\n**Website:** [hubspot.com/products/landing-pages](https://www.hubspot.com/products/landing-pages)\n\n## 5. Deconstruct and Rebuild with Proven Components\n\nWhy reinvent the wheel when you can learn from the best? A common pitfall is designing in a vacuum, leading to layouts and copy that miss the mark. One of the most effective **SaaS landing page best practices** is to deconstruct what’s already working for top-tier companies and use those proven patterns as a foundation. This approach allows you to benchmark your design against successful examples and rapidly assemble high-converting pages.\n\n![Landingfolio](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/9f0d9b61-0632-4da2-a6ff-aea2a736eb3f.jpg)\n\n### Why It Works: Benchmarking Meets Rapid Implementation\n\nInstead of guessing which hero section or pricing table layout converts, you can study thousands of real-world examples from successful SaaS businesses. This strategy removes the guesswork from design and copywriting, providing a clear roadmap for what an effective page looks like. By using a library of pre-built components based on these examples, you can accelerate your workflow from inspiration to a fully functional page.\n\n### Actionable Insight: Use Landingfolio for Inspiration and Assets\n\nA premier resource for this is **Landingfolio**, a curated gallery of top-tier landing pages that also offers hundreds of pre-built components and templates. It bridges the gap between seeing a great design and being able to implement it quickly in your own projects.\n\n- **Unique Offerings:** Landingfolio provides thousands of real component examples categorized by section (hero, features, pricing, etc.). It also sells production-ready assets and templates for Figma, Webflow, Tailwind, and Vue/React, supporting diverse tech stacks.\n- **Developer & Designer Experience:** The platform is a goldmine for both inspiration and practical application. You can analyze copy, structure, and design choices, then download a corresponding component to drop directly into your project, drastically reducing build time.\n- **Pricing & Access:** While the inspiration gallery is free, the high-quality components and templates are available via flexible pricing plans, including quarterly, annual, and lifetime access options.\n\n> **Pro Tip:** Use Landingfolio’s gallery to identify 3-4 hero sections you admire. Analyze their value propositions and calls-to-action. Then, find a similar pre-built component from their library to use as a starting point for your own page, ensuring your design is grounded in a proven format from day one.\n\nLandingfolio is not a hosted builder; it’s an asset and inspiration library. You still need the technical skills to implement the components, but it gives you an unparalleled head start, ensuring your landing page is built on a foundation of proven success.\n\n**Website:** [https://www.landingfolio.com](https://www.landingfolio.com)\n\n## 6. Test Multiple Concepts Rapidly with a Template Marketplace\n\nIterating on your landing page design is crucial for finding what resonates with your audience, but building multiple high-fidelity versions from scratch is often impractical. A key **SaaS landing page best practice** is to leverage a vast template marketplace to quickly prototype and deploy different concepts. This allows you to test various layouts, value propositions, and visual styles without a massive upfront investment in custom design and development.\n\n![Envato Elements](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/81f9de36-aa12-4ed5-930a-f2025d3eaf8a.jpg)\n\n### Why It Works: Quantity and Quality on Demand\n\nUsing a subscription-based asset library gives your team an unlimited playground for creative exploration. You can download and customize dozens of production-ready SaaS templates, from complete HTML/CSS builds to sophisticated Figma and Webflow kits. This approach dramatically accelerates the A/B testing cycle, enabling you to gather real-world data on what converts best before committing to a final, polished design. It's about making data-driven decisions faster.\n\n### Actionable Insight: Use Envato Elements for Unlimited Assets\n\nFor teams looking to implement this strategy at scale, **Envato Elements** is an unparalleled resource. It’s a subscription service offering unlimited downloads from a massive library of over 26 million creative assets, including thousands of high-quality SaaS landing page templates.\n\n- **Unique Offerings:** The platform provides a huge selection of assets tailored for SaaS, including HTML templates, Webflow components, and comprehensive Figma/XD UI kits. It also includes icons, illustrations, and mockups to fully flesh out your designs.\n- **Developer Experience:** Templates come with live previews and user ratings, helping you vet quality before downloading. While you need your own build and hosting workflow, the source files are well-organized and ready for customization.\n- **Pricing & Access:** Envato Elements operates on a simple subscription model (starting at $16.50/month) that includes a commercial license for all assets. This makes it incredibly cost-effective for teams that need a steady stream of creative resources.\n\n> **Pro Tip:** Use Envato Elements to create multiple landing page variants for different audience segments. Download a few top-rated Figma kits, customize the messaging and visuals for each target persona, and deploy them simultaneously to see which one performs best. This rapid, low-cost testing can yield powerful conversion insights.\n\nBy using a service like Envato Elements, you can de-risk your design process and empower your team to experiment freely. It provides the assets needed to implement best practices across multiple campaigns, ensuring your final landing page is not just beautiful but also validated by user behavior.\n\n**Website:** https://elements.envato.com\n\n## 7. Go Beyond Design with Conversion Rate Optimization (CRO) Expertise\n\nA beautiful landing page is a great start, but it’s useless if it doesn’t convert visitors into customers. Truly effective **SaaS landing page best practices** involve a deep understanding of user psychology, data analysis, and continuous testing. Instead of guessing what works, you can learn the proven frameworks for persuasion and optimization from the industry’s leading practitioners.\n\n![CXL (ConversionXL)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/daa8e0ee-33cc-409e-8d6b-5404e7127c45.jpg)\n\n### Why It Works: Data-Driven Decisions Over Gut Feelings\n\nTop-performing SaaS companies don't just launch a landing page and hope for the best; they instrument, test, and iterate based on data. CXL provides the exact knowledge required to implement this process. By learning foundational CRO principles, you can systematically improve your messaging, layout, and calls-to-action to drive measurable growth, turning your landing page into a predictable revenue engine rather than a static digital brochure. For a deeper dive into these tactics, you can learn more about [how to improve website conversion rates](https://magicui.design/blog/how-to-improve-website-conversion-rates).\n\n### Actionable Insight: Upskill Your Team with CXL Courses\n\n**CXL (ConversionXL)** is a premier education platform that offers practitioner-led courses on every aspect of conversion rate optimization. It’s the ideal resource for moving beyond surface-level tips and mastering the science behind high-converting landing pages.\n\n- **Unique Offerings:** CXL offers over 100 on-demand courses, including a dedicated \"Landing Page Optimization\" course that covers everything from persuasive design to A/B testing frameworks. Minidegrees and certifications provide structured learning paths.\n- **Expert Instructors:** The courses are taught by vetted, in-the-trenches experts who have driven results for major brands, ensuring the content is practical and up-to-date.\n- **Pricing & Access:** Full access to the library is subscription-based, with plans for individuals and teams. They also offer a 7-day money-back guarantee, allowing you to explore the platform risk-free.\n\n> **Pro Tip:** Don't just watch the videos. Use the CXL frameworks to conduct a heuristic analysis of your current landing page. Identify areas of friction, unclear value propositions, and weak calls-to-action, then create a hypothesis-driven testing roadmap to systematically improve performance.\n\nBy investing in education from a platform like CXL, you equip yourself and your team with the skills to make smarter, data-backed decisions that directly impact your bottom line. It’s about building a culture of optimization, not just a one-off design.\n\n**Website:** [https://cxl.com](https://cxl.com)\n\n## SaaS Landing Page Best Practices — 7-Tool Comparison\n\n| Item                          |                                       Implementation complexity | Resource requirements                                                                   | Expected outcomes                                                  | Ideal use cases                                                      | Key advantages                                                                     |\n| ----------------------------- | --------------------------------------------------------------: | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |\n| Magic UI                      |        Moderate — developer-focused (React/TypeScript/Tailwind) | Dev environment, familiarity with modern JS stack; Pro templates are paid               | Production-ready, highly animated UIs assembled quickly            | Dev teams, startups, freelancers building modern landing pages       | Large open-source animated component library, ready blocks, strong community       |\n| Webflow Templates Marketplace |                         Low — visual no-code editing in Webflow | Webflow account (hosting optional), basic Webflow skills                                | Fast visual launches; polished templates, exportable clean code    | Non-technical founders, marketers, designers who want visual editing | Curated templates, live previews, visual builder + hosting or export               |\n| Unbounce                      |          Low–Medium — platform-driven builder and testing tools | Subscription, marketing resources, sufficient traffic for AI features                   | Rapid A/B testing and CRO-focused page improvements                | Paid-acquisition teams and conversion-focused marketers              | Smart Traffic AI, built-in A/B testing, wide integrations                          |\n| HubSpot Landing Page Builder  |                       Low — WYSIWYG builder integrated with CRM | HubSpot account (free start, paid tiers for more features)                              | Lead capture with attribution and workflow automation              | Teams already using HubSpot or needing CRM-connected pages           | Native CRM integration, end-to-end marketing stack, easy lead workflows            |\n| Landingfolio                  | Low (resource library) — requires implementation in chosen tool | Purchase/access to assets, designers or devs to implement Figma/Webflow/Tailwind assets | Rapid benchmarking and component-based page assembly               | Designers and teams looking for examples and reusable sections       | Massive collection of real landing sections, cross-tool assets for multiple stacks |\n| Envato Elements               |           Low–Medium — download assets then build/host yourself | Subscription, time to vet assets, dev/design for integration                            | Access to many template concepts for large-scale iteration         | Agencies and teams testing many concepts or producing multiple sites | Unlimited downloads, broad asset variety, commercial licensing included            |\n| CXL (ConversionXL)            |                            Low — learning platform (no builder) | Subscription or course purchase, time investment for training                           | Deeper CRO knowledge, better test design and optimization outcomes | Teams wanting to upskill in CRO and persuasive design                | Practitioner-led courses, certifications, in-depth CRO frameworks                  |\n\n## From Best Practices to Better Performance\n\nBuilding a SaaS landing page that consistently converts is not a one-time project; it's a dynamic, ongoing process of strategic iteration. Throughout this guide, we've explored a comprehensive toolkit designed to elevate your landing pages from mere digital storefronts to powerful conversion engines. We've seen how establishing a powerful first impression with sophisticated animations from Magic UI can immediately capture user attention. We've also delved into the efficiency of using platforms like the Webflow Templates Marketplace and Envato Elements to accelerate development without sacrificing quality.\n\nThe journey from a good landing page to a great one is paved with data and user-centric design. This is where mastering **SaaS landing page best practices** becomes crucial. Tools like Unbounce and the HubSpot Landing Page Builder empower you to move beyond guesswork, enabling rapid A/B testing and personalization at scale. By leveraging these platforms, you can systematically test headlines, calls to action, and value propositions to discover what truly resonates with your audience.\n\nFurthermore, continuous learning and inspiration are non-negotiable. Drawing inspiration from curated collections like Landingfolio keeps your designs fresh and aligned with current trends, while diving deep into the data-driven methodologies taught by CXL provides the strategic framework to understand the \"why\" behind every conversion.\n\n### Your Actionable Next Steps\n\nThe difference between reading about best practices and achieving better performance lies in implementation. Don't let this wealth of information lead to paralysis. Instead, focus on taking small, deliberate steps forward.\n\n- **Audit Your Current Page:** Use the principles discussed as a checklist. Where are the most significant gaps? Is your value proposition unclear? Is your social proof weak or non-existent? Identify one or two high-impact areas to tackle first.\n- **Select the Right Tool for the Job:** Your choice of tool should align with your immediate goals and technical resources.\n  - For **visual distinction and modern UI**, consider integrating components from **Magic UI**.\n  - If you need to **launch and test new page variants quickly**, **Unbounce** is an industry-leading choice.\n  - For **inspiration and design direction**, spend an hour browsing **Landingfolio**.\n  - If you're part of a larger marketing ecosystem and need an **all-in-one solution**, **HubSpot** is a powerful contender.\n- **Commit to a Testing Cadence:** The core principle behind all **SaaS landing page best practices** is experimentation. Commit to running at least one new test every two weeks. Whether it's a simple headline change or a complete redesign of a section, the key is to build a rhythm of continuous improvement. This iterative process, fueled by data and guided by the strategies we've covered, is the ultimate path to building a landing page that not only looks great but also drives meaningful business growth.\n\n---\n\nReady to instantly elevate your landing page's first impression? The best practices start with a design that captivates and communicates quality. Explore the open-source, professionally designed components at **Magic UI** to add stunning, modern animations to your site in minutes.\n"
  },
  {
    "path": "apps/www/content/blog/search-input-with-icon.mdx",
    "content": "---\ntitle: Build a Perfect Search Input with Icon\ndescription: >-\n  Learn to build a responsive and accessible search input with icon using HTML,\n  CSS, Tailwind, and React. A practical guide for modern web developers.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/56c35588-1727-431b-8c57-e03c4d13246c/search-input-with-icon-search-interface.jpg\nauthor: Dillion Verma\ntags:\n  - search input with icon\n  - tailwind css\n  - react components\n  - html css input\n  - ui development\npublishedOn: \"2025-11-29T08:29:17.88628+00:00\"\nfeatured: true\n---\n\nA **search input with an icon** is way more than just a bit of visual flair; it's a powerful signpost that helps users find their way. When you add a simple magnifying glass, you turn a plain text box into a search tool that everyone instantly recognizes. This little touch lowers the mental effort required and makes your entire interface feel more intuitive.\n\n## Why an Icon Supercharges Your Search Input\n\nPutting an icon inside a search bar is a classic design pattern for a very good reason. It immediately tells you what the element does, no label or placeholder text required. This small addition makes the search function pop, which is a huge deal for keeping users engaged and helping them navigate.\n\nThe magnifying glass is the universal symbol for \"search.\" Everybody gets it. That instant recognition means people don't waste precious milliseconds trying to figure out what to do—they just know. It's a perfect example of how a small, thoughtful design choice can lead to a much smoother user journey.\n\n### The Impact of Icons on User Performance\n\nThe benefits here aren't just a gut feeling; there's data to back it up. A pivotal 2021 study found that interfaces combining icons with text labels gave user performance a serious boost. In fact, users found what they were looking for **23% faster** and made **18% fewer errors** compared to text-only options.\n\nThis data really drives home a core UX principle: visuals are incredibly effective at improving both speed and accuracy. For a search input, that translates directly into a better experience and more people successfully finding what they need.\n\n> A well-placed icon acts as a silent guide, telling users, \"This is where you find what you need.\" It removes ambiguity and builds user confidence from the very first interaction.\n\n### The Broader Role of Effective Search\n\nJust look at the search bar on Google's homepage—it's front and center, complete with its unmistakable icon.\n\n![A clean and modern search input field with a magnifying glass icon on a white background.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e7b41fc4-c21d-413c-b166-84db5414817e/search-input-with-icon-search-bar.jpg)\n\nThis design choice highlights just how critical search is as a primary action, a lesson that applies to almost any website or app. Getting a handle on [the vital role of search in user experience](https://www.milesmarketing.co.uk/the-role-of-search-in-retail-seo-and-google-shop/) can really put the importance of optimizing your search input into perspective. A great search function can completely change how users find content, discover products, and move through your platform.\n\n## Building a Search Input with HTML and CSS\n\nBefore you can get fancy with frameworks, it’s crucial to understand how to build a polished `search input with icon` from the ground up. Nailing the core HTML and CSS gives you total control and ensures your component is accessible and easy to maintain. Think of it as building a strong foundation.\n\n![A hand-drawn illustration of a search input field with a decorative icon in a browser window.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/1c49137c-8f09-4aec-8ffd-550fb051881b/search-input-with-icon-search-input.jpg)\n\nWe'll start with semantic HTML. It’s tempting to just throw a `<div>` and an `<input>` on the page, but wrapping everything in a `<form>` tag is a non-negotiable. This gives you browser-native behaviors, like submitting on Enter, and provides essential context for screen readers.\n\n### Structuring the Component\n\nThe basic anatomy is simple: a container that holds the input field and its icon. This container is the key to positioning everything correctly.\n\nHere’s the breakdown:\n\n- **A `div` wrapper:** This element will act as our positioning anchor. By setting it to `position: relative`, we can place child elements precisely within it.\n- **A `<label>`:** Every input needs a label for accessibility. We’ll hide it visually but keep it available for assistive tech.\n- **An `<input>` field:** The star of the show where users will type.\n- **An icon:** This is usually an SVG that sits inside the wrapper alongside the input.\n\nGetting this structure right from the start means your component will be functional and accessible before you’ve written a single line of CSS.\n\n> Proper semantic HTML isn't just a best practice; it's the bedrock of accessibility. A well-structured form with correctly associated labels ensures that users relying on screen readers can navigate your search functionality just as easily as visual users.\n\n### Styling with CSS Positioning\n\nNow for the fun part. The real magic comes from the CSS relationship between the parent wrapper and the icon. We give the wrapper `position: relative`, which creates a bounding box for any children with `position: absolute`.\n\nThis lets us pin the icon exactly where we want it. We'll use `top`, `left`, and `transform` to get it perfectly centered vertically. Of course, this means the icon will sit on top of the input field, so we just need to add some left padding to the `<input>` to make sure the user's text doesn't slide underneath it.\n\nLet's see how it all comes together in a complete example.\n\n```html\n<div className=\"search-container\">\n  <label htmlFor=\"main-search\" className=\"sr-only\"> Search </label>\n  <input\n    type=\"search\"\n    id=\"main-search\"\n    name=\"search\"\n    placeholder=\"Search anything...\"\n  />\n  <svg\n    className=\"search-icon\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"16\"\n    height=\"16\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n    <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n  </svg>\n</div>\n```\n\n```css\n.search-container {\nposition: relative;\nwidth: 300px;\n}\n\n.search-icon {\nposition: absolute;\nleft: 12px;\ntop: 50%;\ntransform: translateY(-50%);\ncolor: #9ca3af; /_ A neutral gray color _/\n}\n\ninput[type='search'] {\nwidth: 100%;\npadding: 10px 10px 10px 40px; /_ Left padding makes space for the icon _/\nborder: 1px solid #d1d5db;\nborder-radius: 8px;\nfont-size: 16px;\noutline: none;\ntransition: border-color 0.2s;\n}\n\ninput[type='search']:focus {\nborder-color: #3b82f6; /_ Blue focus ring _/\nbox-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);\n}\n\n/_ For screen readers _/\n.sr-only {\nposition: absolute;\nwidth: 1px;\nheight: 1px;\npadding: 0;\nmargin: -1px;\noverflow: hidden;\nclip: rect(0, 0, 0, 0);\nwhite-space: nowrap;\nborder-width: 0;\n}\n```\n\nThis code gives you a clean, accessible **search input with icon**, complete with intuitive focus states and a properly handled label. It's a reliable pattern that you can use anywhere.\n\n## Modern Styling with Tailwind CSS\n\nWhile plain CSS gives you total control, a utility-first framework like [Tailwind CSS](https://tailwindcss.com/) can seriously speed things up when building a **search input with an icon**. Instead of juggling custom stylesheets, you apply pre-built classes directly in your HTML. The result? Faster, more consistent styling.\n\nThis approach also keeps your markup and styles in the same place, making components much easier to decipher and maintain down the road. You won't have to go digging through separate CSS files just to figure out what styles are affecting an element.\n\nThis little decision tree visualizes the two main paths you can take.\n\n![Flowchart illustrating styling options for a search input: Custom CSS represented by a code icon, or Tailwind CSS with an arrow.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d698fe8a-371f-4b53-ab73-c255efa17db9/search-input-with-icon-css-options.jpg)\n\nAs the flowchart suggests, while custom CSS is powerful for fine-grained control, Tailwind often provides a much smoother workflow, especially in modern, component-driven development.\n\n### Setting Up the Structure with Utility Classes\n\nLet's refactor our previous HTML using Tailwind. The basic idea is identical—a `relative` parent containing an `absolutely` positioned icon. The difference is we achieve this with simple utility classes instead of writing custom CSS rules.\n\nTo get the alignment just right, we'll lean on flexbox utilities. By adding `flex` and `items-center` to the container, any child elements will be vertically centered automatically, which makes positioning the icon a breeze.\n\nIf you're new to the framework, our guide on how to [install and set up Tailwind CSS](https://magicui.design/blog/tailwind-css-install) will get you up and running in minutes.\n\n> With Tailwind, you're essentially composing a design directly in your HTML. This shift in mindset can feel strange at first, but it quickly becomes second nature and dramatically speeds up the process of building and iterating on UIs.\n\n### Implementing the React MDX Example\n\nTranslating this into a React component is a piece of cake. We just need to swap the `class` attribute for `className` and embed the SVG right into the JSX. This keeps the component totally self-contained and ready for any modern JavaScript project.\n\nHere's how you can build a sleek search input with an icon using Tailwind CSS in a React environment.\n\n```tsx\nfunction SearchInput() {\n  return (\n    <div className=\"relative w-full max-w-xs\">\n      <label htmlFor=\"tailwind-search\" className=\"sr-only\">\n        Search\n      </label>\n      <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n        <svg\n          className=\"h-5 w-5 text-gray-400\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          viewBox=\"0 0 20 20\"\n          fill=\"currentColor\"\n          aria-hidden=\"true\"\n        >\n          <path\n            fillRule=\"evenodd\"\n            d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\"\n            clipRule=\"evenodd\"\n          />\n        </svg>\n      </div>\n      <input\n        id=\"tailwind-search\"\n        name=\"search\"\n        type=\"search\"\n        placeholder=\"Search...\"\n        className=\"block w-full rounded-md border-0 bg-gray-100 py-2 pr-3 pl-10 text-gray-900 ring-1 ring-gray-300 ring-inset placeholder:text-gray-400 focus:ring-2 focus:ring-blue-500 focus:ring-inset sm:text-sm\"\n      />\n    </div>\n  )\n}\n```\n\nThis snippet is all you need. Notice how state variants like `focus:` are handled inline, making the styling logic immediately obvious. This kind of maintainability is a huge reason why so many developers gravitate toward utility-first frameworks for building robust component libraries.\n\nWhen you move from static HTML and utility classes to a component-based framework like [React](https://react.dev/), you unlock the ability to build a truly dynamic and reusable **search input with an icon**. Instead of copying and pasting the same markup over and over, we can build a single, intelligent component, configure it with props, and drop it anywhere in our app.\n\nThis whole approach is about building for scale. A good React component encapsulates its own logic, state, and styling, which makes it far easier to manage, test, and maintain down the road. For our search input, this means we can neatly handle its value, user interactions, and even its appearance through a clean, declarative API.\n\nHere's a great video walkthrough of the process:\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/L6XXua68eEU\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\n### Managing State with the useState Hook\n\nTo make our search input truly interactive, the first thing we need to do is manage its state. In a functional React component, the `useState` hook is the perfect tool for the job. It lets us create a state variable to hold the current value of the input field.\n\nAs a user types into the input, we’ll capture that `onChange` event and use the state's setter function to update the value in real-time. This is the core of what makes React \"reactive\"—our component always knows what the user has entered, allowing us to immediately filter data or show search suggestions.\n\n### Defining Props with TypeScript\n\nTo make our component genuinely reusable and developer-friendly, we need to define a clear contract for how it's meant to be used. This is where [TypeScript](https://www.typescriptlang.org/) really shines. By creating an `interface` for our component's props, we get type safety and fantastic autocompletion in our code editor.\n\nFor our `SearchInputProps` interface, we might include:\n\n- **`initialValue`**: An optional string to set a default search query.\n- **`placeholder`**: The text to display when the input is empty.\n- **`onSearchChange`**: A callback function that fires whenever the input value changes.\n- **`icon`**: A `React.ReactNode` type, which allows us to pass in any SVG or icon component.\n\nThis setup makes the component both flexible and predictable. Developers know exactly which props to pass and what types they should be, which drastically cuts down on bugs and guesswork. Following patterns like this is crucial, and you can dive deeper into them in our guide on [React component best practices](https://magicui.design/blog/react-component-best-practices).\n\n> Using TypeScript to define your component's API isn't just about catching errors early. It's about creating a better developer experience. A well-typed component is self-documenting, making it much easier for your team to understand and use correctly.\n\n### Building the Reusable Component\n\nAlright, let's put all the pieces together. We'll create a functional component called `SearchInput` that accepts the props we just defined. Inside, we’ll use the `useState` hook to manage the input's value and wire it up to the `onChange` event handler. The icon, passed in as a prop, will be rendered right alongside the input field using the same absolute positioning techniques we covered earlier.\n\nHere’s a practical, production-ready example that combines React, TypeScript, and [Tailwind CSS](https://tailwindcss.com/).\n\n```tsx\nimport React, { useState } from \"react\"\n\n// Define the component's props with TypeScript\ninterface SearchInputProps {\n  icon: React.ReactNode\n  placeholder?: string\n  onSearchChange: (value: string) => void\n}\n\nconst SearchInput: React.FC<SearchInputProps> = ({\n  icon,\n  placeholder = \"Search...\",\n  onSearchChange,\n}) => {\n  const [query, setQuery] = useState(\"\")\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    const newValue = event.target.value\n    setQuery(newValue)\n    onSearchChange(newValue)\n  }\n\n  return (\n    <div className=\"relative w-full max-w-sm\">\n      <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n        {icon}\n      </div>\n      <input\n        type=\"search\"\n        value={query}\n        onChange={handleChange}\n        placeholder={placeholder}\n        className=\"block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 pl-10 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500\"\n      />\n    </div>\n  )\n}\n\nexport default SearchInput\n```\n\nAnd just like that, we have a self-contained component ready to be dropped into any project. It provides a consistent and dynamic **search input with an icon** wherever it's needed, without any duplicated code.\n\n### Comparison of Search Input Implementation Methods\n\nTo wrap things up, let's compare the three approaches we've covered. Each method has its own trade-offs, and the best choice really depends on your project's specific needs, scale, and tech stack.\n\n| Feature             | HTML/CSS                                    | Tailwind CSS                                   | React Component                                    |\n| ------------------- | ------------------------------------------- | ---------------------------------------------- | -------------------------------------------------- |\n| **Setup Speed**     | Very fast, minimal setup required.          | Fast, requires Tailwind setup but is quick.    | Slower, requires React environment & setup.        |\n| **Reusability**     | Low. Requires copy-pasting HTML and CSS.    | Moderate. Utility classes are reusable.        | High. Encapsulated and reusable via props.         |\n| **Maintainability** | Difficult. Changes must be made everywhere. | Better. Changes are managed in one place.      | Excellent. Logic and styles are self-contained.    |\n| **Interactivity**   | Low. Requires separate JavaScript.          | Low. Still needs JS for state management.      | High. Built-in state management with hooks.        |\n| **Best For**        | Simple static sites, prototypes.            | Projects already using Tailwind, rapid UI dev. | Complex applications, design systems, large teams. |\n\nThis table should give you a clear picture of when to reach for each tool. While plain HTML/CSS is great for a quick mockup and Tailwind excels at rapid styling, building a proper React component is the way to go for any application that needs to be scalable and easy to maintain over time.\n\n## Advanced Customizations and UI Patterns\n\nOnce you've got a solid, reusable component, the real fun begins. Now we can explore some more advanced UI patterns that make a `search input with icon` not just functional, but genuinely enjoyable to use. It's often the small enhancements that have the biggest impact on the user experience, turning a standard element into something that feels truly polished.\n\nMoving beyond the basics is where you start to refine the interaction. Simple additions like a clear button or subtle animations can dramatically improve usability.\n\n![A minimalist interface displays a search bar with text 'eech' and various application icons below.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cd880763-4f29-4d4f-8b5e-c28ff2da01b7/search-input-with-icon-search-interface.jpg)\n\n### Shifting the Icon to the Right\n\nWhile the left-aligned search icon is the convention, don't be afraid to break the mold. Moving the icon to the right can be a smart design choice, especially in layouts where it needs to feel more like a \"submit\" button, signaling the primary action after a user has finished typing.\n\nThe implementation is a simple tweak—just adjust the positioning classes. In Tailwind CSS, you'd swap `left-0 pl-3` for `right-0 pr-3`. But this isn't just a code change; it's a UX decision. You need to consider user expectations and the icon's design. Research has actually shown that simple, horizontally structured icons can be located up to **28% faster** than more complex, enclosed ones. The visual structure really does matter.\n\n### Implementing a Clear Button\n\nHere’s one of my favorite user-friendly additions: a \"clear\" button. It's typically an \"X\" icon that only pops up inside the input when there's text. This little feature gives users a quick, one-click way to reset their search query without having to mash the backspace key.\n\nHooking this up in React is pretty straightforward. You'll want to conditionally render the clear button based on the input's state.\n\n- **Condition:** Render it only if `query.length > 0`.\n- **Action:** When clicked, the button should trigger a handler that resets the state (`setQuery('')`).\n- **Placement:** Pop it on the right side of the input. Just make sure to add enough padding (like `pr-10`) so the text doesn't awkwardly overlap both the search and clear icons.\n\nThis tiny feature is a perfect example of a thoughtful micro-interaction that saves user effort. If you're looking for more ideas on smart component design, check out our guide on common [user interface design patterns](https://magicui.design/blog/user-interface-design-patterns).\n\n### Adding Subtle Focus Animations\n\nAnimations can add a layer of polish that makes an interface feel alive and responsive. For a search bar, a subtle expansion animation on focus is a fantastic way to draw attention to the active input without being distracting. You can pull this off with simple CSS transitions.\n\n> By applying a `transition` property to the input's `width` and a `scale` transform to its focus state, you can create a smooth, satisfying effect. For example, using `focus:w-full` on an input with a smaller initial width or `focus:scale-105` can provide just enough visual feedback to feel great.\n\nThese advanced customizations are about much more than just looking cool; they're about creating an intuitive and efficient experience. When you start combining different patterns—like a right-aligned icon, a conditional clear button, and focus animations—you can build a `search input with icon` that is both powerful and a delight to use.\n\nLooks great on the surface, but is it usable by everyone? A sharp-looking **search input with an icon** is only half the job. Making sure it’s accessible and intuitive is what separates a good component from a great one. This is where we nail down the accessibility (a11y) and user experience (UX)—the details that make or break your design.\n\nIt all starts with clean, semantic HTML. Every single input needs an associated `<label>`. You might be tempted to hide it for a cleaner look, and that's fine, but it _must_ exist in the DOM. Screen readers rely on it to tell users what the input field is for.\n\n### Getting the Core Accessibility Right\n\nWhen you do hide a label visually, ARIA attributes are your best friend. Slapping an `aria-label=\"Search\"` directly onto the input element gives screen readers the context they need. It’s a tiny addition that makes a massive difference for anyone using assistive tech.\n\nNext up: keyboard navigation. This is non-negotiable. Anyone should be able to navigate your site without a mouse. For our search input, that means a user must be able to:\n\n- Tab directly to the search input.\n- Type their query without any weird focus traps.\n- Hit the Enter key to submit the form.\n\nThis simple flow ensures you aren't putting up a wall for users with motor disabilities. If you want to go deeper, referencing an [ultimate website accessibility checklist](https://www.justbeepit.com/post/ultimate-website-accessibility-checklist-for-inclusivity) is a great way to cover all your bases.\n\n> Accessibility isn't just a box to check off at the end of a project. It’s a core design principle that shows respect for every user and, frankly, leads to a better product for everyone.\n\n### Little Things That Elevate the User Experience\n\nWith accessibility handled, let's talk UX. A great user experience feels effortless. One of the easiest wins here is using an icon people already know. Why a magnifying glass? Because research shows that users recognize familiar icons like it **34% faster** than abstract ones. Sticking to conventions just works. You can dive into the full study on [icon recognition and search performance](https://pmc.ncbi.nlm.nih.gov/articles/PMC6024531/) if you're curious.\n\nThink about the user’s entire interaction. The search input has to be fully responsive, looking and working just as well on a tiny mobile screen as it does on a huge desktop monitor. And on mobile, make sure those touch targets are big enough to tap without frustration.\n\nFinally, give people clear feedback. What happens after they hit Enter? A loading spinner, a subtle animation—anything that says, \"I got your request and I'm working on it.\" This kind of feedback prevents confusion and makes the whole experience feel polished and professional.\n\n---\n\nTired of building from scratch? You can skip the manual labor and drop production-ready, accessible components right into your projects. **Magic UI** offers a library of beautifully crafted and fully animated components built with React, TypeScript, and Tailwind CSS.\n\n[Explore Magic UI Components](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/semantic-ui-vs-material-ui.mdx",
    "content": "---\ntitle: \"The Ultimate Comparison Between Semantic UI Vs Material UI\"\ndescription: \"Deciding between Semantic UI vs Material UI for your web project? This comparison breaks the pros and cons of each to help you make right choice.\"\nimage: https://cdn.magicui.design/assets/080d92c5-075d-49df-98b7-03c985ae0e6c.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-24\"\nfeatured: false\n---\n\nAre you struggling to choose between Semantic UI and Material UI for your React apps? Making the right choice of [UI frameworks](https://magicui.design/blog/ui-frameworks) is crucial for your project's success. This article will provide valuable insights, comparing Semantic UI and Material UI for your React apps.\n\nLooking to streamline your UI framework selection process? [MagicUI](https://magicui.design/) offers a straightforward and effective solution that can help you achieve your goals of comparing Semantic UI and Material UI for your React apps.\n\n## What Is Semantic UI?\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1635405076647-80cfa0f2effe?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx1aSUyMGNvbXB1dGVyfGVufDB8fHx8MTcxOTMwMDY0NHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nSemantic UI React is a toolkit that simplifies styling for React developers. It provides a set of pre-designed components, acting like stylish building blocks for your web projects. With Semantic UI React, you can effortlessly create a polished and responsive user interface without starting from scratch. It's a go-to choice for developers looking to add a professional touch to their React applications, instilling confidence and pride in the design process.\n\n### Building Beautiful UIs with React and Pre-Styled Components\n\nSemantic UI is an open-source framework that uses CSS and jQuery to build great user interfaces. It is similar to Bootstrap and has many elements to make your website look amazing. It uses a class to add CSS to the elements.\n\n### Development Speed and Design Confidence\n\nSemantic UI React combines the power of React with the beauty of Semantic UI.\n\n- It provides a set of React components matching the Semantic UI design language. Using Semantic UI React, developers can design quickly, confidently, and easily without relying on web design skills.\n- This library addresses the needs of React developers looking for a simple way to build web applications that look good.\n- The library is highly adaptable, providing diverse UI elements, from buttons to tables and models. Developers can use these elements to build rich web applications without coding custom stylings.\n- The library has gained popularity over the years due to its ease of use and the speed at which developers can build professional-looking web applications.\n\n### A Web Developer's Toolkit\n\nSemantic UI React is an essential toolkit for React developers looking to quickly build attractive web applications. It provides an array of pre-designed components that allow developers to skip the styling process and jump straight into building functional, good-looking user interfaces. The library is a boon for React developers, as it enables them to focus on building the functionality of their web applications while maintaining a professional and impressive design.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Is Material UI?\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1607799279861-4dd421887fb3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb2RlcnxlbnwwfHx8fDE3MTkzMDA2Njd8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nMaterial UI is another popular open-source library for building React applications. It was launched in 2014 and has since become one of the most widely used UI libraries for React. Material UI provides a comprehensive set of pre-built components based on Google's Material Design guidelines. These components are highly customizable and can be used to create modern and responsive user interfaces.\n\nOne of the benefits of using Material UI is its focus on accessibility. The library offers a range of accessibility features, such as support for screen readers and keyboard navigation. Material UI has excellent documentation and a large community of developers contributing to its development. Material UI is a top choice for developers looking to create visually appealing and accessible user interfaces quickly and efficiently.\n\n## Semantic UI Vs Material UI: Detailed Comparison\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxpbiUyMHdvcmt8ZW58MHx8fHwxNzE5MzAwNjg3fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Design Philosophy\n\nMaterial UI and Semantic UI are popular front-end development libraries providing pre-built components for creating user interfaces. Material UI, as its name suggests, follows the principles of Material Design, a design language developed by Google. It focuses on creating interfaces that resemble physical materials and provides a consistent look and feel across different platforms.\n\nOn the other hand, Semantic UI strongly emphasizes using natural language principles to create intuitive and readable code, making it easier to understand and maintain.\n\n### Component Styles\n\nMaterial UI offers a wide range of pre-built components with a distinct visual style closely matching the Material Design guidelines. These components have consistent colors, shadows, and shapes, creating a cohesive look throughout the application.\n\nSemantic UI, on the other hand, provides more visually expressive components with unique designs and styles. It allows for more customization options, but the resulting UI may not be as consistent across different application sections.\n\n### Customization Flexibility\n\nMaterial UI provides a theming system that allows developers to customize the appearance of components, such as changing colors, typography, and spacing. It also supports overriding individual components' styles.\n\nOn the other hand, Semantic UI offers a variety of preset themes that can be easily applied to the entire application, but customization options for individual components may be more limited.\n\n### Community and Ecosystem\n\nMaterial UI has a large and active community as it is widely used in the React ecosystem. This means many resources, tutorials, and community-driven libraries and tools are available to help developers.\n\nSemantic UI has a decent community but may not be as widely adopted as Material UI, so the available resources and community support are smaller.\n\n### Documentation\n\nMaterial UI's documentation is comprehensive and well-organized. It provides detailed information about each component, examples, and usage guidelines. It also includes guidance on effectively implementing Material Design principles.\n\nSemantic UI's documentation is extensive but may not be as structured or comprehensive as Material UI's.\n\n### Integration with Frameworks\n\nMaterial UI is primarily designed for use with React and integrates seamlessly with React applications. It provides React-specific features like hooks and context, making it convenient for React developers.\n\nSemantic UI supports multiple frameworks, including React, Angular, and Vue. This flexibility allows developers to use Semantic UI regardless of their preferred framework.\n\n### Accessibility Features\n\nMaterial UI provides extensive, out-of-the-box accessibility features, ensuring compliance with web accessibility standards. Semantic UI emphasizes accessibility but may require additional configuration compared to Material UI.\n\nBoth libraries prioritize creating accessible components that meet WCAG (Web Content Accessibility Guidelines) standards.\n\n### Comprehensive Set of Components\n\n[Material UI and Semantic UI](https://npmtrends.com/material-ui-vs-semantic-ui-react) offer comprehensive pre-built components for various projects or apps. These components range from basic elements like buttons and forms to complex ones like modals and data tables. A wide range of ready-to-use components saves development time and effort, allowing developers to focus on building core functionalities.\n\n### Bridging the Design-Development Gap\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours, create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## Semantic UI Vs Material UI In React Projects\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1569748130764-3fed0c102c59?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxyZWFjdHxlbnwwfHx8fDE3MTkzMDA3MDB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Performance\n\nRegarding performance and ease of use, both Semantic UI and Material UI have unique strengths and design philosophies that set them apart.\n\nMaterial UI, rooted in Google's Material Design principles, focuses on creating efficient components prioritizing responsiveness and lightweight interactions. This emphasis on performance translates into a sleek and fluid user experience that can benefit developers looking to optimize performance for their React projects.\n\nWhile also optimized for performance, semantic UI offers a different approach to user interface design, focusing on readability and clean visuals. This design philosophy can appeal to developers looking for an aesthetic approach backed by robust performance.\n\n### Ease of Use\n\nEase of use is another crucial factor to consider when choosing between the two frameworks. Material UI stands out for its user-friendly implementation and wealth of readily available components, making it a breeze for developers to get started and build interfaces quickly. The library's clear adherence to Material Design principles further eases the learning curve for developers familiar with Google's design language.\n\nSemantic UI offers similar ease of use but with different design principles that may better match your project's aesthetic goals. Both frameworks are accessible for developers and provide intuitive experiences when building React projects.\n\n### Documentation and Community Support\n\nWell-documented libraries are crucial for developers who require comprehensive resources and guidance as they navigate the development process. Material UI boasts extensive documentation with detailed examples, API references, and explanations to help developers understand the library's features and functionality. The library's active developer community further enhances its documentation by sharing insights, tips, and best practices.\n\nWhile providing detailed documentation with clear examples and usage guidelines, Semantic UI may not match the sheer volume of resources available for Material UI. If you prefer customization options, design aesthetics, and community support for Semantic UI, these factors may outweigh the differences in documentation volume.\n\n### Integration and Compatibility with React Projects\n\nMaterial UI and Semantic UI are built with React in mind, offering seamless integration and compatibility with React applications. Both libraries embrace modern React features such as hooks and functional components, allowing developers to fully utilize React's capabilities when building user interfaces.\n\nThe broader community and comprehensive documentation of Material UI make it an attractive choice for developers seeking robust support and resources to integrate the library into their React projects. If you prioritize design customization options and support for multiple frameworks, Semantic UI may better align with your project requirements.\n\n## Real Life Use Cases Of Semantic UI And Material\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1531539134685-27d854339120?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkaXNjdXNzfGVufDB8fHx8MTcxOTMwMDcxMnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nSemantic UI and Material UI are popular UI frameworks used in web development. Both frameworks offer a variety of pre-designed components, a responsive grid system, and robust documentation. Their design philosophies and use cases differ.\n\nSemantic UI, as the name suggests, focuses on:\n\n- Semantics and natural language make it easier for developers to read and write code.\n- This framework also emphasizes clarity and consistency in design.\n- Semantic UI provides a human-friendly HTML language that resembles English, making it intuitive for developers to understand and use.\n\nMaterial UI, on the other hand, is:\n\n- Based on Google's Material Design guidelines, which prioritize visual appeal, motion, and interaction.\n- It offers a comprehensive set of components inspired by the physical world and its textures, ensuring a smooth user experience.\n- Material UI components are designed to be unified, adaptable, and consistent across platforms and device sizes.\n\n### Real-World Examples of Companies Using Material UI\n\n#### Google: Building a Cohesive User Experience Across Products\n\nOne of the most prominent technology companies globally, Google utilizes Material UI in various products like Google Docs and Google Drive. The consistent design language offered by Material UI ensures a cohesive user experience across different Google applications.\n\n#### UberEats: Prioritizing User Experience with Material UI's Design Consistency\n\nUberEats, a popular food delivery service, relies on Material UI for its user-friendly interface. The framework's focus on design consistency and adaptability allows UberEats to provide a seamless experience for its customers, enhancing brand loyalty and user satisfaction.\n\n#### Coursera: Creating an Engaging Learning Environment\n\nCoursera, a leading online learning platform, incorporates Material UI components into its website to create an engaging and intuitive learning environment for students. The framework's robust features and design principles align with Coursera's commitment to providing high-quality educational content.\n\n#### Airbnb: Maintaining Design Consistency Across Platforms\n\nAirbnb, a global accommodation marketplace, adopts Material UI for its design consistency across different platforms. The framework's adaptability and scalability enable Airbnb to maintain a cohesive visual identity while catering to diverse user needs and preferences.\n\n#### Netflix: A Visually Appealing User Experience Powered by Semantic UI \n\nA popular streaming service, Netflix employs Semantic UI for a visually appealing user experience. The framework's focus on clarity and design consistency enhances the overall user interface, making it easier for viewers to navigate content and discover new shows.\n\n#### LinkedIn: Streamlining Recruitment with Semantic UI's Intuitive Components\n\nLinkedIn, a professional networking platform, integrates Semantic UI into its recruitment tools and job posting features. The framework's intuitive components and semantic naming conventions help LinkedIn create a seamless experience for job seekers and recruiters, improving engagement and user satisfaction.\n\n#### Twitch: Fostering Community Engagement with Semantic UI's Dynamic Chat Interface\n\nTwitch, a live streaming platform, uses Semantic UI to enhance its [chat interface](https://www.canaxess.com.au/articles/build-better-chatbot-ui-semantic-html/). The framework's diverse components and customization options allow Twitch to create a dynamic and interactive chat experience for users, fostering community engagement and user interaction.\n\n#### Reddit: Balancing Flexibility and Consistency with Semantic UI\n\nReddit, a popular social news aggregation and discussion website, incorporates Semantic UI elements in certain sections of its platform. The framework's flexibility and adaptability enable Reddit to maintain its unique visual identity while ensuring a consistent user experience across different pages and features.\n\n## Comparing Pros & Cons Of Semantic UI And Material UI\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxub3Rlc3xlbnwwfHx8fDE3MTkzMDA3MjZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Pros of Semantic UI for React app development\n\n#### Wide range of pre-built components\n\nOne of the major advantages of using Semantic UI for React app development is its extensive library of pre-built components. These components are designed to be highly modular and reusable, allowing developers to quickly assemble complex user interfaces without starting from scratch.\n\n#### Intuitive class naming convention\n\nAnother key advantage of Semantic UI is its intuitive class naming convention. The class names used in Semantic UI follow a clear and descriptive pattern that makes it easier for developers to understand the code structure at first glance.\n\n#### Excellent integration with other frameworks and libraries\n\nSemantic UI integrates with other popular frameworks and libraries, making it a versatile choice for React app development. This level of integration allows developers to leverage the benefits offered by multiple frameworks simultaneously.\n\n#### Large community support\n\nOne significant advantage of Semantic UI is its large community of users. With an active and vibrant community, developers can find ample support and resources when they encounter challenges or need guidance.\n\n### Cons of Semantic UI for React App Development\n\n1\\. Less flexibility in terms of customization  \n2\\. Semantic UI embraces a more traditional approach with its visually appealing elements reminiscent of classic web design and may not be suitable for all projects\n\n### Benefits of Material UI for React App Development\n\n#### Comprehensive Set of Components\n\nOne of the standout features of Material UI is its collection of components. With Material UI, developers can access pre-built components that can be easily integrated into their applications. These components follow the principles of Material Design, resulting in sleek and modern user interfaces.\n\n#### Consistent Theming System\n\nAnother advantage offered by Material UI is its theming system. This feature allows developers to create consistent branding across organizational projects or applications. By defining a custom theme, developers can easily apply consistent colors, typography styles, and other design elements throughout their applications.\n\n#### Active Community Support\n\nMaterial UI boasts an active community of developers contributing to its ongoing development and improvement. This community-driven approach ensures regular updates, bug fixes, and new feature releases for Material UI.\n\n#### Extensive Documentation\n\nMaterial UI provides extensive documentation to facilitate developers' ease of use. This documentation is a comprehensive guide, covering everything from installation and setup to detailed explanations of each component and its usage.\n\n### Cons of Material UI for React app development\n\n1\\. Less enterprise-level components and internationalization tools compared to Semantic UI  \n2\\. A more modern and creative design aesthetic may not be suitable for all projects\n\n### Bridging the Design-Development Divide\n\n[MagicUI](https://magicui.design/) is a free and open-source React component library designed for design engineers to develop stunning user interfaces with minimal effort. It provides visually appealing and interactive elements to bridge the gap between design and development.\n\nUse our [React component library](https://magicui.design/) for free today at \\[MagicUI\\]([https://magicui.design/docs](https://magicui.design/docs)).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## Choosing Between Material UI And Semantic UI For Your React UI\n\n![Semantic UI Vs Material UI](https://images.unsplash.com/photo-1543269865-cbf427effbad?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxtZWV0aW5nfGVufDB8fHx8MTcxOTMwMDczOHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Design Aesthetic\n\nThe design aesthetic must be considered first when deciding between Semantic UI and Material UI. [Semantic UI](https://www.g2.com/products/semantic-ui-react/reviews) is ideal if you prefer a conventional visual approach reminiscent of classic web design. Material UI is the way to go if you must adhere to Google's Material Design guidelines. Your design preferences can significantly influence your choice.\n\n### Component Availability\n\nCheck into each library's components and compare them against your project requirements. Both Semantic UI and Material UI have extensive components, but specific elements like data visualization or internationalization tools could be a deciding factor. Ensuring your chosen library aligns with your needs is vital.\n\n### Customization Needs\n\nCustomization is key for projects requiring a unique brand identity. Material UI provides more flexibility in theming and customization, making it ideal for those seeking a tailored look. Evaluate your customization needs before choosing between the two libraries to ensure your project's success.\n\n### Development Speed\n\nIf rapid development is a priority, consider which library offers more pre-built components that meet your needs. Choosing a library with many ready-to-use components can significantly accelerate your development process. Speed and efficiency are crucial considerations.\n\n### Performance\n\nBoth libraries are optimized for performance, but the impact can vary based on your project's requirements. Analyze the performance implications of Semantic UI vs. Material UI before choosing, especially for performance-sensitive projects. Performance is critical in determining the library that best suits your project.\n\n### Learning Curve\n\nAnother important factor to consider is each library's learning curve. A steeper learning curve might result in longer development times, harming your project schedule. Picking a library that aligns with your team's expertise could save time and resources in the long run.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours, create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/shadcn-ui.mdx",
    "content": "---\ntitle: What Is Shadcn UI A Guide for Modern Developers\ndescription: >-\n  Discover what Shadcn UI is and why it's a game-changer. Learn how its unique\n  approach gives you full control over your React components and styles.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-60c584a9-05e0-4f55-b86c-05677b147f68.jpg\nauthor: Dillion Verma\ntags:\n  - shadcn ui\n  - react components\n  - tailwind css\n  - ui development\n  - radix ui\npublishedOn: \"2025-09-20\"\nfeatured: true\n---\n\nHere’s the simple truth about **Shadcn UI**: it is _not_ a component library in the way you’re probably used to. Think of it less as a package you install and more as a collection of well-crafted, reusable components that you copy and paste directly into your project. This gives you complete ownership and control over every line of code.\n\n## What Is Shadcn UI and Why Does It Matter?\n\nImagine you’re given a professional chef's recipe book. It lays out the exact ingredients and steps for a perfect dish, but you have total freedom to adjust the seasoning, swap out an ingredient, or plate it however you like. That's the whole idea behind Shadcn UI. You get beautiful, accessible components that live right inside your own codebase.\n\nTraditional UI libraries, on the other hand, are more like a pre-packaged meal. You install them via npm, import what you need, and then find yourself limited by the library's built-in styling and functionality. It’s convenient at first, but it often leads to fighting with CSS overrides and bloating your app with code you don't even use.\n\nShadcn UI completely sidesteps these problems with its unique 'copy-and-paste' philosophy.\n\n### The Power of Owning Your Code\n\nThis ownership model is the real game-changer and the core reason Shadcn UI is getting so much attention in modern web development. Because the components are just files in your own project, you can:\n\n- **Modify them freely:** Need to change styles, add new features, or strip out something you don’t need? Go for it. No complex workarounds required.\n- **Avoid dependency headaches:** There is no \"shadcn-ui\" package in your `package.json`. That means no breaking changes from library updates wrecking your project overnight.\n- **Ensure perfect consistency:** The components become a true part of your internal design system, perfectly aligned with your project's architecture from day one.\n\nThis approach isn't just a niche idea; it's catching on fast. Recent developer surveys show its adoption is climbing, with one Stack Overflow report noting it's already used by nearly **8.7%** of developers in its category. This reflects a bigger shift in the community toward tools that give developers more control and lead to better-performing applications. You can dig into the full survey details at [Stack Overflow's 2025 Developer Survey](https://survey.stackoverflow.co/2025/).\n\n> Shadcn UI gives you the building blocks, not a finished building. You are the architect, with full control over the final design and structure of your user interface.\n\nAs you get familiar with Shadcn UI, you'll see how its modular design naturally supports key website design best practices for modern web development, making it easier to build high-quality, user-friendly interfaces. To get a better handle on this, it helps to understand [what a component library is](https://magicui.design/blog/what-is-a-component-library) and how Shadcn UI is completely redefining the category.\n\nTo make this crystal clear, here’s a quick breakdown of its core principles.\n\n### Shadcn UI Core Principles at a Glance\n\nThis table sums up the fundamental ideas that make Shadcn UI so different from the libraries you might be used to.\n\n| Principle          | What It Means for Developers                                                                                         |\n| :----------------- | :------------------------------------------------------------------------------------------------------------------- |\n| **Not a Library**  | You get source code, not a dependency. This means no versioning conflicts or unexpected updates breaking your build. |\n| **Code Ownership** | You have **100% control** to edit, restyle, and refactor components to fit your exact needs.                         |\n| **Composition**    | Components are built on unstyled, accessible primitives, giving you a solid, flexible foundation to build upon.      |\n| **CLI-Driven**     | A simple command-line tool lets you add the components you need, one at a time, without any manual setup fuss.       |\n\n<br />\n\nUltimately, these principles put the power back in your hands, letting you build what you want, how you want.\n\nTo really _get_ Shadcn UI, you have to look past the components themselves and understand the philosophy behind it all. It’s a deliberate break from how we’ve traditionally used UI libraries, and it’s all built around one powerful idea: **you should own your code**, not just rent it from a package. This principle of **code ownership** is the secret sauce to building more flexible, maintainable, and future-proof projects.\n\nMost UI libraries get installed as a single, monolithic package from npm. When you do that, you're essentially plugging a black box into your application. Sure, you can use its components, but they aren't _truly_ yours. This creates a dependency that can, and often does, cause major headaches down the road.\n\nThis is where the dreaded \"dependency hell\" rears its ugly head. We've all been there—wrestling with a library update that breaks everything, or hitting a wall because a component just doesn't quite match the design spec. The typical fix involves messy CSS overrides or convoluted workarounds that make your codebase brittle and a pain to manage.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8362262f-b081-4fa8-97fb-dbbe8307c24d.jpg)\n\n### From Consumer to Creator\n\nShadcn UI flips this entire model on its head. Instead of an install, you use a simple CLI command to copy a component's source code directly into your project's `components` folder. This simple act transforms you from a library _consumer_ into a code _owner_. The components become a first-class part of your application, no different from any other file you’ve written yourself.\n\nThat might sound like a small change, but the ripple effects on your workflow are huge:\n\n- **No More Fighting Abstractions:** You're not stuck working within the confines of a library's API or theming system. You have direct access to the component's JSX and [Tailwind CSS](https://tailwindcss.com/) classes, so you can make any change you need without fighting the framework.\n- **Zero External Dependencies:** Because there’s no `shadcn-ui` package in your `package.json`, your project is completely insulated from outside versioning conflicts. You decide when and if a component ever gets updated.\n- **True Customization:** The components are intentionally unopinionated. They give you a beautifully crafted and accessible starting point, but the final look, feel, and function are completely in your hands.\n\nThis philosophy gives you the power to build durable, adaptable user interfaces that are perfectly suited to your project. You’re not just borrowing components; you’re using high-quality blueprints to build your own design system.\n\n### The Power of Composition\n\nThe other pillar of Shadcn UI's philosophy is its focus on **composition**. Rather than giving you overly complex, feature-packed components, it provides simple, composable building blocks. This whole approach is built on top of [Radix UI](https://www.radix-ui.com/), an incredible library of unstyled, accessible primitives for things like dropdowns, dialogs, and tooltips.\n\nShadcn UI takes these rock-solid primitives and layers on a clean, thoughtful design using Tailwind CSS. It’s the best of both worlds: you get world-class accessibility and functionality from Radix, plus the full styling power of Tailwind right at your fingertips. You can easily combine and extend these simple pieces to create more complex UI without inheriting a mountain of code you don't need.\n\n> \"The moment I switched to Shadcn UI, my entire mindset changed. I stopped thinking about how to 'work around' a library's limitations and started focusing on how to build the exact experience I wanted. It's liberating to know you have complete control over every pixel.\"\n\nThis shift from a rigid, top-down structure to a flexible, bottom-up approach is what makes Shadcn UI so powerful. It respects your expertise as a developer and gives you the tools to build with confidence, knowing your codebase will stay clean, scalable, and easy to manage for years. At the end of the day, it’s about making you the true owner of your front end.\n\n## Exploring Key Features and Technical Advantages\n\nThe real magic behind Shadcn UI isn't just one thing; it's the smart combination of three core technologies that fit together perfectly. This isn't your typical component library. It's a finely-tuned system built on a foundation of bulletproof accessibility, utility-first styling, and a clever command-line interface.\n\nThis trio is what lets developers build beautiful, functional, and easy-to-maintain UIs with incredible speed and complete control.\n\nAt its heart, Shadcn UI stands on the shoulders of giants. It uses **Radix UI** for its component primitives—the unstyled, accessible building blocks for things like dialogs, dropdowns, and accordions. This is a huge win. It means every component you grab is accessible right out of the box, handling all the tricky details like ARIA attributes, focus management, and keyboard navigation for you.\n\nLayered on top of that solid foundation is **Tailwind CSS**. This is where the styling comes in. Since you literally own the component code, you change how it looks by editing Tailwind’s utility classes directly in your JSX. This approach cuts out the need for complicated CSS-in-JS solutions or wrestling with style overrides. Customization feels direct and natural.\n\nWant a deeper dive on this approach? Check out our guide on creating a [Tailwind CSS component library](https://magicui.design/blog/tailwind-css-component-library).\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/445462dc-a2c8-437c-a16f-3a378d86cbde.jpg)\n\n### The Command-Line Interface Is Your Assistant\n\nThe last piece of the puzzle is the Shadcn UI **CLI**. It's a simple but powerful tool that orchestrates the whole process. Instead of installing and managing a package, you run a command like `npx shadcn-ui@latest add button`, and the actual source code for that component lands right in your project.\n\nThe CLI is smart. It handles dependencies, figures out your project paths, and drops the file exactly where it needs to go. Think of it as a personal assistant who takes care of all the tedious boilerplate, giving you a clean, ready-to-use component file every single time. It's an incredibly efficient workflow that lets you focus on building features, not on manual setup.\n\n### How It All Comes Together: A Practical Example\n\nLet's see this in action. Say you need a dialog box for your app.\n\n1.  **Add the Component:** You pop open your terminal and run a single command: `npx shadcn-ui@latest add dialog`.\n2.  **Import and Use:** Just like that, the CLI adds a `dialog.tsx` file to your `components/ui` folder. Now you can import it and use it like any other React component.\n\nThe code you get is clean, readable, and built with familiar React patterns.\n\n```jsx\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n  DialogTrigger,\n} from \"@/components/ui/dialog\"\n\nfunction MyComponent() {\n  return (\n    <Dialog>\n      <DialogTrigger>Open Dialog</DialogTrigger>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Are you absolutely sure?</DialogTitle>\n          <DialogDescription>\n            This action cannot be undone. This will permanently delete your\n            account and remove your data from our servers.\n          </DialogDescription>\n        </DialogHeader>\n      </DialogContent>\n    </Dialog>\n  )\n}\n```\n\nNotice how composable it is? You get individual pieces like `DialogTitle` and `DialogDescription` that you can arrange however you need. Want to change the styling? Just open `dialog.tsx` and tweak the Tailwind CSS classes. There are no barriers between you and the code.\n\n> By giving you full source code access and using Tailwind CSS for styling, Shadcn UI gets rid of external package updates and drastically reduces migration risks—a common headache with traditional UI libraries.\n\nThis unique architecture has made Shadcn UI a go-to for projects where flexibility and performance are non-negotiable. It stands apart from libraries like Material-UI by giving developers the keys to the kingdom, freeing them from the shackles of external package updates.\n\n### The Technical Edge Summarized\n\nThe synergy between Radix, Tailwind, and the CLI offers some clear advantages over the old way of doing things.\n\n- **Maximum Control:** With the source code living in your project, you have the final say over every pixel and every interaction.\n- **Minimal Bundle Size:** You only add the components you actually need. This means no shipping unused code to the client, which leads to better tree-shaking and a leaner final bundle.\n- **Future-Proof Architecture:** Your UI isn't tied to an external library's release schedule. This insulates your project from breaking changes and ensures things stay stable for the long haul.\n\nUltimately, these technical perks translate into a better developer experience and a faster end product. You get all the benefits of a well-designed component system without giving up the freedom to build things your way.\n\n## How Shadcn UI Stacks Up Against Traditional Libraries\n\nPicking a UI toolkit is a pivotal moment for any web project. It’s a decision that echoes through your entire development process, influencing everything from workflow and developer happiness to the final performance of your app. While established libraries like [Material UI (MUI)](https://mui.com/) or [Chakra UI](https://chakra-ui.com/) offer a robust, all-in-one package, Shadcn UI comes at the problem from a completely different angle.\n\nThis isn't about crowning a \"winner.\" It's about understanding two fundamentally different philosophies. Traditional libraries are like a high-end meal kit subscription. You get a box with perfectly portioned ingredients and a set of strict recipes. It's convenient, consistent, and fast, but you’re pretty much locked into what they sent you.\n\nShadcn UI, on the other hand, is like being handed the keys to a professional-grade kitchen. You get the best tools and top-shelf ingredients, but you have complete creative control over the final dish.\n\n### The Core Philosophical Divide\n\nThe biggest difference boils down to a single, powerful concept: **ownership**.\n\nTraditional libraries are installed as third-party dependencies in your `package.json`. You import their components, tweak them through a specific API and theming system, and cross your fingers that the next version update doesn't blow up your app. This model is great for projects that need to get off the ground quickly and are happy to stick to a pre-defined design system.\n\nShadcn UI operates on the principle that you should own your code. When you add a component, its actual source code is copied directly into your project. It stops being an external dependency and becomes just another file in your codebase—one you can edit, refactor, or even delete at will. This rips away a layer of abstraction, giving you raw, direct control over the markup and styling.\n\nThis approach of having direct access to the code is a game-changer for theming and styling, massively simplifying the design process.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fd9ac182-d6f5-47da-8d80-71a6d6f492f5.jpg)\n\nAs the image shows, when developers can just open a file and directly change styling elements, they get unparalleled flexibility to perfectly match any design spec.\n\n### Customization and Flexibility\n\nIf you've ever used a library like MUI, you've probably done the customization dance with a theming provider and `sx` props. It's a powerful system, but sometimes it feels like you're wrestling with the library's built-in styles, writing complex overrides just to achieve a unique look.\n\nWith Shadcn UI, customization is as simple as editing a file. Because every component is styled with [Tailwind CSS](https://tailwindcss.com/), you just change the utility classes right there in the JSX. For anyone comfortable with Tailwind, this direct approach is often way faster and more intuitive.\n\n> The decision between Shadcn UI and a traditional library is a strategic one. It's a trade-off between the out-of-the-box convenience of a managed system and the long-term control of an owned codebase.\n\n### A Head-to-Head Comparison\n\nTo really nail down the differences, let's look at the key criteria that development teams care about most. This table breaks down the practical implications of each library's architecture, helping you decide which tool fits your project best.\n\n### Shadcn UI vs Traditional UI Libraries\n\n| Feature                  | Shadcn UI                                                                              | Material UI / Chakra UI                                                          |\n| :----------------------- | :------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------- |\n| **Dependency Model**     | Code is copied into your project; no external dependency in `package.json`.            | Installed as a versioned npm package, creating a direct dependency.              |\n| **Customization**        | Direct manipulation of JSX and Tailwind CSS classes within the component file.         | Primarily through a theme provider, component props, and style override APIs.    |\n| **Bundle Size Impact**   | Minimal. You only add the components you use, leading to excellent tree-shaking.       | Can be larger, as the entire library is a dependency, though tree-shaking helps. |\n| **Updating Components**  | Manual process. You use a CLI to `diff` changes and decide whether to apply them.      | Managed via `npm update`. Can introduce breaking changes between major versions. |\n| **Developer Experience** | High control and transparency. Feels like writing your own components from a template. | Structured and guided. Easier for teams who prefer a consistent, documented API. |\n\n<br />\n\nIn the end, there's no single right answer. If your team needs to spin up a standard dashboard fast and values a huge, pre-styled set of components, a traditional library is probably a great fit. But for projects that demand a completely unique design system, maximum performance, and long-term maintainability, the ownership model of **Shadcn UI** offers a seriously compelling advantage.\n\n## Getting Started with Shadcn UI in Your Project\n\nJumping into a new tool can feel like a big commitment, but getting Shadcn UI into your project is surprisingly fast. It’s built to take you from a blank canvas to a fully working, styled component in just a couple of minutes. Let’s walk through the whole process, from the first setup command to adding and tweaking your very first component.\n\nThe whole thing kicks off with a single command in your terminal. This isn't your typical `npm install`—it doesn't add a bulky library to your `node_modules`. Instead, it runs a clever initialization script that wires up your project to work with Shadcn UI, creating a perfect home for all your future components.\n\nBefore you start, just make sure you have a React project ready to go. Whether you're using [Next.js](https://nextjs.org/), [Vite](https://vitejs.dev/), or [Remix](https://remix.run/), you're in good shape. Shadcn UI plays nicely with the entire modern React ecosystem.\n\n### Initializing Your Project\n\nTo get the ball rolling, pop open your terminal, navigate to your project's root folder, and run the initialization command. This is the one and only setup step you'll ever need to do.\n\n```bash\nnpx shadcn-ui@latest init\n```\n\nRunning this command starts a short, interactive Q&A session to get everything configured just right for your project. It’ll ask you about things like:\n\n- Your language of choice: **TypeScript** or **JavaScript**.\n- The visual style you're going for: `Default` or `New York`.\n- Your base color preference: `Slate`, `Gray`, `Zinc`, you name it.\n- Where your `globals.css` file lives, so it knows where to drop in the necessary Tailwind variables.\n- If you want to use CSS variables for theming.\n- Path aliases for your components (it usually defaults to `@/components`).\n\nOnce you’ve answered the prompts, the script does all the heavy lifting. It creates a `components.json` file to keep track of your setup, tweaks your `tailwind.config.js`, and adds the right styles to your global CSS file. This completely sidesteps all the tedious manual configuration. If you're new to this styling approach, our guide on how to [install Tailwind CSS in a React project](https://magicui.design/blog/install-tailwind-react) is a great place to get up to speed.\n\n### Adding Your First Component\n\nWith the setup out of the way, your project is primed and ready for components. This is where you really see the core idea of Shadcn UI in action. You don't _import_ components from a package; you use the CLI to pull their actual source code right into your project.\n\nLet's start with a classic UI element: a button.\n\n```bash\nnpx shadcn-ui@latest add button\n```\n\nRun that, and you'll see a new file, `button.tsx` (or `.jsx`), appear in your `components/ui` directory. That's it. The button component is now a first-class citizen in your codebase. You can open it up, see exactly how it's built with Tailwind CSS, and get ready to use it.\n\n> By adding components one by one, you keep your project incredibly lean. This approach completely avoids the bundle bloat that plagues traditional, all-in-one UI libraries. You only ship the code you're actually using.\n\nNow, you can import and use this button just like any other component you'd write from scratch.\n\n```jsx\nimport { Button } from \"@/components/ui/button\"\n\nfunction MyFirstComponent() {\n  return (\n    <div className=\"p-4\">\n      <Button>Click me</Button>\n    </div>\n  )\n}\n\nexport default MyFirstComponent\n```\n\nThis simple workflow—initialize once, then add components as you need them—is the heart and soul of working with Shadcn UI.\n\n### Customizing the Component\n\nThe real magic happens the moment you need to change something. Since `button.tsx` is just another file in your project, customizing it is as direct as it gets.\n\n1.  **Open the file:** Head over to `components/ui/button.tsx`.\n2.  **Read the code:** You’ll find a clean React component defined with Tailwind CSS utility classes for styling.\n3.  **Make your changes:** Want bigger buttons by default? Just adjust the padding classes. Need a new variant with a slick gradient background? You can add it directly to the component’s variants right there in the code.\n\nThere's no wrestling with complex theming APIs or fighting specificity with style overrides. You're just editing the source. This gives you **100% control** over how every component looks and behaves. This transparent process lets you go from an idea to a fully functional, custom UI element in minutes, closing the gap between your design vision and the final product.\n\n## Why Shadcn UI Is a Game-Changer for Teams and Design Systems\n\nWhen you're building software with a team, consistency isn't just a nice-to-have; it's everything. This is where Shadcn UI's unique approach really starts to pay off, especially in collaborative settings. It acts as the ultimate bridge between designers and developers by establishing a single source of truth.\n\nHow? By placing component source code _directly inside your project repository_. This simple idea completely gets rid of the guesswork that so often slows down team workflows. Every developer on the team pulls from the exact same set of component files, guaranteeing that UI elements look and behave the same across the entire application.\n\nThis direct ownership also makes version control a breeze. Forget about the headache of managing updates from an external UI library. With Shadcn UI, any change to a component is tracked through Git, just like the rest of your project's code. This creates a transparent history, making it dead simple to see who changed what and why.\n\nThat shared codebase quickly becomes the foundation of a living, breathing design system.\n\n### Building a Cohesive Design Language\n\nA design system is so much more than a folder of components—it's the shared language your team uses to build products. Because your team _owns_ the Shadcn UI components, you can adapt them perfectly to your evolving brand guidelines without battling the constraints of an external library.\n\nImagine this workflow: a designer requests a tweak to a button's hover state. A developer can jump right into that button's file, make the change, and the update is instantly available for everyone on the team. No silos, no friction.\n\nThis tight loop between design and development fosters incredible alignment. Designers and developers are no longer tossing ideas over a wall; they're both contributing to the same transparent codebase that defines the product's visual identity. Iteration becomes faster, and the endless back-and-forth that kills project momentum is drastically reduced. By making component development and reuse so straightforward, Shadcn UI directly supports various [strategies to increase team productivity](https://www.growlio.io/blog/increase-team-productivity) in a very tangible way.\n\n> The real power of Shadcn UI in a team setting is its ability to turn the codebase into the ultimate design documentation. The code itself becomes the single, undisputed source of truth for every UI element.\n\nThis direct-to-repository model isn't just about making developers' lives easier; it delivers real business benefits. It cuts down on maintenance overhead, speeds up the delivery of new features, and builds a more harmonious relationship between your design and engineering teams.\n\nThese aren't just abstract gains. A recent industry report found that companies with over 100 employees using design systems similar to what **Shadcn UI** enables saw a **46%** reduction in design and development costs and a **22%** faster time to market. You can dig into these findings on design system efficiency yourself. The numbers show how this modern approach to UI can supercharge product cycles and lock in consistency, even as you scale. The end result is a more agile team that can ship higher-quality products, faster.\n\n## Common Questions About Shadcn UI\n\nAs you start digging into Shadcn UI, you'll probably run into a few questions. Its whole philosophy is a bit different from what you might be used to, so let's clear up some of the common sticking points right now.\n\n### Is It Just Another Component Library?\n\nNope, and this is the most important thing to get your head around. Shadcn UI isn't a package you install from **npm** and import. It's not a dependency.\n\nInstead, you use its CLI to literally copy the source code for beautifully designed, unstyled components right into your project. That means **you own the code**. You have 100% control over its logic, styling, and everything in between, without bloating your `package.json`.\n\n### How Do I Handle Component Updates?\n\nSince the code is yours, you're in charge of updates. When the official components get a new feature or a bug fix, it won’t automatically break your app.\n\nShadcn UI gives you a handy `diff` command in its CLI. You can run it to see a side-by-side comparison of your local component file and the latest version. This shows you exactly what changed, so you can decide if—and how—you want to merge those updates yourself.\n\n> With Shadcn UI, you're never at the mercy of a library's release cycle. Updates are intentional and transparent, putting you in the driver's seat of your project's evolution.\n\n### Can I Use It with Vite or Remix?\n\nAbsolutely. While it's a massive hit in the [Next.js](https://nextjs.org/) community, Shadcn UI is totally framework-agnostic as long as you're in the React world.\n\nWhen you run the `init` command, it will ask what you're building with. It has presets for [Vite](https://vitejs.dev/), [Remix](https://remix.run/), Create React App, and others, and it sets up all the right paths for you automatically.\n\n### How Hard Is It to Customize Components?\n\nThis is where it truly shines. Customizing a component is as direct as it gets. Every component is styled with [Tailwind CSS](https://tailwindcss.com/) utility classes, so all you have to do is open the file and edit the JSX.\n\nThere are no complicated theming APIs, style overrides, or layers of abstraction to fight with. If you know Tailwind, you already know how to customize every single part of a **shadcn ui** component.\n\n---\n\nReady to build beautiful, high-performance web interfaces in minutes? **Magic UI** offers a massive library of over **50+** customizable blocks, templates, and **150+** free animated components built with React, TypeScript, and Tailwind CSS. Check out our collection and start building your next stunning landing page at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/sidebar-for-website.mdx",
    "content": "---\ntitle: Build a Modern Sidebar for Website\ndescription: >-\n  Learn to build a responsive, accessible sidebar for website using React,\n  TypeScript, and Tailwind. This guide covers UI patterns, animations, and\n  performance.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4b5efb2e-3a87-4011-be0f-2c1c6a8d719a/sidebar-for-website-web-development.jpg\nauthor: Dillion Verma\ntags:\n  - sidebar for website\n  - responsive sidebar\n  - react sidebar\n  - tailwind css\n  - web development\npublishedOn: \"2025-11-27T09:44:25.286844+00:00\"\nfeatured: true\n---\n\nA well-designed **sidebar for a website** is more than just a navigation panel—it's a strategic asset. Think of it as a dedicated column, usually on the left or right, that offers up helpful info like nav links, ads, or related content without cluttering up the main view. When done right, it can seriously improve the user experience.\n\n## Why a Modern Sidebar Is Crucial for Your Website\n\nLet's move beyond thinking of sidebars as simple navigation. A modern sidebar is a powerful tool for guiding user behavior and boosting engagement. When you get the implementation right, it feels less like an afterthought and more like a helpful co-pilot, anticipating what your users need and giving them shortcuts to valuable content.\n\nIt’s the difference between a user feeling lost on your site and feeling completely in control. A huge part of this is how a sidebar can enhance user experience and guide visitors, which can ultimately help to [improve website conversion rates](https://mick-mar.com/blog/how-to-improve-website-conversion-rates/). This isn't just about looks; it's about smart design.\n\n### Aligning with Natural User Attention\n\nPeople don't scan webpages randomly; their eyes follow predictable patterns. Research has shown that a massive **80% of users** spend most of their time looking at the left side of a webpage. This makes the left-side sidebar prime real estate for your most important navigation links and calls-to-action.\n\nBy placing key elements here, you can directly influence user flow, lower bounce rates, and create a much more intuitive experience. And since over **57% of users** now browse on their smartphones, a responsive sidebar that collapses or slides out is non-negotiable. It's essential for keeping your site functional and friendly on smaller screens, which is a major factor for Google's mobile-first indexing.\n\n### Choosing the Right Sidebar for Your Goal\n\nNot all sidebars are built the same. The type you choose should directly support what you want your website to achieve, whether that's keeping users hooked on your content or simplifying navigation through a complex site. The two most common approaches are static and sticky sidebars.\n\n- A **static sidebar** stays put as the user scrolls down the page. This works best for sites where the main content is the star of the show.\n- A **sticky sidebar**, on the other hand, stays visible on the screen no matter how far you scroll. This is perfect for keeping key actions like a \"Subscribe\" button or a shopping cart summary always within reach.\n\nThis decision tree breaks it down nicely:\n\n![Flowchart showing a decision for 'What's your goal?', leading to two options: Sticky Sidebar (with a speech bubble icon) and Static Sidebar (with a map icon).](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f330fd38-bb9c-4d9a-a63d-60c1b37f0145/sidebar-for-website-sidebar-options.jpg)\n\nAs you can see, if your goal is driving engagement, a sticky sidebar is your best bet. If you're focused on clear navigation, a static one is the way to go.\n\nTo help you decide, here’s a quick breakdown of the different sidebar types and where they shine.\n\n### Sidebar Types and Their Best Use Cases\n\n| Sidebar Type          | Primary Use Case   | Desktop UX                                                            | Mobile UX                                                                    | Best For                                                                          |\n| :-------------------- | :----------------- | :-------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :-------------------------------------------------------------------------------- |\n| **Static**            | Primary Navigation | Stays fixed at the top of the page content. Disappears on scroll.     | Typically collapses into a hamburger menu or off-canvas drawer.              | Blogs, documentation sites, corporate websites where content is the main focus.   |\n| **Sticky**            | Persistent Actions | Remains visible on the screen as the user scrolls.                    | Often transforms into a sticky bottom bar or a floating action button.       | E-commerce sites (cart summary), SaaS apps (key actions), lead-gen forms.         |\n| **Off-Canvas/Drawer** | Mobile Navigation  | Can be used as a slide-out panel on wider screens for secondary info. | The standard for mobile. Slides in from the side when a menu icon is tapped. | Almost all responsive websites, especially those with extensive navigation menus. |\n| **Floating**          | Contextual Tools   | Floats over the content, often movable by the user.                   | Can be adapted to a smaller, fixed position element.                         | Web applications, design tools, or sites with user-configurable interfaces.       |\n\nUltimately, picking the right sidebar depends entirely on your site's purpose and how you want your users to interact with it.\n\nA great sidebar minimizes friction. It makes key information available without interrupting the user's journey, which is why it often contains things like email sign-up forms, popular posts, or social media links. It’s all about providing value at just the right moment.\n\nThink of your sidebar as an opportunity to declutter your UI while keeping essential tools accessible. By understanding user behavior and choosing the right implementation, you're setting the stage for a website that is not only functional but a genuine pleasure to use on any device.\n\n## Setting Up Your React and TypeScript Environment\n\nTo build a truly modern **sidebar for a website**, you need a solid foundation. That means starting with a clean, powerful, and scalable development environment. We'll be using a combination of [React](https://react.dev/) with [TypeScript](https://www.typescriptlang.org/) for type safety, [Tailwind CSS](https://tailwindcss.com/) for rapid styling, and [Framer Motion](https://www.framer.com/motion/) for silky-smooth animations. I've found this stack to be the professional standard for building high-performance UIs.\n\nThe best place to start is by scaffolding a new React project. I almost always reach for a tool like [Vite](https://vitejs.dev/) these days because its development server is incredibly fast, and it gives you an optimized build process right out of the box. TypeScript is non-negotiable for a project like this; it catches errors during development—not in production—and makes your components much easier to maintain as your project grows.\n\n![A web browser interface showing a sidebar and development tools with icons for React, Server, Database, UI, and API.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7fae85d4-31ba-494e-acd1-2804d5e708c6/sidebar-for-website-dev-tools.jpg)\n\n### Installing Core Dependencies\n\nWith your project initialized, it's time to bring in the core styling and animation libraries. Tailwind CSS is essential for its utility-first approach, letting us design directly in our markup without ever leaving our component files. Framer Motion will handle all the complex animations, making our sidebar feel fluid and responsive to every interaction.\n\nFire up your terminal, navigate to your project's root directory, and run this to install Tailwind and its friends:\n\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\nThis sequence installs the necessary packages and then creates two crucial configuration files: `tailwind.config.js` and `postcss.config.js`. Getting these set up correctly is the key to letting Tailwind scan your component files and generate the right CSS. For a more detailed walkthrough, there's an excellent guide on [how to install Tailwind CSS in your project](https://magicui.design/blog/tailwind-css-install) that breaks down every step.\n\n### Configuring Tailwind and TypeScript\n\nNow that the config files are in place, we need to tell Tailwind where to find our class names. You'll do this in `tailwind.config.js` by updating the `content` array. This is a critical step because it allows Tailwind to purge all unused styles during the production build, keeping your final CSS bundle as small as possible—a massive win for performance.\n\n> **Pro Tip:** When you set up your `content` path in `tailwind.config.js`, be as specific as possible. Pointing it directly to `src/**/*.{js,jsx,ts,tsx}` stops Tailwind from wasting time scanning `node_modules`, which can really speed up your build process.\n\nNext, let's give our `tsconfig.json` a quick look. While the defaults from Vite or Create React App are a decent start, enabling strict type-checking rules will save you countless headaches down the road. Make sure settings like `\"noImplicitAny\": true` and `\"strictNullChecks\": true` are enabled to enforce better code quality from day one.\n\n### Integrating Animation and UI Libraries\n\nAlright, let's add the fun stuff: Framer Motion and a UI library to speed things up.\n\nnpm install framer-motion\n\nFramer Motion gives you a set of simple yet incredibly powerful tools for animation. We'll lean on its `motion` components to create the slide-in and fade effects for our sidebar.\n\nTo really boost productivity, integrating a pre-built component library like **Magic UI** is a game-changer. It offers a collection of beautifully designed, pre-animated components built with the exact stack we're using—React, Tailwind CSS, and Framer Motion. This lets you focus on your sidebar's unique logic instead of reinventing the wheel on common UI patterns.\n\nAfter running through these steps, you've got a professional-grade development environment ready to go. Your project is fully configured with:\n\n- **React and TypeScript** for a robust, type-safe component structure.\n- **Tailwind CSS** for efficient, utility-first styling.\n- **Framer Motion** for smooth, declarative animations.\n\nThis powerful stack is the perfect launchpad for building a flexible, responsive, and visually impressive sidebar.\n\nWith our development environment ready to go, it’s time to build the heart of our application: a flexible and reusable **sidebar for a website**. The aim here isn't to create a one-off solution. Instead, we're building a modular piece of UI that you can drop into any project down the line. We'll get there by defining a solid structure, managing its state cleanly, and styling it with the power of [Tailwind CSS](https://tailwindcss.com/).\n\nThe foundation of any great [React](https://react.dev/) component is a well-defined set of props. By using a [TypeScript](https://www.typescriptlang.org/) interface, we can enforce exactly what the `<Sidebar>` component needs to function. This simple step makes our code far more predictable and helps us sidestep common bugs. It turns our component into a reliable \"black box\"—you feed it the right data, and it just works.\n\n![A minimalist wireframe sketch of a website layout displaying various content blocks and a sidebar.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/c9193adb-f468-4d85-b0bd-4f329e9e35e7/sidebar-for-website-website-wireframe.jpg)\n\n### Defining Component Props with TypeScript\n\nFirst things first, let's outline the component's API. What information will our sidebar need from its parent to render correctly? We'll create a `SidebarProps` interface to establish this contract.\n\nOur key properties will include:\n\n- **`isOpen`**: A boolean that controls whether the sidebar is visible. This gives the parent component total control over toggling it open or closed.\n- **`onClose`**: A function that gets called when the user wants to close the sidebar, like clicking an overlay or hitting the escape key.\n- **`children`**: This will be of type `React.ReactNode`, which is a fancy way of saying we can pass _anything_ inside—from simple links to complex, nested components.\n\nThis structure gives us maximum flexibility. The sidebar itself doesn't need to know what content it holds; it just focuses on its one job: showing or hiding whatever it's given.\n\n### Structuring the Sidebar with JSX and Tailwind CSS\n\nNow for the fun part: writing the JSX. We’ll lean on semantic HTML elements like `<aside>` for the main container and `<nav>` for navigation links. This isn't just a \"nice-to-have\"—it's crucial for accessibility and good practice.\n\nUsing Tailwind CSS lets us apply styles directly in our markup, keeping the component self-contained and easy to read at a glance. For instance, the main `<aside>` element might get classes like `fixed inset-y-0 left-0` to pin it to the screen and `bg-gray-800 text-white` for a standard dark theme.\n\nHere’s a simple structural outline to follow:\n\n1.  **Main Container (`<aside>`)**: The root element holding everything. It’ll be positioned as `fixed` or `absolute`, depending on your design.\n2.  **Header Section**: Usually holds a logo and a close button. This adds branding and gives users a clear way to dismiss the sidebar.\n3.  **Content Area (`children`)**: This is the dynamic part where your navigation links, filters, or other components will live.\n4.  **Footer Section**: A great spot for secondary actions like \"Settings\" or \"Log Out,\" keeping them neatly separated from the primary navigation.\n\n> By breaking the component into distinct sections—header, content, and footer—you create a logical and scalable structure. This makes it much easier to add or modify elements later without having to refactor the entire component.\n\n### Managing State with React Hooks\n\nTo bring the sidebar to life, we need to manage its state. While the `isOpen` prop will be handled by a parent component, we might need some internal state for other behaviors. The `useState` hook is perfect for this.\n\nFor example, a parent component would typically manage the open/closed state like this:\n\n```tsx\nconst [isSidebarOpen, setSidebarOpen] = useState(false)\n\nreturn (\n  <div>\n    <button onClick={() => setSidebarOpen(true)}>Open Menu</button>\n    <Sidebar isOpen={isSidebarOpen} onClose={() => setSidebarOpen(false)}>\n      {/* Navigation links go here */}\n    </Sidebar>\n  </div>\n)\n```\n\nThis pattern is called a **controlled component**. The parent has full authority over the sidebar's visibility, which makes state management crystal clear. Inside our sidebar, we can use the `useEffect` hook to handle side effects, like adding an event listener to close the sidebar when the \"Escape\" key is pressed. It's a small touch, but one that significantly improves keyboard accessibility.\n\nIf you want to dive deeper into building scalable UIs, exploring a guide on [React component best practices](https://magicui.design/blog/react-component-best-practices) can offer some incredibly valuable insights.\n\nBy combining a clean TypeScript interface, a logical JSX structure with Tailwind CSS, and smart state management via React hooks, we've built a seriously flexible and reusable sidebar. It’s not tied to any specific content, making it a perfect, adaptable solution for just about any web application. This foundational piece is now ready for us to build upon with responsive behaviors and smooth animations.\n\n## Implementing Responsive and Animated Behaviors\n\nA static sidebar just doesn't cut it anymore. For a truly professional **sidebar for a website**, it needs to adapt fluidly to any device and respond to user interactions with grace. This is where we bring our component to life, making it smart enough to know when to be a full panel, a collapsed icon bar, or a slide-out drawer.\n\nThese dynamic behaviors aren't just for show; they're essential for usability. Someone on a tiny phone screen has completely different needs than a user on a widescreen desktop monitor. Our job is to anticipate those needs and build a seamless experience across the board.\n\n![A hand-drawn illustration showing a large tablet, a smaller tablet, and a smartphone with arrows, depicting device size progression.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/be56f9f4-f3f3-477d-9c3b-084fa20e284a/sidebar-for-website-device-progression.jpg)\n\n### Making the Sidebar Responsive with Tailwind CSS\n\nThis is where a utility-first framework like [Tailwind CSS](https://tailwindcss.com/) absolutely shines. It makes responsive design feel intuitive. We can define different styles for specific screen sizes just by adding prefixes like `md:` (for medium screens) and `lg:` (for large screens) directly into our class names.\n\nLet's game out the behavior we're aiming for:\n\n- **Mobile (default):** The sidebar is hidden completely off-screen, ready to slide in as an overlay.\n- **Tablet (`md:`):** It collapses into a narrow bar showing only icons.\n- **Desktop (`lg:`):** The sidebar fully expands to show both icons and text labels.\n\nWe can pull this off by conditionally applying width classes. For example, a `div` might get classes like `w-16 md:w-20 lg:w-64`. Just one line of code tells the browser exactly how to adjust the sidebar's width as the viewport changes. It’s an incredibly clean, declarative way to build UIs.\n\nTo handle the slide-out behavior on mobile, we can use something like `transform -translate-x-full md:translate-x-0` on the main container. This tucks it away off-screen by default but snaps it into place on medium screens and larger.\n\n### Creating a Custom Hook for Screen Size Detection\n\nWhile CSS handles the visual shifts, sometimes our component’s _logic_ needs to know the screen size. Maybe we want a button to say \"Menu\" on mobile but shrink to just an icon on a tablet. For that, a custom React hook is the perfect tool.\n\nWe can build a `useBreakpoint` hook that listens to the window's resize event and tells us the current breakpoint (e.g., 'sm', 'md', 'lg'). This keeps all our responsive logic in one place, so our components stay clean and focused. With this hook, we can conditionally render entire elements or just change a few props, making our component as smart as it is stylish.\n\n> A custom `useBreakpoint` hook is a reusable asset that pays dividends across your entire application. By abstracting away the raw `window.addEventListener` logic, you create a simple, declarative API for any component that needs to adapt its behavior to screen size.\n\n### Adding Fluid Animations with Framer Motion\n\nWith our responsive structure locked in, it's time to add that layer of polish with animations. A sudden, jarring change can be disorienting. Smooth transitions give users crucial visual feedback, making the whole interface feel more intuitive and professional.\n\nMy go-to library for this is [Framer Motion](https://www.framer.com/motion/). It’s ridiculously powerful yet simple to use. We can just wrap our sidebar in a `motion` component and use the `animate` prop to control its state. For the mobile drawer, animating the `x` property creates that slick slide-in effect.\n\nThink about the sidebar's toggle button, too. When clicked, we want the hamburger icon to morph into a close icon ('X'). Framer Motion's `AnimatePresence` and `variants` make complex animations like this surprisingly straightforward.\n\nHere are a few key animations we should implement:\n\n- **Slide-In/Out:** For the mobile view, animate the sidebar's position from off-screen to on-screen.\n- **Fade-In/Out:** When the mobile drawer opens, a semi-transparent overlay should gently fade in over the main content to focus the user's attention.\n- **Icon Rotation:** Animate the little chevron icons next to dropdown menus to rotate smoothly when they're opened and closed.\n\nThese small details guide the user's eye and confirm that their actions have registered. To dive deeper into creating these kinds of engaging user experiences, check out our guide on [CSS animation on scroll](https://magicui.design/blog/css-animation-on-scroll). By combining smart responsive design with thoughtful animation, our sidebar for a website goes from being a simple box to a dynamic, delightful part of the user interface.\n\n## Getting Accessibility and Performance Right\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/rHbPg9xG51E\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nLook, building a slick, responsive sidebar is a great start, but it's only half the job. A truly professional component needs to be accessible to _everyone_ and load faster than they can blink. This is where we talk about two absolute must-haves in modern web dev: accessibility (or **a11y**) and performance.\n\nIf you drop the ball on either, you risk creating a frustrating experience, tanking your user engagement, and even hurting your SEO. The cool thing is, they often go hand-in-hand. A fast-loading site is inherently more accessible to folks on spotty connections, and a well-structured, accessible site is usually easier for browsers to render quickly.\n\nLet’s dig into how to get both of these right for our sidebar.\n\n### Making Your Sidebar Genuinely Accessible\n\nWeb accessibility is all about making sure people with disabilities can use your site without barriers. For a dynamic component like a slide-out sidebar, this means we need to be thoughtful in our implementation, especially for users who rely on screen readers or navigate with a keyboard.\n\nThe first, and easiest, win is using semantic HTML. Wrap your sidebar in an `<aside>` element and the navigation links in a `<nav>` tag. This simple step gives assistive technologies immediate context about what they're dealing with. But we need to go further and use **ARIA (Accessible Rich Internet Applications)** attributes to communicate the sidebar's state.\n\nHere are the key ARIA attributes you'll need:\n\n- **`aria-hidden`**: Set this to `true` when the sidebar is closed. When it's open, switch it to `false`. This tells screen readers to either ignore it or pay attention to it.\n- **`aria-controls`**: This goes on your toggle button. Its value should be the ID of your sidebar container, creating a clear, programmatic link between the trigger and the panel it controls.\n- **`aria-expanded`**: Also on the toggle button, this attribute should be `true` when the sidebar is open and `false` when it's closed, announcing the state change.\n\nGetting these attributes right is the difference between a confusing mess and a smooth experience for screen reader users.\n\n### Don’t Forget Keyboard Focus Traps\n\nFor anyone navigating with a keyboard instead of a mouse, focus management is everything. When that sidebar slides open, you absolutely _must_ programmatically shift the user's focus inside it. The target should be the first interactive element, like the \"close\" button or the first link.\n\nMore importantly, you have to create what’s called a \"focus trap.\" This is non-negotiable. It means that as a user hits the `Tab` key, their focus should cycle _only_ through the links and buttons inside the sidebar. It shouldn't be able to escape to the main page content hiding underneath. And when the sidebar closes? Focus must snap right back to the button that opened it.\n\n> A proper focus trap is a deal-breaker for accessible modals and off-canvas elements. Without it, keyboard users get stuck. They can't interact with the sidebar or get back to the main content, which essentially makes your site unusable for them.\n\n### Optimizing for Blazing-Fast Performance\n\nA laggy sidebar will drag down your whole page, hurting your Core Web Vitals and testing your users' patience. We want it to feel instantaneous. Thankfully, our tech stack gives us some great tools for this.\n\nOne of the biggest wins comes from using [Tailwind CSS](https://tailwindcss.com/)'s JIT (Just-In-Time) compiler. It’s on by default and works by scanning your files to generate only the CSS classes you’re actually using. The result is a tiny CSS bundle, which means much faster load times.\n\nAnother powerful technique is **code-splitting**. Let's say your sidebar has some heavy components, like high-res images or a complex chart, that aren't needed right away. You can lazy-load them. Using `React.lazy()` and `Suspense`, you can tell React not to bother loading that code until the sidebar is actually opened by the user. This can make a huge difference in your initial page load speed.\n\nThe whole concept of the **sidebar for website** design has shifted over the years, from static link lists to dynamic, interactive modules. You can see this evolution in platforms like WordPress, which powers over **43% of all websites** and heavily relies on sidebars for widgets. This matters because websites with personalized sidebar content see better engagement and lower bounce rates—a big deal when the average user's attention span is just **8 seconds**. With mobile browsing now accounting for over **63% of internet traffic**, a responsive, fast-loading sidebar isn’t just nice to have; it’s essential for both UX and SEO.\n\nOf course, performance goes beyond just one component. To make sure your entire site is up to snuff, it's worth following [a comprehensive checklist for on-page SEO](https://danielproctor.com/checklist-for-on-page-seo/).\n\n## Sidebar FAQs: Getting the Details Right\n\nEven with the best tutorials, you're bound to hit a few head-scratchers when building a **sidebar for your website**. Getting these core decisions right from the jump can save you a world of refactoring pain down the line. Let's tackle some of the most common questions developers and designers run into.\n\nThese aren't just minor stylistic choices, either. Deciding on placement, size, and mobile behavior directly shapes how people navigate your site, and it can make or break the user experience.\n\n### Left vs. Right: Where Does the Sidebar Go?\n\nFor any language read left-to-right (like English), the main navigation sidebar almost always belongs on the **left**. This isn't an arbitrary rule; it's baked into user psychology. We've been trained for years to look to the left side of a screen for primary navigation. It's prime real estate.\n\nSo, what about the right side? A right-hand sidebar is perfect for secondary, contextual information. It’s the ideal spot for things that supplement the main content, but aren't the primary way to get around.\n\nThink of it as the place for:\n\n- Related articles or product suggestions\n- A shopping cart summary\n- Context-specific filters or actions\n- Advertisements\n\nStick your main navigation on the left to meet user expectations. It reduces their mental effort and helps them find what they need, fast.\n\n### What’s the Ideal Width for a Website Sidebar?\n\nThere's no magic number here, but a solid range for a desktop sidebar is between **240px and 320px**. This gives you enough breathing room for navigation links that use both icons and text, without making things feel cramped.\n\n> The real key is balance. Your sidebar needs to be functional and spacious, but it should never fight for attention with your main content. If the sidebar is too wide, it makes the primary content area feel like an afterthought.\n\nAlways, always test your layout on different screen sizes. What looks perfect on your big monitor might completely overwhelm a smaller laptop screen. A smart, responsive design that adjusts the width based on the viewport is always the way to go.\n\n### How Do I Make My Sidebar Work on Mobile?\n\nThis one is non-negotiable. On a mobile device, screen space is everything, so a permanently visible sidebar is a huge no-go. The standard, most effective solution is to convert it into a **collapsible \"drawer\" or \"off-canvas\" menu**.\n\nYou’ve seen this pattern a million times: the sidebar is hidden by default, and a tap on a \"hamburger\" icon slides it into view, usually overlaying the main content. This approach just works.\n\n1.  **It Maximizes Content Space:** The entire screen is dedicated to what the user came for, which is critical on a small display.\n2.  **It Keeps Navigation Handy:** All your links and options are just one tap away, but they stay out of sight until needed.\n3.  **It’s an Established Pattern:** Users instantly know how this works. There's no learning curve, making it completely intuitive.\n\nBuilding this behavior is a cornerstone of modern responsive design. It ensures your site feels professional and is actually usable on any device.\n\n---\n\nReady to build stunning, high-performance web interfaces without the hassle? **Magic UI** offers a massive library of over 150 free, open-source animated components built with React, TypeScript, and Tailwind CSS. Create beautiful landing pages in minutes, not weeks. Check out our components and templates at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/social-proof-on-website.mdx",
    "content": "---\ntitle: \"41 Best Ways To Add Social Proof on Websites\"\ndescription: \"Boost your website’s credibility and engagement with these 41 powerful social proof strategies. Elevate trust and connect with your audience effectively.\"\nimage: https://cdn.magicui.design/assets/0788a4f8-2800-48df-82d9-fab0a5165961.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nWondering how to make your startup landing page stand out? Some [landing page examples](https://magicui.design/blog/landing-page-examples) may help. By adding testimonials, reviews, and case studies, you can build credibility and increase conversions. This article will provide practical insights on incorporating social proof into your website and understand the types you can use.\n\nIf you’re unsure where to start, Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) provides a user-friendly solution for integrating social proof and achieving your goals.\n\n## What Is Social Proof?\n\n![Social Proof On Website](https://images.unsplash.com/photo-1494778752932-64ee27ba2a37?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjI0MDY0NDB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nSocial proof is a psychological phenomenon that describes people's tendency to conform to others' actions and opinions when making decisions, especially when they are uncertain about the \"right\" choice. In other words, social proof is the idea that we rely on the crowd's wisdom to help us determine what we should do or behave in a given situation.\n\nSocial proof can take many forms, such as:\n\n- Customer reviews\n- Ratings\n- Testimonials\n- Social media likes and shares\n- Celebrity endorsements\n- Behavior of people around us\n\nAny indication that others have found a particular product, service, or experience worthwhile can be considered social proof.\n\n### The Power of Social Proof\n\nThe power of social proof lies in its ability to reduce the perceived risk of a decision. We feel more confident when we see that others have had positive experiences. It also helps us feel like we belong to a group or community of like-minded people, which can be a powerful motivator for action.\n\n### Social Proof and Website Engagement\n\nIn the context of website engagement, social proof can be an incredibly effective tool for increasing conversions and engagement, as it provides visitors with the confidence they need to take action on your site.\n\n## Why Is Adding Social Proof to Websites Important?\n\n![Social Proof On Website](https://images.unsplash.com/photo-1688561808434-886a6dd97b8c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxlY29tbWVyY2V8ZW58MHx8fHwxNzIyNDA2NDUxfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nSocial proof plays a huge role in a buyer's decision. According to Trustpluse, 88% of people trust reviews over advertising. When someone is mulling over a purchase or trying to decide between two different brands, they’ll often turn to other people with experience with the products for guidance.\n\nAnd shoppers aren’t picky about whose advice they’ll take. It can be anyone from:\n\n- Family\n- Friends\n- Idols\n- Celebrities\n\n### Social Proof in Everyday Life\n\nSocial proof affects us in many ways. Even beyond buying decisions, we look to other people to show us how to pay in restaurants while abroad, what to do in emergencies, or how to eat “Toad in the hole” in England, to name a few things.\n\n### The Importance of Social Proof for Business\n\nBecause it’s such a big part of daily life, if your business doesn’t have social proof, shoppers on your site might even feel alienated. Including social proof in your marketing is great for your business.\n\nSocial proof has also been shown to increase customer trust and confidence and build credibility for your brand. Including social proof on your website helps potential customers feel more secure about their purchase decisions.\n\n#### Building Trust With Social Proof\n\n- [High-quality and convincing reviews](https://trustpulse.com/social-proof-statistics/)\n- Positive testimonials\n- Engaging in social media shares\n\nThis trust is crucial to driving sales.\n\n#### Social Proof Builds Community\n\nSocial proof also fosters customer engagement by creating a sense of community. It shows potential customers that others have tried your products or services and have had positive experiences. This can create a sense of belonging and increase the likelihood of new customers engaging with your brand.\n\n#### Social Proof Drives Conversions\n\nSocial proof is a great way to [increase website conversions](https://blog.hubspot.com/marketing/how-to-increase-conversion-rate). Displaying positive customer experiences and feedback can help convince potential customers to purchase. It’s much more persuasive for a potential customer to see other customers' experiences than to hear directly from a salesperson or to see a marketing message.\n\n#### Leveraging Social Proof for Business Success\n\nSocial proof is not only a great marketing strategy, but it is also an easy and effective way to improve your website and increase your conversion rates. Adding social proof to your website can give your business the boost it needs to excel.\n\n### MagicUI: A Design Engineer's Dream Tool\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers.\n\n#### Features of Our Component Collection\n\n- Over 20 animated components\n- Built with React, TypeScript, Tailwind CSS, and Framer Motion\n- Visually appealing and interactive elements\n- Easy integration into web applications\n- Create stunning user interfaces with minimal effort\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n#### Why Choose MagicUI\n\n- Focus on animation and design-centric approach\n- Bridges the gap between design and development\n- Empowers the creation of captivating digital experiences\n- Free component library available\n- MagicUI Pro saves thousands of hours\n- Create beautiful landing pages with website templates\n- Convert visitors into customers\n\nDiscover the perfect solution for your startup with our startup landing page template. Designed to attract and engage your audience, this template offers a professional and polished look to kickstart your online presence. Use our startup landing page template ([https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup)) today to transform your website and captivate your visitors. Start now!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Where To Put Social Proof on a Website\n\n![Social Proof On Website](https://images.unsplash.com/photo-1527689368864-3a821dbccc34?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3ZWJzaXRlfGVufDB8fHx8MTcyMjQwNjQ2NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nTo get the most out of social proof on your website, you must ensure it is easily visible and accessible. After all, what good is a glowing testimonial or an impressive set of numbers if no one sees them?\n\nThink about where you put your social proof. Keep it near the supporting claim or in the most visible places on your site. Here are some suggestions for where to add social proof:\n\n### Social Proof on the Cart\n\nIf you're selling something, add social proof to the cart. People want to know they're making the right decision, and if they see that others have bought the same items, they'll feel more confident.\n\n### Social Proof on Your Blog\n\nYou can also include social proof to reinforce your writing. It's like saying, \"I know what I'm talking about.\" That only strengthens your point.\n\n### Next to Your Newsletter Sign-Up Form\n\nThe more subscribers you have, the more social proof you have. It's hard to refuse something that everyone else is doing, right?\n\n### Case Studies\n\nCase studies are one of your most potent forms of social proof. They're not just numbers on a screen but testimonials in story form.\n\n### Your Sidebar\n\nAdd social proof to your sidebar. People will see it, especially if it's high on your site.\n\n### Your Home Page\n\nThink of your home page as the front door to your site. You want to show off your social proof right when people arrive.\n\n### Your Landing Page\n\nLanding pages are great places to put social proof. You're asking people to do something, so it helps to show that others have done it (and are happy with it!).\n\nRemember, no one else can if you can't see your social proof. So make it easy to find.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 41 Best Ways To Add Social Proof on Websites\n\n![Social Proof On Website](https://images.unsplash.com/photo-1485217988980-11786ced9454?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxyZXZpZXdzJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzIyNDA2NDg1fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Reviews and Customer Testimonials\n\nOnline reviews and customer testimonials are the most obvious and probably sought-after social proof. People rely on them for an honest and realistic impression of your product/service that they often feel they can’t get from your words.\n\n#### Versatile Testimonial Placement Strategies\n\nIf you sell real estate agent software, there’s only so much you can do via your website to convince new customers to buy. Selling houses depends heavily on each particular case and customer, so having a review collection strategy for people who have used your software in the field is vital to assure prospective buyers that your stuff will be helpful.\n\nThere are many ways to use testimonials in your content. Some brands create dedicated landing pages for them, while others pepper them throughout their site.\n\n### 2\\. Case studies\n\nWhen buyers are at the ‘research’ phase of their buying journey, customers want to know exactly how your product will improve their lives. Customer success stories help with this. A good case study acts like an extended customer review over which you have some control. Contact your best customers and ask if they’d mind answering a few questions for a case study. Chances are, they’ll be delighted to help you and get the extra exposure your case study will provide.\n\n#### Maximizing the Impact of Case Studies\n\nYou can then utilize these case studies throughout your website. A dedicated page or area on your site will satisfy those individuals who search specifically for this kind of social evidence. But you don’t have to limit the impact of case studies to those prospects.\n\n### 3\\. Show Live Sales Notifications\n\nLive sales notifications are another excellent way to show visitors that other people are interested in your product or service. In many cases, these notifications appear as small pop-ups in the bottom corner of the screen.\n\n#### The Power of Real-Time Social Proof\n\nWhen consumers browse your products, check out your blog, or even visit the payment page, they can see how others interact with your site. If someone is on the fence about placing an order but suddenly sees three notifications that shoppers recently checked out, this could encourage them to take action.\n\n### 4\\. Video Testimonials\n\nLike written testimonials, video testimonials are a great example of social proof for your digital marketing strategy. These convert better than written testimonials because the visual aspect adds more credibility. One study shows that social proofing your site with video testimonials convinces 77% of users to purchase.\n\n### 5\\. Audio Testimonials\n\nThese are less used than written or visual testimonials and are more likely to be found in radio advertisements and podcasts. The type of testimonial you choose will likely depend on where your audience consumes your content. If your podcast is posted on your website, you can add audio testimonials before, during, or after each episode.\n\n### 6\\. Quick quotes\n\nYou’ve likely seen this social poof website example before. Quotes are the perfect way to boost credibility with your site’s visitors quickly—the more well-known the reference, the better. But even adding a small photo can make quotes a powerful social proof example.\n\n### 7\\. Displays of Past Clients\n\nOn the homepage of most websites, you’ll likely see a section that displays the company’s previous clients. This lets you borrow social proof from other company brands. When done ethically (meaning they’re your former clients), this can be a compelling example of social proof.\n\n### 8\\. High-Profile Guest Posts\n\nYou likely know about guest posts for content marketing purposes. They help you get more site traffic from other sources and, usually, help build backlinks. That said, they’re also a great example of social proof. If your guest poster is well-known, it speaks volumes about your brand’s authority within your niche. Any time you get a guest post, even a short one, from a famous persona in your niche, it can build trust with your audience.\n\n### 9\\. Recent Publications\n\nOn the flip side, where have you or your brand guest posted recently? One of the strongest forms of social proof is showing that you’ve written articles or posts for other popular publications. If you can get your articles accepted by big-name online publishers like Inc. or Forbes, you’re sitting on an excellent form of social proof.\n\n### 10\\. Expert approval\n\nThis is like a high-end quote from an expert in your niche. If you can get someone well-known in your business to speak positively about your brand, product, or service, that’s one of the best examples of social proof you can put on your website. Again, the key here is that the person providing the quote needs to be an expert within your niche.\n\n### 11\\. Influencer Endorsement\n\nLike expert approval, an influencer endorsement can boost your sales and conversions. Still, the difference is that the person giving the endorsement doesn’t need to be an expert; they just need to be popular.\n\nAn excellent example is when the podcaster Joe Rogan off-handedly endorsed Bernie Sanders for president. Joe Rogan is not a political expert, but his casual celebrity endorsement caused news headlines and controversy. And that is because he has a huge audience who trusts his opinion, even knowing he’s not an expert in that field.\n\n### 12\\. User Metrics\n\nThis is your website’s perfect social proof example. You can display how many users your product or service has helped. This works best if you’re well-established and have many people using your services.\n\n### 13\\. Best-Selling Products\n\nYou can display your best-selling or top-rated products to boost sales and increase social proof. When website visitors see that other people are enjoying certain items, they’ll be more comfortable making a purchase themselves. You can also display top-rated products, sale products, and more.\n\n### 14\\. On-Site Reviews\n\nMany websites will have forms that let people leave them direct feedback or reviews. This can be through a form on a web page or, often, in a live chat. Either way, you can take screenshots from these positive reviews and post them on your website.\n\n### 15\\. Blog Post Comments\n\nHave you ever been the first one to arrive at a party? It’s usually a bit uncomfortable until other people arrive. The same is true for blog post comments. The more people you can get to interact with your content, the more people will feel comfortable leaving comments, too. Once you get that flywheel started with some social proof, you can consistently bring in more blog post comments.\n\n### 16\\. Number of Email Subscribers\n\nIf you’re trying to grow your email list and already have many subscribers, why not tell people about it? Showing how many people receive your emails makes the content appear more valuable, resulting in more sign-ups.\n\n### 17\\. Number of Unsubscribers\n\nRather than showing the number of subscribers on your list, you may want to add the number of unsubscribers (if it’s relatively low). This is an excellent way to show that you have an extensive email list and that people love consuming the content you produce.\n\n### 18\\. Third-Party Review Sites\n\nWe already discussed using [third-party site review](https://blog.hubspot.com/service/customer-review-sites) notifications as a social proof example. You can also take screenshots or quotes from these review sites and post them directly on your homepage. Having a neutral logo from a 3rd party site can create trust with your audience.\n\n### 19\\. Group Activity Notification\n\nUnlike individual activity notifications, group activity messages show when large groups take the same action on your site. This is an excellent example of social proof that you can use for popular promotions, email subscriptions, webinar sign-ups, and more. They’re super effective because they display how famous your brand, product, or event truly is.\n\n### 20\\. Recent Sales Notifications\n\nThis type of message lets users know when someone has purchased from your site. This is a great social proof example for eCommerce stores.\n\n### 21\\. Low-stock notifications\n\nDo you have a popular item starting to run out of inventory? If so, let your audience know about it with a low-stock notification. This ensures your potential customers don’t miss out on their desired items.\n\n### 22 New Email Subscriber Notifications\n\nThese types of messages are an excellent strategy for growing your email list. As your audience sees your monthly newsletters’ popularity, they’ll be more inclined to join.\n\n### 23\\. Webinar Registration Notifications\n\nWebinars are undoubtedly one of the best ways to drive more sales for your company. That said, getting new attendees can take time and effort. That’s where webinar registration notifications come in handy. These messages let your online audience know they won’t be the only attendees joining your online presentation. As a result, you get loads of new registrations.\n\n### 24\\. 3rd Party Review Notifications\n\nOnly some interactions with your brand take place on your actual website. Sometimes, you get reviews from sites like Google My Business and Yelp. In that case, why not redirect your site’s visitors to see those stunning reviews? These social proof notifications can drastically increase your credibility, especially since the glowing reviews come from a neutral 3rd party site.\n\n### 25\\. Survey Response Notifications\n\nGetting people to respond to your surveys can be challenging, like getting new webinar registrations or email subscribers. That’s why you can make a survey response notification for any survey forms on your website. This will inspire others to fill out your survey form, which means more user-generated data for you.\n\n### 26\\. Online Contest Shares\n\nThough online contests aren’t technically a social media platform, they’re usually widely spread via sites like:\n\n- Facebook\n- Instagram\n- Twitter, and so on\n\nThis social proof persuasion example is excellent for increasing your brand's exposure, building your list, and gaining a more prominent social media following, which drives more sales.\n\n### 27\\. Social Media Shares\n\nIf you write a social media post that begins getting a lot of shares, you’re bound to capture more of your audience’s attention. That’s because your audience can use this as a metric to indicate that the content is worth viewing. Plus, once you get a few extra shares on your post, you’ll likely get even more as the post gains exposure.\n\n### 28\\. Social Media Followers\n\nGrowing your social media presence can be challenging. But like the old saying, “It takes money to make money,” it also takes followers to get more followers. That’s because your follower count indicates social proof that can motivate people to join your online community.\n\n### 29\\. Social Media Likes\n\nSimilar to the last two social proof examples, having a post with tons of “likes” can go a long way in reaching more people online. When people see a post, they may quickly glance at the content. But if they see it’s been liked by hundreds of people, they’ll likely go back and read the post in more depth.\n\n### 30\\. Social Media Shoutouts\n\nTwitter and Facebook have become two great resources for creating social proof persuasion. If someone speaks positively about your brand online, you can collect these testimonials from social media and display them on your website.\n\n### 31\\. Social Media Engagement\n\nThis form of social proof is a mix of the last few examples we looked at: how are people engaging with your brand? When people check out your social profiles, they likely won’t be influenced by just one of the social proof examples we’ve covered. Instead, they’ll consider everything, such as:\n\n- Your follower count\n- Popularity of your posts (from likes and shares)\n- Number of people discussing your brand online\n\nIf you can boost your social media engagement, you’re looking at a massively influential social proof example that can bring you new leads and drive more sales.\n\n### 32\\. Social Media Response Time\n\nResponse time matters! About 40% of social media users want you to respond within one hour. Users who find your response time quicker than the rest will interact with your brand first.\n\n#### Social Media Response Time\n\nRightly so, Facebook allows you to state how responsive you are on Messenger. Similarly, if you provide customer support on Twitter, you can display when you’re most responsive. It encourages people to message you, knowing they’ll quickly get your response.\n\n### 33\\. Social media blue checkmark\n\nYou can get verified on Twitter, Facebook, and Instagram and receive a blue checkmark on your bio.\n\n#### Social Media Blue Checkmark\n\nA blue checkmark is also an example of social proof. The blue tick is awarded to top celebrities and brands who develop authority and are deemed famous, influential, or interesting by the social media platform.\n\nIn addition to gaining credibility and respect from the community, you would also gain access to new features reserved only for verified accounts or Pages.\n\nIf you wish to get the checkmark on Twitter, here’s a guide to getting verified.\n\n### 34\\. Social Media Webinars and Live Events\n\nYou could invite experts as guests for your [social media events](https://www.techtarget.com/whatis/feature/Social-media-conferences-to-attend) and webinars, such as:\n\n- Twitter chats\n- Facebook Live video discussions\n\n#### Expert Leverage\n\nSuch collaborations allow you to tap into the experts’ positive influence and let your social media audiences hear and learn from industry experts.\n\n### 35\\. YouTube Subscribers\n\nYouTube is much more than just a video-sharing platform. It’s a way for you to share your knowledge and drum up new business for your online store. Like social media platforms, your subscriber count will go a long way toward getting people to trust your brand.\n\nLike all the other examples of social proof we discussed today, getting started can be tricky. But with each new subscriber you obtain, it becomes easier to get the next one.\n\n### 36\\. YouTube Video Likes\n\nLike your social media posts, getting [likes on your YouTube video](https://viralyft.com/blog/how-many-likes-on-youtube-to-get-paid) is crucial. This example of social proof doesn’t just indicate that people watched your videos; it’s proof that they liked them.\n\n### 37\\. YouTube Video Comments\n\nAnother example of social proof on YouTube is the number of comments your video can generate. Remember that your brand aims to connect with and engage your audience.\n\nComments under your video show a higher engagement rate and, as a result, inspire other people to [leave comments](https://www.tuko.co.ke/390183-youtube-comments-attract-likes.html), too. Once people leave a comment underneath your post, you can nurture that lead into a new customer.\n\n### 38\\. Podcast Subscribers\n\nPodcasts don’t get much attention when it comes to social proof examples. Though they probably should. That’s because podcasts have quickly become one of the most popular forms of content.\n\nPeople may look for how many subscribers your podcast has. Like with YouTube, the more you have, the easier it is to get more!\n\n### 39\\. Podcast Downloads\n\nAnother metric for social proof on podcasts is how many downloads you’ve acquired. You may not have a ton of subscribers, but specific episodes may have high download rates. You can display this to get more subscribers to your podcast and more exposure to your brand.\n\n### 40\\. Press Mentions\n\nThis is another way to leverage the Halo Effect. If your brand has been featured in (or even mentioned by) a media source, its logo can be added to your site, usually on the homepage.\n\n### 41\\. Data and Statistics\n\nAlthough technically not social proof, data is a powerful form of evidence. Website templates have made this feature more popular in recent years. Not all numbers are social proof because they aren’t connected to human behavior, but they’re still powerful forms of credibility and differentiation.\n\n#### Social Proof Metrics\n\nBut when the numbers are related to the work you do or the results of the work you do, it becomes social proof:\n\n- Years in business\n- The combined experience of the team\n- The size of the team\n- Number of happy customers or projects\n- Return on investment (% increased, dollars earned, hours saved)\n\n### Visual Representation\n\nYou can better represent your data and stats with charts or circles. For instance, the animated circular progress bar in the [Magic UI library](https://magicui.design/) can be neatly used to describe your data and stats on your website, grabbing visitors' attention with its visual appeal.\n\n## 4 Examples Of Social Proof In Action On Popular Websites\n\n![Social Proof On Website](https://images.unsplash.com/photo-1529339017023-c2f2ce633d0d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyMjQwNjUwMHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Amazon: Using Customer Reviews and Recommendations\n\nAmazon is a prime example of how social proof can boost conversions and engagement on an e-commerce website. The [customer review system](https://www.amazon.com/s?k=reviews&crid=2PRJ0PHWD3ZXX&sprefix=review%2Caps%2C265&ref=nb_sb_noss_1) on Amazon allows shoppers to read about the experiences of others who have purchased the same product, providing valuable insights before making their purchase.\n\nAmazon prominently displays bestseller lists customer ratings, and customers who bought this also bought recommendations, which all contribute to creating a sense of social validation and nudging potential customers towards making a purchase.\n\n### 2\\. Airbnb: User-Generated Reviews and Rating\n\nAirbnb is another website that effectively leverages social proof. The platform employs a [user-generated reviews](https://community.withairbnb.com/t5/Community-Center/ct-p/community-center) and ratings system that establishes trust among users.\n\nBy showcasing tangible proof of the quality of accommodations and hosts through previous guests' experiences, Airbnb instills a sense of security and confidence in potential guests, ultimately encouraging them to book a stay.\n\n### 3\\. Yelp: Business Reviews and Ratings\n\nYelp is a platform that revolves around [social proof](https://trust.yelp.com/), streamlining the decision-making process for users. The number of reviews and the average star rating prominently displayed on each business's profile page give users a quick and convenient way to assess a business's quality. This transparency enables users to make informed decisions quickly, making Yelp a go-to platform for many seeking recommendations.\n\n### 4\\. LinkedIn: Building Credibility Through Social Proof\n\nLinkedIn employs various forms of social proof, such as showcasing a user's number of followers, connections, endorsements, and recommendations from peers within their network. This practice helps in establishing credibility and building trust among users.\n\nBy allowing others to vouch for a user's skills and experience, LinkedIn helps paint a comprehensive picture of a user's professional background and competencies.\n\n## Common Mistakes to Avoid When Displaying Social Proof On A Website\n\n![Social Proof On Website](https://images.unsplash.com/photo-1709718499883-7267d6ffae9c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHx3b3JyaWVkJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzIyNDA2NTEzfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Overloading with Testimonials\n\nWhile [testimonials](https://blog.hubspot.com/service/testimonial-page-examples) can significantly enhance credibility, overloading your website with them can have the opposite effect. Here are some risks associated with cluttering pages with too much information:\n\n#### Information Overload\n\nWhen visitors face overwhelming testimonials, they may need help to discern which ones are most relevant or impactful. This can lead to decision fatigue, causing potential customers to leave your site without taking action.\n\n#### Dilution of Impact\n\nToo many testimonials can dilute the strength of the individual messages. Instead of emphasizing a few powerful endorsements, a long list may cause visitors to skim rather than engage deeply with the content.\n\n#### Visual Clutter\n\nAn excessive number of testimonials can create a visually chaotic experience, detracting from your website’s overall design and usability. A cluttered layout can frustrate users and make navigation difficult, leading to higher bounce rates.\n\n#### Best Practices\n\n##### Selectivity\n\nChoose a handful of the most compelling testimonials highlighting different aspects of your product or service. Aim for quality over quantity.\n\n##### Highlight Key Quotes\n\nUse standout quotes from testimonials in prominent areas, such as hero sections or call-to-action buttons, to draw attention without overwhelming users.\n\n##### Rotating Carousel\n\nConsider using a rotating carousel or slider to display testimonials. This allows you to showcase multiple endorsements without cluttering the page. A perfect component will be the Marquee component from the [Magic UI library](https://magicui.design/).\n\nThis component allows you to display your testimonials horizontally, vertically, or in 3D without cluttering your landing page or website.\n\n### Using Fake Reviews\n\nThe temptation to [fabricate reviews](https://pirg.org/edfund/resources/how-to-recognize-fake-online-reviews-of-products-and-services/) can be vital, especially in a competitive market. Using fake reviews can have severe consequences for your brand’s reputation. If customers discover that your reviews are fake, they can significantly lose trust.\n\n#### Risks & Consequences\n\nConsumers are increasingly savvy and can often spot inauthentic endorsements. Once trust is broken, it can be challenging to rebuild.\n\nAlso, in many jurisdictions, false advertising and deceptive marketing practices can lead to legal consequences. Companies may face fines or other penalties for misleading consumers.\n\n#### Best Practices\n\n##### Encourage Authentic Feedback\n\nActively solicit genuine reviews from customers after their purchase. Consider follow-up emails or feedback forms to gather authentic testimonials.\n\n##### Transparency\n\nIf you receive negative feedback, address it openly. This shows potential customers that you value honesty and are committed to improving your product or service.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in UI libraries, offering over 20 animated components to make your landing pages pop. With MagicUI, you can easily create visually stunning and interactive elements seamlessly integrating into your web applications. The best part? It's free and open-source, allowing you to craft captivating digital experiences effortlessly.\n\n### Bridging the Gap Between Design and Development\n\nOne of the challenges in creating landing pages is ensuring they are visually appealing and technically sound. [MagicUI](https://magicui.design/) bridges the gap between design and development by offering highly customizable components that can be adapted to seamlessly match your branding and design requirements. This means you can focus on creating beautiful landing pages without dealing with the technical complexities.\n\n### MagicUI Pro: Elevate Your Landing Page Game\n\nWith [MagicUI Pro](https://pro.magicui.design/), you can take your landing page design to the next level. Using our website templates, you can save thousands of hours and create a beautiful landing page that converts visitors into customers. MagicUI Pro equips you with everything you need to make a stunning startup landing page that captures attention and drives results.\n\n### Design Made Easy With MagicUI\n\nThe call-to-action (CTA) is one of the most crucial elements of a landing page. With MagicUI, you can effortlessly design compelling CTAs that drive conversions. Our [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the perfect starting point for creating a CTA that resonates with your target audience and compels them to act.\n\n[Get MagicUI today](https://magicui.design/) and see the difference it can make in your landing page design.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/startup-landing-page.mdx",
    "content": "---\ntitle: \"Creating A Startup Landing Page That Boost Conversions\"\ndescription: \"Transform your startup landing page into a powerful tool for boosting conversions. Discover the secrets to creating a landing page that converts.\"\nimage: https://cdn.magicui.design/assets/c64e4503-c0d7-427f-9317-e7da0598e513.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you a startup founder seeking to create a compelling online presence? Developing a high-converting landing page can be challenging, but it's essential for transforming website visitors into loyal customers. With the help of [landing page examples](https://magicui.design/blog/landing-page-examples), discover the secrets to crafting a successful startup landing page and learn how to showcase your product or service.\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) could be your golden ticket to crafting an effective startup landing page that converts. With no technical know-how needed, this solution empowers you to create a stellar startup landing page that leaves a lasting impression on your audience. Building a high-converting startup landing page with Magic UI is manageable and enjoyable.\n\n## What Is A Startup Landing Page\n\n![Startup Landing Page](https://images.unsplash.com/photo-1713946598664-b753ed24f9a9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxvbiUyMGxhcHRvcCUyMGFsb25lfGVufDB8fHx8MTcyMTg1NjYwNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA startup landing page is a [standalone web page](https://www.endorphindigital.com/post/the-difference-between-standalone-landing-pages-and-the-rest-of-your-website) designed for a specific campaign or to attract a particular target audience. Like any other landing page, it is created with a single goal: conversion.\n\nYou’ll often see two types of startup landing pages:\n\n### 1\\. Lead Capture Page\n\nThis type of landing page generates leads for your startups with the help of an embedded lead capture form. Your sales team can follow up through the contact details provided, nurture the leads, and ultimately convert them into customers.\n\n### 2\\. Click-Through Page\n\nA click-through page is designed to warm up and entice your target audience to click through to a conversion page, like a download or account creation page. This allows for immediate conversion, unlike the lead capture landing page, which requires follow-up.\n\n### Landing Pages as Proof of Concept for Startups\n\nFor many startups, their landing page functions as proof of concept, as a way to validate their business model without spending money they don’t have on a website they might not even need. With a landing page, startups can put their concept, MVP, or offer in front of target customers in literal hours for literal dollars.\n\nFor startups in the early stages with limited budgets, a good landing page can also double up as their homepage.\n\n### Landing Page Creation with Landing Page Builders\n\nSubscribe to a landing page builder, like [Magic UI](https://magicui.design/), download or duplicate a template, fill in the blanks with your messaging, and run a smoke test to determine whether there is sufficient customer demand to justify building a business. Using a landing page builder saves even more time and resources.\n\n## Why Are Landing Pages So Important For Startups?\n\n![Startup Landing Page](https://images.unsplash.com/photo-1637684666451-423047d6bf5e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxzdGFydHVwfGVufDB8fHx8MTcyMTg1NjYxNnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nLanding pages are like the doors to the digital universe for a startup. These sites aren’t just the first glimpse visitors get of what a company offers, but they also play an important role for several essential reasons:\n\n### Continuous Experimentation\n\nBy utilizing a landing page as a virtual laboratory, startups can conduct tests that will constantly refine their content and design. This constant experimentation is key to maximizing the effectiveness of every aspect of the page and thereby captivating visitors’ attention in the best possible way.\n\n### Customization for Target Audience\n\nStartups can tailor a landing page like a suit by focusing on specific audience groups or campaigns. This [targeted personalization](https://www.180ops.com/180-perspective-change/personalization-techniques-to-reach-target-audience) makes the information more relevant to visitors, enhancing their connection and significantly improving conversions.\n\n### Data-Driven Decision Making\n\nLanding pages provide valuable data on visitor behavior, offering detailed metrics that allow assessment of the performance of advertising campaigns and adjustment of strategies based on interaction patterns, ensuring a more accurate course toward success.\n\n### Clarity in Communication\n\nLanding pages eliminate unnecessary distractions, guiding visitors directly toward the desired action. This simplicity in messaging leads to a smoother and results-oriented experience.\n\n### Accelerate UI Development with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with [MagicUI Pro](https://pro.magicui.design/), you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n\n## Primary Purpose Of A Landing Page\n\n![Startup Landing Page](https://images.unsplash.com/photo-1522542550221-31fd19575a2d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3ZWJzaXRlJTIwZGVzaWdufGVufDB8fHx8MTcyMTg1NjYyOHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nYour landing page should be a digital showcase where you compellingly present your products or services. It should also encourage visitors to take specific actions, such as:\n\n- Subscribing to a newsletter\n- Making a purchase\n- Downloading your application\n\nSo, before you create your landing page, you need to set clear goals. It’ll become much easier to optimize your [page for conversions](https://www.webfx.com/blog/marketing/what-is-a-good-conversion-rate/) when you know what those conversions are and why you need them. As a new business, you’ll need to include objectives related to building customer trust. Answer these customer questions on your landing page to meet common startup challenges:\n\n- What is this company, and what do they do? Your visitors must understand what your brand does before they can get interested in it.\n- Why should I trust this business with my money? Since you’re new to the game, you’ll have to build credibility ASAP.\n- Will I get what this company says they’ll give me? Quality and consistency are key to bringing customers through to conversion.\n\nAccording to a survey by Hubspot, the average [landing page conversion rate](https://blog.hubspot.com/marketing/landing-page-stats) across all industries is 5.89%. 10% is the benchmark for a good conversion rate. To hit this mark, you must create landing pages that benefit you and your target audience.\n\n## 11 Essential Elements Of A Great Startup Landing Page\n\n![Startup Landing Page](https://images.unsplash.com/photo-1678690832310-cf614292671d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8d2Vic2l0ZSUyMGRlc2lnbnxlbnwwfHx8fDE3MjE4NTY2Mjh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Conversion Intent\n\nWhen creating a startup landing page, conversion intent is one of the most vital aspects. It is crucial to make an offer that visitors will likely convert on. This means tailoring your offer to the different types of visitors you will receive, such as:\n\n- Those at the top of the funnel (e.g., first-time visitors)\n- Those at the bottom of the funnel (e.g., repeat visitors)\n\nBy understanding and addressing the needs of these different groups, you can create a more effective and appealing landing page.\n\n### 2\\. Single Conversion Goal\n\nAnother essential element of a successful startup landing page is having a single, [clear conversion goal](https://fastercapital.com/topics/setting-clear-conversion-goals.html). Your page should guide visitors along a straightforward path to conversion.\n\nMultiple competing calls to action (CTAs) can create confusion and lower conversion rates. By focusing on a single conversion goal, you can help visitors understand what you want them to do and increase the likelihood that they will take that action.\n\n### 3\\. Message Match\n\nTo create a cohesive and effective startup landing page, you must ensure that the messaging across all page elements aligns. This includes the:\n\n- Ad copy\n- Message\n- Offer\n- Tone matching\n\nMaintaining consistency in your messaging can build trust with visitors and increase the likelihood that they will convert.\n\n### 4\\. Headline/Subheadline\n\nThe headline and subheadline of your landing page play a critical role in capturing visitors' attention and communicating the value proposition of your product or service. Your headline should clearly explain the value you provide and the [promise you make to visitors](https://www.surveymonkey.com/market-research/resources/how-to-identify-brand-promise-customers-want/). The subheadline should introduce your product or service and explain how you will create value and deliver on your promise.\n\n### 5\\. Visuals\n\nImages, graphics, and videos can make your product's or service's intangible aspects visible and provide context to your value proposition. Visual elements can help reinforce your messaging, create a more engaging experience for visitors, and increase the likelihood of conversion.\n\n### 6\\. Benefits Over Features\n\nWhen creating a startup landing page, focusing on the benefits of your product or service rather than just the features is essential. While features describe how your product or service works, benefits explain why those features matter and how they will improve your customers' lives. By focusing on benefits over features, you can create a more compelling value proposition and increase the likelihood of conversion.\n\n### 7\\. Social Proof\n\nIncluding social proof on your landing page is a powerful way to build credibility and trust with visitors. Social proof shows that other people in similar situations have chosen your product or service and found it valuable. This can make your offer more believable and increase visitors' likelihood of converting.\n\n### 8\\. Form\n\nThe form plays a critical role in capturing essential lead information for lead generation startup landing pages that your sales team can follow up on. Creating a form that captures the right information without overwhelming visitors can increase the likelihood of conversion and generate high-quality leads for your business.\n\n### 9\\. Call-to-action\n\nYour landing page's call-to-action (CTA) nudges visitors toward the next step in your conversion path. Your CTA should be:\n\n- Clear\n- Compelling\n- Aligned with your conversion goal\n\nCreating a strong CTA that tells visitors what to do next can increase the likelihood of their taking that action.\n\n### 10\\. 1:1 Attention Ratio\n\nVisitors to your startup landing page can easily get distracted. To keep them focused on your conversion goal, it is essential to limit the number of links on your page as close to one as possible. By reducing distractions and focusing visitors' attention on your CTA, you can increase the likelihood of conversion.\n\n### 11\\. Irresistible offer\n\nWithout an irresistible offer, nothing else on your startup landing page matters. To create an effective startup landing page, it is crucial to make your offer matter. Your offer should:\n\n- Solve a problem\n- Meet a need\n- Fulfill a desire for your target audience\n\nCreating a truly irresistible offer increases the likelihood that visitors will convert and become customers.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## Benefits Of Landing Pages For Startups\n\n![Startup Landing Page](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyMTc4NzEwNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Lead Generation\n\nLanding pages are crucial for startups to channel visitors into potential customers by capturing their data in exchange for valuable information. This method ensures a targeted approach to lead generation, offering specific deals or relevant information that aligns with the needs of interested parties. This focused strategy allows startups to attract potential customers more effectively and quickly than traditional lead generation methods.\n\n### Accelerated Decision-Making\n\nThe fast-paced world of startups demands quick decision-making from potential customers. Landing pages play a vital role in this process by providing a clear and concise representation of a company's benefits. These pages facilitate accelerated decision-making by swiftly communicating the value proposition to visitors.\n\nWhen visitors understand what they are getting and how the motivation to take action becomes apparent, they may feel confused or lack the necessary information to make informed decisions. If a startup lacks a well-structured landing page, visitors may feel confused or lack the necessary information to make informed decisions.\n\n### Increased Conversions\n\nConversions are the lifeblood of startups looking to scale their business rapidly. While startups employ [various methods to drive conversions](https://www.forbes.com/sites/theyec/2021/07/15/seven-top-ways-to-drive-conversions/), landing pages remain among the most effective. These pages are designed to guide visitors toward a desired action, focusing solely on a particular offer or product.\n\nLanding pages significantly boost a startup's conversion rate by highlighting the benefits and converting initial interest into a specific action. This focused approach ensures that visitors are nudged towards taking action, increasing the likelihood of turning them into paying customers.\n\n## How To Build A Great Startup Landing Page\n\n![Startup Landing Page](https://images.unsplash.com/photo-1648854006531-361649aa182c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxmaWdtYXxlbnwwfHx8fDE3MjE4NTY2NjN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nAs a startup, you don’t have the advantage of being known the way that household names are. You have to establish a solid brand with your landing page visitors so they’ll remember you. Your branding has to stay consistent throughout your copy and visuals.\n\nKeep your design elements consistent and follow a visual hierarchy. Once you have your visuals nailed down, use words and tones that match those visuals and your brand goals. It’s easier said than done, but you’ll get better at it as you practice.\n\n### Talk to the Right Audience\n\nYour landing page should have relevant messaging. As you build your brand and marketing assets, research your audience and customize your marketing to their preferences. Try demographic and [psychographic segmentation techniques](https://www.questionpro.com/blog/psychographic-segmentation/) to get an overview of your typical customer.\n\nOnce you understand the groups that dig your product, think about the language that will fit their personalities and purchase goals. If you have more than one audience segment, give Smart Traffic a spin to direct customers to the copy that they’ll like best.\n\n### Research Competitors\n\nCompetition isn’t always destructive, especially when it comes to seeking inspiration. Observe what others are doing. For instance, does your direct competitor have a call-to-action button that’s always in red? Well, there might be something about that color choice that attracts this specific audience. Observe and learn!\n\n### Use Landing Page Builders\n\nYou don’t need to be a design expert. Tools like [Magic UI](https://magicui.design/) allow you to create spectacular landing pages. Magic UI offers a gallery of templates that adapt to your needs without requiring a degree in web design. It’s fun, even cost-effective, and you can add personality.\n\n### Make High-converting Offers\n\nYou need to make offers that your audience can’t resist. Avoid generic propositions and create something that generates genuine interest and leads them to take the desired action. Think about offering something that makes your visitors feel like they’ve found the treasure at the end of the rainbow.\n\n### Write a Compelling Title\n\nThe title is the first impression, so it must be unforgettable. It must grab attention immediately, be clear and relevant to the page's offers, and pique curiosity. Although not necessarily lengthy, an impactful title should be large and visible enough to stand out on the page and immediately capture users’ attention. It should highlight the unique value proposition or the main offer of the landing page to attract visitors and encourage them to explore further.\n\n### Simplify Conversion Path\n\nCan you imagine getting lost in a maze without knowing how to get out? That shouldn’t happen on your landing page. Guide your visitors with a clear path to the action you want them to take. A simple and [direct call-to-action](https://www.investopedia.com/terms/c/call-action-cta.asp), like “Sign up now,” makes a difference so that your users know exactly what to do.\n\n### Add a Form\n\nConsider including a form on your page, as it provides a dedicated space for visitors to share their contact information. This gives you the valuable opportunity to convert mere visitors into potential customers. With their information, you can continue interacting with them, sending useful information or promotions, and ultimately nurturing that relationship until they become satisfied clients.\n\n### Call to Action\n\nA call to action is an invitation for your visitors to act. To achieve this, ensure it’s easy to find and understand. Use words that generate excitement and spark interest, like:\n\n- Explore more\n- Join now\n- Start your journey\n\nAdding a distinctive visual touch, like a button highlighted in vivid colors, can also make your CTA more attractive and eye-catching for users.\n\n## Great Examples Of Startup Landing Pages\n\n![Startup Landing Page](https://images.unsplash.com/photo-1531539134685-27d854339120?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkaXNjdXNzfGVufDB8fHx8MTcyMTc4NzEwNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### [langfuse.com](http://langfuse.com)\n\n[Langfuse's landing page](https://magicui.design/showcase/langfuse) is designed using Magic UI, which helps create an engaging and clean design with a 1:1 attention ratio. The animated components offered by Magic UI enhance the page's engagement and aesthetics, making it appealing to visitors.\n\n### Cognosys\n\nThe landing page design for [Cognosys leverages Magic UI's capabilities](https://magicui.design/showcase/cognosys) to deliver interactive and customizable interfaces seamlessly. The page is incredibly dynamic, with numerous animations and effects that create a sense of action and engagement for users.\n\n### Ranktracker\n\nRanktracker's landing page stands out with a video in the hero section that provides more information about the company and its benefits. The benefits-focused headline and well-placed compelling CTA help visitors quickly grasp the brand's value and encourage them to take action.\n\n### Cybellum\n\nCybellum's landing page features a clear and simple design with animations that complement the various headlines displayed. The inclusion of icons and testimonials from reputable companies they've worked with adds credibility and piques visitors' interest.\n\n### Letter\n\nLetter's landing page reflects the high-tech banking services it offers through a modern and opulent design. The combination of colors and images creates a sophisticated atmosphere, enhanced by dynamic animations and effects that convey a sense of action.\n\n### Vaayu\n\nVaayu's landing page impresses with its technically advanced design, featuring a plethora of animations throughout its various sections. A unique horizontal scrolling feature in the \"How Vaayu Works\" section adds interest and engagement to the viewing experience.\n\n### Pave\n\nPave, a career-finding platform, presents most key information on a single page in a clear and concise manner. Each section is visually and content-wise distinct, with a focus on specific benefits using a \"How we can help\" table and testimonials to boost credibility.\n\n## Setting Up Your Landng Page For Success\n\n![Startup Landing Page](https://images.unsplash.com/photo-1629904853893-c2c8981a1dc5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzIxODU2NzA0fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCreating a landing page for your startup can be a daunting task. You need a visually appealing and fully functional website. [Magic UI](https://magicui.design/) is the perfect tool to help you create and optimize your landing page with over 20 animated components.\n\n### Simplify Landing Page Creation\n\nMagic UI simplifies the process of creating a landing page for your startup. With pre-designed components, you can quickly build a professional-looking website without the need for coding expertise. By streamlining the creation process, Magic UI saves you time and effort, allowing you to focus on other aspects of your startup.\n\n### Optimize for Conversions\n\nA successful landing page converts visitors into customers. Magic UI provides you with the tools to optimize your landing page for conversions. From call-to-action buttons to interactive elements, Magic UI helps you create a persuasive landing page that encourages visitors to take action.\n\n### Highlight Your Startup's Best Features\n\nWhen visitors land on your startup's website, they should immediately see the value your product or service offers. Magic UI allows you to highlight your startup's best features with eye-catching animations and engaging content. By showcasing what makes your startup unique, you can capture visitors' attention and keep them on your website.\n\n### Improve User Experience\n\nUser experience plays a vital role in the success of your landing page. Magic UI helps you create a seamless user experience by offering responsive design elements and smooth animations. By providing visitors with a user-friendly interface, you can keep them engaged and prevent them from bouncing off your website.\n\n### Create a Professional Online Presence\n\nEstablishing a professional online presence is crucial to gaining credibility and trust. Magic UI enables you to create a polished and professional-looking landing page that reflects positively on your startup. You can attract potential customers and investors by presenting your business in the best light.\n\n### Elevate Your Startup Landing Page with Magic UI\n\n[Magic UI](https://magicui.design/) is a valuable tool for startups looking to set up their landing pages for success. Magic UI helps you build a winning landing page that drives results by:\n\n- Simplifying the creation process\n- Optimizing for conversions\n- Highlighting your startup's best features\n- Improving user experience\n- Creating a professional online presence\n\nStart using Magic UI today and take your startup to the next level!\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with [MagicUI Pro](https://pro.magicui.design/), you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today - [https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup).\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-border-radius.mdx",
    "content": "---\ntitle: \"How to set Border Radius in Tailwind using React and Typescript\"\ndescription: \"Learn how to set border radius in Tailwind using React and Typescript with this comprehensive guide.\"\nimage: https://cdn.magicui.design/assets/d71b5583-8832-4504-978d-f6f635d23d73.png\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\npublishedOn: \"2024-06-03\"\nfeatured: false\n---\n\nHumans love circles. [According to BBC Science](https://www.sciencefocus.com/science/why-do-we-find-circles-so-beautiful), soft corners give off a feeling of safety, whereas sharp corners suggest threat and injury. It's no wonder that this phenomenon has surfaced in modern web design, where users highly prefer rounded elements over sharp ones.\n\nDo you ever look at a site from pre-2010 and gasp at the sharp buttons all over the place? Yep, me too. If you can master the border-radius, you can up-level your designs in minutes. Tailwind makes this even easier.\n\nIn this blog post, I'll guide you through setting border-radius in Tailwind using React. Whether you're a seasoned developer or just starting out, this guide will help you effortlessly create visually appealing and consistent designs.\n\n## What is Border Radius in Tailwind CSS?\n\nTailwind provides utility classes out of the box to apply [CSS' border-radius property](https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius). Typically, you can apply any pixel amount of rounding, but Tailwind provides a common set that really helps with consistency across your designs.\n\nThese include:\n\n- `rounded` - Applies a small border radius.\n- `rounded-lg` - Applies a larger border radius.\n- `rounded-full` - Makes the element a perfect circle if its height and width are equal.\n- `rounded-none` - Removes all rounded styling from the element. Best used when you want to override base roundedness on hover or responsive screen width change.\n\n## Setting Up Tailwind CSS in a React Project\n\nFirst, make sure that your React project has Tailwind CSS properly configured. Need help? We've written a full step-by-step guide on [how to install all the necessary packages for React here](/blog/install-tailwind-react).\n\n## Create a React Button component\n\nLet's add a button to the `App.tsx`. We will apply just the base level of roundedness with `rounded`.\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex-rows flex h-screen w-full items-center justify-center gap-4 bg-gray-100\">\n      <button className=\"rounded bg-blue-500 px-4 py-2 text-white\">\n        'rounded'\n      </button>\n    </div>\n  )\n}\nexport default App\n```\n\nWhen rendered, this is what the button looks like - very aesthetically pleasing, right?\n\n![4 Tailwind buttons with varying border radius](https://cdn.magicui.design/assets/sh6gjuuht5.png)\n\nLet's add more rounded variations and see side-by-side how they compare.\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex-rows flex h-screen w-full items-center justify-center gap-4 bg-gray-100\">\n      <button className=\"bg-blue-500 px-4 py-2 text-white\">\n        No Round Corners\n      </button>\n      <button className=\"rounded bg-blue-500 px-4 py-2 text-white\">\n        'rounded' Corners\n      </button>\n      <button className=\"rounded-md bg-blue-500 px-4 py-2 text-white\">\n        'rounded-md' Corners\n      </button>\n      <button className=\"rounded-full bg-blue-500 px-4 py-2 text-white\">\n        'rounded-full' Corners\n      </button>\n    </div>\n  )\n}\nexport default App\n```\n\nNotice the different rounded utility classes added to each button element.\n\n![4 Tailwind buttons with varying border radius](https://cdn.magicui.design/assets/4hgdkrd90qv.png)\n\n## Modify Border Radius on hover\n\nWhen creating complex layouts, you can add more interactivity to your elements by modifying the border radius on hover.\n\nHere's a sample React card that has `rounded-lg` applied at the start but when the user hovers over it, it changes to `rounded-none` giving the element sharp edges.\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex-rows flex h-screen w-full items-center justify-center gap-4 bg-gray-100\">\n      <div className=\"rounded-lg bg-white p-6 shadow-md hover:rounded-none\">\n        <h2 className=\"text-xl font-bold\">Card Title</h2>\n        <p className=\"text-gray-700\">This is a card with a border radius.</p>\n      </div>\n    </div>\n  )\n}\nexport default App\n```\n\nThis is what it looks like when rendered:\n\n![4 Tailwind buttons with varying border radius](https://cdn.magicui.design/assets/n88hvbhn9k.png)\n\n## Creating Responsive Design\n\nAs with all the classes in Tailwind, you can apply different rounded classes based on what width screen the user is on.\n\nFor smaller screens, the card below will have medium roundedness applied. It will switch to Large [at the Medium breakpoint](https://tailwindcss.com/docs/screens) and then stay Extra Large for all of the bigger screens.\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex-rows flex h-screen w-full items-center justify-center gap-4 bg-gray-100\">\n      <div className=\"rounded-md bg-white p-6 shadow-md md:rounded-lg lg:rounded-xl\">\n        <h2 className=\"text-xl font-bold\">Responsive Card Title</h2>\n        <p className=\"text-gray-700\">\n          This card adjusts its border radius based on the screen size.\n        </p>\n      </div>\n    </div>\n  )\n}\nexport default App\n```\n\n## Next Steps\n\nNow that you've learned how to set border radius in Tailwind using React, it's time to put that knowledge to use. Here are a few ideas to help you continue building your skills:\n\n- Experiment with Different Border Radii: Try out different values for the border-radius classes like `rounded-lg`, `rounded-full`, or `rounded-md`. See how they change the look of your components.\n\n- Combine with Other Tailwind Classes: Mix and match border radius with other Tailwind classes such as padding, margin, and colors. This will give you a better sense of how different utilities work together.\n\n- Create Custom Components: Use your new skills to create reusable React components with different border radii. We have written guides on using [Grid](https://magicui.design/blog/tailwind-css-grid) and [Font Sizes](https://magicui.design/blog/tailwind-font-size) in React that you can explore.\n\n- Practice by Building a Project: Start a small project, like a personal portfolio or a simple web app. Apply what you've learned about border radius in a real-world scenario.\n\n- Share Your Work: Post your creations on platforms like GitHub, CodePen, or your personal blog. Getting feedback from others can help you improve and learn new tricks.\n\nKeep experimenting and building, and you'll become more comfortable using Tailwind with React in no time. Happy coding!\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-cdn-html.mdx",
    "content": "---\ntitle: \"How to install Tailwind from a CDN in HTML\"\ndescription: \"Installing Tailwind is the easiest way to get started, especially if you're looking to create your first Tailwind CSS project.\"\nimage: https://cdn.magicui.design/assets/aca37764-b078-45e3-bfa8-4da9805bfb7a.png\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\npublishedOn: \"2024-05-28\"\nfeatured: false\n---\n\nHave you ever found yourself lost in the sea of CSS frameworks, wondering which one to choose for your next project? I certainly have. A few months ago, I was working on a personal project and needed a CSS framework that was both powerful and easy to use. That's when I stumbled upon Tailwind CSS.\n\nBut here's the kicker: I didn't want to go through the hassle of installing it via npm or any other package manager. I needed something quick and straightforward. That's when I discovered the magic of using a CDN.\n\nIf you're like me and want to get up and running with Tailwind CSS without any fuss, you're in the right place.\n\nIn this post, we'll walk you through the steps to install Tailwind from a CDN directly into your HTML file. We'll cover everything from adding the CDN link to your HTML, verifying the installation, and even some basic usage of Tailwind classes.\n\nReady to dive in? Let's get started!\n\n## What is Tailwind?\n\n[Tailwind CSS](https://tailwindui.com/) is a utility-first CSS framework that provides low-level utility classes for building custom designs without writing CSS from scratch. It offers a unique approach to styling by using utility classes directly in your HTML.\n\n- You don't have to create or manage CSS files\n- You don't have to create a design system\n- Your UI looks much more cohesive because of Tailwind's predefined set of styling classes\n\n## What is a CDN and why install Tailwind from a CDN?\n\nUsing a CDN (Content Delivery Network) for Tailwind CSS has several benefits. It ensures faster load times because the CDN servers are distributed globally. This means users will download the CSS from the nearest server, reducing latency. Additionally, CDNs often have optimized caching mechanisms, which further enhance performance.\n\nIt's crucial to use the official Tailwind CDN to ensure you're getting the library's latest and most secure version. This also guarantees compatibility with the documentation and other resources.\n\nIn this post, you will learn how to install Tailwind from a CDN in your HTML file, verify the installation, use basic Tailwind classes, and troubleshoot common issues.\n\n## Adding Tailwind CDN to Your HTML File\n\nFirst, open your HTML file in a text editor of your choice. This could be anything from Notepad to Visual Studio Code.\n\nNext, you need to place the Tailwind CDN link in the `<head>` section of your HTML file. This ensures that Tailwind CSS is loaded before any content is rendered.\n\nHere’s an example of what your HTML snippet should look like with the Tailwind CDN link included:\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Tailwind CDN Example</title>\n    <script src=\"https://cdn.tailwindcss.com\"></script>\n  </head>\n  <body>\n    <!-- Your content goes here -->\n  </body>\n</html>\n```\n\nSee related:\n\n- [How to install Tailwind using React](/blog/install-tailwind-react)\n- [How to create a grid layout in Tailwind with React](/blog/tailwind-css-grid)\n\n## Verifying Tailwind Installation\n\nAfter adding the CDN link, save your HTML file. Open the file in a web browser to check if Tailwind CSS is loaded correctly.\n\nYou can inspect the page to ensure Tailwind CSS is applied. Right-click on the page and select \"Inspect\" or \"Inspect Element\" depending on your browser. Look for the `<link>` tag in the `<head>` section. It should point to the Tailwind CDN URL you added.\n\nTo further verify, you can add a simple Tailwind class to an element and see if the styles are applied. For example, add a `<div>` with a `bg-blue-500` class and check if it has a blue background.\n\n## Create your first HTML page with Tailwind CSS\n\nNow that Tailwind CSS is installed, you can use its utility classes to style your elements.\n\nCreate a basic HTML structure with some elements. Here’s an example:\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Tailwind CDN Example</title>\n    <script src=\"https://cdn.tailwindcss.com\"></script>\n  </head>\n  <body>\n    <div class=\"container mx-auto p-4\">\n      <h1 class=\"text-center text-4xl font-bold text-gray-800\">\n        Hello, Tailwind!\n      </h1>\n      <p class=\"mt-4 text-lg text-gray-600\">\n        This is a paragraph styled with Tailwind CSS.\n      </p>\n      <button class=\"mt-4 rounded bg-blue-500 px-4 py-2 text-white\">\n        Click Me\n      </button>\n    </div>\n  </body>\n</html>\n```\n\nIn this example, we have a container with padding and centered text. The heading uses utility classes for font size, weight, and colour. The paragraph and button also use Tailwind classes for styling.\n\n## Troubleshooting Common Issues\n\nIf you encounter issues, here are some common troubleshooting steps:\n\n1.  **Check CDN Link Placement**: Ensure the Tailwind CDN link is correctly placed within the `<head>` section.\n2.  **Syntax Errors**: Verify that your HTML file does not contain syntax errors. Even a small mistake can prevent styles from being applied.\n3.  **Clear Browser Cache**: Sometimes, changes may not be visible due to cached files. Clear your browser cache and refresh the page to see the latest changes.\n4.  **Inspect Element**: Use the browser's inspect tool to check if the Tailwind CSS file is loaded. Look for the `<link>` tag pointing to the Tailwind CDN.\n\n## Next Steps\n\nNow that you have Tailwind CSS installed via CDN and understand the basics, you can explore more advanced features. Dive into the Tailwind documentation to learn about responsive design, custom configurations, and more. Experiment with different utility classes to create unique designs.\n\nConsider integrating Tailwind with JavaScript frameworks like React or Vue for dynamic applications.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-button.mdx",
    "content": "---\ntitle: A Practical Guide to the Tailwind CSS Button\ndescription: >-\n  Build responsive, accessible, and beautiful Tailwind CSS buttons. Learn\n  styling, states, variants, and component abstraction with real-world examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-f65b98b1-ad25-42fb-ade7-bed2b34beb30.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css button\n  - tailwind css\n  - css buttons\n  - react components\n  - frontend development\npublishedOn: \"2025-10-31T09:13:21.42137+00:00\"\nfeatured: true\n---\n\nBuilding a **Tailwind CSS button** is one of those \"aha!\" moments where the power of a utility-first workflow really clicks. Instead of jumping back and forth between your HTML and a separate CSS file, you're building, styling, and polishing elements right in your markup. This keeps everything in one place, making the whole process faster and way more intuitive.\n\n## Crafting Your First Tailwind CSS Button\n\n![A stylized Tailwind CSS button with a gradient background and a subtle shadow, representing a polished final product.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3b01c4ad-efa2-4e44-82ce-8e91dfab0a69.jpg)\n\nThe best way to get a feel for this is to just dive in and build one. We'll start with a completely naked `<button>` element and layer on Tailwind's utility classes one by one to see how it comes to life.\n\nFirst things first, make sure your project is set up with Tailwind. If you're starting from scratch or just need a quick refresher, our guide on how to [install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) will get you up and running in no time.\n\n### From Plain HTML to a Styled Button\n\nAlright, let's say this is what you're starting with in your component. It works, but it's not exactly inspiring.\n\n<button>Click Me</button>\n\nOur mission is to turn that into a professional-looking primary button. We'll do it by stringing together a few utility classes directly inside the `<button>` tag. Each class has a single, clear job.\n\nHere’s a quick look at the core utilities that will get us started.\n\n### Core Utilities for Your First Button\n\nThis table breaks down the essential classes we'll be using to style our button from the ground up. Think of it as your cheat sheet for the basics.\n\n| Utility Class   | Purpose                                              | Example Usage                           |\n| :-------------- | :--------------------------------------------------- | :-------------------------------------- |\n| `py-2` / `px-4` | Sets vertical and horizontal padding, respectively   | `<button className=\"py-2 px-4\">...`     |\n| `bg-indigo-600` | Applies a specific background color from the palette | `<button className=\"bg-indigo-600\">...` |\n| `text-white`    | Sets the text color                                  | `<button className=\"text-white\">...`    |\n| `font-semibold` | Increases the font weight for better emphasis        | `<button className=\"font-semibold\">...` |\n| `rounded-lg`    | Adds rounded corners for a softer, modern look       | `<button className=\"rounded-lg\">...`    |\n| `shadow-md`     | Applies a medium box-shadow for a subtle lift        | `<button className=\"shadow-md\">...`     |\n\nBy combining these simple, single-purpose classes, you can build complex styles without ever leaving your HTML file. That's the magic of the utility-first approach.\n\n### The Final Code in Action\n\nOnce we apply all those classes, our button's code will look like this. Yes, the `className` is longer, but it's also incredibly descriptive. Anyone—including your future self—can look at this markup and know _exactly_ how the button is styled without needing to hunt down a separate stylesheet.\n\n<button className=\"rounded-lg bg-indigo-600 px-4 py-2 font-semibold text-white shadow-md\">\n  Click Me\n</button>\n\nAnd just like that, you've created your first real **Tailwind CSS button**. This simple exercise covers the fundamental workflow and gives you a solid foundation for the fun stuff we'll get into next, like handling hover states and creating reusable button components.\n\n## Bringing Buttons to Life with States and Variants\n\n![A grid of different button styles and states, including primary, secondary, and disabled, showing visual feedback.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0b9feb9e-c21d-431e-86be-c8465802535f.jpg)\n\nA static button is a missed opportunity. It leaves users wondering, \"Is this thing clickable?\" To build an interface that feels responsive and alive, your buttons need to give immediate visual feedback. This is where Tailwind's state modifiers absolutely shine, letting you style interactions like hover, focus, and clicks right in your HTML.\n\nThese modifiers are just simple prefixes you add to any utility class. For instance, `hover:bg-indigo-700` applies a darker background, but _only_ when the user’s cursor hovers over the button. It's a tiny tweak, but it makes a world of difference in the user experience, signaling that the element is interactive and ready to go.\n\n### Styling Common Button States\n\nLet's take the button we just built and give it some personality by styling the most common user interactions. The name of the game is clear, consistent feedback for every state.\n\n- **Hover State (`hover:`):** This is the one you'll see most often. A simple, effective approach is to slightly darken the background color, which acknowledges the user's intent to click.\n- **Active State (`active:`):** This fires the moment the button is clicked. A subtle transform, like a one-pixel downward shift (`active:translate-y-px`), gives that satisfying \"pressed\" feeling and confirms the action.\n- **Focus State (`focus:`):** Absolutely critical for accessibility. This state lets keyboard navigators know exactly which element is selected. We'll add a visible ring around the button to make it crystal clear.\n- **Disabled State (`disabled:`):** When a button isn't usable, it should look the part. We can make it appear faded and, importantly, disable pointer events to stop any clicks.\n\nHere’s an updated React MDX snippet that puts these modifiers into practice.\n\n<button className=\"rounded-lg bg-indigo-600 px-4 py-2 font-semibold text-white shadow-md hover:bg-indigo-700 focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 focus:outline-none active:translate-y-px active:bg-indigo-800 disabled:cursor-not-allowed disabled:opacity-50\">\n  Click Me\n</button>\n\n> **Pro Tip:** Never, ever skip the `focus` state. It's not just a \"nice-to-have\" for accessibility; it's a fundamental part of building a keyboard-friendly website. Forgetting it can lock out a huge number of your users.\n\n### Creating Practical Button Variants\n\nMost apps need more than one button style. You need a clear visual hierarchy to guide users toward the most important actions. This usually means creating a set of variants, like primary, secondary, and destructive buttons.\n\nYou can define these styles by simply mixing and matching Tailwind's utility classes.\n\n- **Primary Button:** This is your main call-to-action. Think bold, high-contrast, and attention-grabbing.\n- **Secondary Button:** For less critical actions. It's often styled with a lighter background or just an outline to take a backseat to the primary button.\n- **Destructive Button:** Save this one for actions like \"Delete\" or \"Cancel.\" A red color scheme is the universal signal for caution.\n\nFor example, a secondary button might use `bg-gray-200 text-gray-800`, while a destructive one could be `bg-red-600 text-white`. A great next step is to build out a complete set of interactive states for each variant. If you want to get really creative, you can find some great ideas for an [interactive hover button](https://magicui.design/docs/components/interactive-hover-button).\n\nBy combining state modifiers with a thoughtful set of variants, your **tailwind css button** components become a powerful and intuitive part of your application's design system.\n\n## Building Advanced and Accessible Buttons\n\n![A close-up of a button with an icon and gradient, symbolizing advanced styling and accessibility considerations.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/101d98e1-85c7-4cae-b57d-e755eaf483a5.jpg)\n\nOnce you’ve nailed the basics, you can start getting creative. Moving beyond standard colors and states opens up a world of possibilities for your Tailwind CSS buttons. Adding things like SVG icons or subtle gradients can really level up your design, making the UI feel more intuitive and look more polished.\n\nThese aren't just cosmetic tweaks, either. They serve a real purpose.\n\nFor instance, sticking a small \"arrow right\" icon inside a \"Learn More\" button clearly signals forward movement. A trash can icon on a delete button? It instantly reinforces the action. This pairing of text and imagery actually reduces cognitive load for your users, letting them process what to do next much faster.\n\n### Integrating SVG Icons\n\nIcons are everywhere in modern UIs, and for good reason. Libraries like [Heroicons](https://heroicons.com/) make dropping them into your buttons dead simple. You just embed the SVG markup right inside your button element and use Tailwind's utilities to handle the size, color, and spacing.\n\nHere’s what that looks like in practice—a simple \"Submit\" button with a leading icon:\n\n<button className=\"inline-flex items-center gap-2 rounded-lg bg-blue-600 px-4 py-2 font-semibold text-white shadow-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:outline-none\">\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className=\"h-5 w-5\"\n    viewBox=\"0 0 20 20\"\n    fill=\"currentColor\"\n  >\n    <path\n      fillRule=\"evenodd\"\n      d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n      clipRule=\"evenodd\"\n    />\n  </svg>\n  <span>Submit</span>\n</button>\n\nThe magic happens with `inline-flex`, `items-center`, and `gap-2`. These three classes perfectly align the icon with the text and add just the right amount of breathing room between them.\n\n### Prioritizing Accessibility for All Users\n\nA beautiful button is only half the battle. If it’s not usable by everyone, including people who rely on assistive tech, it’s a failure. Accessibility isn’t a feature you tack on at the end; it’s a fundamental part of professional web development.\n\n> Making your web components accessible from the start saves significant time and effort down the line. It ensures your product serves the widest possible audience and complies with critical web standards.\n\nHere are a few essential practices you should build into every single button you create with Tailwind:\n\n- **Use `focus-visible`:** The default `focus:` outline is helpful for keyboard users but can be a visual distraction for mouse users. The `focus-visible:` variant is the perfect solution—it **only applies focus styles during keyboard navigation**, which creates a much cleaner experience for everyone.\n- **Check Color Contrast:** Your text has to be readable against its background. Aim for a contrast ratio of at least **4.5:1** for normal-sized text. Tools like the [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) are great for quickly verifying your color palette.\n- **Add ARIA Attributes for Icon-Only Buttons:** If a button has no text, a screen reader won't know what it’s for. Use the `aria-label` attribute to give it a descriptive name, like `<button aria-label=\"Close\">...</button>`.\n\nThinking about the user experience doesn't stop with a single button, of course. It's always a good idea to [explore broader user experience design best practices](https://www.baslondigital.com/post/10-user-experience-design-best-practices-for-2025) to see how these small interactions fit into the bigger picture of creating intuitive and inclusive products.\n\n## Getting Your Buttons to Perform at Their Peak\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/-7mh0ez0OFU\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nA visually stunning **Tailwind CSS button** is only half the battle. If you've been in web development for any length of time, you know that performance is a feature, not an afterthought. It directly impacts everything from user experience to conversion rates.\n\nSlow-loading styles can cause frustrating layout shifts and make an otherwise great site feel sluggish. This is exactly where Tailwind’s performance-first approach really shines.\n\nThe secret sauce is its **Just-In-Time (JIT) compiler**. This engine is a game-changer. It scans your HTML, JavaScript components, and any other template files on the fly, looking for every single utility class you use. When it's time to build for production, it generates a CSS file with _only_ the styles you actually need. No bloat.\n\n### Smart Configuration for Maximum Performance\n\nTo get the most out of the JIT engine, you have to point it in the right direction. This all happens in your `tailwind.config.js` file, specifically inside the `content` array.\n\nBy giving it precise paths to your template files, you make sure the compiler scans every class you've used without wasting time on directories it doesn't need to see.\n\nA typical setup for a Next.js project, for example, might look like this:\n\n```ts\n/** @type {import('tailwindcss').Config} \\*/\nmodule.exports = {\n  content: [\n    \"./src/pages/**/_.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/\\*\\*/_.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/\\*_/_.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nKeeping these paths clean and accurate is a simple but incredibly powerful way to guarantee a lean, optimized build every time.\n\n### The HTML vs. CSS Performance Question\n\nI get this question a lot: don't all those utility classes in the HTML hurt performance? While it’s true that your HTML file size increases slightly, the tradeoff is a massive win for performance.\n\nBecause Tailwind purges every unused style, the final CSS file is tiny—often **under 10 kB** for most sites. That’s a huge reduction compared to traditional CSS frameworks. If you want to dive deeper, you can find a great [in-depth performance analysis](https://www.developerway.com/posts/tailwind-vs-linaria-performance) that breaks down how this approach leads to smaller CSS payloads.\n\n> In the world of modern web performance, a tiny, highly-cacheable CSS file is far more valuable than a slightly smaller HTML document. Faster CSS parsing means your page becomes interactive sooner, which is a metric that directly impacts user satisfaction.\n\nAt the end of the day, true performance is about more than just file size. It’s about how your design choices influence user behavior. To really get the most out of your buttons, you should combine Tailwind's technical efficiency with broader [conversion rate optimization tips](https://raven-seo.com/conversion-rate-optimization-tips/). That’s how you build buttons that aren’t just fast, but also incredibly effective.\n\n## Creating Reusable Button Components\n\n![A developer's screen showing a reusable React button component code, symbolizing abstraction and maintainability.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/163ae534-de04-429f-9c25-de85225bcc8b.jpg)\n\nIf you find yourself manually copying and pasting long strings of utility classes for every button, it's time to rethink your strategy. That approach is a recipe for disaster—it’s tedious, prone to typos, and makes updating your site’s design an absolute nightmare.\n\nThe real power of Tailwind CSS isn't just in styling individual elements; it’s in abstracting those styles into reusable components. This is the leap from a hobby project to a professional, scalable application.\n\nYou see this component-first mindset everywhere. Big players like Netflix and GitHub use Tailwind's utilities to build and maintain their design systems. It's no surprise that community surveys show over **60%** of new React projects now see Tailwind as a go-to styling solution, signaling a major industry shift toward component-driven architecture.\n\n### Building a Flexible Button Component\n\nLet's walk through creating a foundational `<Button>` component using React and JSX. The goal is simple: build one component that can handle multiple styles and sizes through props, instead of hardcoding classes for every single variation. This is how you keep your code DRY (Don't Repeat Yourself) and your design consistent.\n\nWe'll set up our component to accept props for `variant` (like `primary` or `secondary`), `size` (`sm`, `md`, or `lg`), and pass along any other standard button attributes with the `...props` spread operator. This structure gives us a component that is both powerful and incredibly easy to use.\n\nHere’s the basic skeleton:\n\n```tsx\n// A basic structure for a reusable Button component\nfunction Button({ children, variant = 'primary', size = 'md', ...props }) {\n// We'll add class logic here\nconst baseClasses = 'font-semibold rounded-lg shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2';\n\n// The final className will be built conditionally\nreturn (\n\n<button className={...} {...props}>\n{children}\n</button>\n);\n}\n```\n\nThis is our starting point. We've got a set of base styles that apply to _every_ button. Now, we just need a clean way to manage the classes that change based on the `variant` and `size` props we pass in.\n\n### Managing Classes with `clsx`\n\nOnce you start dealing with conditional classes, string concatenation can get messy—fast. This is where a tiny utility library like `clsx` (or its cousin, `classnames`) becomes a lifesaver. It gives you a clean, declarative way to combine class names, especially when some of them are conditional.\n\nAnother fantastic tool to have in your arsenal is `tailwind-merge`. This utility intelligently merges your Tailwind classes, so you don't have to worry about style conflicts. For instance, it understands that you can't have both `px-2` and `px-4` active at the same time and will correctly apply the last one in the sequence. It's a small detail that prevents a lot of headaches.\n\nLet’s bring these tools together to flesh out our component's logic.\n\n> By abstracting your styling logic into components, you create a \"single source of truth.\" Need to change your primary button color? You only have to update it in one place, and that change will instantly ripple across your entire application.\n\nHere’s the finished `Button` component, fully equipped to handle variants and sizes gracefully. If you're looking for more real-world examples, exploring a high-quality **[Tailwind CSS component library](https://magicui.design/blog/tailwind-css-component-library)** can show you just how powerful this pattern is.\n\n```tsx\nimport { clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nfunction Button({\n  children,\n  variant = \"primary\",\n  size = \"md\",\n  className,\n  ...props\n}) {\n  const baseClasses =\n    \"font-semibold rounded-lg shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors\"\n\n  const variantClasses = {\n    primary:\n      \"bg-indigo-600 text-white hover:bg-indigo-700 focus:ring-indigo-500\",\n    secondary:\n      \"bg-gray-200 text-gray-800 hover:bg-gray-300 focus:ring-gray-500\",\n  }\n\n  const sizeClasses = {\n    sm: \"py-1 px-3 text-sm\",\n    md: \"py-2 px-4 text-base\",\n    lg: \"py-3 px-6 text-lg\",\n  }\n\n  const finalClasses = twMerge(\n    clsx(baseClasses, variantClasses[variant], sizeClasses[size], className)\n  )\n\n  return (\n    <button className={finalClasses} {...props}>\n      {children}\n    </button>\n  )\n}\n```\n\nAnd there you have it. This reusable `Button` component is now the foundation for a scalable, maintainable UI system. You can call it anywhere in your app, pass a few props, and get a perfectly styled, consistent button every time.\n\n## Common Questions About Tailwind Buttons\n\nAs you get your hands dirty with Tailwind, you'll inevitably run into a few common questions, especially when it comes to customization and performance. Nailing down the answers to these will really solidify your understanding and just make you a better, more efficient developer. Let's walk through some of the things people often ask when building a **Tailwind CSS button**.\n\nMost of these questions circle around how to extend the framework, keep larger projects from becoming a mess, and what the real-world performance impact of the utility-first approach actually is.\n\n### How Do I Apply Custom Styles or Animations?\n\nThis is usually one of the first walls developers hit. What do you do when the default theme doesn't have that _exact_ brand color or the specific animation you need for a button? Luckily, Tailwind gives you a few great ways to tackle this.\n\nFor a quick, one-off custom value, you can lean on arbitrary value syntax right in your HTML. This is perfect for a unique color that isn't a core part of your design system.\n\n<button className=\"rounded bg-[#1da1f2] p-2 text-white\">Follow on X</button>\n\nBut for more systematic changes, like adding a new hover animation you'll use everywhere, the best practice is to extend your theme. You can define custom `keyframes` and `animation` utilities directly in your `tailwind.config.js` file. This is powerful because it makes your custom styles available as utility classes, just like any of Tailwind's built-in options.\n\n> The cleanest, most maintainable way to handle complex custom styles is by using the `@apply` directive in your main CSS file. It lets you bundle a bunch of utilities under one custom class name, keeping your HTML tidy while still using Tailwind's design system.\n\n### What Is the Best Way to Manage Button Variants?\n\nIn any real project, you're going to need more than one button style. Think primary, secondary, destructive, and so on. Keeping these consistent is the secret to a professional-looking app.\n\nThe single best strategy here is to create a reusable button component.\n\n- **Centralize Your Logic:** A single component becomes the \"source of truth\" for what a button looks and feels like.\n- **Use Props for Variants:** You can pass props like `variant=\"primary\"` or `size=\"lg\"` to conditionally swap out the right classes.\n- **Guarantee Consistency:** Need to change the primary button color? You only have to edit one file, and that change ripples through your entire application instantly.\n\nTo take this a step further, I highly recommend using a couple of small utility libraries: `clsx` for conditionally applying classes and `tailwind-merge` to intelligently handle class conflicts. This combination is pretty much the industry standard for building robust, scalable component systems that don't break.\n\n### Does Using So Many Utility Classes Hurt Performance?\n\nIt’s a fair question. Seeing that long string of classes in your HTML can make you wonder if you're bloating the final file size. The reality, though, is that the performance impact is usually tiny—and in many cases, it's actually a net positive.\n\nThe magic here is Tailwind's JIT (Just-In-Time) compiler. It scans all your files—HTML, JS, JSX, you name it—and generates a CSS file containing **only the classes you've actually used**. This process results in a shockingly small production CSS file, which is a huge win for performance.\n\nBrowsers can parse and apply a tiny CSS file way faster, leading to a quicker first contentful paint. The slight increase in HTML size is a tiny trade-off for a site that renders significantly faster for the end user.\n\n---\n\nReady to build stunning, high-performance UIs without the headache? Explore the component library at **Magic UI** and discover over 150 free and open-source animated components to bring your projects to life. Find your next component at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-component-library.mdx",
    "content": "---\ntitle: \"Choosing a Tailwind CSS Component Library\"\ndescription: \"Discover the best Tailwind CSS component library for your project. Learn how to choose, integrate, and customize components to build stunning UIs faster.\"\nimage: https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-16b461bd-520f-4bbb-ba7a-fa11bc858a2e.jpg\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\n  - Component Library\npublishedOn: \"2025-09-17\"\nfeatured: true\n---\n\nSo, what exactly is a **Tailwind CSS component library**? At its core, it’s a ready-made collection of UI elements like buttons, cards, and navigation bars, all built with Tailwind's utility classes. This lets you _build custom interfaces much faster_ by skipping the tedious process of coding common elements from scratch. You get the speed of pre-built components combined with the unmatched flexibility of a utility-first framework.\n\n## How Tailwind Component Libraries Put Your Development on the Fast Track\n\nEvery developer knows the feeling: you’re staring at a blank screen with a deadline breathing down your neck. While raw [Tailwind CSS](https://tailwindcss.com/) is incredibly powerful, it's like being handed a giant box of individual Lego bricks. You have the freedom to build absolutely anything, but you have to assemble every single piece from the ground up. It’s flexible, sure, but it can be a real time-sink, especially for standard UI patterns you've built a hundred times before.\n\nThis is where a **Tailwind CSS component library** completely changes the game. Think of it less like loose bricks and more like a collection of expertly designed, pre-assembled Lego kits. Instead of building a car one tiny piece at a time, you get a pre-built chassis, wheels, and a steering mechanism. You can snap them together instantly and then customize everything to your heart's content.\n\n### The Best of Both Worlds\n\nThese libraries give you fully-functional modules like navigation bars, forms, and modals that you can drop straight into your project. This alone saves countless hours. But here's the magic: unlike traditional UI kits that lock you into their specific design, every component is made from Tailwind's utility classes. That means you keep total creative control. You can tweak every color, adjust every pixel of spacing, and modify any detail right in your HTML.\n\n> A component library isn't a shortcut that sacrifices quality. It's a strategic accelerator that empowers you to build beautiful, consistent, and maintainable user interfaces way faster than you could on your own.\n\n### A Smarter Way to Build UIs\n\nThe utility-first approach has taken the web development world by storm, and for good reason. Tailwind CSS has seen massive growth, quickly establishing itself as a powerhouse alongside giants like Bootstrap. Its appeal is simple: incredible design flexibility and top-tier performance. It’s no surprise that major companies like Netflix and GitHub now use Tailwind, citing huge boosts in developer productivity and faster load times from smaller CSS files. You can learn more about [Tailwind's growing influence on aynsoft.com](https://aynsoft.com/tailwind-css-trends-in-2025-revolutionizing-modern-web-design/).\n\nWhen you use a **tailwind css component library**, you’re plugging into this efficiency multiplier. You aren't just building faster; you're building smarter. You're using a system that encourages consistency and scales effortlessly across your entire application. This frees you up to focus on what really matters: solving unique business problems and creating an amazing experience for your users.\n\n## Understanding What a Component Library Really Is\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8ee7163e-c121-42f5-9a67-591a0ef77101.jpg)\n\nTo really get why a **Tailwind CSS component library** is such a big deal, you have to understand how it breaks from the old way of doing things, like with traditional UI kits such as Bootstrap. In the past, grabbing a UI kit meant you were adopting its entire pre-styled world. You’d get a decent-looking button, sure, but it came with its own opinionated CSS file that you constantly had to fight just to make small changes.\n\nA Tailwind component library throws that whole model out the window. Instead of shipping components with their own external stylesheets, it gives you building blocks made _entirely_ with Tailwind's utility classes. Every button, modal, or card is just a self-contained chunk of HTML, styled directly with classes like `bg-blue-500`, `p-4`, and `rounded-lg`.\n\nThis small change has massive implications. Customization becomes completely native. You aren't wrestling with overrides in a separate CSS file; you're just changing the utility classes right in your HTML. Want a green button instead of a blue one? You just swap `bg-blue-500` for `bg-green-500`. It’s a direct, intuitive workflow that puts you back in control.\n\n### Unstyled Components: The Secret Sauce\n\nMany modern Tailwind libraries take this a step further with \"headless\" or \"unstyled\" components. The idea might sound a little strange at first—why would anyone want a component with no style? The magic lies in separating a component's _behavior_ from its _appearance_.\n\nThink about a dropdown menu. The logic behind it is pretty complex. It needs to:\n\n- Manage its own open and close state.\n- Handle keyboard navigation for accessibility.\n- Close itself when you click somewhere else on the page.\n\nAn unstyled component handles all of that tricky logic for you but leaves the visual styling completely blank. It provides a functional skeleton, and you get to decide exactly how it looks using your own Tailwind classes.\n\n> This approach gives you the best of both worlds: you get the convenience of pre-built functionality and the complete design freedom that made you love Tailwind in the first place. It's a huge head start without ever forcing your project into a generic mold.\n\nThis separation is a game-changer for building truly unique interfaces. It saves you from reinventing the wheel for common UI patterns while making sure your final product looks nothing like a template. You can dive deeper by reading our detailed guide on [what a component library is](https://magicui.design/blog/what-is-a-component-library) and how it fits into a modern developer's workflow.\n\n### The True Meaning of Customization\n\nWith traditional UI kits, \"customization\" often meant tweaking a handful of predefined variables. The core design language was already baked in. If you tried to stray too far, you risked breaking the whole system, which usually led to a frustrating game of CSS overrides and `!important` tags.\n\nIn the Tailwind ecosystem, every component is inherently yours to shape. The library gives you a well-structured starting point, but the final design is a direct result of the utility classes you choose to apply. This makes building a unique and consistent design system not just possible, but surprisingly straightforward. It empowers you to translate a designer’s vision into pixel-perfect reality without wrestling with someone else's CSS.\n\n## What Makes a Great Tailwind CSS Component Library?\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fddcd8f9-e68f-462a-a558-363a29d69d0f.jpg)\n\nDiving into the world of Tailwind CSS component libraries can feel like a lot. There are so many options out there, but they are definitely not all created equal. Picking the right one is a big deal—it affects your project's health and your sanity down the line.\n\nThink of it like choosing a set of high-quality power tools versus a cheap, generic toolkit. One set is built to last, with every tool feeling right in your hand and doing its job perfectly. The other might look the part, but you'll spend more time fighting with it than building with it.\n\nTo make the right call, we need to look past the flashy demos. We’ll break down the three pillars that separate an average **tailwind css component library** from a truly exceptional one: rock-solid accessibility, deep customizability, and documentation that actually helps. This is your checklist for finding a library that's powerful, easy to maintain, and a genuine joy to use.\n\nWhen you're shopping around, it's easy to get lost in the details. This quick-reference table breaks down the non-negotiable features every top-tier library should have, why they're so important, and what you should be looking for.\n\n### Essential Features of Top-Tier Tailwind Component Libraries\n\n| Feature                    | Why It Matters                                                                                                                   | What to Look For                                                                                                                |\n| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |\n| **Built-in Accessibility** | It's not just a feature; it's a requirement for modern web development. It expands your user base and ensures legal compliance.  | Explicit mention of **WAI-ARIA standards**, full keyboard navigation support, semantic HTML, and logical focus management.      |\n| **Deep Customization**     | The whole point of Tailwind is control. Your library should enhance this, not restrict it. It prevents \"fighting the framework.\" | Components that are styled with utility classes, not complex custom CSS. Easy theming via `tailwind.config.js`.                 |\n| **Clear Documentation**    | A library is useless if you can't figure out how to use it. Good docs save you time, frustration, and headaches.                 | Live interactive previews, copy-paste code snippets for different component states, and a complete API reference for all props. |\n\nUltimately, a library built on these principles isn't just a collection of UI elements; it's a solid foundation for your entire project, setting you up for success from day one.\n\n### Built-In Accessibility Compliance\n\nLet's get one thing straight: accessibility isn't a \"nice-to-have.\" It’s a core requirement for building professional websites. A high-quality library has accessibility baked in from the very beginning, not sprinkled on top as an afterthought. This means every component is built to be used by everyone, including people who rely on screen readers or other assistive tech.\n\nLook for libraries that make a point of mentioning their compliance with **WAI-ARIA standards**. This is a clear signal that complex components like modals, dropdowns, and tabs are built correctly with the right roles and properties, so they actually work for all users.\n\n> A library with strong accessibility doesn't just help you meet legal requirements; it directly expands your potential user base. An accessible product is an inclusive product, and that's good for both people and business.\n\nAt a minimum, this includes:\n\n- **Keyboard Navigation:** Can you tab through and interact with every single button, link, and form field without touching a mouse? You should be able to.\n- **Semantic HTML:** Using the right tags for the job (`<button>`, `<nav>`, `<main>`) gives your site structure and meaning that assistive tech can understand.\n- **Proper Focus Management:** When a modal pops up, the keyboard focus should move into it—and return to where it was when the modal closes. This is a small detail that makes a huge difference.\n\n### Effortless Customization and Theming\n\nThe biggest reason developers flock to [Tailwind CSS](https://tailwindcss.com/) is for its incredible control over styling. A good component library gets this. It should never box you into a rigid design system you can't escape. It's supposed to be a starting point, not a creative straitjacket.\n\nThe best libraries make customization feel completely natural within the Tailwind ecosystem. You shouldn't have to write messy CSS overrides or fight with opinionated styles. Changing a button's color or a card's padding should be as simple as swapping a few utility classes in your markup.\n\nThis level of control has become the standard for professional development. By **2025**, Tailwind CSS has become a top choice for huge projects at companies like **Shopify**, **GitHub Next**, **NASA**, and **Loom**. They use its utility-first approach to build custom, high-performance UIs that scale, often relying on libraries that give them total styling freedom. You can dive deeper into some [top UI library picks for modern frameworks on varbintech.com](https://varbintech.com/blog/ui-component-libraries-5-must-try-picks-for-next-js-in-2025).\n\n### Comprehensive and Clear Documentation\n\nFinally, a component library is only as good as its documentation. A powerful tool is worthless if the instructions are confusing or incomplete. Top-tier docs are your trusted guide, making the development process smooth instead of a struggle.\n\nGood documentation goes way beyond just listing components. For every single element, you should be able to find:\n\n- **Live Previews:** Interactive examples that let you play with the component and see how it behaves.\n- **Code Snippets:** Clean, ready-to-go code for different variations and states that you can copy and paste right into your project.\n- **Props and API Reference:** A detailed breakdown of every available option and property for customization.\n- **Best Practices:** Helpful tips on how and when to use a component to create the best possible user experience.\n\nExcellent documentation is a massive time-saver and a clear sign that the library's creators care about the developer experience. It’s what empowers you to build amazing things without pulling your hair out.\n\nPicking the right **Tailwind CSS component library** is a huge decision. It basically sets the tone for your entire development workflow. This isn't about finding the one \"best\" library out there, but about finding the one that clicks with your project's specific goals, timeline, and even your team's vibe.\n\nNailing this choice upfront saves you from a world of headaches down the line. You're building a foundation, so you want to be sure it can support your vision, not hold it back.\n\nThe whole thing boils down to a few key questions. Are you throwing together a quick prototype where speed is everything? Or are you building a massive, enterprise-level app that needs to last for years? Even your team's comfort level with frameworks like React or Vue matters, since many libraries are built for specific ecosystems. A little honesty here goes a long way in pointing you to the right tool.\n\nThis decision tree gives you a simple mental model for how to approach this based on what you're building.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/03116f72-fd74-4217-a541-8722e59d56ab.jpg)\n\nAs you can see, quick-and-dirty prototypes can get away with a fast CDN setup. But for a real production app, you’ll want a proper NPM installation to fine-tune and optimize everything.\n\n### Styled vs. Headless Libraries\n\nAt the heart of this decision is a fundamental choice between two main philosophies: **fully-styled** libraries and **headless** (or unstyled) ones. Each has its own set of trade-offs, and your pick will massively shape how you build.\n\nA fully-styled library, like [DaisyUI](https://daisyui.com/), is like buying a professionally decorated model home. You get components that look great right out of the box. You can move in immediately. It’s perfect for projects where a totally unique design isn't the top priority and you just need to get moving. You can still tweak things with Tailwind utilities, but you're starting from a polished, opinionated base.\n\nOn the flip side, a headless library like [Headless UI](https://headlessui.com/) is more like getting the keys to a house with just the framework and wiring done. It handles all the tricky, behind-the-scenes functionality—accessibility, state management, keyboard navigation—but leaves every single design choice to you. This gives you total creative freedom to build something **100%** unique. The catch? It takes more work upfront to style every little detail.\n\nIf you want to dig deeper into the pros and cons, our guide on [choosing between different types of component libraries](https://magicui.design/blog/component-libraries) breaks it all down.\n\nTo help you visualize the differences, here's a quick comparison of the two main approaches.\n\n### Component Library Styles Head-to-Head Comparison\n\nChoosing between styled and headless libraries is really about weighing speed against control. This table breaks down the key differences to help you figure out which style is the best fit for your next project.\n\n| Feature               | Styled Component Libraries (e.g., DaisyUI)                                    | Headless/Unstyled Libraries (e.g., Headless UI)                                    |\n| --------------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |\n| **Speed & Setup**     | Incredibly fast. Components are pre-designed, allowing for rapid prototyping. | Slower initial setup. Requires styling every component from scratch.               |\n| **Design Freedom**    | Limited. You start with an opinionated design and customize from there.       | Maximum freedom. Every visual aspect is controlled by you.                         |\n| **Learning Curve**    | Low. Easy to get started, as most design decisions are already made.          | Steeper. Requires a solid understanding of both design and Tailwind CSS.           |\n| **Brand Consistency** | Easy to maintain consistency, but can look generic if not customized enough.  | Perfect for implementing a unique, pixel-perfect design system.                    |\n| **Best For**          | Internal tools, admin panels, MVPs, and projects on a tight deadline.         | Flagship products, bespoke marketing sites, and apps with a strong brand identity. |\n\nUltimately, styled libraries get you to a finished product faster, while headless libraries give you the raw materials to build something truly one-of-a-kind.\n\n### Making the Right Choice for Your Goals\n\nLet your project's needs be your guide. Building a quick internal tool or a proof-of-concept? A styled library will get you across the finish line much faster. Building a flagship product with a very specific brand identity? A headless library will give you the creative control you need to nail that vision.\n\nHere are the key things to weigh in your decision:\n\n- **Project Timeline:** If you’re on a tight deadline, a styled library gives you a massive head start. No question about it.\n- **Design Specificity:** For projects with a detailed, bespoke design system, a headless library is almost always the right call.\n- **Team Experience:** If your team is newer to building design systems, a styled library can provide helpful guardrails and keep things consistent.\n\nBy thinking through these factors, you can pick a **Tailwind CSS component library** that not only speeds up your work but also truly aligns with your project’s long-term vision. It's the best way to avoid that painful moment when you realize you've built on the wrong foundation and need to refactor everything.\n\n## Spotlight on a Professional Component Solution\n\nLet's move from theory to practice. To really get a feel for what a professional-grade **Tailwind CSS component library** can do, it helps to see one up close. We'll put [Magic UI](https://magicui.design/) under the microscope.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/KnmxD8LvHmA\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n/>\n\nMagic UI is built for developers and teams who don't want to choose between beautiful design, rock-solid performance, and an efficient workflow. It’s more than just a box of UI parts; it's a complete system designed for building slick, modern web applications.\n\nThe whole idea behind it is to give you production-ready components that look amazing right out of the box. They're not just static—they're meticulously animated and optimized for the modern web. This saves you from the tedious work of perfecting the tiny animations and micro-interactions that separate a \"good enough\" user experience from a truly great one.\n\nSince it's built specifically for [Next.js](https://nextjs.org/) and [React](https://react.dev/), it drops right into the stack that powers so many of today's best web apps.\n\n### Elevating Design with Animated Components\n\nWhat really makes Magic UI stand out is its deep focus on motion design. Plenty of libraries give you static building blocks, but Magic UI comes packed with components that have polished, built-in animations. We’re talking about everything from subtle hover effects to complex, multi-stage animated grids and text reveals.\n\nThese animations aren't just for show. They're crafted using high-performance libraries like [Framer Motion](https://www.framer.com/motion/) to ensure they run smoothly and never bog down the user experience. By including these right out of the gate, Magic UI lets you add a layer of professional polish to your projects with almost zero extra effort.\n\n> A great UI is more than just static elements on a page. It's about creating an engaging, responsive experience that guides the user. Thoughtful animation is a critical part of that, turning a functional interface into a memorable one.\n\nThink about it. Coding something like an animated, shimmering button or a dynamic grid that reacts to the user's cursor could easily burn hours of your time. With a library like Magic UI, that complex feature becomes a simple copy-and-paste job. That frees you up to concentrate on the core logic that makes your app tick.\n\nThis shot of the Magic UI homepage gives you a taste of the visually rich, animated components you get.\n\nYou can immediately see the commitment to a modern aesthetic. It’s a clean design brought to life with dynamic elements that grab a user's attention.\n\n### Built for a Modern Development Workflow\n\nMagic UI was clearly engineered to fit right into how developers work today. The components are fully typed with TypeScript and built with clean, readable code. That makes them a breeze to understand, customize, and extend when you need to.\n\nThis focus on developer experience is a huge deal, especially for business-critical applications where you can't afford messy code or a painful learning curve. With clear documentation and a dead-simple implementation process, teams can get moving fast, dramatically shortening their development timelines.\n\nUltimately, a professional **Tailwind CSS component library** like Magic UI is a powerful case study. It demonstrates how the right toolkit can do much more than just speed up your work. It elevates the final product, enforces design consistency, and delivers a superior user experience that makes an application stand out. For any project where quality and speed are non-negotiable, investing in a premium library is a clear strategic win.\n\n## Integrating and Customizing Your First Component\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8ad09d4c-6e80-46f1-a45e-cc3554a091c4.jpg)\n\nTheory is great, but the real magic happens when you get your hands dirty and drop a **Tailwind CSS component library** into a live project. This is that \"aha!\" moment where abstract ideas become a tangible, working part of your application. The good news? Most libraries are designed to get you from zero to a functioning component in just a few minutes.\n\nLet's walk through the process with a classic example: the humble 'Button' component. It's a staple in every project, and the steps to get it working are pretty universal across any component library you pick up.\n\n### Initial Setup and Configuration\n\nFirst, you'll pull the library into your project, usually with a quick `npm` or `yarn` command. The next—and most critical—step is tweaking your `tailwind.config.js` file. You'll almost always need to add the library's component paths to your `content` array.\n\nDon't skip this part! This is how you tell Tailwind's Just-In-Time (JIT) compiler where to look for utility classes. If you forget, Tailwind won't \"see\" the classes inside the library's components, leaving you with plain, unstyled HTML. For a detailed guide on getting this right in a React project, check out our tutorial on how to [install Tailwind with React](https://magicui.design/blog/install-tailwind-react).\n\nOnce that's configured, you just copy the code snippet for the button and paste it into your app. Instantly, you have a styled, functional button without writing a single line of your own CSS.\n\n### Customizing the Component\n\nThis is where the true power of a **Tailwind CSS component library** really shines. You’re never locked into the default look. Since every component is just a collection of utility classes, you can easily override or extend its styles directly in your markup.\n\nFor example, if the default button has a `bg-blue-500` class, you can switch it to `bg-emerald-600` or any other Tailwind color utility. It’s this direct, intuitive manipulation that makes the development workflow so incredibly fast.\n\n> Customization isn't about fighting the library's styles; it's about composing new ones. You use the library's structure as a foundation and apply your own utility classes to tailor the appearance to your exact needs.\n\nThis utility-first approach has exploded in popularity, and for good reason. Recent developer surveys show that frameworks like Tailwind CSS have seen a **30%** jump in adoption. A big driver for this shift is performance; projects using Tailwind often see their CSS bundle sizes shrink by up to **50%**, which means significantly faster load times for your users.\n\n### Creating Component Variants with Props\n\nFor more organized and reusable customizations, most modern libraries (especially for React or Vue) let you pass **props** to components to toggle between predefined styles. It's a much cleaner way to manage different button types without repeating yourself.\n\nYou might have a `variant` prop that accepts values like 'primary', 'secondary', or 'destructive'.\n\n- **Primary Variant:** Could apply classes for your main brand color, like `bg-indigo-600 text-white`.\n- **Destructive Variant:** Might use classes like `bg-red-500 text-white` for delete actions.\n\nBy just changing a single word in your code (`<Button variant=\"destructive\">`), you can completely change how the component looks and feels. This keeps your code tidy, your design system consistent, and gives you the freedom to adapt any component to fit your project’s unique identity.\n\n## Got Questions? Let's Get Them Answered\n\nDiving into the world of component libraries can definitely bring up a few questions. That's perfectly normal. Getting those questions cleared up is the best way to move forward and pick the right tools for your project with total confidence.\n\nHere are a few of the most common things developers ask when they start exploring **Tailwind CSS component libraries**.\n\n### Can I Mix and Match Library Components with My Own Custom Styles?\n\nYou bet. In fact, this is one of the biggest reasons to use a library built on Tailwind in the first place.\n\nBecause every component is just a smart combination of utility classes, you can easily tweak or completely override its appearance right in your HTML. Want to adjust a button's padding or change a card's shadow? Just add or modify the utility classes on the element itself. No more wrestling with external stylesheets to make simple changes.\n\n### Aren't Tailwind Component Libraries Bad for Performance?\n\nIt’s a common misconception, but the reality is the complete opposite—they're fantastic for performance.\n\nSince everything is built with Tailwind utilities, your entire project benefits from the Just-In-Time (JIT) compiler. This thing is a game-changer. It scans all your files and surgically removes every single unused style from your final CSS file.\n\n> The result is a ridiculously small, highly optimized CSS bundle. It’s often much smaller than what you'd get from older frameworks like Bootstrap, which means faster load times and a much snappier experience for your users.\n\n### What's the Real Difference Between a UI Kit and a Headless Library?\n\nThis is a really important distinction to understand, as it will guide you to the right tool for the job.\n\n- **A traditional UI kit** (think of older versions of Bootstrap) is opinionated. It gives you components that are already styled and often come with their own JavaScript. This is great for whipping up a quick prototype, but it can be a real pain when you need to match a unique brand identity. You end up fighting the default styles more often than not.\n\n- **A headless library**, on the other hand, is all about function over form. It gives you the logic, state management, and accessibility features right out of the box but leaves the styling **100%** up to you. You get the functional skeleton, and you get to dress it up with your own Tailwind classes. It’s the ultimate in design freedom.\n\n---\n\nReady to build stunning, production-ready interfaces without losing weeks to custom styling? Check out the animated, fully customizable components over at **Magic UI** and see just how fast you can bring your ideas to life. [https://magicui.design](https://magicui.design)\n\n_Article created using [Outrank](https://outrank.so)_\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-grid.mdx",
    "content": "---\ntitle: \"How to Use Tailwind CSS Grid in React and Typescript\"\ndescription: \"Learn how to use Tailwind CSS Grid in React and Typescript with this comprehensive guide.\"\nimage: https://cdn.magicui.design/assets/cb7ef35a-ca0c-4d71-8cb5-9a50c128c78c.png\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\npublishedOn: \"2024-06-01\"\nfeatured: false\n---\n\nHave you ever spent hours figuring out how to use CSS Grid correctly? Me too. As a developer, I’ve been lost in documentation, experimenting with code, and still not getting the envisioned layout. It’s frustrating, isn't it?\n\nNow that I've figured it out (reasonably well!) let me save you that time.\n\nThis blog post is your shortcut to mastering grid layouts in Tailwind CSS, specifically within a React project. No more endless searches. No more trial and error. Just straight answers.\n\nWe’ll dive into:\n\n- The differences between CSS Grid and Flexbox\n- Setting up Tailwind CSS in your React project\n- Creating basic and advanced grid layouts\n\nLet’s get started!\n\n## What is Grid vs. Flex in Tailwind CSS?\n\nCSS Grid is useful when you create a 2-dimensional grid of elements - rows and columns. It allows you to create complex, responsive layouts with ease. Grid is particularly useful for creating page layouts where you need precise control over horizontal and vertical alignment.\n\nFlexbox, on the other hand, is a one-dimensional layout system. It excels at aligning items along a single axis, either horizontally or vertically. Flexbox is ideal for distributing space within an item or aligning items in a container.\n\nThis makes Grid more suitable for complex layouts. You can use it to create entire page layouts or complex card designs.\n\nFlexbox is better for simpler, linear arrangements, such as navigation bars, single rows of items, or aligning items within a container.\n\n## Tailwind Grid Syntax cheat sheet\n\nYou need to understand some basics to start with Tailwind CSS Grid in React and TypeScript. Here’s a simple cheat sheet to help you with the syntax:\n\n**Grid**\n\n- `grid`: This class turns an element into a grid container. It has to always be present, along with the other properties mentioned below. This tells Tailwind to treat the children of this element like grid items.\n\nTo specify your layout, you can either specify the number of columns you want or the number of rows you want. You only need one or the other.\n\n**Columns**\n\n- `grid-cols-3`: This class divides the grid into three equal columns. You can change the number to create more or fewer columns, like `grid-cols-2` for two columns or `grid-cols-4` for four columns. The elements are ordered horizontally. A column layout is best for a collection of cards or images.\n\n**Rows**\n\n- `grid-rows-3`: This class sets the grid to have three equal rows. You can adjust the number for different row counts, such as `grid-rows-2` for two rows or `grid-rows-4` for four rows. The ordering of the elements is done vertically. A row layout is best for lists.\n- When you use the row layout, remember to set `grid-flow-col` to make sure that the items are auto-placed correctly.\n\n**Gap**\n\n- `gap`: You don't want all the items in the grid to be super close to each other. It just doesn't look good. THis is where you can use the \\`gap\\` class to set the spacing between items in the grid. You can specify different sizes, such as `gap-1` for a small gap, `gap-4` for a medium gap, or `gap-8` for a large gap.\n\nHere's what a sample grid might look like:\n\n```html\n<div>\n  <div className=\"grid grid-cols-3 gap-2\"></div>\n  <div className=\"grid grid-rows-3 gap-2\"></div>\n</div>\n```\n\nCombining these classes allows you to create flexible and responsive grid layouts in your React and TypeScript projects.\n\n## Setting Up Tailwind CSS in a React Project\n\nFirst, make sure that your React project has Tailwind CSS properly configured. Need help? We've written a full step-by-step guide on [how to install all the necessary packages for React here](/blog/install-tailwind-react).\n\n## Creating a Basic Grid Layout in React with Tailwind CSS\n\nLet's start by creating a simple Card component that we will use as the items in our grid.\n\nCreate a new file called `src/components/Card.tsx` :\n\n```tsx\nimport { FC } from \"react\"\n\nconst Card: FC<any> = () => {\n  return (\n    <div className=\"max-w-sm overflow-hidden rounded bg-white shadow-md\">\n      <div className=\"px-6 py-4\">\n        <div className=\"mb-2 text-xl font-bold\">Mountain Sunset</div>\n        <p className=\"text-base text-gray-700\">\n          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatibus\n          quia, nulla! Maiores et perferendis eaque, exercitationem praesentium\n          nihil.\n        </p>\n      </div>\n      <div className=\"px-6 pt-4 pb-2\">\n        <span className=\"mr-2 mb-2 inline-block rounded-full bg-gray-200 px-3 py-1 text-sm font-semibold text-gray-700\">\n          #photography\n        </span>\n        <span className=\"mr-2 mb-2 inline-block rounded-full bg-gray-200 px-3 py-1 text-sm font-semibold text-gray-700\">\n          #travel\n        </span>\n        <span className=\"mb-2 inline-block rounded-full bg-gray-200 px-3 py-1 text-sm font-semibold text-gray-700\">\n          #winter\n        </span>\n      </div>\n    </div>\n  )\n}\nexport default Card\n```\n\nAdd it to your `App.tsx` to see what it looks like when it's rendered. It should be something like this.\n\n![Simple card in Tailwind CSS using React](https://cdn.magicui.design/assets/717dp5iz8lb.png)\n\nNow is the fun part - setting up a grid component to hold all the cards.\n\n### Create a column-based grid\n\nCreate a new file called `src/components/CardGallery.tsx`\n\n```tsx\nimport { FC } from \"react\"\n\nimport Card from \"./Card\"\n\nconst CardGallery: FC<any> = () => {\n  return (\n    <div className=\"grid-col-3 grid\">\n      <Card />\n      <Card />\n      <Card />\n      <Card />\n    </div>\n  )\n}\nexport default CardGallery\n```\n\nNotice how we added the `grid` class to the parent div; this tells Tailwind to treat the children as grid items. With `grid-cols-3` , they get stacked horizontally one after another.\n\nI added a 4th Card to show how they they are ordered.\n\n![A grid of cards in column layout ](https://cdn.magicui.design/assets/ljg59j0l00i.png)\n\nThey are a little too close, right? Let's add a gap.\n\n```tsx\nimport { FC } from \"react\"\n\nimport Card from \"./Card\"\n\nconst CardGallery: FC<any> = () => {\n  return (\n    <div className=\"grid-col-3 grid gap-4\">\n      <Card />\n      <Card />\n      <Card />\n      <Card />\n    </div>\n  )\n}\nexport default CardGallery\n```\n\nMuch better, no?\n\n![A grid of cards in column layout with spacing between them](https://cdn.magicui.design/assets/f5tf8ir6yu.png)\n\n## Create a row-based grid\n\nWe can switch the layout to row-first like so. This will stack 3 cards vertically and then move to the next row.\n\n```tsx\nimport { FC } from \"react\"\n\nimport Card from \"./Card\"\n\nconst CardGallery: FC<any> = () => {\n  return (\n    <div className=\"grid grid-flow-col grid-rows-3 gap-4\">\n      <Card />\n      <Card />\n      <Card />\n      <Card />\n    </div>\n  )\n}\nexport default CardGallery\n```\n\nHere's what that looks like.\n\n![A grid of cards in row layout ](https://cdn.magicui.design/assets/u5vydpyt2oe.png)\n\n## Next Steps\n\nNow that you know how to create great looking grids, try creating an image gallery to test your skills. If you're feeling particularly fancy, see if you can [recreate this Bento Grid](https://bentogrids.com/shots/cltg5vfqw00045rk6pj0y199p) using Tailwind.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-install.mdx",
    "content": "---\ntitle: Your Guide to a Flawless Tailwind CSS Install\ndescription: >-\n  Struggling with your Tailwind CSS install? This guide walks you through setup\n  for any project, from the CLI to frameworks like React, Next.js, and Vue.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-847d3e22-6e38-48be-98ad-a2a8472c7642.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css install\n  - tailwind css\n  - css frameworks\n  - frontend setup\n  - web development\npublishedOn: \"2025-10-22T09:56:26.790473+00:00\"\nfeatured: true\n---\n\nGetting started with Tailwind CSS means setting up your project in a Node.js environment, pulling in Tailwind as a dependency, and generating a couple of config files. The most direct route is using the **Tailwind CLI**, which crunches all your utility classes down into a single, static CSS file—perfect for performance.\n\n## Why Tailwind CSS Is Dominating Web Development\n\n![A laptop screen showing lines of code for web development with Tailwind CSS](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/1f9b9944-f9a5-4170-aedd-27dd055de129.jpg)\n\nBefore we get into the nitty-gritty of the installation commands, it’s worth taking a moment to understand _why_ so many developers are switching to Tailwind CSS. Unlike component-based frameworks like Bootstrap, Tailwind is built on a utility-first philosophy. This gives you a massive set of low-level utility classes you can apply directly in your HTML to build completely custom designs.\n\nThe beauty of this approach? You get total control without the headache of overriding opinionated, pre-built component styles. Instead of fighting with a framework's defaults, you’re simply composing your UI from small, single-purpose classes.\n\n### Unlocking Speed and Maintainability\n\nThis utility-first model naturally leads to faster development. You can prototype and build out interfaces incredibly quickly, often without ever leaving your markup to write a single line of custom CSS. It also makes for a much more maintainable codebase because styles are located right next to the HTML they affect, making components self-contained and dead simple to understand.\n\nHere’s why this is such a big deal in practice:\n\n- **No More Naming Conventions:** Forget spending ages trying to come up with the perfect class name like `.card-header-title` or `.user-profile-avatar`.\n- **Global Changes Are Safe:** Since classes are applied locally to components, you can refactor with confidence, knowing you won’t accidentally break something on a totally different page.\n- **Your CSS Stops Growing:** With traditional CSS, stylesheets just get bigger and bigger as you add features. With Tailwind, you’re constantly reusing existing utilities, which keeps your final CSS file size tiny.\n\n> The real magic here is the incredibly small production build size. Tailwind's Just-In-Time (JIT) compiler scans your template files and generates _only_ the CSS classes you’re actually using, often shrinking the final bundle to under **10KB**.\n\n### A Modern Framework for a Modern Web\n\nTailwind's massive growth isn't just a fleeting trend; it’s a direct response to what modern development demands. As of 2025, it has cemented its place alongside the most established frameworks, with giants like Netflix and GitHub using it to streamline their design workflows. The recent release of Tailwind CSS 4.0 brought even more performance improvements, making it an even clearer choice for new projects.\n\nThis unique mix of control, performance, and developer experience is exactly why a **Tailwind CSS install** is the first step for so many developers starting a new project. To see how it stacks up against the old guard, check out our deep dive on [how Tailwind compares to Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap).\n\n## Getting Started with the Tailwind CLI\n\n![A minimalist command-line interface on a dark background showing the Tailwind CSS installation process](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/db3cd1da-14e7-4cfd-864b-000f31411236.jpg)\n\nFor the vast majority of projects, the Tailwind CLI is your fastest ticket to getting up and running. It’s a slick, self-contained executable that handles all the heavy lifting of compiling your CSS. This gives you a lean, production-ready stylesheet without getting bogged down in a complex build process.\n\nFirst things first, you'll need a project already set up with [Node.js](https://nodejs.org/en) and npm (or your package manager of choice). Pop open your terminal in the project's root directory. We're going to install Tailwind CSS as a development dependency—an important distinction, since it's a build-time tool that your final production code doesn't need.\n\nFire off this command:\n\n`npm install -D tailwindcss`\n\nThis command snags the Tailwind package from the registry and tucks it neatly into your `devDependencies` inside `package.json`. With that one line, the foundation for your **Tailwind CSS install** is officially in place.\n\n### Generating Your Configuration Files\n\nNow that Tailwind is part of your project, the next move is to generate its configuration file. This file, `tailwind.config.js`, is the heart and soul of your project's styling. It's where you'll define custom colors, tweak your theme, and, most critically, tell Tailwind which files to scan for utility classes.\n\nBack in your terminal, run this:\n\n`npx tailwindcss init`\n\nExecuting this command creates a minimal `tailwind.config.js` file right in your project's root. This is a huge leg up in modern Tailwind versions, especially with the move towards a zero-config start. The file it generates is clean, simple, and ready for you to tailor to your project's specific needs.\n\n> A common tripwire for newcomers is messing up the `content` array. This array is what tells Tailwind’s Just-In-Time (JIT) compiler which files to watch. If a file isn't listed here, any Tailwind classes you use inside it will be completely ignored and won't make it into your final CSS.\n\n### Configuring Template Paths and CSS\n\nGo ahead and open that new `tailwind.config.js` file. Your first job is to populate the `content` array with the paths to all your template files. Getting this right ensures every class you use actually gets compiled.\n\nFor instance, if all your HTML and JavaScript files live in a `src` folder, your config should look something like this:\n\n```js\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\"./src/**/*.{html,js}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThat glob pattern, `\"./src/**/*.{html,js}\"`, is a concise way of telling Tailwind to scan every single `.html` and `.js` file inside the `src` directory, including any subdirectories.\n\nNext, you need a main CSS file. I usually call mine `src/input.css` to keep things organized. Inside this file, you’ll add the special `@tailwind` directives. These are just placeholders that Tailwind finds and replaces with its generated styles during the build process.\n\n- `@tailwind base;` injects Tailwind's foundational styles and any base styles from plugins.\n- `@tailwind components;` brings in Tailwind's component classes.\n- `@tailwind utilities;` injects the massive library of utility classes.\n\nSo, your `input.css` file should contain just these three lines:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\nWith your config file set and your source CSS created, you're ready to compile. The build command instructs the Tailwind CLI to scan your content files, work its magic, and spit out a finished CSS file. For development, you'll want to add the `--watch` flag, which tells the CLI to keep running and automatically recompile your CSS every time you save a file.\n\n## Pairing Tailwind CSS with Modern Frameworks\n\nThe Tailwind CLI is great on its own, but the real magic happens when you pair it with a modern JavaScript framework. Think [React](https://react.dev/), [Vue](https://vuejs.org/), [Next.js](https://nextjs.org/), or [Svelte](https://svelte.dev/)—their component-based approach is a perfect fit for Tailwind's utility-first philosophy. This combination lets you build self-contained, easy-to-maintain UI components with styles that live right alongside the markup.\n\nYou’ll find that the setup is surprisingly consistent across these frameworks. It almost always boils down to installing Tailwind as a [PostCSS](https://postcss.org/) plugin. Since most modern build tools like Vite and Create React App already use PostCSS under the hood, the whole process feels incredibly native. Tailwind just slots right into your existing development server and build pipeline.\n\n### Tailoring Your Tailwind Install for Frameworks\n\nNo matter which framework you pick, the fundamental steps are pretty much the same. You'll start by installing `tailwindcss`, `postcss`, and `autoprefixer` as dev dependencies. Next, you'll generate your `tailwind.config.js` and `postcss.config.js` files.\n\nBut here's the most critical part: getting the `content` array in `tailwind.config.js` configured just right. This is how you tell Tailwind which files to scan for classes.\n\nHere’s what a typical configuration might look for a Next.js project:\n\n```js\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\n    \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nSee how it’s looking for `.jsx`, `.tsx`, and `.mdx` files inside specific folders like `pages`, `components`, and `app`? This precision is exactly what Tailwind’s Just-In-Time (JIT) engine needs to find every single class you use and generate the leanest CSS file possible.\n\nFor a deeper dive, check out our guide on how to [install Tailwind CSS in a React project](https://magicui.design/blog/install-tailwind-react), which walks through these steps in detail.\n\n### Dodging Common Integration Pitfalls\n\nOne of the first roadblocks developers hit is styles not showing up. I can tell you from experience, **99%** of the time, the culprit is a wrong path in the `content` array. If you miss a file extension or a directory, Tailwind won't see the classes in those files, and they won't make it into the final build. Always double-check your file paths against your project structure.\n\nAnother small but crucial step is importing Tailwind's base styles. You need to add the `@tailwind` directives to your main global CSS file, which might be `globals.css` or `index.css`. This file then gets imported into your application’s root, like `_app.js` in Next.js or `main.jsx` in a Vite-powered React app.\n\nLuckily, the official Tailwind docs have excellent, framework-specific guides to get you up and running.\n\nThis screenshot just shows a fraction of them. They cover everything from Next.js to Laravel, providing boilerplate configs and exact terminal commands. These guides are invaluable for taking the guesswork out of the initial setup.\n\n> If you get two things right, you'll have a smooth experience. First, correctly tell Tailwind where to find your classes. Second, make sure its CSS is properly imported into your app's main entry point. Nail those, and you're golden.\n\nThis integrated approach is clearly the way forward. In fact, many predict Tailwind CSS will overtake Bootstrap as the framework of choice by **2025**, largely thanks to its flexibility and performance. Its seamless fit with JavaScript frameworks is a huge part of that, offering a workflow that just feels more in sync with modern development. The first step in so many new projects today is a `tailwind css install`.\n\n## Choosing the Right Installation Method for Your Project\n\nPicking the right way to **tailwind css install** isn't about finding a single \"best\" option. It’s about matching the tool to the job. The size of your project, its complexity, and the tech you're using will all point you toward the most efficient choice, whether that’s the CLI, a PostCSS integration, or the Play CDN. Getting this right from the start can save you a world of hurt later on.\n\nBefore you jump in, it’s always a good idea to brush up on the [key considerations for website development](https://www.superhub.biz/website-development-explained-the-8-things-you-need-to-know-before-you-start). A simple static site has completely different needs than a massive application built on a JavaScript framework, and your installation choice should absolutely reflect that.\n\nThis decision tree gives you a quick visual guide for that first big choice.\n\n![Infographic decision tree helping users choose a Tailwind CSS installation method based on whether they are using a JavaScript framework.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/935e34dc-d5ad-4e5f-a654-95e11634c8ee.jpg)\n\nAs you can see, there's one major fork in the road: if you're working with a modern JavaScript framework, integrating Tailwind as a PostCSS plugin is pretty much the standard path. It just makes for a smoother development workflow.\n\nTo make the choice even clearer, here's a quick breakdown of how these methods stack up against each other.\n\n### Tailwind CSS Installation Method Comparison\n\n| Method             | Best For                                                                                     | Pros                                                                                                                                                 | Cons                                                                                                             |\n| :----------------- | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------- |\n| **Tailwind CLI**   | Simple projects, static HTML sites, or projects without an existing build pipeline.          | Standalone and easy to use. No complex setup required. Great for getting started quickly.                                                            | Lacks integration with other CSS tools. Can feel disconnected from framework build processes.                    |\n| **PostCSS Plugin** | Projects using modern JavaScript frameworks (React, Vue, Next.js) or a custom build process. | Integrates seamlessly into existing build tools. Allows use of other PostCSS plugins like `autoprefixer`. The industry standard for production apps. | Requires a bit more initial setup and configuration within your project's build system.                          |\n| **Play CDN**       | Rapid prototyping, quick demos, tutorials, and learning Tailwind's classes.                  | Zero installation. Just add a single script tag to your HTML. Instantly start using Tailwind classes.                                                | **Not for production.** Slower performance due to in-browser compilation. No access to customization or plugins. |\n\nThis table lays it all out, but let's dig into the \"why\" behind these recommendations.\n\n### CLI vs PostCSS Plugin\n\nThe **Tailwind CLI** is a standalone tool that’s perfect for simpler setups. Think static HTML sites, a quick landing page, or any project where you don’t have a complex build process humming in the background. It's a direct, no-fuss way to compile your CSS with a single command.\n\nOn the flip side, using Tailwind as a **PostCSS plugin** tucks it right into a larger build process. This is the way to go for projects built with frameworks like React, Vue, or Next.js because their build tools (like Vite or Webpack) are already using PostCSS. This approach unlocks the ability to chain other PostCSS plugins, like `autoprefixer`, creating a much more powerful and automated workflow.\n\n> Your choice between the CLI and PostCSS really boils down to your build system. If you already have one that uses PostCSS (and most modern frameworks do), the plugin is the natural fit. If not, the CLI gets the job done simply and effectively.\n\n### When to Use the Play CDN\n\nThe **Play CDN** offers a third, completely different approach. By dropping a single `<script>` tag into your HTML, you can start using Tailwind classes without any build step whatsoever. I've found this to be incredibly handy for a few very specific situations:\n\n- **Rapid Prototyping:** When you just want to mock up a UI idea directly in the browser.\n- **Demos and Tutorials:** Perfect for creating simple examples for a blog post or documentation without requiring a whole project download.\n- **Learning:** It's a fantastic, zero-friction way to experiment with Tailwind's classes.\n\nBut—and this is a big but—the CDN is **not meant for production use**. It works by compiling your CSS in the user's browser, which is way less efficient than serving a pre-compiled stylesheet. For any real, live website, you'll want to use a proper build process with either the CLI or PostCSS plugin. If you're curious and just want to mess around, you can learn how to [set up Tailwind CSS with the CDN](https://magicui.design/blog/tailwind-cdn-html) in minutes.\n\nEven the smoothest **Tailwind CSS install** can hit a snag. If you've followed the guide to the letter but your styles are nowhere to be found, don't panic. This happens to everyone, and it's almost always a simple configuration mix-up.\n\nNine times out of ten, the problem lies in your `tailwind.config.js` file.\n\n<iframe\n  src=\"https://www.youtube.com/embed/Uvemk9Q8_34\"\n  width=\"100%\"\n  height=\"400\"\n  frameBorder=\"0\"\n  allowFullScreen\n></iframe>\n\nThe most common culprit? A misconfigured `content` array. This little array is mission-critical; it tells Tailwind's Just-In-Time (JIT) engine exactly which files to scan for class names. If a path is wrong or a file extension is missing, Tailwind simply won't see the classes in that file, and they'll never make it into your final CSS.\n\nFor example, you might have `./src/**/*.{html,js}` in your config, but all your fancy new components are actually `.jsx` or `.tsx` files. It's a tiny detail that can bring your styling to a halt. Always take a moment to double-check that your paths perfectly match your project's structure.\n\n### Fixing \"Styles Not Applying\" Errors\n\nWhen your styles go missing, your first stop should always be the `tailwind.config.js` file. Open it up and carefully inspect every single line within the `content` array.\n\n- **Check Your File Extensions:** Are you building with React or Vue? Make sure you’ve included `.jsx`, `.tsx`, `.vue`, or `.svelte` if you're using them.\n- **Verify the Folder Paths:** Is your source code in a folder named `./src`, `./app`, or something else? The path needs to be correct relative to where your config file lives.\n- **Hunt for Typos:** A simple typo like `/componets` instead of `/components` is all it takes. The build process won't throw an error; it will just silently fail to generate styles for that entire directory.\n\nAnother thing to check is the import order in your main CSS file (often named `globals.css` or `index.css`). You need to have these three base directives present and in the correct order:\n\n```css\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n```\n\nIf these are missing or mixed up, Tailwind won't be able to inject its styles correctly. And just as important, make sure this CSS file is actually being imported into your app's entry point, like `_app.jsx` in [Next.js](https://nextjs.org/) or `main.js` in [Vite](https://vitejs.dev/).\n\n> Here’s a classic \"gotcha\": Your styles look perfect in development, but disappear in the production build. This is almost guaranteed to be a CSS purging issue. Tailwind is super aggressive about removing unused CSS for production, and if you create class names dynamically (like `text-${color}-500`), the JIT compiler can't \"see\" them ahead of time.\n\nThe best way to handle this is to avoid building class names with string concatenation. Instead, write out the full class name and use conditional logic to apply it. If you absolutely _must_ use dynamic classes, you can add them to the `safelist` option in `tailwind.config.js` to tell Tailwind not to purge them.\n\n## Answering Your Top Tailwind CSS Install Questions\n\nAs you get your hands dirty with a new tool, a few common questions always seem to pop up. It doesn't matter if you're just spinning up a quick demo or trying to weave Tailwind into a massive existing project—some hurdles are universal. Let's clear up some of the most frequent ones I see people run into.\n\n### Can I Use Tailwind CSS Without Node.js?\n\nYes, you absolutely can. The quickest way to get up and running is with the Play CDN.\n\nAll it takes is a single `<script>` tag in your HTML file’s `<head>` section, and you’re good to go. This approach is fantastic for rapid prototyping, throwing together a quick demo, or simply learning the framework without the headache of a full build environment.\n\nBut here’s the important bit: the CDN is **not meant for production**. It works by compiling your CSS directly in the browser as the user loads the page, which is a lot slower than serving a pre-compiled, optimized stylesheet. For any real project, you'll want to use the Tailwind CLI or the PostCSS plugin in a Node.js environment to get a lean, production-ready build.\n\n### Why Are My Dynamic or Custom Classes Not Appearing?\n\nAh, the classic \"my classes aren't working\" problem. If you've run into this, you're not alone. This almost always comes down to how you've set up your `tailwind.config.js` file.\n\nTailwind's Just-In-Time (JIT) engine is incredibly efficient because it only generates the CSS you actually use. It does this by scanning the files you list in the `content` array of your config. If a file isn't listed there, Tailwind won't look inside it, and none of the classes from that file will make it into your final stylesheet.\n\nThe same rule applies when you try to build class names dynamically with strings. For example, if you write something like `bg-${color}-500` in your JavaScript, Tailwind's scanner can't piece that together at build time. To make it work, you have to write the full, complete class name somewhere in your code (like `bg-red-500` or `bg-blue-500`).\n\n> If you absolutely must generate classes at runtime, your best friend is the `safelist` option in your config. It lets you specify class patterns that should _always_ be included in the final CSS, no matter what.\n\n### How Do I Add Custom Colors or Fonts to Tailwind?\n\nCustomizing Tailwind is one of its greatest strengths. The whole point is to build _your_ design system, not just use a generic one. You can easily add your own design tokens by working inside the `theme.extend` object in your `tailwind.config.js` file.\n\nUsing `extend` is key because it adds your customizations _on top_ of Tailwind's defaults instead of wiping them out.\n\n- **For custom colors:** Just add a `colors` object inside `theme.extend`. You could define your brand palette like this: `'brand-primary': '#4F46E5'`. Suddenly, utility classes like `bg-brand-primary` are ready to use.\n- **For custom fonts:** It's the same idea. Add a `fontFamily` object inside `theme.extend` to define your font stacks, like `'sans': ['Inter', 'sans-serif']`.\n\nThis approach gives you the best of both worlds—your own branded design tokens living right alongside Tailwind's comprehensive default set.\n\n### What Is the Difference Between the Tailwind CLI and PostCSS Plugin?\n\nThink of it this way: the tool you choose depends on the complexity of your project.\n\nThe **Tailwind CLI** is a simple, standalone tool that does one thing and does it well: compiles your CSS. It's perfect for projects that don't already have a complicated build process, like a simple static website or a project where you want to keep things minimal.\n\nUsing Tailwind as a **PostCSS plugin**, on the other hand, plugs it into a much larger and more powerful ecosystem. Most modern frontend frameworks—think [Next.js](https://nextjs.org/), [Vite](https://vitejs.dev/), and [Svelte](https://svelte.dev/)—already use PostCSS under the hood. By integrating Tailwind as a plugin, you can easily chain it with other tools like `autoprefixer` to create a more automated and robust workflow. For any project built on a modern framework, the PostCSS plugin is the way to go.\n\n---\n\nReady to build stunning, high-performance UIs with less effort? **Magic UI** offers a massive library of over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. Create beautiful landing pages in minutes and accelerate your development workflow today.\n\n[Explore our components and templates at Magic UI](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-react.mdx",
    "content": "---\ntitle: \"Tailwind CSS React: A Practical Guide for React Projects\"\ndescription: >-\n  Master tailwind css react in your React projects with a practical setup guide,\n  covering Vite, Next.js, component styling, and performance tips.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/34194b7d-b32c-4a32-b79a-625616415182/tailwind-css-react-developer-workspace.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css react\n  - react css\n  - frontend development\n  - utility-first css\n  - vite\npublishedOn: \"2025-12-15T08:03:07.836832+00:00\"\nfeatured: true\n---\n\nPairing **Tailwind CSS with React** has become the go-to strategy for building modern, component-driven user interfaces. It’s a combination that just makes sense, letting you style components directly inside your JSX. This keeps your logic, markup, and styling all bundled together in one predictable, easy-to-manage file.\n\n## The Perfect Match for Modern Web Development\n\nThe real magic behind Tailwind and React is how well their core ideas complement each other. React is all about breaking down big, complex UIs into small, reusable components. Each component is a self-contained unit with its own state and logic, which makes your app far easier to scale and debug down the line.\n\nThis is exactly where Tailwind’s utility-first approach shines.\n\nInstead of juggling separate CSS files and fighting with class name collisions or specificity issues, you apply simple, pre-defined utility classes right onto your elements. This means your styles live right alongside your component's markup. When you look at a React component, you see the full picture—its structure, its behavior, and its appearance—all at once.\n\n### Why So Many Developers Are on Board\n\nThe benefits aren't just theoretical; you feel them almost immediately. The biggest win is a massive productivity boost. You stop switching contexts between your component files and your stylesheets, which means you can prototype and build features much faster.\n\n- **Build Faster:** You can create complex, bespoke designs without ever writing a single line of custom CSS.\n- **Maintain with Confidence:** Because styles are scoped locally to each component, you can make changes without worrying about accidentally breaking something else in your app.\n- **Stay Consistent:** Your `tailwind.config.js` file acts as a single source of truth for your design system, ensuring a consistent look and feel across the entire project.\n\nIt's no surprise this combination has seen explosive growth. Tailwind now pulls in over **20 million weekly NPM downloads**, and the State of CSS survey found that about **75%** of developers who give it a try end up sticking with it for their projects. If you're curious about the bigger picture, it's worth reading up on some [modern web design trends](https://aynsoft.com/tailwind-css-trends-in-2025-revolutionizing-modern-web-design/).\n\n> Choosing the right tools is a foundational decision for any project. Before you commit, thinking through [how to choose the right tech stack](https://upnorthmedia.co/blog/how-to-choose-tech-stack) is a critical step that will pay dividends in scalability and long-term maintainability.\n\n## Configuring Your React Development Environment\n\nGetting Tailwind CSS hooked into your React project is a pretty smooth process these days, especially with modern tools like [Vite](https://vitejs.dev/) and frameworks like [Next.js](https://nextjs.org/) streamlining the setup. The exact steps vary a bit depending on your environment, so let's walk through how to get up and running with these two popular choices.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/sHnG8tIYMB4\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nThink of it like this: React gives you the component-based structure, and Tailwind provides the styling language to bring those components to life. They work together, not against each other.\n\n![Diagram illustrating the steps for integrating Tailwind CSS into a React project to build UI components.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5ad396b8-ff07-4fe0-8893-2509f2d820c7/tailwind-css-react-integration-flow.jpg)\n\nThis flow shows that Tailwind isn't some separate entity; it's a powerful styling layer that integrates directly into your component ecosystem.\n\n### Setting Up Tailwind with Vite and React\n\nVite has quickly become a developer favorite, and for good reason—its near-instant server start and Hot Module Replacement (HMR) are game-changers. Luckily, integrating Tailwind is just as quick.\n\nAfter spinning up a new Vite project with React, you'll need to pull in a few key dependencies. These are the workhorses that make the magic happen:\n\n- **`tailwindcss`**: The core framework itself.\n- **`postcss`**: A tool that transforms your CSS with JavaScript plugins.\n- **`autoprefixer`**: A PostCSS plugin that automatically adds vendor prefixes to your CSS, so you don't have to worry about browser compatibility.\n\nYou’ll run one command to install them, then another to generate your config files. This will create `tailwind.config.js` and `postcss.config.js` right in your project's root. These files are basically the command center for your entire styling setup. For a deeper dive into each step, our complete guide on how to [install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) breaks down the fundamentals.\n\nNext up, you have to tell Tailwind where to look for your classes. This is probably the most critical step for keeping your production build lean. Inside `tailwind.config.js`, you’ll update the `content` array to point to all your template files—your HTML, JSX, and TSX files.\n\n```javascript\n/** @type {import('tailwindcss').Config} */\nexport default {\n  content: [\"./index.html\", \"./src/**/*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis config tells Tailwind's Just-In-Time (JIT) engine to scan those specific files. It finds every utility class you've used and includes it in the final CSS bundle. Anything you _haven't_ used gets purged. It's an incredibly efficient system that keeps your final stylesheet tiny.\n\nFinally, you’ll pop open your main CSS file (usually `index.css`) and add three core Tailwind directives. These are responsible for injecting Tailwind’s base styles, component classes, and utility classes into your stylesheet during the build process.\n\n> These three lines—`@tailwind base;`, `@tailwind components;`, and `@tailwind utilities;`—aren't just CSS. They're placeholders that PostCSS processes and replaces with all the generated styles. This is how your simple utility classes are transformed into highly optimized, browser-ready CSS.\n\n### Configuring Tailwind in a Next.js Project\n\nWith a production-focused framework like Next.js, the setup is even easier. When you fire up a new project with `create-next-app`, the installer will straight-up ask if you want to include Tailwind CSS from the get-go.\n\nJust say \"Yes.\" That's it.\n\nThe installer handles everything for you—it installs the right dependencies and creates perfectly configured `tailwind.config.js` and `postcss.config.js` files. The `content` array even comes pre-configured to scan the `pages`, `components`, and `app` directories, covering the standard Next.js project structure right out of the box.\n\nIf you're adding Tailwind to an _existing_ Next.js project, the manual process is almost identical to the Vite setup. You'll install the same dependencies and generate the config files. The only real gotcha is making sure the `content` property in your `tailwind.config.js` correctly points to every file that contains your markup. A misconfigured path is the number one reason styles mysteriously don't show up.\n\n### React Framework Setup at a Glance\n\nTo quickly recap, here’s a high-level comparison of setting up Tailwind CSS with Vite versus Next.js. Both are excellent choices, but their approaches have subtle differences that might make one a better fit for your project's needs.\n\n| Framework   | Primary Dependencies                     | Key Configuration File                | Best For                                                                                                            |\n| :---------- | :--------------------------------------- | :------------------------------------ | :------------------------------------------------------------------------------------------------------------------ |\n| **Vite**    | `tailwindcss`, `postcss`, `autoprefixer` | `tailwind.config.js`                  | Rapid prototyping, single-page applications, and projects where build speed is paramount.                           |\n| **Next.js** | Included with `create-next-app`          | `tailwind.config.js` (auto-generated) | Production-grade applications, server-side rendering (SSR), static site generation (SSG), and SEO-focused projects. |\n\nUltimately, both frameworks offer a fantastic developer experience. Next.js gives you a batteries-included setup with a single command, while Vite provides a lightning-fast, flexible environment that’s just as easy to configure manually. You can’t go wrong with either.\n\nWith your environment set up and ready to go, we can get into the real fun: building components. This is where **Tailwind CSS in React** truly shines. The utility-first approach fundamentally changes how you think about styling. You're no longer bouncing between CSS and JSX files; you're composing visual elements directly where they live.\n\n![Diagram showing web content transforming from a browser into a document and then a simplified web page.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d0c28ca1-67f6-4fad-8960-2d87449563fe/tailwind-css-react-content-flow.jpg)\n\nHonestly, it feels less like writing CSS and more like snapping together LEGO bricks. You grab small, single-purpose utility classes—like `flex` for layout, `p-4` for padding, or `rounded-lg` for border-radius—and combine them to build out complex, polished designs without ever leaving your component file.\n\n### Crafting a Responsive Card Component\n\nLet's walk through a classic UI element: a responsive card. This is a perfect, real-world example of how quickly you can create something that looks great and adapts to different screen sizes. A solid grasp of [responsive web design principles](https://uncommonwebdesign.com/custom-web-design/responsive-web-design/) is helpful here, as Tailwind’s breakpoints are built right on top of these concepts.\n\nWe can kick things off with a simple container `div`. By applying classes for a shadow, rounded corners, and some padding, we can flesh out the basic card shape in seconds.\n\n```jsx\nfunction ProductCard({ title, description, imageUrl }) {\n  return (\n    <div className=\"max-w-sm overflow-hidden rounded-lg bg-white shadow-lg\">\n      <img className=\"w-full\" src={imageUrl} alt={title} />\n      <div className=\"px-6 py-4\">\n        <div className=\"mb-2 text-xl font-bold\">{title}</div>\n        <p className=\"text-base text-gray-700\">{description}</p>\n      </div>\n    </div>\n  )\n}\n```\n\nSee how every style is declared right in the `className` prop? Classes like `max-w-sm` handle the width, `shadow-lg` adds that nice, subtle shadow, and `font-bold` takes care of the typography. This co-location makes the component completely self-contained and easy to understand at a glance.\n\n### Managing Readability and Conditional Styles\n\nOne of the first concerns developers have is that their JSX will get messy with long strings of utility classes. It’s a fair point, but the React ecosystem has some really elegant solutions.\n\nFor common, reusable elements like buttons or form inputs, the answer is abstraction. Instead of copy-pasting `className=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded\"` everywhere, you just create a dedicated `<Button>` component that encapsulates those styles. This keeps your application logic clean and your UI consistent.\n\nWhen you need to apply styles based on state or props, libraries like `clsx` are absolute lifesavers. They let you merge class names conditionally in a super clean, readable way.\n\n> **Pro Tip:** Using a utility like `clsx` or `tailwind-merge` is a game-changer for dynamic components. It elegantly handles conditional logic for things like an `active` state or a `disabled` style, keeping your JSX free of messy template literals.\n\nImagine a button that needs to change its appearance when it's disabled:\n\n```jsx\nimport clsx from \"clsx\"\n\nfunction ActionButton({ children, isDisabled }) {\n  const buttonClasses = clsx(\"font-bold py-2 px-4 rounded\", {\n    \"bg-blue-500 hover:bg-blue-700 text-white\": !isDisabled,\n    \"bg-gray-300 text-gray-500 cursor-not-allowed\": isDisabled,\n  })\n\n  return (\n    <button className={buttonClasses} disabled={isDisabled}>\n      {children}\n    </button>\n  )\n}\n```\n\nThis approach keeps your styling logic declarative and right where you need it. It’s the perfect blend of JavaScript’s power and Tailwind’s simplicity. And if you're looking to speed up this process even more, exploring a pre-built [Tailwind CSS component library](https://magicui.design/blog/tailwind-css-component-library) can give you a massive head start with accessible, ready-to-use components.\n\n## Diving Deeper: Advanced Customization and Best Practices\n\nOnce you've got the hang of building UIs with utility classes, the real fun begins. This is where you start to bend Tailwind to your will, tailoring it to match your project's unique brand and feel. You'll move from simply using a design system to truly _creating your own_.\n\nYour command center for all of this is the `tailwind.config.js` file. Think of it as the central hub for your project's entire aesthetic.\n\n![A UI customization panel displaying color swatches, a font size slider, and spacing settings.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/1a8db683-1a3e-450f-a67f-098a82dba405/tailwind-css-react-ui-settings.jpg)\n\nThis is where you'll define your brand's specific design tokens—colors, spacing, fonts, and more—ensuring every component you build feels perfectly on-brand and cohesive.\n\n### Making the Design System Your Own\n\nThe `theme.extend` object in your config file is your personal playground. The golden rule here is to _extend_, not overwrite. Tailwind’s defaults are incredibly well-thought-out, so you'll want to build on top of them rather than replacing them entirely.\n\nLet's say you need to add your brand's official color palette. It's as simple as this:\n\n```javascript\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      colors: {\n        \"brand-primary\": \"#1E40AF\",\n        \"brand-secondary\": \"#FBBF24\",\n      },\n      spacing: {\n        128: \"32rem\",\n      },\n    },\n  },\n  plugins: [],\n}\n```\n\nWith that small addition, you can now use classes like `bg-brand-primary` or `p-128` anywhere in your React components. This is a game-changer for consistency. If the brand color ever needs an update, you change the hex code in one place, and it propagates across your entire application. Magic.\n\n> This tight integration between **Tailwind CSS and React** has genuinely changed how we approach frontend work, paving the way for fantastic tools like [Shadcn UI](https://ui.shadcn.com/). By marrying pre-built, accessible components with the power of Tailwind, developers can compose modern, responsive designs right inside their JSX, cutting down on the constant back-and-forth between different files. You can read more about these evolving front-end trends over at [Netguru](https://www.netguru.com/blog/front-end-trends).\n\n### Mastering Responsive Design and Dark Mode\n\nOne of Tailwind's killer features is its ridiculously intuitive approach to responsive design. By using simple breakpoint prefixes like `md:` and `lg:`, you can tweak your UI for different screen sizes directly in the HTML. No more media query hell. It just works.\n\nGetting a beautiful dark mode up and running is just as easy. Simply flip the `darkMode: 'class'` switch in your config. From then on, you can use the `dark:` variant to apply styles that only kick in when the `<html>` element has a `dark` class.\n\nHere are a few pro tips to keep in mind as you work:\n\n- **Go Mobile-First:** Always. Style for the smallest screen by default, then use prefixes like `md:` and `lg:` to layer on adjustments for larger viewports. This leads to cleaner, more efficient CSS.\n- **Order Your Classes Logically:** A messy `className` is hard to read. I like to group related utilities together: start with layout and flexbox, then spacing, then typography, and finally colors and backgrounds.\n- **Use `@apply` with Caution:** While `@apply` can be tempting for extracting repeated utility patterns, it's often a sign that you should create a new React component instead. In a component-based world, encapsulation is king.\n\nFollowing these practices will help you build scalable, bespoke UIs that are a joy to maintain. This level of customization is what separates a good **Tailwind CSS React** project from a truly great one.\n\n## Optimizing Your CSS for Production\n\nA slick UI is a great start, but in today’s web, performance is everything. A snappy, responsive app has a direct line to user satisfaction and retention. This is where a **Tailwind CSS React** build really shines, helping you ship a product that’s as lightweight as it is beautiful.\n\n![Diagram illustrating CSS optimization: JIT processing Bundle.css to Purrge, then Purge for efficient styling.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/53607055-aea3-45ef-841e-c5108186f974/tailwind-css-react-css-optimization.jpg)\n\nThe secret to Tailwind’s incredible performance is its Just-In-Time (JIT) compiler. This engine works tirelessly behind the scenes, scanning your files and generating _only_ the CSS classes you’re actually using. Think of it as an on-demand system that prevents your final bundle from getting bloated with styles you never touch.\n\n### The Critical Role of Content Paths\n\nFor the JIT engine to work its magic, you have to tell it where to look. This is all handled in the `content` array inside your `tailwind.config.js` file. Getting this right is the single most important step for production optimization.\n\nHere's what a typical setup looks like:\n\n```javascript\n// tailwind.config.js\n/** @type {import('tailwindcss').Config} */\nexport default {\n  content: [\n    \"./src/**/*.{js,ts,jsx,tsx}\", // Scans all component files in the src directory\n    \"./public/index.html\", // Scans the main HTML file\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThis configuration acts as a map, guiding Tailwind to every file that might contain a utility class. When you run a production build, any class that isn't found in these files gets completely purged from the final CSS output. This process, often called **tree-shaking**, is automatic and ridiculously effective.\n\n> The impact of proper purging is massive. An unpurged Tailwind CSS file can weigh several megabytes. But a properly configured production build often shrinks this down to just **10-15 KB**. That drastic reduction translates directly to faster page loads and a much better user experience.\n\n### Ensuring a Lean Production Build\n\nGetting your content paths right ensures your application stays quick and efficient. The goal is simple: ship only the necessary code to the user's browser. A well-configured Tailwind setup handles most of the heavy lifting for you.\n\nHere are a few quick tips to keep in mind:\n\n- **Be Specific:** Your content paths should be as specific as possible. This avoids scanning unnecessary files, like everything inside `node_modules`.\n- **Include All Sources:** Double-check that every file type containing your markup (JSX, TSX, HTML) is included in the array. It's easy to miss one.\n- **Verify the Output:** After running a production build (`npm run build`), go inspect the generated CSS file in your build folder. You should see a remarkably small file size.\n\nMastering this optimization step is essential for any professional project. For more tips on boosting your site's speed, our guide on [how to improve website performance](https://magicui.design/blog/how-to-improve-website-performance) offers additional valuable strategies.\n\n## Common Questions About Tailwind and React\n\nAnytime you bring a new tool into your stack, you're going to have questions. It's just part of the process. When it comes to pairing **Tailwind CSS with React**, a few common hurdles pop up time and time again. Let's tackle them head-on so you can build with more confidence.\n\n### Can I Use Tailwind with Component Libraries Like Material-UI?\n\nThis is probably one of the first questions developers ask. The short answer is yes, you _can_, but it often feels like you're swimming upstream.\n\nEstablished libraries like [Material-UI](https://mui.com/) or [Ant Design](https://ant.design/) come with their own strongly opinionated styling systems. When you try to sprinkle Tailwind classes on top, you often end up in a battle of CSS specificity, needing to use `!important` prefixes (`!bg-blue-500`) just to make your styles stick. It can get messy, fast.\n\n> A far more elegant solution is to reach for a headless UI library. Tools like [Headless UI](https://headlessui.com/) (from the makers of Tailwind) or [Radix UI](https://www.radix-ui.com/) are game-changers here. They give you all the tricky functionality and accessibility for components like dropdowns or modals, but with zero pre-baked styles. It’s a blank canvas, ready for your Tailwind classes.\n\nFor any new project, I'd strongly recommend going the headless route. It just clicks with the entire Tailwind philosophy of giving you complete, granular control over your design from the very beginning.\n\n### How Do I Handle Conditional Classes in React?\n\nBuilding dynamic UIs means your styles often need to change based on state or props. Is a button active? Is a dropdown open? You'll be toggling classes constantly.\n\nWhile you could use simple template literals in your JSX, things can get unreadable pretty quickly once you add a bit of logic. A tiny utility library here makes a world of difference.\n\nMy go-to tools for this are `clsx` and `tailwind-merge`. They are purpose-built for cleanly and conditionally joining class names together.\n\nFor instance, look how clean styling an active navigation link becomes:\n\n```jsx\nimport clsx from \"clsx\"\n\nfunction NavItem({ href, isActive, children }) {\n  const classes = clsx(\"px-3 py-2 rounded-md text-sm font-medium\", {\n    \"bg-slate-900 text-white\": isActive,\n    \"text-slate-300 hover:bg-slate-700 hover:text-white\": !isActive,\n  })\n\n  return (\n    <a href={href} className={classes}>\n      {children}\n    </a>\n  )\n}\n```\n\nThis keeps your component's render method tidy and makes the styling logic incredibly easy to reason about.\n\n### Is It Bad Practice to Have Long Class Names?\n\nSeeing a dozen utility classes crammed into a `className` prop can feel wrong at first. It goes against everything we were taught about separating content and presentation. But in the world of Tailwind, this is often a sign you're on the right track.\n\nThe whole point is co-location—your styles live directly with the markup they affect. This makes components truly self-contained.\n\nThat said, if you find yourself copying and pasting the exact same long string of classes for every button on your site, that's a signal. It's time to abstract. The \"React way\" to solve this isn't to create a new CSS class like `.btn`, but to create a new component, `<Button>`. That component encapsulates the long `className` string, keeping your code DRY (Don't Repeat Yourself) and your application far easier to maintain.\n\n---\n\nReady to build stunning, high-performance web interfaces with less effort? **Magic UI** offers over **150** free, open-source animated components built with React, TypeScript, and Tailwind CSS. [Explore our components and templates today!](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-template.mdx",
    "content": "---\ntitle: 12 Best Tailwind CSS Template Kits for Developers in 2025\ndescription: >-\n  Discover the 12 best Tailwind CSS template and component kits for 2025. Find\n  the perfect resource to build stunning, responsive websites and apps faster.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-09bc2bae-26a1-4b9b-8a6d-6366accd55b1.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css template\n  - tailwindcss\n  - ui kits\n  - web development\n  - react components\npublishedOn: \"2025-11-21T09:35:35.751911+00:00\"\nfeatured: true\n---\n\nBuilding a professional, high-performance website no longer requires starting from scratch. For developers who value speed and customization, a high-quality **Tailwind CSS template** offers the perfect middle ground between a rigid theme and a blank canvas. These templates and UI kits provide pre-built, production-ready components and page layouts, all built on Tailwind's utility-first framework. This approach dramatically accelerates development time, allowing you to focus on unique features rather than reinventing common interface elements.\n\nThis guide provides a curated list of the best resources for finding your next Tailwind CSS template, from comprehensive UI kits like Magic UI and Flowbite to specialized marketplaces like ThemeForest. We'll analyze each option, highlighting its strengths, ideal use cases, and pricing models. To ensure your chosen Tailwind CSS template truly stands out, it's essential to build upon a foundation of solid design. Understanding [effective website design principles](https://alisavepro.com/best-ecommerce-website-design/) can help you customize your template for maximum impact and user engagement. Our goal is to help you quickly identify the right starting point for your project, whether you're building a SaaS platform, a marketing site, or an e-commerce store. Each entry includes direct links and key details to streamline your selection process.\n\n## 1. Magic UI\n\nMagic UI stands out as a developer-first UI library that fundamentally accelerates landing page development. Instead of building from scratch, developers can leverage a massive, open-source library of over 150 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. This focus on modern animation and interactivity makes it an exceptional choice for creating visually stunning, high-performance web experiences.\n\n![Magic UI](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/07696a19-ad84-4947-9bbe-eb0a655db479.jpg)\n\nThe platform is engineered for rapid assembly, providing more than 50 pre-built blocks and complete templates that transform a multi-hour design task into a matter of minutes. Its seamless integration with modern development stacks, particularly its compatibility with shadcn/ui, makes it a powerful addition to any React-based project. The strong community backing on GitHub and extensive social proof from developers highlight its real-world effectiveness in saving significant time and effort.\n\n### Core Features\n\n- **Free Animated Components:** Access 150+ free, open-source, and beautifully animated components. Each one is easily installable via a one-line command.\n- **Pro Templates & Blocks:** The \"Pro\" version offers over 50 premium blocks and full landing page templates for even faster development.\n- **Modern Tech Stack:** Built with React, TypeScript, Tailwind CSS, and Framer Motion for optimal performance and developer experience.\n- **shadcn/ui Compatibility:** Designed to work flawlessly alongside the popular shadcn/ui library, enhancing your component toolkit.\n\n### Who is it Best For?\n\nMagic UI is ideal for web developers, freelancers, and startup founders operating within the React ecosystem. If your goal is to quickly build polished, animated, and modern landing pages without compromising on code quality or developer experience, this is an unparalleled `tailwind css template` resource.\n\n### Pricing\n\n- **Components:** The core library of 150+ animated components is free and open-source.\n- **Magic UI Pro:** Premium templates and blocks are available for a one-time purchase. Check the official website for current pricing.\n\n**Website:** [magicui.design](https://magicui.design)\n\n## 2. Tailwind Plus (official, by Tailwind Labs)\n\nTailwind Plus is the official, commercial component library from the creators of Tailwind CSS. It provides an extensive, professionally designed and maintained collection of over 500 UI components, blocks, and fully-functional site templates. This is the canonical source for high-quality, framework-approved patterns, ensuring every `tailwind css template` is up-to-date with the latest framework features and best practices.\n\n![Tailwind Plus (official, by Tailwind Labs)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/080c486e-a2b1-47b5-a126-e6a7b0b6ad05.jpg)\n\nWhat makes it stand out is its one-time purchase model, which grants lifetime access to all current and future components without a recurring subscription. The code quality is exceptionally high, with everything built for modern stacks like Next.js and React.\n\n### Key Features & Considerations\n\n- **Pricing:** One-time payment of $299 for access to all components and templates.\n- **Best For:** Developers who want official, \"blessed\" components and are building with React or Next.js.\n- **Pros:** Maintained by the Tailwind team, one-time fee with lifetime updates, includes an Elements JS library for interactivity without a full JS framework.\n- **Cons:** Templates are not available in plain HTML, which may be a limitation for non-React projects. Figma files are not included with the templates.\n\nFor developers seeking an officially supported and comprehensive toolkit, Tailwind Plus is an excellent investment. While it offers premium paid options, you can explore excellent no-cost alternatives to get started; for a curated list, check out these [free Tailwind CSS templates](https://magicui.design/blog/tailwind-css-templates-free).\n\n**Website:** [https://tailwindcss.com/plus](https://tailwindcss.com/plus)\n\n## 3. ThemeForest (Envato)\n\nThemeForest, part of the Envato Market, is a massive marketplace hosting thousands of website templates, including a substantial and growing collection of items built with Tailwind CSS. It connects independent authors with buyers, offering a vast range of designs for landing pages, admin dashboards, and complex niche sites. Its strength lies in the sheer volume and variety, allowing you to find a `tailwind css template` for almost any project imaginable.\n\n![ThemeForest (Envato)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/8c31b17d-9405-40e7-8424-36786093bec0.jpg)\n\nWhat makes ThemeForest stand out is its powerful filtering system, user reviews, and author rating mechanisms. These tools help you navigate the huge selection to find quality products. You can easily compare templates based on sales, last updated date, and community feedback, which is crucial since quality can vary significantly between different creators.\n\n### Key Features & Considerations\n\n- **Pricing:** Varies per template, typically a one-time payment between $10 and $79.\n- **Best For:** Developers looking for a wide variety of competitively priced templates for specific niches who are willing to vet authors.\n- **Pros:** Huge selection across countless categories, competitive pricing, and a robust system for comparing items via sales data and reviews.\n- **Cons:** Quality is inconsistent across authors. It's essential to check demos, update logs, and verify the Tailwind CSS version and build tools for each item.\n\n**Website:** [https://themeforest.net](https://themeforest.net)\n\n## 4. Cruip\n\nCruip specializes in polished, design-forward Tailwind CSS templates, primarily focusing on landing pages and admin dashboards for startups and SaaS businesses. It stands out by offering each `tailwind css template` across multiple tech stacks, including plain HTML, React, Next.js, and Vue, ensuring developers can find a version that fits their existing workflow perfectly. This multi-framework support is a significant advantage over single-stack providers.\n\n![Cruip](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/2762a953-404e-40a9-9609-ca2824ad0150.jpg)\n\nWhat makes Cruip particularly user-friendly is its \"try before you buy\" model. Most premium templates have a free \"Lite\" version, allowing you to test the design quality and code structure before committing to a purchase. The templates are actively maintained and updated, with clear notes on compatibility with the latest versions of Tailwind CSS, which provides peace of mind for long-term projects.\n\n### Key Features & Considerations\n\n- **Pricing:** Individual templates typically range from $29 to $69. An \"all-access\" bundle is available for $199.\n- **Best For:** SaaS founders, marketers, and developers needing a high-quality, conversion-optimized landing page or dashboard without starting from scratch.\n- **Pros:** Very high design quality, templates available for multiple popular frameworks (HTML, React, Vue), and free \"Lite\" versions for evaluation.\n- **Cons:** The template selection is heavily focused on SaaS, marketing, and admin interfaces, with fewer options for other niches like e-commerce or blogs.\n\nCruip is an excellent choice for launching a professional-looking marketing site quickly. For more inspiration on building effective marketing sites, explore these high-quality [Tailwind landing page templates](https://magicui.design/blog/tailwind-landing-page).\n\n**Website:** [https://cruip.com](https://cruip.com)\n\n## 5. Flowbite (by Themesberg)\n\nFlowbite is an extensive open-source component library built on top of Tailwind CSS, offering a rich ecosystem of UI elements, blocks, and templates. It stands out by providing a robust free tier with hundreds of MIT-licensed core components, making it highly accessible. For those needing a complete solution, Flowbite Pro offers a `tailwind css template` for nearly any use case, from marketing sites to complex application dashboards.\n\n![Flowbite (by Themesberg)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/6db8099e-1fdc-446f-b9ce-9e1e81c086e5.jpg)\n\nWhat makes it a strong contender is its comprehensive documentation and active community, complete with integrations for popular frameworks like React, Vue, and Svelte. The Pro version enhances this by including a Figma design system, which is invaluable for teams that need to bridge the gap between design and development. The balance between a powerful free offering and a comprehensive premium toolkit makes it a versatile choice.\n\n### Key Features & Considerations\n\n- **Pricing:** Free MIT-licensed core library; Pro versions start from a one-time payment of $149 (Developer), $299 (Team), or $699 (Enterprise).\n- **Best For:** Developers and teams looking for a well-documented component ecosystem with both free and premium options, including integrated Figma assets.\n- **Pros:** Large collection of free components, excellent documentation, framework-specific integrations, and a full design system with Pro.\n- **Cons:** The most advanced components and full-page templates are locked behind the Pro version; licensing can be restrictive for reselling derivative works.\n\n**Website:** [https://flowbite.com](https://flowbite.com)\n\n## 6. Shuffle.dev (tailwind.build / Shuffle)\n\nShuffle.dev is a powerful visual editor designed for rapidly building websites using pre-made UI components. It offers a massive library of thousands of components and templates, allowing users to visually assemble a custom `tailwind css template` by dragging and dropping elements. This approach significantly speeds up the prototyping and development process, making it a go-to tool for creating landing pages and marketing sites.\n\n![Shuffle.dev (tailwind.build / Shuffle)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/9119c874-0992-4a78-b4a4-815a6934a529.jpg)\n\nWhat makes Shuffle stand out is its combination of a visual builder with code export functionality. Once a design is complete, you can export the clean code to various modern stacks, including React, Next.js, Vue, and plain HTML. This flexibility bridges the gap between visual design and hands-on development, providing a solid foundation that can be customized further.\n\n### Key Features & Considerations\n\n- **Pricing:** Offers monthly ($25/month), annual ($200/year), and lifetime ($599) plans for individuals and teams.\n- **Best For:** Developers and designers who want to visually assemble custom pages quickly and export the code for further refinement.\n- **Pros:** Extremely fast for prototyping, huge library of components and multiple UI kits, export to popular frameworks, lifetime license option.\n- **Cons:** The generated code may require some cleanup for complex, large-scale projects, and the visual builder's output may differ from a hand-coded structure.\n\n**Website:** [https://tailwind.build](https://tailwind.build)\n\n## 7. Creative Tim\n\nCreative Tim is a well-established marketplace for premium UI kits and admin dashboard templates. It offers a specialized collection of products built with Tailwind CSS, often developed in partnership with other ecosystems like Flowbite. Their focus is on providing comprehensive, ready-to-use solutions for complex application interfaces, such as dashboards, CRMs, and e-commerce backends. Each `tailwind css template` is designed to be a complete starter kit.\n\nWhat makes Creative Tim stand out is its reputation for producing polished, well-documented, and consistently updated templates. Developers can rely on their products for building robust back-end interfaces quickly, with extensive component libraries and detailed guides included with each purchase. They provide live demos for all templates, allowing for thorough evaluation before buying.\n\n### Key Features & Considerations\n\n- **Pricing:** Varies per product, typically ranging from $69 to $149 for a single license, with bundle options available.\n- **Best For:** Developers and teams needing a feature-rich, pre-built admin dashboard or application UI.\n- **Pros:** Reputable vendor with a history of quality releases and support, excellent choice for complex dashboard projects, provides extensive documentation.\n- **Cons:** Some templates rely on third-party libraries like Flowbite, which may have separate licensing. The feature set and included pages vary significantly between products.\n\nFor those building data-heavy applications, Creative Tim offers some of the most complete Tailwind CSS dashboard solutions on the market.\n\n**Website:** [https://www.creative-tim.com](https://www.creative-tim.com)\n\n## 8. TailGrids\n\nTailGrids is a comprehensive component library offering over 600 UI elements and blocks, but it distinguishes itself by also providing a solid collection of ready-to-use templates. It is an excellent choice for developers and teams who need a large variety of components for marketing, e-commerce, and dashboards, alongside the core design files for seamless collaboration. Each `tailwind css template` is built with flexibility in mind.\n\n![TailGrids](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/d9bab8b7-d966-4fbb-b5ac-986bf0191246.jpg)\n\nWhat makes it stand out is its licensing model and the inclusion of design assets. TailGrids offers a one-time payment for lifetime access and updates, which is a major advantage over subscription-based services. Higher-tier packages bundle Figma source files, making it a powerful resource for teams where designers and developers work closely together from concept to production.\n\n### Key Features & Considerations\n\n- **Pricing:** Free plan available. Paid plans start from a one-time payment of $99 for lifetime access.\n- **Best For:** Teams and freelancers needing both a vast component library and the corresponding Figma design files.\n- **Pros:** One-time purchase with lifetime updates, includes Figma source files on higher tiers, large library of 600+ components.\n- **Cons:** Primarily a component library, so its collection of full-site templates is smaller than template-first platforms.\n\n**Website:** [https://tailgrids.com](https://tailgrids.com)\n\n## 9. UIdeck\n\nUIdeck offers a diverse marketplace of website templates and UI kits, with a dedicated category for resources built with Tailwind CSS. It functions as a broad catalog, providing a mix of free and premium options primarily focused on landing pages, business sites, and marketing templates. This platform is ideal for developers and entrepreneurs looking for a quick and affordable `tailwind css template` to launch a project.\n\n![UIdeck](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/352f7aca-744d-4a46-928e-afb1ad93bc45.jpg)\n\nWhat makes UIdeck stand out is its \"All-Access\" pass, which grants access to its entire collection of premium templates for a single fee. This model provides excellent value for agencies or freelancers who need a wide variety of designs for different projects. The lifetime usage rights on downloaded items also add to its appeal.\n\n### Key Features & Considerations\n\n- **Pricing:** Free templates are available. Premium templates are sold individually (around $29-$49) or via an All-Access pass ($99 for lifetime access).\n- **Best For:** Freelancers, agencies, and startups needing a variety of affordable marketing and landing page templates.\n- **Pros:** Great value through the All-Access bundle, especially during promotions. A good mix of free and paid options for different budgets.\n- **Cons:** Template quality and build tooling can be inconsistent across different items. Users must verify the Tailwind CSS version and dependencies for each template individually.\n\n**Website:** [https://uideck.com](https://uideck.com)\n\n## 10. Themefisher\n\nThemefisher is a boutique template shop offering a curated collection of both free and premium HTML templates built with Tailwind CSS. It is an excellent resource for developers looking for straightforward, static-site-ready designs. Each `tailwind css template` comes with source files, including the `tailwind.config.js` file, making customization simple and direct for HTML-based projects.\n\n![Themefisher](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/d6f99fe4-44f1-4b7b-a1d6-92f3dd732b95.jpg)\n\nWhat makes Themefisher stand out is its focus on simplicity and accessibility. The zipped downloads provide everything needed to get a project running without the complexity of a JavaScript framework. This makes it an ideal choice for landing pages, portfolios, or marketing sites where a static deployment is sufficient and preferred. The availability of free templates also allows users to trial the code quality before committing to a premium option.\n\n### Key Features & Considerations\n\n- **Pricing:** Offers both free templates and premium options, typically ranging from $29 to $59 for a single-use license.\n- **Best For:** Developers and freelancers building static websites, landing pages, or projects that don't require a complex JavaScript framework.\n- **Pros:** Straightforward HTML-based builds are great for static sites, free options are available to test code quality, and downloads include all necessary source files and Tailwind configs.\n- **Cons:** The catalog is smaller compared to larger marketplaces, and there are fewer variations for different tech stacks (like React or Vue).\n\n**Website:** [https://themefisher.com/tailwind-templates](https://themefisher.com/tailwind-templates)\n\n## 11. Vercel Templates\n\nVercel Templates is the official gallery of deployable starters from the creators of the Next.js framework. It offers a wide range of free, open-source templates, many of which are pre-configured with Tailwind CSS. These starters are designed for one-click deployment, making it incredibly fast to go from a template to a live URL hosted on Vercel's platform. This makes it an ideal resource for prototyping, proof-of-concepts, or learning modern web stacks.\n\n![Vercel Templates](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/457c9c21-2bdf-41d2-9c35-c1b254d6ae95.jpg)\n\nWhat makes this platform stand out is its seamless integration with the Vercel ecosystem. Each `tailwind css template` is optimized for performance and immediate deployment, removing the friction of initial setup. While the templates are more like functional scaffolds than polished designs, they provide a solid, best-practice foundation for building out full applications like blogs, e-commerce sites, and SaaS platforms.\n\n### Key Features & Considerations\n\n- **Pricing:** Free and open-source.\n- **Best For:** Developers using Next.js who want a fast, zero-config way to deploy a starter project.\n- **Pros:** One-click deployment to Vercel, up-to-date with modern frameworks, excellent for learning and rapid prototyping.\n- **Cons:** Designs are often basic scaffolds that require significant UI customization for production use.\n\nFor developers needing a quick start, Vercel provides an unmatched path from concept to live site. If you're new to the framework, getting the initial setup right is key; for guidance, you can follow this detailed [guide on installing Tailwind CSS with Next.js](https://magicui.design/blog/tailwind-css-install).\n\n**Website:** [https://vercel.com/templates](https://vercel.com/templates)\n\n## 12. Wrapmarket (formerly WrapBootstrap)\n\nWrapmarket, the platform previously known as WrapBootstrap, is a curated marketplace for premium website templates where independent creators sell their work. While it covers various frameworks, it features a dedicated and filterable category specifically for items built with Tailwind CSS. This allows developers to discover unique niche templates for projects like creative portfolios, specialized e-commerce stores, and complex dashboards that might not be available on larger, more generalized marketplaces.\n\n![Wrapmarket (formerly WrapBootstrap)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/430d683b-95b2-4f00-9fa1-210030a66caa.jpg)\n\nWhat makes Wrapmarket a valuable resource is its collection of distinct designs from a diverse pool of authors. Each `tailwind css template` is a one-time purchase, but it's crucial to review each seller's profile, as the quality, documentation, and update frequency can vary significantly between creators. This platform is an excellent alternative to explore when you're looking for a specific aesthetic that is hard to find elsewhere.\n\n### Key Features & Considerations\n\n- **Pricing:** One-time payments per template, with prices set by individual authors.\n- **Best For:** Developers looking for niche templates and unique designs from independent creators.\n- **Pros:** Offers an alternative marketplace with some exclusive items, clear filtering helps to find Tailwind-specific templates quickly.\n- **Cons:** The inventory of Tailwind templates is smaller compared to major marketplaces, and the quality and support level vary by seller.\n\n**Website:** [https://wrapmarket.com](https://wrapmarket.com)\n\n## Top 12 Tailwind CSS Template Providers — Comparison\n\n| Product                      |                                                        Key features | UX & quality                                              | Value & pricing                                       | Target audience                                  | Unique selling points                                                        |\n| ---------------------------- | ------------------------------------------------------------------: | --------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------- |\n| **Magic UI**                 | 50+ customizable blocks, 150+ animated React/TS/Tailwind components | High-performance, modern animations, active OSS community | Core library free (OSS); Pro premium templates (paid) | Web developers, designers, startups, freelancers | Fast landing-page assembly; large animated component set; shadcn/ui friendly |\n| Tailwind Plus (official)     |                   500+ components, full site templates, Elements JS | Canonical Tailwind patterns, high code quality            | One-time purchase with ongoing updates                | Teams wanting official Tailwind patterns         | Maintained by Tailwind Labs; canonical examples                              |\n| ThemeForest (Envato)         |                    Broad marketplace, live previews, author ratings | Quality varies by author; strong discovery tools          | Per-item pricing; competitive & frequent discounts    | Buyers seeking variety and budget options        | Huge catalog and strong comparison tools                                     |\n| Cruip                        |                Templates in HTML/React/Next/Vue, free Lite versions | Polished design, actively maintained                      | Individual purchases and bundle options               | SaaS, marketing sites, dashboards                | High-design SaaS templates; clear stack choices                              |\n| Flowbite                     |                  MIT core components + Pro (600+ items), admin kits | Good docs and ecosystem                                   | Free core; Pro paid upgrade for assets                | Developers building interactive UIs & dashboards | Documented component system + Figma/asset kits                               |\n| Shuffle.dev (tailwind.build) |            Visual editor, large component library, export to stacks | Fast visual assembly; output may need cleanup             | Monthly/annual/lifetime plans                         | Designers and devs who prefer visual builders    | Visual page builder with multi-stack export                                  |\n| Creative Tim                 |                      Premium Tailwind admin & UI kits, demos & docs | Reputable vendor, consistent documentation                | Paid products per item                                | Admin/dashboard projects and teams               | Polished dashboards often integrating Flowbite                               |\n| TailGrids                    |                     600+ components, lifetime licenses, Figma files | Component-rich; includes design assets on tiers           | One-time lifetime pricing options                     | Teams needing components + design sources        | Lifetime access + bundled Figma sources                                      |\n| UIdeck                       |                 100+ templates, All-Access pass, Tailwind filtering | Mixed quality; good bundle value during promos            | Free + premium; All-Access bundles                    | Marketers and small teams needing many templates | All-Access bundles for bulk downloads                                        |\n| Themefisher                  |                          Tailwind HTML templates with configs, docs | Straightforward for static sites; free trials             | Free & premium; simple pricing                        | Static site builders and simple deployments      | HTML-first Tailwind templates with config files                              |\n| Vercel Templates             |                       Next.js + Tailwind starters, one-click deploy | Optimized for Vercel, quick to deploy                     | Free, open-source starters                            | Developers deploying to Vercel and prototyping   | One-click Deploy + framework-ready starters                                  |\n| Wrapmarket                   |                            Curated marketplace with Tailwind filter | Niche items; quality varies by seller                     | Per-item purchases from independent authors           | Buyers seeking unique or niche templates         | Filtered Tailwind listings with indie creators                               |\n\n## Final Thoughts\n\nNavigating the expansive world of Tailwind CSS templates can feel like searching for a specific component in a massive, unorganized library. Throughout this guide, we've explored a diverse landscape of options, from the official component kits by Tailwind Labs to expansive marketplaces like ThemeForest and specialized providers such as Cruip and Creative Tim. The core takeaway is that the \"best\" template is entirely subjective and hinges directly on your project's unique requirements, your technical proficiency, and your budget.\n\nYour project's scope is the single most important factor. A simple landing page for a new SaaS product has vastly different needs than a complex, data-driven dashboard. For rapid prototyping or a straightforward marketing site, a solution like TailGrids or UIdeck provides excellent, free, and functional components. In contrast, if you're building a full-scale application, investing in a comprehensive design system from Flowbite or the premium offerings from Tailwind Plus will provide the necessary depth, documentation, and consistency.\n\n### Making the Right Choice for Your Next Project\n\nSelecting the right **tailwind css template** requires a strategic approach. Before committing, consider the following critical factors to ensure your choice accelerates, rather than complicates, your development workflow:\n\n- **Technology Stack Compatibility:** Are you using React, Vue, Svelte, or plain HTML? Ensure the template provides components or code compatible with your chosen framework. Tools like Shuffle.dev excel here, offering exports for various popular frameworks.\n- **Design and Customization:** How much do you plan to alter the base design? Some templates are highly opinionated and difficult to restyle, while others are built on a flexible, utility-first foundation that encourages customization. Always check the underlying code structure and documentation.\n- **Licensing and Long-Term Use:** Scrutinize the license carefully. Can you use the template for a single commercial project or multiple? Are you allowed to use it in products you sell? This is particularly crucial when sourcing from marketplaces.\n- **Support and Updates:** A template is not a one-time purchase; it's an investment. Look for providers who offer ongoing support and regularly update their components to align with the latest versions of Tailwind CSS and popular frameworks. This ensures your project remains modern and secure.\n\nUltimately, a **tailwind css template** is more than just a collection of pre-styled components; it's a foundational decision that impacts your development speed, design consistency, and overall user experience. By carefully evaluating your needs against the options we've detailed, you can confidently select a toolkit that empowers you to build beautiful, responsive, and high-performing web applications with the efficiency that Tailwind CSS promises. Your ideal starting point is out there, waiting to be customized into your next great project.\n\n---\n\nReady to move beyond static templates and build truly dynamic, animated user interfaces? **Magic UI** offers a library of over 50 free, open-source, and beautifully animated components built with Tailwind CSS and Framer Motion. Elevate your next project with stunning, production-ready animations by visiting [Magic UI](https://magicui.design) and exploring our component library today.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-templates-free.mdx",
    "content": "---\ntitle: 12 Best Tailwind CSS Templates Free to Use in 2025\ndescription: >-\n  Discover the top 12 Tailwind CSS templates free for your next project. Explore\n  a curated list of high-quality, responsive, and customizable resources.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-37b46d39-bde9-43a3-9ae8-58031cb67ff8.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css templates free\n  - tailwind templates\n  - free tailwind css\n  - tailwind ui kits\n  - react templates\npublishedOn: \"2025-09-23\"\nfeatured: true\n---\n\nTailwind CSS has revolutionized front-end development with its utility-first approach, but starting a new project from a blank slate can still be a significant time investment. That's where a solid template foundation comes in. High-quality templates provide the structural and design groundwork, saving you countless hours of initial setup and styling. The challenge, however, is navigating the vast number of online resources to find genuinely useful and well-coded **tailwind css templates free** of charge. This guide is designed to solve that problem.\n\nWe have curated a definitive list of the 12 best platforms and collections offering free Tailwind templates. For each resource, you'll find a detailed analysis covering its ideal use cases, technical strengths, and any potential limitations to consider. Whether you're a freelancer building a portfolio, a startup launching a SaaS product, or a developer creating a complex admin dashboard, this list provides a vetted starting point to accelerate your workflow.\n\nThis \"build faster, not harder\" philosophy extends beyond just web development. Just as you use templates for your site, leveraging resources like [social media design templates](https://aifontgenerator.com/blog/social-media-design-templates) can streamline content creation and maintain brand consistency across all platforms. This article focuses on helping you find the right code foundation, complete with previews and direct links, so you can stop searching and start building.\n\n## 1. magicui Homepage\n\nMagic UI emerges as a premier destination for developers seeking to build visually stunning and high-performance landing pages with exceptional speed. It differentiates itself by integrating cutting-edge technologies like React and Typescript directly with Tailwind CSS, offering a sophisticated component-based architecture. This approach provides a significant advantage for modern web development, allowing for the rapid assembly of complex, maintainable interfaces.\n\n![magicui Homepage](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/00a3a05e-21d7-4de7-9f31-5cb5884496ef.jpg)\n\nWhile it offers comprehensive paid templates, its core strength for those seeking **tailwind css templates free** lies in its extensive collection of over 150 open-source animated components. These are not static blocks but dynamic, copy-paste-ready elements that can elevate any project. This dual offering of free components and premium templates makes Magic UI an invaluable resource for both bootstrapping startups and seasoned developers.\n\n### Key Strengths & Use Cases\n\n- **Component-Driven Design:** Instead of just providing static page templates, Magic UI delivers individual, animated components. This is ideal for developers who want to integrate unique, eye-catching elements like animated grids or meteor effects into an existing project without overhauling the entire design.\n- **Modern Tech Stack:** Built for the React ecosystem, it’s a perfect fit for projects using Next.js or similar frameworks. The use of Typescript ensures type safety and better developer experience, reducing potential runtime errors.\n- **Rapid Prototyping:** The copy-and-paste functionality is seamless. You can find a component, copy the code, and have a complex animation running in your local development environment in minutes, dramatically accelerating the prototyping phase.\n\n---\n\n| Feature Analysis           | Assessment                                                                                                                                                    |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Free Offerings**         | Excellent. The 150+ free animated components are high-quality and provide immense value, making it a top-tier resource.                                       |\n| **Technology Integration** | Specialized. Tailored for the React/Typescript/Tailwind ecosystem, which is a pro for developers in that niche but a potential barrier for others.            |\n| **Ease of Use**            | Very Good. The platform is clean, and components are easy to find and implement. Familiarity with React and `npm`/`yarn` is necessary for smooth integration. |\n| **Community & Support**    | Growing. Backed by prominent investors, the project has strong momentum and an active community, ensuring future updates and support.                         |\n\n**Website:** [https://magicui.design](https://magicui.design)\n\n## 2. Tailwind Toolbox\n\nTailwind Toolbox stands out as a foundational, community-driven hub for **tailwind css templates free** of charge. It's less of a commercial marketplace and more of a curated library of open-source starter kits, making it an excellent first stop for developers who prioritize simplicity and direct access to source code over complex, feature-heavy designs. The platform's core strength is its straightforward, no-frills approach.\n\nThe user experience is clean and efficient. You can filter templates by categories like \"Admin,\" \"Landing Page,\" or \"Blog,\" and each entry provides a live preview and a direct link to the GitHub repository. This transparency is a key differentiator; you can inspect the code, check for dependencies, and fork the project in seconds without creating an account. While some designs are minimalist and may target older Tailwind versions, they serve as perfect, lightweight boilerplates for custom projects.\n\n### Core Offerings & Use Cases\n\n- **Starter Templates:** A diverse gallery of templates ideal for rapid prototyping or as a clean base for a new project.\n- **Practical Use:** Best suited for developers who want a simple starting point to build upon, rather than a fully-featured, ready-to-deploy solution.\n- **Pricing:** All resources are 100% free and open-source.\n\n**Website:** [Tailwind Toolbox](https://www.tailwindtoolbox.com/starter-templates?utm_source=openai)\n\n## 3. Creative Tim – Tailwind Free Templates\n\nCreative Tim elevates the landscape of **tailwind css templates free** by offering professionally designed UI kits, dashboards, and starter projects. Its primary differentiator is the high-quality, polished aesthetic of its free offerings, which often feel like lite versions of premium products. This makes it an ideal resource for developers and startups who need a visually impressive foundation without an initial investment. The platform bridges the gap between basic open-source boilerplates and expensive commercial themes.\n\nThe user experience is highly organized, allowing you to filter by technology like React, Vue, Next.js, and Angular, in addition to standard HTML. Each template comes with a comprehensive live preview and detailed documentation, which is a significant advantage. While account registration is typically required for downloads, the process is quick. The free versions are robust, but it's important to note they are often feature-limited to encourage upgrading to a PRO version, which unlocks more components and pages.\n\n### Core Offerings & Use Cases\n\n- **Polished UI Kits & Dashboards:** A large collection of free templates that look and feel premium, perfect for building admin panels, SaaS interfaces, and presentation websites.\n- **Framework-Specific Starters:** Best for developers committed to a specific JavaScript framework who want a pre-configured, well-documented starting point.\n- **Pricing:** Offers a generous selection of free templates, with paid PRO versions available for expanded features and support.\n\n**Website:** [Creative Tim – Tailwind Free Templates](https://www.creative-tim.com/templates/tailwind-free?utm_source=openai)\n\n## 4. Cruip – Free Tailwind Templates\n\nCruip specializes in high-quality, production-ready landing pages and dashboards designed with a modern aesthetic. While known for their premium products, they offer a selection of exceptional **tailwind css templates free** to the community. These \"Lite\" versions are far from basic, providing sophisticated designs and support for popular frameworks like Next.js, React, Vue, and Laravel, making Cruip an excellent choice for startups and developers needing a polished, professional starting point.\n\n![Cruip – Free Tailwind Templates](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/7d766572-4720-47f3-99c7-8a3535c6191c.jpg)\n\nThe user experience on the site is stellar, with clear live demos and direct access to GitHub repositories for each free template. A unique benefit is that some free offerings include accompanying Figma design files, which is a massive advantage for teams that want to customize visuals before coding. The primary trade-off is that more advanced pages and components are reserved for the paid versions, but the free templates are more than capable for single-page marketing sites or simple dashboard MVPs.\n\n### Core Offerings & Use Cases\n\n- **Lite Templates:** A curated collection of landing pages and dashboards with modern UX/UI, available for multiple tech stacks.\n- **Practical Use:** Ideal for developers building marketing websites for startups, SaaS products, or modern web applications that require a visually impressive and conversion-focused design.\n- **Pricing:** \"Lite\" templates are completely free, with full-featured premium versions available for purchase.\n\n**Website:** [Cruip – Free Tailwind Templates](https://cruip.com/free-templates/?utm_source=openai)\n\n## 5. Flowbite\n\nFlowbite is a highly popular ecosystem built on top of Tailwind CSS, offering an extensive open-source library of UI components that function as building blocks. While best known for its individual components like modals and navbars, it also provides a selection of **tailwind css templates free** to use, primarily in the form of pre-built application pages. This component-first approach allows developers to quickly assemble complex interfaces by copying and pasting production-ready elements.\n\nThe platform excels at providing accessible, best-practice-driven code snippets that integrate seamlessly into any Tailwind project. The free offerings are essentially demo pages, such as pricing tables or CRUD layouts, which serve as excellent, practical examples. While the most comprehensive template kits and advanced blocks are part of the paid \"Flowbite Pro,\" the free core library is robust enough to build sophisticated layouts from scratch, making it a powerful resource for developers who prefer a more modular construction process.\n\n![Flowbite](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/28793799-7aca-4b8a-a9be-9cda435d93cb.jpg)\n\n### Core Offerings & Use Cases\n\n- **Component-Driven Pages:** Free access to fully-coded application pages like pricing, login, and maintenance screens built with the core Flowbite component library.\n- **Practical Use:** Ideal for developers who need to quickly assemble standard application views or want to learn how to structure pages using a component-based system.\n- **Pricing:** The core component library and select page templates are free and open-source. Full template kits and Figma files are available via paid tiers.\n\n**Website:** [Flowbite](https://flowbite.com/application-ui/demo/pages/pricing/?utm_source=openai)\n\n## 6. HyperUI\n\nHyperUI distinguishes itself as a comprehensive, open-source library of unstyled UI components built with Tailwind CSS. Rather than providing full-page templates, its strength lies in offering a massive collection of copy-and-paste building blocks. This makes it an invaluable resource for developers who need to assemble custom interfaces from scratch, offering a middle ground between using a full UI kit and writing every className by hand.\n\nThe platform is exceptionally developer-friendly, with a clean interface that allows you to filter components by categories like \"Marketing,\" \"Application UI,\" and \"Ecommerce.\" Each component provides clean, readable JSX markup ready for React projects, and the code is designed to be easily adaptable. This component-first approach is perfect for those who want granular control over their final design, leveraging a rich **tailwind css component library** without being locked into a specific template's structure.\n\n![HyperUI](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/8a95af32-4310-4ee5-badd-7b8be21dcbc7.jpg)\n\n### Core Offerings & Use Cases\n\n- **Component Collections:** Hundreds of free, unstyled components for alerts, forms, navigation, marketing sections, and more.\n- **Practical Use:** Ideal for developers building custom web applications or websites who need a wide variety of individual UI elements rather than a single cohesive theme.\n- **Pricing:** Completely free and open-source under the MIT license.\n\n**Website:** [HyperUI](https://www.hyperui.dev/components/application?utm_source=openai)\n\n## 7. TailAdmin\n\nTailAdmin is a specialized powerhouse for developers needing a robust, open-source admin dashboard. It stands out by providing versions for multiple modern frameworks, including HTML, React, Next.js, Vue, and Angular, ensuring a consistent design language regardless of your tech stack. It's a go-to resource for anyone looking for **tailwind css templates free** to build analytics panels, CRMs, or sophisticated internal tools.\n\n![TailAdmin](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/54bef752-e207-4907-87b6-728e27b496b6.jpg)\n\nThe user experience is developer-centric, with clear documentation and an active GitHub community. The free community edition is remarkably generous, offering dozens of pre-built UI components, charts, and essential dashboard layouts. While its focus is strictly on admin interfaces rather than marketing sites, this specialization is its core strength. Advanced features and more complex dashboards are reserved for the PRO version, but the free tier provides more than enough for building professional-grade backends. For more information, you can learn about building a SaaS with templates like [TailAdmin](https://magicui.design/docs/templates/saas).\n\n### Core Offerings & Use Cases\n\n- **Multi-Framework Dashboards:** Offers consistent, high-quality dashboard templates for most popular frontend frameworks.\n- **Practical Use:** Ideal for developers building data-rich applications like SaaS backends, e-commerce admin panels, or internal management systems.\n- **Pricing:** A powerful free community edition is available, with a one-time payment for PRO features and additional components.\n\n**Website:** [TailAdmin](https://tailadmin.com/?utm_source=openai)\n\n## 8. UIdeck – Free Tailwind Templates\n\nUIdeck specializes in providing polished, business-oriented **tailwind css templates free** of charge, making it a go-to resource for startups, SaaS companies, and digital agencies. Its core strength lies in offering visually modern and conversion-focused landing pages that look premium and are ready for immediate deployment. Unlike more developer-centric repositories, UIdeck's offerings feel like complete products, not just starter kits.\n\n![UIdeck – Free Tailwind Templates](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/3a711ec1-0eb5-4984-b0f3-574ff0c6bb8d.jpg)\n\nThe user experience is straightforward, presenting templates in a clean gallery format with live previews and download links. While many high-quality templates are genuinely free, it's worth noting that some act as \"lite\" versions to upsell a more feature-rich pro kit. This is a fair trade-off, as the free versions are often more than sufficient for launching a new product or marketing campaign. The code is clean, responsive, and easy to customize, making it simple to adapt a template to a specific brand identity.\n\n### Core Offerings & Use Cases\n\n- **Business & SaaS Templates:** A strong collection of landing pages and multi-page sites designed for commercial use.\n- **Practical Use:** Ideal for entrepreneurs and marketing teams needing a professional-looking website quickly without designing from scratch.\n- **Pricing:** Offers a mix of completely free templates and free \"lite\" versions of premium products.\n\n**Website:** [UIdeck](https://uideck.com/tailwind-templates?utm_source=openai)\n\n## 9. TailwindFlex\n\nTailwindFlex operates as a massive, community-powered library focused on individual components rather than full-page **tailwind css templates free** of charge. Its primary value lies in its sheer volume, offering thousands of design blocks for nearly any conceivable need, from headers and footers to complex interactive elements. It’s less a place for downloading a cohesive theme and more a creative repository for developers looking to quickly assemble a unique interface or find inspiration for a specific UI problem.\n\n![TailwindFlex](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/06665346-f336-497f-86ae-520c8ccda29e.jpg)\n\nThe user experience is built around a rapid copy-and-paste workflow. You find a component you like, view the code, and drop it directly into your project. While the open contribution model means design quality and consistency can vary, the platform's \"trending\" and \"weekly\" lists help surface the best and most popular submissions. This makes it an invaluable resource for breaking out of design ruts and discovering novel ways to apply Tailwind CSS utilities.\n\n### Core Offerings & Use Cases\n\n- **Component Library:** An extensive collection of over 2,000 free, copy-paste-ready UI components and blocks.\n- **Practical Use:** Ideal for developers who prefer to build pages piece by piece or need quick design patterns and inspiration for specific sections of a website.\n- **Pricing:** All components are completely free for both personal and commercial projects.\n\n**Website:** [TailwindFlex](https://tailwindflex.com/?utm_source=openai)\n\n## 10. TailwindTemplate.co\n\nTailwindTemplate.co is a lean and efficient hub offering **tailwind css templates free** for developers who value speed and simplicity. It carves out its niche by focusing on minimal, open-source templates and components, making it an ideal resource for rapid project kickstarts, especially for landing pages and basic application UIs. The platform's standout feature is its multi-framework support, providing clean code snippets for HTML, React, Vue, and Svelte.\n\nThe user experience is direct and uncluttered. Navigating the site is effortless, with clear previews and immediate access to the code. This direct-to-source approach is perfect for developers who want to grab a responsive layout and start customizing immediately without navigating complex dependencies or build tools. While its library is more modest compared to larger aggregators, the quality and minimalism of its offerings ensure that each template is a solid, unbloated foundation.\n\n### Core Offerings & Use Cases\n\n- **Multi-Framework Snippets:** Provides ready-to-use code for HTML, React (using `className`), Vue, and Svelte, streamlining integration.\n- **Practical Use:** Excellent for building quick, responsive landing pages, simple marketing sites, or starter UIs where minimal dependencies are a priority.\n- **Pricing:** All templates and components are completely free and open-source.\n\n**Website:** TailwindTemplate.co\n\n## 11. Meraki UI\n\nMeraki UI offers a refined collection of **tailwind css templates free** to use, with a standout emphasis on robust Right-to-Left (RTL) language support and integrated dark mode. This makes it a go-to resource for developers building multilingual applications or modern UIs that require accessibility and user preference features out of the box. While its template library is more selective, its primary strength lies in its high-quality, responsive, and accessible components.\n\n![Meraki UI](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/0e6ab450-92fe-4a29-b1b8-57ea70c3e1c6.jpg)\n\nThe platform is exceptionally developer-friendly, providing components compatible with modern frameworks like Vue 3 and Alpine.js, as well as Laravel Blade. Instead of offering monolithic templates, Meraki UI encourages a component-first approach, where you assemble a custom interface from its clean and modern building blocks. This method gives you more control and results in a more tailored final product. For a deeper dive into modern template options, you can explore more about [portfolio templates for developers](https://magicui.design/docs/templates/portfolio).\n\n### Core Offerings & Use Cases\n\n- **RTL & Dark Mode Components:** A rich library of components with built-in support for RTL languages and dark themes, perfect for global applications.\n- **Practical Use:** Ideal for developers who need to build accessible, multilingual websites or prefer to construct their UI from a set of well-designed, individual components.\n- **Pricing:** All components and templates are completely free and open-source.\n\n**Website:** [Meraki UI](https://merakiui.com/?utm_source=openai)\n\n## 12. daisyUI\n\nWhile not a direct provider of full templates, daisyUI has become an essential ecosystem tool that dramatically accelerates the process of building with Tailwind CSS. It functions as a plugin, offering a vast library of over 60 pre-designed, themeable components like buttons, cards, and navbars. This component-first approach allows developers to assemble complex interfaces rapidly without writing dozens of utility classes for each element, effectively offering the building blocks for any **tailwind css templates free** project you can imagine.\n\n![daisyUI](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/b1cc8057-cdcc-4af1-b29e-cda75b6f51d5.jpg)\n\nThe primary advantage of daisyUI is its use of semantic class names (e.g., `className=\"btn btn-primary\"`) which significantly reduces HTML bloat and improves code readability. It's highly customizable with a powerful theme generator, dark mode support, and works seamlessly with any JavaScript framework. While you won't find complete, downloadable website templates here, its comprehensive component library empowers you to build them from scratch far more efficiently than with vanilla Tailwind alone.\n\n### Core Offerings & Use Cases\n\n- **Component Library:** An extensive collection of pure CSS components that plug directly into Tailwind.\n- **Practical Use:** Ideal for developers who want to maintain the power of utility classes but speed up development with pre-styled, semantic, and highly themeable UI elements.\n- **Pricing:** Completely free and open-source.\n\n**Website:** [daisyUI](https://daisyui.com/?utm_source=openai)\n\n## Comparison of 12 Free Tailwind CSS Template Sources\n\n| Product                      | Core Features / Tech ✨                                 | User Experience ★★★★☆                   | Value 💰                                   | Target Audience 👥                                  | Unique Selling Points 🏆                             |\n| ---------------------------- | ------------------------------------------------------- | --------------------------------------- | ------------------------------------------ | --------------------------------------------------- | ---------------------------------------------------- |\n| magicui Homepage             | 50+ customizable blocks, React, TS, Tailwind CSS        | High performance, responsive, intuitive | Premium-grade, sustained by investors 💰💰 | Developers & designers (all levels) 👥              | 150+ animated open-source components ✨              |\n| Tailwind Toolbox             | Free starter templates, GitHub links, live previews     | Lightweight, easy to customize          | Completely free 💰                         | Beginners & quick template users 👥                 | Simple, curated starter templates                    |\n| Creative Tim – Tailwind Free | Free dashboards & UI kits, multi-framework support      | Professional design quality ★★★★☆       | Free + paid upgrade options 💰             | Developers seeking polished multi-framework kits 👥 | Professional docs & wide framework support           |\n| Cruip – Free Tailwind        | Multi-stack (Next.js, React, Vue, Laravel), Figma files | Modern UX, production-ready             | Free Lite + paid versions 💰               | Marketing & admin dashboards users 👥               | Multi-stack support & Figma resources ✨             |\n| Flowbite                     | UI components, prebuilt pages, accessibility focus      | Extensive UI coverage, quick workflow   | Free core + premium packs 💰               | Rapid UI builders & accessibility-focused devs 👥   | Ecosystem variants (React, Svelte)                   |\n| HyperUI                      | Copy-paste small components, categorized by use case    | Developer-friendly, modular             | Fully free & open-source 💰                | Custom builders & tailwind v4 users 👥              | MIT licensed, no install needed                      |\n| TailAdmin                    | Admin dashboards, multi-framework, updated regularly    | Solid IA & docs, active community       | Free base + PRO upgrades 💰                | Admin tool developers & dashboards 👥               | Multi-framework, strong admin focus                  |\n| UIdeck – Free Tailwind       | Business & startup landing templates                    | Responsive, modern, quick solutions     | Mostly free, some paid kits 💰             | Startups, SaaS marketers 👥                         | Frequent template updates                            |\n| TailwindFlex                 | 2000+ components/examples, weekly updates               | Huge variety for inspiration            | 100% free 💰                               | Designers & developers needing inspiration 👥       | Massive community-driven library                     |\n| TailwindTemplate.co          | Responsive templates, multi-framework examples          | Simple, minimal dependencies            | Fully free 💰                              | Fast prototyping & minimalists 👥                   | Lightweight, multi-framework snippets                |\n| Meraki UI                    | RTL & dark mode support, marketing & app UI components  | Clean, modern, accessible               | Free 💰                                    | Multilingual & RTL interface developers 👥          | Strong RTL support & Vue/Alpine.js/Laravel templates |\n| daisyUI                      | 60+ pre-themed semantic components, theme generator     | Fast assembly, reduced className bloat  | Free & open-source 💰                      | Developers preferring CSS plugins 👥                | Theme generator, dark mode support                   |\n\n## Choosing the Right Free Template for Your Next Project\n\nThe journey through the world of **tailwind css templates free** reveals a vibrant ecosystem of resources designed to accelerate your development workflow. We've explored everything from extensive component libraries like Flowbite and daisyUI to complete, professionally designed landing pages from sources like Cruip and UIdeck. The central takeaway is clear: the perfect free template is not a one-size-fits-all solution. Instead, it’s the one that most closely aligns with your specific project goals, technical requirements, and long-term vision.\n\nYour choice should be a strategic one. For a startup needing a polished marketing site quickly, a template from TailwindFlex or Creative Tim offers a significant head start. In contrast, a developer building a complex, data-heavy dashboard will find a more suitable foundation in a specialized template like TailAdmin. The key is to look beyond the initial design and consider the underlying structure, component quality, and documentation.\n\n### A Practical Framework for Selection\n\nBefore committing to a template, use this simple checklist to guide your decision-making process. A few minutes of upfront analysis can save you hours of refactoring down the line.\n\n- **Project Scope:** Is this a single landing page, a multi-page marketing site, a web application, or a full-blown SaaS dashboard? A component library like HyperUI or Meraki UI is ideal for custom builds, while a full-site template is better for standard projects.\n- **Technical Stack:** Does the template offer variants for your chosen framework (React, Vue, Svelte)? While plain HTML templates like those from Tailwind Toolbox are universally adaptable, a framework-specific version can save significant integration time.\n- **Design Customization:** How much do you plan to alter the design? Some templates are highly opinionated, making them difficult to restyle. Others, like daisyUI, offer extensive theming capabilities, providing a solid, customizable design system from the start. To truly understand what makes a great design, explore [stellar website layout design examples](https://feather.so/blog/website-layout-design-examples) that can inspire your template selection process.\n- **Component Needs:** Do you require complex, interactive elements like animated components? If so, a resource like Magic UI is specifically built for that purpose, offering components that would be time-consuming to build from scratch.\n\n### Final Thoughts: From Template to Launch\n\nThe true power of using **tailwind css templates free** lies in their ability to remove friction and let you focus on what truly matters: your product's unique value proposition. By leveraging these high-quality starting points, you bypass the repetitive, time-consuming aspects of setup and initial UI development. You get to stand on the shoulders of talented designers and developers, enabling you to build and launch beautiful, modern, and responsive web experiences faster than ever before.\n\nExperiment with the options on this list. Clone a repository, play with the components, and see how a template feels within your own workflow. The right resource will not only speed up your current project but will also teach you new patterns and best practices, making you a more efficient and effective developer in the future.\n\n---\n\nReady to elevate your projects with stunning, production-ready animated components? **Magic UI** offers a library of over 100 free, open-source components built with Tailwind CSS, Framer Motion, and React. Go beyond static templates and start building dynamic, memorable user experiences today by visiting [Magic UI](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-css-themes.mdx",
    "content": "---\ntitle: A Guide to Tailwind CSS Themes\ndescription: >-\n  Discover the best Tailwind CSS themes and learn how to configure and customize\n  them. This guide breaks down everything from the config file to advanced\n  theming.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-2abb17a1-8ca6-43ba-9637-5a7f4397451c.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind css themes\n  - tailwind css\n  - web development\n  - css customization\n  - frontend development\npublishedOn: \"2025-11-12T08:32:17.139544+00:00\"\nfeatured: true\n---\n\nWhile a lot of platforms give you pre-styled, ready-to-go components, **Tailwind CSS themes** play a completely different game. Instead of handing you a rigid template, Tailwind is built on a _utility-first_ foundation. It gives you an incredibly powerful framework to build your own design system from the ground up, all controlled from a single, central configuration file.\n\n## How Tailwind Redefined CSS Theming\n\nWorking with traditional CSS themes often feels like you're just painting over someone else's art. You start with a pre-built template—a full set of styled buttons, cards, and navigation bars—and then immediately start writing override styles to bend it to your brand's will. That whole process can be a real headache, leading to bloated stylesheets and a constant war with CSS specificity.\n\nTailwind flips that entire model on its head. Instead of a finished product, it hands you a meticulously organized toolbox full of low-level utility classes. Think of it less like a theme you install and more like a set of guiding principles for your project’s entire visual language.\n\n### The Utility-First Philosophy\n\nThe beating heart of Tailwind is its utility-first philosophy. Rather than inventing a custom class like `.big-blue-button`, you compose styles directly in your HTML by stringing together existing utilities.\n\nFor instance, a simple button might look something like this:\n\n<p className=\"docs-code-block rounded-md bg-gray-100 p-4 font-mono text-sm text-gray-800\">\n  {'<button className=\"bg-blue-500 text-white font-bold py-2 px-4 rounded\">'}\n  <br />\n  {\"  Click Me\"}\n  <br />\n  {\"</button>\"}\n</p>\n\nThis way of working lets you prototype and build completely custom designs at lightning speed, often without ever leaving your HTML file. It also naturally enforces consistency, since everyone on the team is pulling from the same pre-defined set of spacing, color, and typography classes. If you want a deeper appreciation for how CSS frameworks shape a site's look and feel, [evaluating website accessibility by disabling CSS](https://testdriver.ai/articles/how-to-evaluate-website-accessibility-by-disabling-css-and-javascript) offers some fascinating insights into the raw structure that theming builds upon.\n\n> A Tailwind theme isn't a pre-made skin; it's a configurable design system. The `tailwind.config.js` file is the single source of truth, defining the colors, spacing, fonts, and breakpoints that generate your project's unique set of utility classes.\n\n### Key Advantages of This Approach\n\nThe real power of Tailwind CSS themes comes from this fundamental shift in thinking, and it brings some serious benefits over the old way of doing things:\n\n- **Total Customization:** You are never locked into pre-designed components. Every single element is built from the ground up, giving you absolute creative control.\n- **Design Consistency:** By defining your design tokens (colors, spacing, and so on) in one central config file, you guarantee a consistent look and feel across your entire application. No more rogue styles.\n- **Performance:** Thanks to its Just-In-Time (JIT) compiler, Tailwind scans your files and only includes the CSS you actually use in the final build. The result is an impressively small file size.\n- **Developer Experience:** Building right in the HTML is fast. The built-in constraints of the design system also help prevent sloppy, one-off styles from creeping into the codebase.\n\nThis modern take on **user interface themes** completely changes how developers think about styling. It shifts the focus from fighting with existing styles to composing new ones from a flexible, consistent set of building blocks. We dive deeper into this idea in our complete guide to [user interface themes](https://magicui.design/blog/user-interface-themes).\n\n## Your Design System's Core: The Config File\n\nAt the very heart of any project using **Tailwind CSS themes** is one surprisingly powerful file: `tailwind.config.js`. You can think of this file as the central command for your entire design system. It’s not just some random settings file; it's your blueprint, your artist’s palette, and your rulebook, all rolled into one tidy package. This is where your theme truly comes to life.\n\nInside this file, the `theme` object becomes your single source of truth. This is where you define your design tokens—colors, fonts, spacing units, and screen sizes. By setting them here, you create a consistent visual language that echoes across your entire application. Any tweak you make in this file instantly ripples through every component, making global style updates a breeze and stamping out design inconsistencies before they even start.\n\nThis diagram shows how Tailwind's config-first approach is central to modern design systems, giving you far more control than old-school CSS ever could.\n\n![Infographic about tailwind css themes](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d82ff46c-9957-4cb5-8e7a-0579923274f7.jpg)\n\nAs you can see, we’ve moved from rigid, template-based styling to a much more flexible, system-driven approach where the configuration file dictates the entire design language.\n\n### Defining Your Core Design Tokens\n\nLet's get practical and break down how some of the most critical properties in the `theme` object work. Getting these right is the first major step to building effective **Tailwind CSS themes**. But before we jump in, make sure your project is set up correctly. If you're starting from square one, our guide on the complete [Tailwind CSS install process](https://magicui.design/blog/tailwind-css-install) will get you up and running.\n\n- **Colors:** This is where you map out your brand's color palette. Give them meaningful names like `primary`, `secondary`, or `accent` to make your HTML cleaner and more intuitive.\n- **Spacing:** This property sets up the scale for all your margin, padding, width, and height utilities. A consistent spacing scale is the secret sauce for a balanced, professional-looking layout.\n- **Screens:** Here, you define your responsive breakpoints. These are the specific screen widths where your layout adapts for different devices, from a small phone to a massive desktop monitor.\n- **fontFamily:** You can integrate your project's typography by defining custom font families. Set up your `sans`, `serif`, and `mono` font stacks, and Tailwind's utility classes will pick them up automatically.\n\n### From Configuration to Class\n\nSo where does the real magic happen? It's when Tailwind takes these definitions and generates a whole suite of utility classes for you. The moment you define a color in your config, Tailwind creates corresponding classes for backgrounds, text, and borders.\n\nLet's say we want to add a custom primary color to our configuration:\n\n```tsx\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      colors: {\n        primary: \"#3490dc\",\n      },\n    },\n  },\n  plugins: [],\n}\n```\n\nWith just that simple addition, you've unlocked a whole set of brand-new utilities. You can now jump into your HTML and use classes like `bg-primary`, `text-primary`, and `border-primary`. This direct link between your config and your code is what makes Tailwind so incredibly powerful for theming. It ensures you’re always pulling from approved brand colors, which means no more guesswork or random one-off hex codes.\n\n> The `tailwind.config.js` file is what turns abstract design decisions into concrete, usable utility classes. It’s the bridge between your design system and your code, ensuring every element you build is perfectly on-brand.\n\nThis configuration-first approach has really taken off. The global market for Tailwind themes is on track to hit **$120 million**, a huge jump from just **$30 million** three years ago, showing a massive demand for more efficient design solutions. Innovations like just-in-time (JIT) compilation have been a game-changer, with **92% of developers** reporting faster build times. Even major players like Netflix and GitHub have credited Tailwind with improving their page load times by up to **40%**, proving its muscle in large-scale applications. Mastering this central file is your first step toward building fast, consistent, and beautiful interfaces.\n\n## Advanced Theme Customization Techniques\n\nSo, you’ve got your core design tokens dialed in. Now it's time for the fun part: moving beyond the defaults to build a design system that’s truly your own. This is where you transform a standard Tailwind setup into something that screams your brand's identity. The trick is knowing how to build on top of Tailwind’s foundation without starting a fight with it.\n\nThis isn't just about splashing a few new colors around. It’s a more strategic game of extending or even overriding the default theme to perfectly match what your project needs. It’s what separates a generic-looking site from one that feels intentional and visually cohesive.\n\n![An abstract image representing the layers of customization in Tailwind CSS](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/54b51e4f-a4ec-403e-8542-fe6e61c69cce.jpg)\n\n### Extending vs. Overriding The Default Theme\n\nOne of the first big decisions you'll make when customizing **Tailwind CSS themes** revolves around the `extend` key in your `tailwind.config.js` file. Whether you choose to _extend_ or _override_ the default theme has a huge impact on your final design system.\n\nThink of it this way: extending is like adding your favorite specialty tools to an already well-stocked toolbox. Overriding is like throwing out the old toolbox and starting from scratch with only your own tools.\n\n- **Extending:** When you put your custom values inside the `theme.extend` object, you're _adding_ to what Tailwind already provides. For example, if you add a new `primary` color, you can still use all of Tailwind's defaults like `blue-500` or `red-700`. This is the way to go **90% of the time**. It gives you total flexibility without losing the framework’s helpful defaults.\n\n- **Overriding:** On the other hand, if you place customizations directly inside the main `theme` object (and outside of `extend`), you _completely replace_ that entire set of defaults. If you define only a single `primary` color under `theme.colors`, all of Tailwind's built-in colors vanish. This is a pretty drastic move, but it can be useful when you need to enforce a super-strict design system and stop developers from using any non-brand colors.\n\n> Use `extend` to add your brand's unique design tokens while keeping Tailwind's helpful defaults. Only override the theme when you need to enforce a highly restrictive palette or scale, intentionally removing all other options.\n\n### Integrating Custom Fonts and Complex Breakpoints\n\nA polished theme almost always needs custom typography and a sophisticated approach to responsive design. Thankfully, Tailwind makes both of these surprisingly straightforward.\n\nTo bring in custom fonts, you can drop a standard `@font-face` rule into your main CSS file and then give it a name in your `tailwind.config.js`.\n\n```css\n/_ In your main CSS file _/ @font-face {\n  font-family: \"Inter\";\n  src: url(\"/fonts/Inter-Regular.woff2\") format(\"woff2\");\n  font-weight: 400;\n  font-style: normal;\n}\n```\n\nFrom there, you just wire it up in your theme configuration to make it available as a utility class, like `font-display`. This keeps your typography consistent and lets you apply it with the same utility-first workflow you use for everything else.\n\nIn the same way, you can define more specific responsive breakpoints for trickier layouts. While Tailwind's defaults are a great starting point, your design might need to target some non-standard screen sizes.\n\n```tsx\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    extend: {\n      screens: {\n        xs: \"480px\",\n        \"3xl\": \"1920px\",\n      },\n    },\n  },\n}\n```\n\nJust like that, you’ve created new `xs:` and `3xl:` prefixes, giving you much finer control over how your layout snaps into place across a wider range of devices.\n\n### Using the theme() Function and Arbitrary Values\n\nSometimes you need a little escape hatch. Maybe you need to access your design tokens directly in your CSS, or you have a weird one-off style that just doesn't feel right adding to your global theme. Tailwind has you covered.\n\nThe `theme()` function is your bridge between your config file and your custom CSS. It lets you pull any design token from `tailwind.config.js` right into a CSS rule. It's perfect for styling complex components that need a bit more than just utility classes.\n\n```css\n.custom-component {\n  background-color: theme(\"colors.primary\");\n  padding: theme(\"spacing.4\");\n}\n```\n\nThis ensures that even your custom CSS stays perfectly in sync with your design system.\n\nFor those one-off styling needs, **arbitrary values** are a game-changer. Instead of cluttering your config with a value you'll only use once, you can just write it directly in your HTML using square bracket notation.\n\n`<div className=\"top-[117px]\">...</div>`\n\nTailwind’s compiler sees this, generates the exact CSS you need on the fly, and doesn't add a single byte of bloat to your theme. It’s the ultimate escape hatch, giving you total freedom for those edge cases where a design token just won't cut it. Mastering these techniques is key to building **Tailwind CSS themes** that are both powerful and a joy to work with.\n\n## Supercharge Your Theme with Plugins\n\nYou've put in the work to build a solid theme, but that doesn't mean you have to create every single feature from the ground up. This is where plugins come in. Think of them as specialized power-ups for your **Tailwind CSS themes**, letting you bolt on new capabilities without writing mountains of custom CSS.\n\nInstead of reinventing the wheel for common UI patterns—like styling a block of blog content or resetting form inputs—you can just grab a plugin. This approach is a massive time-saver, but it also means you’re relying on battle-tested code that's maintained by either the Tailwind team or the wider community. It’s the smart way to add sophisticated features while keeping your own code lean and focused.\n\n![An image illustrating the concept of plugins as extensions to a core system](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/ba5ecfc0-a96c-4642-95e7-21582083b58f.jpg)\n\n### Official Plugins For Common Problems\n\nThe [Tailwind CSS](https://tailwindcss.com/) team offers a handful of official plugins that are designed to solve the most common headaches developers run into. These are fantastic starting points because you know they’ll always be up-to-date and play nicely with the core framework.\n\nTwo of the most indispensable official plugins are:\n\n- **`@tailwindcss/typography`**: An absolute lifesaver for any content-heavy site. Just add the `prose` class to an article or blog post, and it instantly applies beautiful, readable styling to all your headings, paragraphs, and lists. No more manually styling every single tag.\n- **`@tailwindcss/forms`**: Styling forms is a classic web dev nightmare because every browser does it differently. This plugin wipes the slate clean with a sensible reset, making it incredibly easy to style inputs, selects, and textareas with utility classes for a consistent look everywhere.\n\nGetting them set up is a breeze. First, pull the package in with npm, then simply register it in the `plugins` array of your `tailwind.config.js` file.\n\n```tsx\n// tailwind.config.js\nmodule.exports = {\n  theme: {\n    // ...\n  },\n  plugins: [require(\"@tailwindcss/typography\"), require(\"@tailwindcss/forms\")],\n}\n```\n\nJust like that, you’ve unlocked powerful new features that feel like a natural part of your theme.\n\n### Exploring The Community Plugin Ecosystem\n\nOnce you step outside the official packages, you'll discover a massive ecosystem of community-built plugins. This is where the real magic happens. You can find solutions for almost anything you can dream up, from complex animations and UI components to entirely new utility variants.\n\nBut with great power comes a little bit of responsibility. Heading into third-party territory means you need to do your homework, as not all plugins are created equal.\n\n> When choosing a community plugin, prioritize its maintenance history and compatibility. A plugin that hasn't been updated in years might not work with the latest version of Tailwind CSS, potentially introducing bugs or build issues into your project.\n\nChoosing between official and community plugins often comes down to balancing reliability with specific needs. Here's a quick comparison to guide your decision.\n\n### Official vs. Community Tailwind CSS Plugins\n\nThis table helps developers decide when to stick with official plugins or explore third-party options.\n\n| Aspect            | Official Plugins (@tailwindcss/...)                                              | Community Plugins                                                            |\n| :---------------- | :------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- |\n| **Reliability**   | Guaranteed compatibility and long-term support from the Tailwind team.           | Varies greatly. Requires vetting the author and project health.              |\n| **Scope**         | Focused on solving common, widespread problems (e.g., typography, forms).        | Can be highly specialized, solving niche problems or adding unique features. |\n| **Innovation**    | Stable and well-tested, but may not have the latest experimental features.       | Often the source of creative and cutting-edge ideas.                         |\n| **Documentation** | Consistently high-quality and integrated with official Tailwind docs.            | Quality can range from excellent to non-existent.                            |\n| **Best For**      | Core theme functionalities and mission-critical features where stability is key. | Unique UI components, specific design patterns, and experimental features.   |\n\nUltimately, a good theme often uses a mix of both. Rely on official plugins for the foundational elements and turn to the community for those special features that make your project stand out.\n\n### How To Evaluate and Install Third-Party Plugins\n\nFinding and vetting community plugins is pretty straightforward once you know what to look for. Your first stops should always be the [official plugin directory](https://tailwindcss.com/docs/plugins) on the Tailwind CSS website and package registries like [npm](https://www.npmjs.com/).\n\nWhen you find a plugin that looks promising, check for these signs of a healthy project:\n\n1.  **Last Updated Date**: If it was updated recently, it’s a great sign the maintainer is active and keeping it compatible with new Tailwind releases.\n2.  **Weekly Downloads**: High download numbers on npm show that other developers trust and rely on it, making it a safer bet.\n3.  **Open Issues and Pull Requests**: Take a quick look at the plugin’s GitHub repository. An active project will have ongoing discussions and a responsive maintainer.\n4.  **Clear Documentation**: Good docs are a must. The README should clearly explain how to install, configure, and use the plugin.\n\nOnce you’ve found a winner, the installation process is usually the same as with official plugins: install it via npm and add it to your config file. By being selective, you can tap into the community's creativity to build incredible **Tailwind CSS themes** with a fraction of the effort.\n\n## Finding the Right Pre-Built Theme or Library\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/MAtaT8BZEAo\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nBuilding a theme from scratch gives you total control, but let's be honest—you don't always need to start with a blank canvas. The Tailwind CSS ecosystem is absolutely packed with high-quality themes, component libraries, and UI kits that can give your project a massive head start.\n\nThink of it less as giving up control and more as making a strategic choice. By starting with a well-designed library, you’re inheriting best practices for accessibility, responsiveness, and design consistency. This frees you up to focus on the unique parts of your application instead of reinventing the same old components for the hundredth time.\n\n### The Official Starting Point: Tailwind UI\n\nWhen you're looking for professionally crafted, pixel-perfect components, your first stop should be **Tailwind UI**. It's the official, premium library from the creators of Tailwind CSS itself. It’s less of a single \"theme\" and more like a massive box of incredibly well-made LEGOs for building interfaces.\n\nYou can see the clean, modern aesthetic of Tailwind UI components, ready to be dropped into any project.\n\nEvery component is fully responsive and comes with code examples for React, Vue, and plain old HTML. It’s a paid product, but the hours you’ll save in development time often make the investment a no-brainer.\n\nThe explosion of top-tier **Tailwind CSS themes** and libraries like Tailwind UI is no accident. The framework's adoption has been meteoric. According to npm stats, Tailwind CSS consistently pulls in over **20 million** weekly downloads, leaving competitors like Bootstrap (around **4.9 million**) in the dust. This wave of popularity has fueled a thriving ecosystem, with marketplaces like ThemeForest reporting a staggering **300%** increase in Tailwind-based templates. Developer surveys back this up, with **78%** of respondents in the State of CSS survey saying they've used a Tailwind theme in their work. You can get more insights on the rise of modern CSS frameworks over at [contentful.com](https://www.contentful.com/blog/css-frameworks/).\n\n### Popular Free and Open-Source Libraries\n\nBeyond the official premium option, the community has built an incredible array of free and open-source libraries. These are perfect for personal projects, budget-conscious startups, or anyone who just wants a solid foundation without opening their wallet.\n\nEach library has its own flavor and philosophy:\n\n- **DaisyUI**: This one is a fan favorite. It adds component-focused class names like `btn`, `card`, and `alert` right on top of Tailwind's utilities. If you're coming from a framework like Bootstrap, it’ll feel familiar, but you still have all of Tailwind’s customization power under the hood.\n- **Flowbite**: Flowbite is known for its huge collection of components that come with all the necessary JavaScript for interactivity built right in. It's a fantastic choice for quickly assembling complex UIs with interactive elements like modals and dropdowns.\n- **Preline UI**: As an open-source component set, Preline is laser-focused on providing a wide range of beautifully designed elements for marketing sites, applications, and e-commerce projects.\n\nIf you want to dig deeper into what the community offers, you should check out our guide on the best [free Tailwind CSS templates](https://magicui.design/blog/tailwind-css-templates-free).\n\n### Navigating Premium Marketplaces\n\nFor those who need a complete, turn-key solution, premium marketplaces like [ThemeForest](https://themeforest.net/) and [Creative Market](https://creativemarket.com/) are gold mines. Here you'll find full-blown **Tailwind CSS themes**—complete website or application templates built for specific niches like SaaS, e-commerce, or personal portfolios.\n\n> When you're shopping for a premium theme, look past the slick design. You need to check for clean code, solid documentation, and a history of recent updates. A well-maintained theme is infinitely easier to customize and secure down the road.\n\nFor some great real-world inspiration on how different design systems look when they're live, it can be helpful to explore various [client showcases](https://appycamper.com/showcase).\n\nWhether you go with an official library, a free community project, or a premium theme, leaning on the ecosystem is one of the smartest ways to build with Tailwind CSS.\n\n## Common Questions About Tailwind Themes\n\nAs you start working with **Tailwind CSS themes**, you'll find it's a bit of a different mindset than traditional CSS. A few questions always seem to come up. Getting your head around these core concepts early on will save you a ton of headaches down the road.\n\nLet's walk through some of the most common questions developers ask when they're making the jump. Think of it as your cheat sheet for clearing those initial hurdles and getting back to building cool stuff, faster.\n\n### What's The Difference Between A Tailwind Theme And A Traditional Template?\n\nThis is the big one, and the answer really gets to the core of what makes Tailwind special. A traditional template is usually a bundle of pre-built HTML and CSS files. You get finished components, which is great, but they’re often rigid. Customizing them means fighting with specificity and writing a bunch of override styles.\n\nA Tailwind theme, however, isn't a set of finished components. It’s your `tailwind.config.js` file, which acts as a blueprint for your entire design system. You define your color palette, your spacing scale, your fonts—all the foundational pieces. Tailwind then uses that blueprint to generate a custom library of utility classes just for you.\n\nYou're not just slapping a pre-made skin on your site. You're using a structured, consistent design language to build your own components from the ground up.\n\n### How Do I Implement Dark Mode In A Tailwind Theme?\n\nOne of the best things about Tailwind is how it handles dark mode. It’s a first-class feature, not a tacked-on afterthought, which makes it surprisingly simple to set up.\n\n1.  **Flip the Switch:** First, pop open your `tailwind.config.js` file and enable dark mode by setting `darkMode: 'class'`. This tells Tailwind to activate dark styles whenever it sees a `.dark` class on a parent element.\n2.  **Apply Your Styles:** From there, you just prefix any utility class with `dark:` to make it apply only in dark mode. For example, `bg-white dark:bg-gray-900` gives you a white background by default and a dark gray one when the dark mode is active.\n\nAll you need is a little JavaScript to toggle the `dark` class on your `<html>` or `<body>` tag, and you’ve got a fully functional theme switcher.\n\n> The `dark:` variant is incredibly powerful. It lets you define your entire dark theme right there in your HTML, keeping your light and dark mode styles perfectly organized and right next to the elements they affect.\n\n### What's The Best Way To Maintain Theme Consistency On A Large Team?\n\nThis is where Tailwind truly shines, especially when you have multiple developers working on a project. The trick is to treat your `tailwind.config.js` file as the absolute single source of truth for every design decision.\n\nTo keep everyone on the same page, a few ground rules help a lot:\n\n- **Stick to Your Tokens:** Always use the utility classes generated from your theme configuration (`bg-primary`, for instance) instead of one-off magic numbers like `bg-[#3490dc]`. This locks every element into your approved brand palette.\n- **Avoid Arbitrary Values:** Make it a team policy to limit arbitrary values. If a specific color or spacing value needs to be used more than once, it belongs in the theme config as a proper token.\n- **Build a Component Library:** On bigger projects, create a set of reusable components (whether in React, Vue, or another framework) built exclusively with your theme's utility classes. This encapsulates the design system and stops unique, one-off styling from creeping into the codebase.\n\n### Can I Migrate An Existing Project To A Tailwind Theme?\n\nYou absolutely can, but don't try to boil the ocean. A full, top-to-bottom rewrite is risky and can take forever. The secret is to do it incrementally.\n\nStart by installing Tailwind and creating an initial `tailwind.config.js` file that mirrors your project's current design system as closely as you can. Define your existing color palette, spacing units, and font families as design tokens.\n\nFrom there, start refactoring one page or even one component at a time. As you go, you’ll replace the old, custom CSS with your shiny new Tailwind utility classes. This lets you see progress immediately, makes the task feel less daunting, and dramatically reduces the risk of breaking your application.\n\n---\n\nReady to build stunning, high-performance landing pages in minutes? **Magic UI** offers over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. [Start creating with Magic UI](https://magicui.design) today and see how fast you can bring your ideas to life.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-dark-mode.mdx",
    "content": "---\ntitle: Build a Flawless Tailwind Dark Mode\ndescription: >-\n  Implement a seamless Tailwind dark mode with class-based toggling,\n  React/Next.js examples, and persistence. A practical guide for modern web\n  apps.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-b1364766-f317-414e-a5f9-6c71aff1f0a6.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind dark mode\n  - tailwindcss\n  - dark mode toggle\n  - react dark mode\n  - nextjs theme\npublishedOn: \"2025-11-19T08:52:15.336912+00:00\"\nfeatured: true\n---\n\nImplementing dark mode in Tailwind boils down to two clear paths: the automatic **`media`** route that follows the user’s system setting, or the manual **`class`** route that hands control over to your UI. Picking the right one here shapes everything that follows in your theme setup.\n\n## Choosing Your Tailwind Dark Mode Strategy\n\nDark mode isn’t a fringe add-on anymore—it’s become essential for readability, eye comfort, and even battery savings on OLED screens. Tailwind CSS cuts right to the chase by offering two built-in strategies that cover both ends of the control spectrum.\n\n![Abstract shapes and colors representing light and dark themes](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3045b22e-7046-4ed2-b0b5-ec0a3622962a.jpg)\n\n### The Two Core Strategies\n\nYour theme logic lives in `tailwind.config.js`. There, you choose how dark styles kick in:\n\n- **Media Strategy (Default)**\n  Tailwind leans on the `prefers-color-scheme` CSS media query. If a user’s OS is in dark mode, any `dark:` variants fire automatically—no JavaScript needed.\n\n- **Class Strategy (Manual Control)**\n  Switch on `darkMode: 'class'` in your config. From there, your UI only applies `dark:` styles when you’ve added a `.dark` class on a parent (usually `<html>`). It means a tiny bit of scripting, but full theme-toggle flexibility.\n\n### When To Use Each Approach\n\nThe **media** route is perfect for simple blogs, docs, or landing pages. You set it up once, and it just respects whatever the user already prefers.\n\nOn full-blown apps and dashboards, though, the **class** approach usually wins. It lets people pick a theme on your site—handy for accessibility and personal choice. If you want to dig into different [user interface themes](https://magicui.design/blog/user-interface-themes), you’ll see why explicit toggles often feel more polished.\n\n> User agency beats passive defaults. Letting people pick dark or light on your site makes your interface more inclusive and satisfying.\n\n### Tailwind Dark Mode Strategies Compared\n\nHere’s a quick rundown of how the two strategies stack up side by side.\n\n| Feature           | Media Strategy                            | Class Strategy                                   |\n| ----------------- | ----------------------------------------- | ------------------------------------------------ |\n| Trigger Mechanism | **OS setting** via `prefers-color-scheme` | **Manual toggle** via `.dark` class              |\n| Setup             | Zero config—works out of the box          | Set `darkMode: 'class'` and add toggle logic     |\n| JavaScript Needed | No                                        | Yes                                              |\n| User Control      | Follows system preference                 | Full on-site choice                              |\n| Ideal Use Cases   | Simple sites, blogs, docs                 | Complex apps, dashboards, highly interactive UIs |\n\nDeciding between these often comes down to how much theme-switching control you need in your interface.\n\nIn my projects, I’ve seen a smart dark mode pay dividends. According to a 2023 study, sites that rolled out dark themes enjoyed a **15% average increase in user session duration**. Even better, user complaints about eye strain fell by **40%** on major platforms. You can dive deeper into these [dark mode case studies](https://www.swiftorial.com/swiftlessons/modern-ui-frameworks/tailwind-css-best-practices/dark-mode-case-studies). Clearly, implementing thoughtful **tailwind dark mode** isn’t just a design trend—it’s a real, measurable enhancement to your product.\n\nIf you want to give users control over your site's theme, the `class` strategy is the way to go. This approach is fantastic because it decouples the theme from the operating system, letting users pick light or dark mode themselves. It’s a small code change that unlocks a much more interactive and user-centric experience.\n\nThe first step is a simple one-liner in your project's configuration. Before you start, make sure you have a working project setup. If you're starting from scratch, you can follow this guide on how to [install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) to get up and running in no time.\n\n### Configuring Tailwind for Class-Based Mode\n\nTo enable manual control, pop open your `tailwind.config.js` file and add the `darkMode` key with the value `'class'`. This one line tells Tailwind to stop paying attention to the system’s `prefers-color-scheme` media query. Instead, it will only apply `dark:` variant styles when it sees a `.dark` class on a parent element.\n\nHere’s what that looks like in practice:\n\n```js\n// tailwind.config.js\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  darkMode: \"class\", // This is the magic line!\n  content: [\n    \"./pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nJust like that, your entire **tailwind dark mode** setup is ready for a manual toggle. All of the framework's `dark:` variant utilities, like `dark:bg-slate-900`, will now lie dormant until you programmatically add the `dark` class to the HTML tree.\n\n### Building the JavaScript Toggle Logic\n\nNext, you'll need a way to add and remove that `.dark` class. A small JavaScript snippet is all it takes. The goal is to create a function that targets the `<html>` element and flips the class on or off whenever a user clicks a button.\n\nThe release of Tailwind CSS v2.0 back in November 2020, which introduced this dedicated `dark` variant, was a huge moment for the framework. Its popularity exploded afterward, with weekly npm downloads jumping from around **2 million** to over **10 million** by early 2025. You can read more about [Tailwind's relevance and growth](https://www.zenesys.com/tailwind-css-vs-bootstrap-who-is-more-relevant-in-the-current-scenario) if you're curious. This one feature made building theme toggles remarkably straightforward.\n\nHere’s a practical, copy-and-paste example for a simple theme toggle button you can drop into any vanilla JavaScript project:\n\n```jsx\n<button id=\"theme-toggle\" className=\"px-4 py-2 bg-slate-200 dark:bg-slate-700 rounded\">\n  Toggle Theme\n</button>\n\n<script>\n  const themeToggle = document.getElementById('theme-toggle');\n\n  themeToggle.addEventListener('click', () => {\n    // toggle the 'dark' class on the html element\n    document.documentElement.classList.toggle('dark');\n  });\n</script>\n```\n\n> **Pro Tip:** By targeting `document.documentElement` (which is just the `<html>` tag), you ensure the `.dark` class gets applied globally. This makes all nested elements with `dark:` variants respond instantly, creating a consistent theme switch across your entire site. It's a simple yet incredibly effective foundation for any user-controlled dark mode.\n\n## Integrating Dark Mode In React And Next.js Apps\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/HU6vGtKGSsM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nA plain JavaScript toggle is fine for a handful of elements, but once your UI grows in React or Next.js, you need something more scalable. Passing `theme` and `setTheme` through every layer quickly becomes a headache—this is where **prop drilling** trips you up.\n\nInstead, we’ll lean on React’s Context API to keep things tidy. With a central `ThemeContext`, any component can read or change the theme without passing props through the entire tree.\n\n### Building A Reusable Theme Provider\n\nWe’ll create a `ThemeProvider` that:\n\n- Centralizes **theme state** (light or dark)\n- Uses `useEffect` to toggle the `dark` class on `<html>`\n- Exposes a simple API for switching themes\n\nThis pattern cleans up your components and keeps the dark-mode logic in one place. If you’re new to Tailwind in React, check out our guide on how to [install Tailwind with React](https://magicui.design/blog/install-tailwind-react) before you dive in.\n\n```jsx\n// components/ThemeProvider.js\nimport React, { createContext, useContext, useEffect, useState } from \"react\"\n\nconst ThemeContext = createContext()\n\nexport const ThemeProvider = ({ children }) => {\n  const [theme, setTheme] = useState(\"light\")\n\n  useEffect(() => {\n    const root = window.document.documentElement\n    root.classList.remove(theme === \"light\" ? \"dark\" : \"light\")\n    root.classList.add(theme)\n  }, [theme])\n\n  return (\n    <ThemeContext.Provider value={{ theme, setTheme }}>\n      {children}\n    </ThemeContext.Provider>\n  )\n}\n\nexport const useTheme = () => useContext(ThemeContext)\n```\n\n### Creating The Theme Toggle Component\n\nWith `useTheme`, building a toggle button is almost trivial. Here’s how you let users switch modes with one click:\n\n> When you need a user-facing switch, the **class** strategy is the only way forward.\n\n![Infographic about tailwind dark mode](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/174baade-7228-4f0d-9747-2c0c5bfc3252.jpg)\n\n```jsx\n// components/ThemeToggleButton.js\nimport React from \"react\"\n\nimport { useTheme } from \"./ThemeProvider\"\n\nconst ThemeToggleButton = () => {\n  const { theme, setTheme } = useTheme()\n\n  const toggleTheme = () => {\n    setTheme(theme === \"light\" ? \"dark\" : \"light\")\n  }\n\n  return (\n    <button\n      onClick={toggleTheme}\n      className=\"rounded-lg bg-slate-200 px-4 py-2 dark:bg-slate-700\"\n    >\n      Switch to {theme === \"light\" ? \"Dark\" : \"Light\"} Mode\n    </button>\n  )\n}\n\nexport default ThemeToggleButton\n```\n\n> A common hiccup in Next.js is the flash of unstyled content (FOUC), where the page briefly shows the default theme before your script applies the correct one. In the next section, we’ll tackle persistence using `localStorage` or cookies to eliminate that flash and honor user preferences on load.\n\n## Persisting User Theme Preferences with LocalStorage\n\nA theme toggle is a great starting point, but a truly polished experience remembers a user's choice. Nobody wants to re-select their preferred theme every single time they visit your site. We can easily fix this with the browser's `localStorage` API, a simple key-value store that sticks around between sessions.\n\n![A stylized graphic showing a browser window with a settings cog and a toggle switch, representing user preferences.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/476b861a-ae7e-489f-ac86-4c0c216f99ab.jpg)\n\nThe idea is pretty straightforward. When a user clicks the toggle, we'll write their choice—'light' or 'dark'—to `localStorage`. Then, on their next visit, we read that value _before_ the page even renders to apply the correct theme. This is the secret to preventing that jarring \"flash of unstyled content\" (FOUC).\n\n### Saving The Theme Choice\n\nLet's upgrade our toggle logic. Right inside the event listener, after we flip the `.dark` class, we'll add one more line to save the current theme. This makes sure that every time the user makes a choice, it’s immediately saved for next time.\n\nHere’s how you can tweak a simple JavaScript toggle to include `localStorage`:\n\n```javascript\nconst toggleButton = document.getElementById(\"theme-toggle\")\n\ntoggleButton.addEventListener(\"click\", () => {\n  // 1. First, toggle the class on the HTML element\n  document.documentElement.classList.toggle(\"dark\")\n\n  // 2. Now, check the current theme and save it to localStorage\n  if (document.documentElement.classList.contains(\"dark\")) {\n    localStorage.theme = \"dark\"\n  } else {\n    localStorage.theme = \"light\"\n  }\n})\n```\n\n### Applying The Saved Theme On Page Load\n\nSaving the theme is only half the battle. To keep the default theme from flashing on screen first, you have to apply the saved preference as early as humanly possible. The best place for this is a tiny, inline `<script>` tag tucked away inside the `<head>` of your HTML, _before_ any of your CSS files are loaded.\n\nThis script checks `localStorage` and slaps the `dark` class on if needed, ensuring the correct **tailwind dark mode** is rendered from the very first paint.\n\n```html\n<script>\n  // On page load, apply the theme from localStorage right away\n  if (localStorage.theme === \"dark\") {\n    document.documentElement.classList.add(\"dark\")\n  }\n</script>\n```\n\n> By placing this script in the `<head>`, you're running it before the browser even starts to render the `<body>`. This is the single most effective trick for killing that annoying theme flash on page loads.\n\n### Creating A Hybrid Approach\n\nFor the ultimate user experience, you can combine a few strategies. On a user's very first visit, `localStorage` will be empty. In that case, we can fall back to their system preference as a sensible default. But as soon as they make a manual choice with the toggle, we honor _that_ choice from then on.\n\nThis hybrid model respects both the user's implicit settings and their explicit actions, leading to an intelligent and seamless theme experience. It’s actually the same approach Tailwind's own documentation recommends for building a really robust dark mode.\n\n## Polishing Your Dark Mode: Advanced Techniques and Best Practices\n\nOnce you have a working theme toggle, it's time to add some polish. Moving beyond a basic class switch is what separates a functional feature from a truly delightful user experience. Let's dig into a few techniques that will make your **tailwind dark mode** implementation feel professional and clean.\n\n![A designer's desk with dual monitors showing light and dark mode versions of a website, emphasizing polish and professionalism.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/d182346c-1281-40ae-98d4-e0937332781e.jpg)\n\nOne of the best things you can do for your theme is to abstract your colors using CSS variables. This approach keeps your component markup incredibly tidy and centralizes all your theme logic in one place. You define your colors once and reuse them everywhere—no more hunting down hex codes.\n\n### Theming with CSS Variables\n\nInstead of peppering your components with classes like `dark:bg-slate-800 dark:text-gray-200`, you can create semantic color variables. Trust me, your future self will thank you when it's time to update your color palette.\n\nHere’s how you can set it up in your global CSS file:\n\n```css\n/* styles/globals.css */\n:root {\n  --background: #ffffff;\n  --foreground: #020817;\n}\n\n.dark {\n  --background: #020817;\n  --foreground: #ffffff;\n}\n```\n\nNext, just tell Tailwind to use these new variables inside your `tailwind.config.js`.\n\n```js\n// tailwind.config.js\nmodule.exports = {\n  // ...\n  theme: {\n    extend: {\n      colors: {\n        background: \"hsl(var(--background))\",\n        foreground: \"hsl(var(--foreground))\",\n      },\n    },\n  },\n  // ...\n}\n```\n\nWith that in place, your component markup becomes beautifully simple: `<div className=\"bg-background text-foreground\">...</div>`. Tailwind handles the rest.\n\n### Adding Smooth Transitions\n\nAn instant, jarring flash when switching themes is a dead giveaway of an unrefined implementation. You can create a much smoother, more professional effect with a subtle transition on your background and text colors.\n\nIt's surprisingly easy to do. Just apply a transition utility to your `<body>` or root layout element.\n\nAdding `transition-colors` and `duration-300` (or whatever timing feels right to you) to your main layout component tells the browser to animate changes to `background-color` and `color`. The result is a fluid and pleasing switch between themes.\n\n### Prioritizing Accessibility\n\nLook, a slick dark mode is pointless if your users can't read the text. Accessibility must always be a priority, and color contrast is a huge piece of that puzzle. A color combination that looks fantastic in light mode might become completely illegible in dark mode.\n\n> As developers, it’s our job to make sure what we build is usable for everyone. Low-contrast text can completely exclude users with visual impairments, which is a massive portion of the web's audience.\n\nAlways test your color pairings against the Web Content Accessibility Guidelines (WCAG) standards. The baseline you should be aiming for is a **AA rating**, which requires a contrast ratio of at least **4.5:1** for normal text.\n\nHere are a few things to double-check:\n\n- **Text vs. Background:** Is your body text easy to read against the background in both themes?\n- **UI Elements:** Are buttons, links, and form fields still distinct and readable?\n- **Focus States:** Don't forget about focus rings and other interactive states. They need to have good contrast, too.\n\nRunning your site through a [website accessibility checklist](https://www.bruceandeddy.com/website-accessibility-checklist/) is a great habit to get into. You can also use browser developer tools and online contrast checkers to validate your palette and ensure your design works for everyone.\n\n## Common Questions About Tailwind Dark Mode\n\nEven with a solid plan, you'll likely run into a few tricky spots when you're in the trenches building a dark theme. Let's walk through some of the most common questions and roadblocks I see developers hit when implementing **Tailwind dark mode** and get you unstuck with some direct, practical solutions.\n\nNailing these little details is often what separates a decent theme from a genuinely great one. Get them right, and you’ll deliver a smooth, professional user experience.\n\n### How Do I Fix the Wrong Theme Flashing on Page Load?\n\nYou know the one—that jarring flash of a light theme right before the dark one loads. It’s a classic issue known as a flash of unstyled content, or **FOUC**. This happens because the browser paints the default HTML before your JavaScript has a chance to execute and apply the user's saved theme preference from `localStorage`.\n\nThe fix is surprisingly simple: a small, inline `<script>` tag placed directly in the `<head>` of your document. It has to go _before_ any CSS files or other scripts are loaded. The sole purpose of this script is to check `localStorage` for a theme setting and immediately slap the `dark` class on the `<html>` element if it finds one. This ensures the correct theme is locked in before the browser’s first render, completely eliminating that annoying flash.\n\n> **Key Takeaway:** Placing this critical script in the document head is non-negotiable for a flicker-free experience. It’s an old-school trick that perfectly solves the race condition between the browser rendering and your main scripts running.\n\n### Can I Use Custom Color Palettes for Dark Mode?\n\nNot only can you, but you absolutely should. Simply inverting your colors is a rookie mistake that often leads to a harsh, inaccessible design. A dedicated dark theme palette gives you granular control over the entire aesthetic and, more importantly, ensures everything remains perfectly readable.\n\nYou can define a whole new set of colors right inside your `tailwind.config.js` file.\n\n- Start by extending the `colors` object with your dark theme palette. For example: `dark: { background: '#1a202c', text: '#e2e8f0' }`.\n- Then, apply these new colors in your components using Tailwind's `dark:` variant.\n- Your markup stays clean and semantic, looking something like this: `<div className=\"bg-white text-gray-800 dark:bg-dark-background dark:text-dark-text\">`.\n\nThis approach keeps your theme rock-solid and consistent. Plus, when it's time to tweak your color scheme down the road, it's a breeze to manage.\n\n### What Is the Best Way to Organize Dark Mode Classes?\n\nThe most maintainable and straightforward way to handle your styles is to keep them co-located. This is a core tenet of Tailwind’s utility-first philosophy: all the styling logic for a single element should live in one place. The `dark:` variant makes this incredibly intuitive.\n\nFor instance, a button's classes should look something like this:\n`<button className=\"bg-slate-100 text-slate-900 dark:bg-slate-800 dark:text-slate-200\">Click Me</button>`\n\nEverything you need to know about that button's appearance—in both light and dark mode—is right there. Steer clear of creating separate stylesheets just for dark mode. That completely defeats the purpose of Tailwind's component-centric approach and will quickly become a maintenance nightmare.\n\n---\n\nReady to build stunning UIs without the headache? **Magic UI** offers a massive library of over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. Create beautiful, high-performance landing pages in minutes at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-font-size.mdx",
    "content": "---\ntitle: \"How to Customize the Font Size in Tailwind CSS in React\"\ndescription: \"Learn how to customize the font size in Tailwind CSS in React with this comprehensive guide.\"\nimage: https://cdn.magicui.design/assets/7d06854e-1232-45a0-976d-eb5ae15ef261.png\nauthor: Dillion Verma\ntags:\n  - Tailwind CSS\npublishedOn: \"2024-06-03\"\nfeatured: false\n---\n\nHave you ever found yourself squinting at your screen, trying to read tiny text in a web app? There's nothing more infuriating.\n\n[When creating a Design System](https://danmall.com/posts/typography-in-design-systems/), Typography is the most crucial piece. It's the one that takes the most thinking and planning. Creating this manually for every project is a nightmare.\n\nBut here’s the good news: Tailwind solves this.\n\nIn this blog post, I'll walk you through customizing font sizes in Tailwind CSS within a React project. Whether you’re a beginner or an experienced developer, you’ll find that using Tailwind's out-of-the-box Typography styles is just a better option.\n\nIn this post, you will learn how to customize the font size in Tailwind CSS within a React application. We'll cover everything from setting up your React project to advanced customization techniques. Let's dive in!\n\n## What is Font Size in Tailwind CSS?\n\nFont size utility classes in Tailwind denote how big or small the text will look on the screen. Typically, in vanilla CSS, you can do `font-size: 12px` . In Tailwind, instead of specifying a pixel size for the fonts and risking inconsistent styles all over the place, you use a predefined set of font sizes that rank\n\nyou use the prefix `text-` to apply a [predefined set of font sizes](https://tailwindcss.com/docs/font-size) like:\n\n- text-xs\n- text-sm\n- text-md\n- text-lg\n- text-xl\n- text-2xl...text-9xl\n\nSticking to a set of font sizes like above forces your UI to look a lot more cohesive.\n\nLet's see how we can set this up for our React project.\n\n## Setting Up Tailwind CSS in your React Project\n\nFirst, make sure that your React project has Tailwind CSS properly configured. Need help? We've written a full step-by-step guide on [how to install all the necessary packages for React here](/blog/install-tailwind-react).\n\n### Testing the Initial Setup\n\nRun your application to ensure everything is set up correctly:\n\n```bash\nnpm start\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser to see your React app styled with Tailwind CSS.\n\n## Create your React Component\n\nLet's start by adding some text and applying the pre-defined font sizes to them. Edit your `App.tsx` with:\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex h-screen w-full flex-col items-center justify-center gap-4 bg-gray-100\">\n      <p className=\"text-xs\">Text size xs</p>\n      <p className=\"text-sm\">Text size sm</p>\n      <p className=\"text-base\">Text size base</p>\n      <p className=\"text-lg\">Text size lg</p>\n      <p className=\"text-xl\">Text size xl</p>\n      <p className=\"text-2xl\">Text size 2xl</p>\n      <p className=\"text-3xl\">Text size 3xl</p>\n      <p className=\"text-4xl\">Text size 4xl</p>\n      <p className=\"text-5xl\">Text size 5xl</p>\n      <p className=\"text-6xl\">Text size 6xl</p>\n      <p className=\"text-7xl\">Text size 7xl</p>\n      <p className=\"text-8xl\">Text size 8xl</p>\n      <p className=\"text-9xl\">Text size 9xl</p>\n    </div>\n  )\n}\nexport default App\n```\n\nThis is how the sizes look like when previewed.\n\n![Different pre-defined Tailwind font sizes ](https://cdn.magicui.design/assets/zul0pj45qn.png)\n\nBy combining font sizes with other text styles, you can start creating more complex layouts like so:\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex h-screen w-full flex-col items-center justify-center gap-4 bg-gray-100\">\n      <div className=\"max-w-xl text-center\">\n        <h1 className=\"mb-4 text-center text-5xl font-bold underline\">\n          Welcome to Tailwind CSS\n        </h1>\n        <p className=\"text-xl text-gray-600\">\n          This is a sample text layout using Tailwind CSS, an utility-first CSS\n          framework for rapidly building custom designs.\n        </p>\n        <div className=\"mt-2\">\n          <button className=\"rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700\">\n            Get Started\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\nexport default App\n```\n\nThis is what it looks like with a heading text up top, then a description followed by a button.\n\n![Tailwind text with a button](https://cdn.magicui.design/assets/tugilh9xi.png)\n\n## Make your layouts responsive\n\nTailwind lets you easily change font sizes to ensure that your text is readable across all screen sizes.\n\n[Tailwind styles are default mobile-first.](https://tailwindcss.com/docs/responsive-design) This means that they will apply to the smallest screen sizes first. When you add new styles with a breakpoint like `md:`, they will be applied starting from that breakpoint and up (in this case 768px and up).\n\nWe can make the above text layout responsive by adding in the `md:` utility class with bigger font sizes so that on mobile, the font size would be `3xl` but on a bigger screen, it will scale to `5xl`.\n\n```tsx\nimport \"./App.css\"\nimport \"./index.css\"\n\nfunction App() {\n  return (\n    <div className=\"flex h-screen w-full flex-col items-center justify-center gap-4 bg-gray-100\">\n      <div className=\"max-w-xl text-center\">\n        <h1 className=\"mb-4 text-center text-3xl font-bold underline md:text-5xl\">\n          Welcome to Tailwind CSS\n        </h1>\n        <p className=\"text-lg text-gray-600 md:text-2xl\">\n          This is a sample text layout using Tailwind CSS, an utility-first CSS\n          framework for rapidly building custom designs.\n        </p>\n        <div className=\"mt-2\">\n          <button className=\"rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700\">\n            Get Started\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\nexport default App\n```\n\nTest this out by opening DevTools (Cmd + Shift + C on Mac) and varying the screen size. You will see that the 2 text lines will change their respective sizes.\n\n![Tailwind responsive text with Chrome DevTools](https://cdn.magicui.design/assets/4v0dg7b7jr5.png)\n\n## Customize Font Sizes to fit your project\n\nThe list of sizes that come with Tailwind should generally be enough for a good UI, but if you're looking to either customize existing ones or add new ones, you can do so by editing the `tailwind.config.js` and extending the `fontSize` property.\n\nFor example:\n\n```js\nmodule.exports = {\n  theme: {\n    extend: {\n      fontSize: {\n        xxs: \"0.625rem\",\n        xxl: \"1.75rem\",\n      },\n    },\n  },\n}\n```\n\nThe new sizes will then be available for use like this.\n\n```tsx\nfunction CustomFontSizeComponent() {\n  return (\n    <div className=\"text-center\">\n      <p className=\"text-xxs\">This is extra extra small text.</p>\n      <p className=\"text-xxl\">This is extra extra large text.</p>\n    </div>\n  )\n}\nexport default CustomFontSizeComponent\n```\n\n## Next Steps\n\nNow that you know how font sizes in Tailwind work, try creating text heavy landing pages with Tailwind to practice your skills.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-landing-page-templates.mdx",
    "content": "---\ntitle: Build Faster With Tailwind Landing Page Templates\ndescription: >-\n  Discover how to use Tailwind landing page templates to build, customize, and\n  deploy beautiful websites. A practical guide for modern web developers.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2f421ed1-05b4-432a-bbbe-a6ca82072a6e/tailwind-landing-page-templates-web-services.jpg\nauthor: Dillion Verma\ntags:\n  - tailwind landing page templates\n  - tailwind css\n  - react templates\n  - vite react\n  - frontend development\npublishedOn: \"2025-12-11T08:21:27.356108+00:00\"\nfeatured: true\n---\n\nTailwind landing page templates are essentially pre-built websites crafted with the [Tailwind CSS](https://tailwindcss.com/) framework. Think of them as a collection of ready-to-use HTML and CSS components that let you build a beautiful, responsive landing page in a fraction of the usual time. They give you a massive head start, turning what could be weeks of work into just a few hours.\n\n## Why Tailwind Templates Are a Game-Changer for Developers\n\nBefore we get into the nitty-gritty, it’s worth taking a step back to see the bigger picture. The shift towards utility-first CSS frameworks like Tailwind isn't just a fleeting trend. It's a direct response to a real need in the development world: the demand for UIs that are faster to build, easier to maintain, and endlessly customizable. This is exactly where **Tailwind landing page templates** shine.\n\nInstead of staring at a blank `index.html` file, you start with all the essential building blocks already in place—things like navigation bars, hero sections, feature grids, and footers. This lets you skip the tedious, repetitive work of coding common elements from the ground up. It’s like having the foundation and framing of a house pre-built, freeing you up to focus on the interior design and the unique details that will make it your own.\n\n### Speed Up Your MVP Launch\n\nIn the startup world, speed is everything. Launching a Minimum Viable Product (MVP) quickly can genuinely make or break a company. A good template gives you a production-ready design system right out of the box, so you can get a polished, professional landing page live in record time.\n\nThis isn't just a nice-to-have; it's a core reason why Tailwind has seen such massive adoption since its 2017 release. We're talking over **25,000 companies** now using it for their projects. You can dig into more data on its industry adoption over at theirstack.com.\n\n> The real win here is reallocating your most precious resource—developer time. Instead of reinventing the wheel on basic UI, you're building the core features that actually deliver value to your users. It's all about working smarter, not harder.\n\n### Ensure Design Consistency and Quality\n\nKeeping a consistent design language across a big project or multiple marketing pages can be a huge headache. A template solves this by providing a predefined set of components and styles. Every button, form, and card follows the same visual rules, creating a cohesive and professional experience for your users without you having to police every line of CSS.\n\nOf course, before diving deeper, it helps to be clear on exactly [what a landing page is](https://blog.soloist.ai/what-is-a-landing-page/) and the strategic role it plays. Understanding this context makes it obvious why starting with a solid template is such a massive strategic advantage for any project.\n\n## Choosing The Right Tailwind Landing page Template\n\nLet's be honest, picking a **tailwind landing page template** isn't just about finding a design you like. This decision sets the tone for your entire project. It's the foundation that dictates how quickly you can build, and more importantly, how easy the site will be to maintain down the road.\n\nA great template is a massive shortcut, while a poorly coded one will have you tearing your hair out.\n\nYou have to look past the flashy demo and dig into what's under the hood. It’s a lot like buying a car—a slick paint job doesn't mean much if the engine is a mess. That means you need to check out the code quality, how clear the documentation is, and what kind of components you're actually getting.\n\nIf you're on the fence about whether to use a template or start from scratch, this decision tree can make things clearer.\n\n![A landing page template decision tree flowchart guiding users through design choices.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/15748efe-e954-4376-96e0-bc94b412ef4a/tailwind-landing-page-templates-decision-tree.jpg)\n\nAs you can see, for most new landing pages, a template is simply the smartest way to go. It saves a ton of time and gives you a solid, pre-tested structure to build on.\n\n### Where to Find Your Template\n\nTemplates are everywhere, from free open-source projects to premium marketplaces. Each source has its place, and the right choice really boils down to your project's needs—whether you're building a SaaS site, an e-commerce page, or a simple portfolio.\n\nThis growing ecosystem of high-quality templates has played a huge role in Tailwind's popularity. Developers can now get their hands on incredibly powerful tools without reinventing the wheel. Some premium providers, for example, offer massive bundles with over **53 fully coded landing pages**, letting companies spin up professional marketing sites in record time. You can learn more about how premium templates are shaping web development and see some great examples in action here: https://magicui.design/blog/landing-page-design-templates.\n\nTo get a better sense of the landscape, here's a quick breakdown of what you can expect from different template sources.\n\n### Comparing Popular Tailwind Template Providers\n\n| Feature               | Free Templates (e.g., Tailblocks) | Mid-Range Templates (e.g., TailGrids)           | Premium Suites (e.g., Flowbite Pro)                    |\n| :-------------------- | :-------------------------------- | :---------------------------------------------- | :----------------------------------------------------- |\n| **Cost**              | **$0**                            | **$29 - $99** (one-time)                        | **$149 - $499+** (often includes lifetime updates)     |\n| **Component Variety** | Basic (buttons, cards, navbars)   | Good (pricing, testimonials, forms)             | Extensive (dashboards, marketing sections, e-commerce) |\n| **Design Quality**    | Functional but generic            | Professional and modern                         | Polished, often with multiple style variants           |\n| **Updates & Support** | Community-driven, if any          | Usually includes updates and basic support      | Dedicated support and regular feature releases         |\n| **Best For**          | Hobby projects, learning Tailwind | Startups, freelancers, smaller commercial sites | Agencies, large-scale projects, product teams          |\n\nUltimately, free templates are perfect for getting your feet wet, but for any serious project, investing in a mid-range or premium option pays for itself in time saved and headaches avoided.\n\n### What to Look for When You’re Choosing\n\nWhen you start comparing **tailwind landing page templates**, there are a few non-negotiables to keep in mind. The goal is to find something that not only looks sharp but is actually enjoyable to customize.\n\n> A template's true value is measured by how easily you can adapt it to your unique brand and functionality. Prioritize clean code, logical component structure, and mobile-first responsiveness over flashy, hard-to-modify animations.\n\nHere's a quick checklist to run through before you commit:\n\n- **Code Quality:** Is the HTML semantic? Is the CSS well-organized? Steer clear of templates with messy, overly complex code—it's a nightmare to customize later.\n- **Responsiveness:** Pull up the demo on your phone, tablet, and desktop. A modern template has to be flawless on every screen size. No excuses.\n- **Component Variety:** Does it have the building blocks you actually need? Things like pricing tables, testimonial sections, and contact forms are essential. The more useful components included, the more flexible the template.\n- **Documentation and Support:** Clear documentation is an absolute must. Good support is a bonus that can be a lifesaver when you hit a wall with a tricky problem.\n\nThinking through these points is a critical step. If all this feels a bit overwhelming, you can always explore [professional landing page design services](https://wiseweb.com.au/get-professional-landing-page-design-services/) to get expert help.\n\n## Your Modern React And Tailwind Setup\n\nWith your **tailwind landing page template** picked out, it's time to set up the digital workshop where you'll bring it to life. A clean, modern development environment isn't just nice to have; it's essential for a smooth workflow. We're going to build our project using React with Vite, a build tool famous for its blazing speed, and then weave in Tailwind CSS.\n\nThis isn't just about punching in commands. It's about understanding the foundation you're building on. We'll go from a blank terminal to a fully configured, scalable launchpad, ready for your template's components.\n\n![A sleek laptop displays code and floating app windows on a modern developer workspace.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5797b501-a33f-48b5-af8d-d01e3bf1bc88/tailwind-landing-page-templates-coding-workspace.jpg)\n\n### Initializing Your Vite and React Project\n\nFirst things first, let's spin up the React application. Vite makes this incredibly quick. Pop open your terminal and run this command, but feel free to swap `my-landing-page` with your own project name.\n\nnpm create vite@latest my-landing-page --template react\n\nThat command scaffolds out a fresh React project. Once it wraps up, jump into the new directory and get the dependencies installed.\n\ncd my-landing-page\nnpm install\n\nAnd that's it. Just two commands and you have a running React app. Give it a whirl by running `npm run dev`. This lightning-fast start is exactly why so many of us have switched to Vite for modern web projects.\n\n### Integrating Tailwind CSS\n\nNow, let's get Tailwind in on the action. This part involves adding a few development dependencies and creating a couple of configuration files.\n\nIf your development server is running, shut it down with `Ctrl + C`. Then, install Tailwind CSS along with its peer dependencies.\n\nnpm install -D tailwindcss postcss autoprefixer\n\nNext up, generate your `tailwind.config.js` and `postcss.config.js` files. These are the brains of your Tailwind setup.\n\nnpx tailwindcss init -p\nThis command adds two critical files. The `postcss.config.js` file is usually good to go out of the box, but `tailwind.config.js` needs a little guidance on where to find your template files.\n\n> Getting your `content` paths right is key. It tells Tailwind's Just-In-Time (JIT) compiler where to look, so it only generates the CSS classes you’re actually using. The result is a tiny, super-optimized production build.\n\nOpen up `tailwind.config.js` and update the `content` array to point to all your component files.\n\n```tsx\n/** @type {import('tailwindcss').Config} \\*/\nexport default {\n  content: [\"./index.html\", \"./src/**/\\*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n```\n\nThe final piece of the puzzle is telling your app to actually use Tailwind's styles. Find your main CSS file (usually `src/index.css`), clear out whatever is in there, and add these three Tailwind directives.\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nThese directives act as placeholders that Tailwind’s build process will replace with all the styles it generates. For a more granular walkthrough, we have a great guide on how to [install Tailwind CSS in our blog post here](https://magicui.design/blog/tailwind-css-install).\n\nWith everything in place, fire up your development server again with `npm run dev`. Your project is now fully armed with React, Vite, and Tailwind CSS—a powerful stack ready to handle any **tailwind landing page template**. You’ve just built a solid, optimized foundation ready for customization.\n\n## Making The Template Your Own With Custom Components\n\nA great **tailwind landing page template** is just the canvas; now it's time to paint. This is where you move beyond the pre-built design and inject your brand's unique personality. Customization isn't about reinventing the wheel—it’s about making smart, targeted changes that align the template with your vision.\n\nThe first place I always start is with the core brand elements. This means diving right into the `tailwind.config.js` file to tweak the theme. Instead of chasing down color classes one by one, you can define your brand’s palette directly in the configuration. It’s a game-changer for consistency and makes future updates a breeze.\n\n![Soft pastel 3D illustration of web UI elements, abstract shapes, and building blocks.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/a870ff12-edf0-44b5-a162-5d3d865d6f20/tailwind-landing-page-templates-ui-design.jpg)\n\n### From Static Blocks To Reusable React Components\n\nTo truly own the template, you need to start thinking in components. A static HTML file is fine for a demo, but a modern web app is built from modular, reusable pieces. Look at the main sections of your landing page—the Hero, Features, Testimonials, and Call-to-Action (CTA)—and break each one down into its own React component.\n\nFor instance, your project structure might look something like this:\n\n- `Hero.jsx`: This holds your main headline, sub-headline, and primary CTA button.\n- `FeatureCard.jsx`: A reusable card for showcasing individual product features. You can then just map over an array of feature data to populate a whole section.\n- `CTASection.jsx`: The final prompt for users, which you can easily drop into different pages or even A/B test later.\n\nThis component-based workflow is the secret to building a landing page that’s both maintainable and easy to scale. If you need to change a button style, you do it in one file, and it updates everywhere. That alone will save you countless hours.\n\n> The real power here is unlocked when you separate presentation from data. By creating components that accept props, you can feed them dynamic information, transforming a static page into a living, breathing experience.\n\n### Breathing Life Into Your Page With Dynamic Data\n\nLet's make this practical. Imagine your template has a static three-column feature grid. Instead of hardcoding the content directly in your JSX, you can pull it from an API or even just a local data file. This simple shift makes your content incredibly easy to update without ever touching the component's structure.\n\nYou could create a simple `featuresData.js` file:\n\nexport const features = [\n  {\n    icon: \"IconRocket\",\n    title: \"Fast Deployment\",\n    description: \"Launch your site in minutes, not weeks.\",\n  },\n  {\n    icon: \"IconSecure\",\n    title: \"Secure by Design\",\n    description: \"Built-in security features to protect your data.\",\n  },\n  {\n    icon: \"IconScalable\",\n    title: \"Scales With You\",\n    description: \"Infrastructure that grows with your user base.\",\n  },\n]\n\nThen, in your `FeaturesSection.jsx` component, you just import this data and render it dynamically. This small architectural change is what separates a simple website from a scalable web application.\n\nIt’s a key reason developers are flocking to more flexible frameworks. In fact, [Tailwind CSS](https://tailwindcss.com/) commanded around **7%** of the CSS framework market share in 2023, pulling ahead of established players like Bootstrap, which held about **4%**. This growth reflects a massive demand for more dynamic, component-driven development. You can discover more insights about landing page tech stacks to see just how quickly the industry is evolving.\n\n## Adding Polish With Animations And Interactions\n\nA static landing page does its job, but a dynamic one creates an experience. This is where you add that final layer of polish—subtle animations and interactions that take your **tailwind landing page template** from good to genuinely memorable. We're not talking about flashy, distracting effects. The goal is thoughtful motion that guides the user and provides satisfying feedback.\n\nA great place to start is with on-scroll reveal effects. As someone scrolls down your page, elements like feature cards or testimonials can gently fade or slide into view. This simple technique is incredibly effective at drawing attention to each section sequentially, making your page feel more engaging and less like a wall of text. Libraries like [Framer Motion](https://www.framer.com/motion/) are fantastic for this; they integrate beautifully with React and give you powerful animation controls without a ton of boilerplate.\n\n![A minimalist illustration depicts a hand holding a device, wirelessly connecting to a laptop computer.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/79f93aba-9911-483d-aa45-41394204989d/tailwind-landing-page-templates-wireless-connection.jpg)\n\n### Implementing Smooth User Interactions\n\nBeyond the big, section-level animations, the real magic happens in the micro-interactions. These are the small, functional animations that respond to a user's actions. Think about a button that subtly scales up when you hover over it or a form input that highlights with a soft glow when you click into it. These little details make your UI feel responsive and alive.\n\nHere are a few high-impact micro-interactions you can build in minutes:\n\n- **Button Hover States:** Just add a `transition` utility in Tailwind and change the background color or add a slight `transform` on hover. It’s a classic for a reason.\n- **Icon Animations:** An icon that rotates or shifts slightly when its corresponding feature is hovered over adds a delightful touch.\n- **Form Feedback:** Use color and motion to clearly indicate success or error states when a user submits a form. It's both helpful and reassuring.\n\nThese small touches really add up, giving your page a polished, professional feel. For a much deeper dive into the mechanics, you can find a helpful guide on achieving [CSS animation on scroll in this blog post](https://magicui.design/blog/css-animation-on-scroll).\n\n### Ensuring Perfect Responsiveness\n\nOkay, so your page is now beautifully animated. But does it look perfect on _every_ device? Before you call it a day, you have to be rigorous with your responsive design checks. Open up your browser's developer tools and start emulating different screen sizes, from a tiny iPhone SE all the way up to a massive desktop monitor.\n\n> Don't just check the common breakpoints. My go-to trick is to slowly drag the browser window's width from its smallest to its largest size. This is how you spot those awkward layout shifts and content overlaps that happen _between_ the standard device widths.\n\nPay special attention to typography, how your images are scaling, and the navigation menu. Your font sizes need to adjust for readability on small screens, and your mobile navigation has to be dead simple to use with a thumb.\n\n### Prioritizing Web Accessibility\n\nLast but certainly not least: a great user experience has to be an accessible one. Accessibility (often shortened to **a11y**) is about making sure your site is usable by everyone, including people with disabilities who might rely on screen readers or keyboard-only navigation.\n\nStart with these fundamental accessibility checks. They're non-negotiable.\n\n1.  **Keyboard Navigation:** Can you get to every interactive element—links, buttons, form fields—using only the Tab key? Critically, is the focus indicator (`outline`) always visible so you know where you are?\n2.  **Semantic HTML:** Use the right HTML tags for the job. That means `<nav>`, `<main>`, and `<button>` instead of slapping a `<div>` on everything. This gives screen readers the context they need to make sense of your page.\n3.  **Alt Text for Images:** Every single meaningful image needs descriptive `alt` text. This is what a screen reader will announce to a visually impaired user, so make it count.\n\n## Deploying Your Landing Page To The World\n\nYou've built an incredible site with a **tailwind landing page template**, polished it with slick animations, and made sure it's accessible to everyone. Now for the best part: getting it out into the world. Thankfully, deploying a modern React app is easier than it has ever been, all thanks to platforms built specifically for developers like us.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/hAuyNf0Uk-w\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nServices like [Vercel](https://vercel.com/) and [Netlify](https://www.netlify.com/) have totally changed the game. They offer seamless, Git-based workflows that take what used to be a complicated, multi-step process and turn it into just a few clicks. The whole idea is beautifully simple: connect your GitHub, GitLab, or Bitbucket repository, and the platform takes care of the rest. Every `git push` automatically triggers a new build and deploys the latest version of your site.\n\n### Connecting And Configuring Your Project\n\nLet's quickly run through how this usually works. Once you've signed up for Vercel or Netlify, you'll authorize it to access your Git provider. From there, you just pick the repository where your landing page lives.\n\nThe platform is almost always smart enough to sniff out that you're using a Vite-based React project and will suggest the right build settings right out of the box.\n\nMost of the time, the defaults are exactly what you need:\n\n- **Build Command:** `npm run build` or `vite build`\n- **Output Directory:** `dist`\n- **Install Command:** `npm install`\n\nYou just confirm these settings, hit the deploy button, and in a minute or two, your site is live on a temporary URL. Seeing it work so effortlessly for the first time is a genuinely magical experience.\n\n### Final Touches For A Professional Launch\n\nWith your site officially live, there are a couple of last-minute things you'll want to handle. First up is adding a custom domain. Both Vercel and Netlify provide super clear, step-by-step instructions for pointing your domain's DNS records to their servers. This is what turns a generic URL into `yourbrand.com`.\n\n> Don't even think about skipping HTTPS. Modern deployment platforms automatically provide and renew free SSL/TLS certificates for your custom domains. This is completely non-negotiable for both security and SEO—it builds trust with your visitors and is a known ranking factor for search engines.\n\nFinally, take a minute to check your production build's performance. The easiest way is to run a Lighthouse audit right from your browser's developer tools. This will give you a report card with actionable feedback on loading speed, accessibility, and SEO. You'd be surprised how often simple fixes like compressing images or lazy-loading offscreen content can give you a massive performance boost, ensuring your page loads lightning-fast for every visitor.\n\n---\n\nReady to build your own stunning landing page in minutes? **Magic UI** offers a powerful library of over **50** customizable blocks and **150+** free animated components built with React, Typescript, and Tailwind CSS. [Start building for free at magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-landing-page.mdx",
    "content": "---\ntitle: \"Design A Tailwind Landing Page (From Scratch Or With Templates)\"\ndescription: \"Master Tailwind landing pages & impress your audience. Get started today with Magic UI's Startup Landing Page Template.\"\nimage: https://cdn.magicui.design/assets/53827030-890d-4b3a-8d48-0865799fb5fe.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nAre you a developer seeking to create a remarkable landing page that stands out amongst the countless online [Landing Page Examples](https://magicui.design/blog/landing-page-examples)? Finding the right path can be overwhelming. This article provides the guidance you need to master creating a Tailwind Landing Page that will catch the interest of your audience and set you apart from the competition.\n\nStart your journey to learn about creating a Tailwind landing page as a developer today by leveraging this powerful tool designed to simplify the process and enhance your development experience. Make your vision a reality using Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup).\n\n## What Is Tailwind CSS?\n\n![Tailwind Landing Page](https://images.unsplash.com/photo-1522152302542-71a8e5172aa1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkZXZlbG9wZXIlMjB3b3JraW5nJTIwYWxvbmV8ZW58MHx8fHwxNzIxMTY0Njg4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nTailwind CSS is a [utility-first CSS framework](https://github.com/tailwindlabs/tailwindcss) designed to enable users to create applications faster and easier. You can use utility classes to control the layout, color, spacing, typography, shadows, and more to create a completely custom component design — without leaving your HTML or writing a single line of custom CSS.\n\nThe main feature of this library is that, unlike other CSS frameworks like Bootstrap, it does not provide a series of predefined classes for elements such as buttons or tables. Instead, it creates a list of utility CSS classes that can style each element by mixing and matching.\n\n### Less Code, Same Style\n\nFor instance, in other traditional systems, a class message warning would apply a yellow background color and bold text. To achieve this result in Tailwind, one must use a set of classes created by the library: bg-yellow-300 and font-bold.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Features And Benefits Of Using Tailwind CSS For Landing Pages\n\n![Tailwind Landing Page](https://images.unsplash.com/photo-1522252234503-e356532cafd5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzIxMTY0NzAxfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Faster Development\n\nLeveraging a utility-first approach and pre-built components, Tailwind CSS streamlines the development process for landing pages.\n\n### Less Custom CSS\n\nWith Tailwind, styling elements by applying pre-existing classes directly in HTML means less custom CSS. This allows developers to build custom designs without writing additional CSS.\n\n### Small CSS files\n\nTailwind minimizes the need to keep writing CSS as new features and components are added, resulting in smaller and lighter CSS files. Utility classes in Tailwind are reusable, reducing the need for new CSS.\n\n### No need to invent class names\n\nTailwind offers a [pre-defined design system](https://blog.hubspot.com/website/what-is-tailwind-css), eliminating the need to create unique class names for styles and components. This streamlines the:\n\n- Design and\n- Development process\n\n### Safer changes\n\nMaking changes to CSS with Tailwind is safer as utility classes in HTML are local. This means changes can be made without worrying about breaking other parts of the site.\n\n### Level Up Your Designs: Integrate MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specifically designed for design engineers. It provides over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. This library offers a range of visually appealing and interactive elements that can be seamlessly integrated into web applications, allowing users to create stunning user interfaces with minimal effort.\n\n### Highly Customizable Components\n\nMagicUI components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. This level of customization empowers users to craft captivating digital experiences that resonate with their target audience and elevate their brand identity.\n\n### Bridge Between Design and Development\n\nMagicUI aims to bridge the gap between design and development by focusing on animation and taking a design-centric approach. This fusion enables users to create dynamic, engaging landing pages that capture attention and effectively drive conversions.\n\n### Save Time and Effort with MagicUI Pro\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) takes the capabilities of the free component library to the next level by allowing users to save thousands of hours creating beautiful landing pages. The Pro version includes website templates optimized for conversions, enabling users to convert visitors into customers efficiently.\n\n### Launch Your Startup Landing Page with MagicUI's Template\n\nReady to elevate your landing page game with MagicUI? Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today and experience firsthand how MagicUI can transform your digital presence.\n\n## How To Build A Tailwind Landing Page From Scratch\n\n![Tailwind Landing Page](https://images.unsplash.com/photo-1485217988980-11786ced9454?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxjb2RlciUyMHdvcmtpbmclMjBoYXJkfGVufDB8fHx8MTcyMTE2NDcxMnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Setting up the Project\n\nYou must first set up the project to build a Tailwind landing page from scratch. Start by installing Node.js if you haven't already. This is necessary as Tailwind CSS requires Node.js to function properly. After installing Node.js, create a new directory for your project and navigate to it in your terminal. Then, initialize a new npm project by running `npm init—y.'\n\nNext, install Tailwind CSS and its dependencies by running the following command:\n\n```bash\nnpm install -D tailwindcss postcss autoprefixer\n```\n\nAfter installing the required dependencies, generate the Tailwind CSS configuration files by running:\n\n```bash\nnpx tailwindcss init -p\n```\n\nThis command creates `tailwind.config.js` and `postcss.config.js` files in your project directory.\n\n### Creating the HTML Structure\n\nCreate an `index.html` file in your project directory and add the [basic HTML structure](https://www.freecodecamp.org/news/introduction-to-html/) with `<head>` and `<body>` sections. In the `<head>`, include the Tailwind CSS CDN link:\n\n```html\n<link\n  href=\"https://cdn.jsdelivr.net/npm/tailwindcss/dist/tailwind.min.css\"\n  rel=\"stylesheet\"\n/>\n```\n\nCreate the main sections of your landing page such as Header, Hero, Features, Call-to-Action, and Footer. Use semantic HTML tags like `<header>`, `<nav>`, `<section>`, `<article>`, `<footer>` to structure your content.\n\n### Styling the Landing Page with Tailwind Utility Classes\n\nTo style your landing page using Tailwind CSS utility classes, you can add various classes to your HTML elements. For example:\n\n```html\n<header class=\"bg-gray-800 py-4 text-white\">\n  <nav class=\"container mx-auto flex items-center justify-between\">\n    <a href=\"#\" class=\"text-xl font-bold\">Your Logo</a>\n    <ul class=\"flex space-x-4\">\n      <li><a href=\"#\" class=\"hover:text-gray-400\">Home</a></li>\n      <li><a href=\"#\" class=\"hover:text-gray-400\">Features</a></li>\n      <li><a href=\"#\" class=\"hover:text-gray-400\">Pricing</a></li>\n      <li><a href=\"#\" class=\"hover:text-gray-400\">Contact</a></li>\n    </ul>\n  </nav>\n</header>\n```\n\n#### Tailwind Responsive Design\n\nTouse responsive utility classes to ensure your landing page looks great on different screen sizes. Tailwind CSS provides a wide range of utility classes that you can utilize to build a responsive design. Customize the styles by modifying the `tailwind.config.js` file. Add colors, fonts, and other styles to match your branding.\n\n#### Visually Appealing & Responsive\n\nBy leveraging Tailwind's utility classes and components, you can quickly build a responsive and visually appealing landing page that meets your design requirements. Testing your landing page on different screen sizes ensures a seamless user experience across various devices.\n\n## Best Practices For Creating Effective Tailwind Landing Pages\n\n### Utilizing PurgeCSS with Tailwind\n\nPurgeCSS is a valuable tool that removes any unused CSS from your site, helping to:\n\n- Reduce file size\n- Improve performance\n\nBy incorporating PurgeCSS with Tailwind, you can ensure that only the necessary CSS classes are included in your [final build](https://www.tailwindawesome.com/?type=template), optimizing loading speeds. To implement this, update your tailwind.config.js file with the appropriate paths to your HTML and JS files.\n\n### Optimizing Images\n\nHigh-resolution images can slow down your landing page's load times. To combat this, consider compressing your images without compromising quality. Tools like ImageOptim or TinyPNG can help you reduce file sizes while maintaining visual appeal, ensuring your images load quickly without sacrificing clarity.\n\n### Leverage Browser Caching\n\nBy leveraging browser caching, you can store frequently used files locally on a user's browser, significantly improving load times for return visits. Ensure your server is configured to serve assets with appropriate cache headers, allowing resources to be locally stored and retrieved efficiently.\n\n### Asynchronous Loading\n\nFor non-essential scripts or third-party integrations, consider loading them asynchronously. By loading these elements separately from the main page content, you prevent them from blocking the initial page render, enhancing user experience. Implement asynchronous loading by adding the \"async\" attribute to your script tags.\n\n### Monitoring and Profiling\n\nTo ensure optimal performance and identify areas for improvement, regularly monitor and profile your [landing page using tools](https://developers.google.com/speed/pagespeed/insights/) like Google's PageSpeed Insights. Analyzing your page's performance metrics can provide actionable recommendations for enhancing user experience and conversion rates.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 12 Amazing Tailwind Landing Page Templates\n\n![Tailwind Landing Page](https://images.unsplash.com/photo-1587355760421-b9de3226a046?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx1c2VyJTIwaW50ZXJmYWNlfGVufDB8fHx8MTcyMTE2NDcyNnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Tailwind UI (Landing Pages)\n\nThree super slick one-page landing page templates designed and coded by creators of Tailwind CSS. Tailwind UI doesn’t only include landing pages, but it’s an ongoing collection of professionally designed, pre-built, [fully responsive HTML snippets](https://tailwindui.com/components/marketing/page-examples/landing-pages) you can drop into your Tailwind projects.\n\n### 2\\. Appy\n\nAppy is the ultimate mobile-based landing page template built on the latest Tailwind CSS 2.0 framework. Along with the toggle to switch between dark and white layouts, it introduces eight pre-made pages that will help you quickly kickstart your project’s development.\n\n### 3\\. Open PRO\n\nOpen PRO is a superb landing page template with a fully dark design and a streamlined user interface. Due to multiple pages and components, this product is the perfect answer for anyone looking to build:\n\n- SaaS apps\n- Corporate websites and more\n\n### 4\\. Easybank\n\nMade as part of a frontend mentor challenge, Easybank is a scalable product designed with FinTech applications in mind. Created as a product that stands out, this template can easily adapt to different viewpoints and be flexible for multiple uses because of [high-quality code](https://github.com/kelvinsanchez15/easybank-landing-page).\n\n### 5\\. Modern SAAS\n\nModern SaaS is a template created using Tailwind CSS V2 and Alpine.js. This product Includes 5 responsive pages (such as blog, contact, about, etc.)\n\n- Pricing tabs\n- Newsletter forms\n- Feature tabs\n- Dark mode support\n- Sleek product illustrations\n\n### 6\\. Treact\n\nTreact is a collection of up to eight landing page templates to suit your needs. There’s something for restaurants, marketing services, hotels, cloud storage services, etc. The possibilities are endless, considering each can be edited with different copies and illustrations.\n\n### 7\\. Simple\n\nFew landing page themes represent their names more than Simple. Its design is professional and straightforward. While it was built on Tailwind CSS, it was utterly coded on React.js with all the essential components needed to get a SaaS landing page.\n\n### 8\\. Monochrome\n\nGo monochrome is a black-and-white landing page for mobile-based apps or extensions. This product includes:\n\n- Native App & Play Store buttons\n- Features sections\n- FAQ lists\n- Artistic MIT license illustrations that you can include in your own project presentation\n\n### 9\\. Shine\n\nShine is a [free startup and app](https://graygrids.com/templates/free-tailwind-template-shine/) landing page template designed for attractive:\n\n- Businesses\n- Websites\n- Digital services\n\nIt’s a free one-page product with all the essential sections and elements to launch several types of one-page sites using Tailwind's mighty power.\n\n### 10\\. Screenshot\n\nThe screenshot is an open-sourced, bright landing page template with space for section browser screenshots and custom mockup illustrations. This template is straightforward to set up because of Tailwind CSS and provides a fresh starting point page in minutes.\n\n### 11\\. Landing\n\nLanding is a developer-friendly landing page template based on the latest coding practices that are fully designed with a product-centric approach. With its cutting-edge front-end tool, you can customize the designs from the foundation and get a fresh template to start different new businesses.\n\n### 12\\. Basic\n\nBasic is the template of your choice if you want to draw the user’s attention because of the excellent hand-drawn cartoon illustrations. All sections and features are coded following the latest practice of Tailwind CSS so that it is easy to set up and customize for non-coders.\n\n### Built for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers, offering a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n#### Effortless Integration\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n#### Highly Customizable\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) components are highly customizable, enabling seamless adaptation to match our:\n\n- Desired branding\n- Design requirements\n\n#### Level Up Your Landing Page Creation & Conversions with MagicUI Pro\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, MagicUI Pro can save you thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n## What Are The Limitations Of Using Tailwind?\n\n![Tailwind Landing Page](https://images.unsplash.com/photo-1516534775068-ba3e7458af70?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxmcnVzdHJhdGVkJTIwb24lMjBsYXB0b3B8ZW58MHx8fHwxNzIxMTY0NzY5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Large HTML files\n\nWhen using Tailwind CSS, you may run into the issue of large HTML files. The utility-first approach of Tailwind often involves a multitude of classes in the HTML, which can increase the file size. This, in turn, can impact website performance as larger HTML files take longer to download and render in the browser.\n\nIt's worth noting that Tailwind CSS's utility-first approach allows for the rapid development of custom designs without the need to write custom CSS. Also, the extra data in the HTML file is highly compressible, helping to mitigate the impact on performance.\n\n### Steep Learning Curve\n\nTailwind CSS may present a steep learning curve for developers new to CSS or unfamiliar with the built-in classes it offers. While it can be simple for those familiar with CSS, mastering Tailwind CSS requires a thorough understanding of the pre-built classes, which might take time.\n\nSome may argue that the time saved using pre-built classes can be used to learn other essential skills. The decision to use Tailwind CSS or another [CSS framework](https://www.freecodecamp.org/news/best-css-frameworks-for-frontend-devs/) should be based on the project’s:\n\n- Specific needs\n- Goals\n\n### An Installation Process is Required\n\nAn installation process is required to generate the latest versions of Tailwind CSS, which may require additional resources and incur extra costs. This added complexity could be overwhelming for developers unfamiliar with front-end build processes.\n\nTailwind CSS integrates well with many front-end frameworks. TailwindCLI can simplify the installation process, making it essential to consider a project’s specific needs and goals when deciding whether to use Tailwind CSS.\n\n### Tailwind CSS is Not an All-Rounder\n\nTailwind CSS has limitations, as it may not handle all CSS properties and advanced features. While its capabilities expand, some functions may require inline styles or custom classes outside Tailwind CSS.\n\nWhile it's not a one-size-fits-all solution, using inline styles or custom classes can help achieve specific requirements that are outside Tailwind’s scope.\n\n### HTML and Styling Are Mixed\n\nTailwind CSS differs from most CSS frameworks in that it incorporates style rules into [HTML](https://www.geeksforgeeks.org/how-to-create-a-landing-page-using-html-css-and-javascript/) files instead of writing separate CSS rules. This approach might violate the principle of ‘separation of concern’ and make the Tailwind markup verbose.\n\nWhile this can be advantageous for those unfamiliar with CSS, some developers believe that separating page structure and style improves the Tailwind markup process.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library specifically designed for design engineers. It provides over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. This library offers a range of visually appealing and interactive elements that can be seamlessly integrated into web applications, allowing users to create stunning user interfaces with minimal effort.\n\n### Highly Customizable Components\n\nMagicUI components are highly customizable, allowing seamless adaptation to match desired branding and design requirements. This level of customization empowers users to craft captivating digital experiences that resonate with their target audience and elevate their brand identity.\n\n### Bridge Between Design and Development\n\nMagicUI aims to bridge the gap between design and development by focusing on animation and taking a design-centric approach. This fusion enables users to create dynamic, engaging landing pages that capture attention and effectively drive conversions.\n\n### Save Time and Effort with MagicUI Pro\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) takes the capabilities of the free component library to the next level by allowing users to save thousands of hours creating beautiful landing pages. The Pro version includes website templates optimized for conversions, enabling users to convert visitors into customers efficiently.\n\n### Launch Your Startup Landing Page with MagicUI's Template\n\nReady to elevate your landing page game with MagicUI? Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today and experience firsthand how MagicUI can transform your digital presence.\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-portfolio-template.mdx",
    "content": "---\ntitle: \"12 Amazing Tailwind Portfolio Templates for a Great Online Presence\"\ndescription: \"Transform your online presence with these 12 exceptional Tailwind portfolio templates, designed to showcase your work with style and impact.\"\nimage: https://cdn.magicui.design/assets/436f192c-adef-4c14-93dd-4f7c5af8808e.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nLooking for free Tailwind CSS templates to enhance your portfolio website? Crafting a standout landing page can be challenging, especially for beginners. But what if you could skip the lengthy design process and build a polished portfolio?\n\nThat's where Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) comes–your shortcut to creating a stunning, professional portfolio from [landing page examples](https://magicui.design/blog/landing-page-examples). Ready to impress clients and employers with your work? Let's get started!\n\n## What Is a Tailwind Template?\n\n![Tailwind Portfolio Template](https://images.unsplash.com/photo-1483817101829-339b08e8d83f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb2RlfGVufDB8fHx8MTcyMTc4NzA3MHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA \"Tailwind template\" is a pre-built or starter template for building web applications using the Tailwind CSS framework.\n\n### Critical Differences Between Tailwind CSS and Other Frameworks\n\n- Tailwind CSS is not a UI kit\n- Lacks default themes\n- Does not include built-in UI components\n- Differs from frameworks like Bootstrap, Foundation, or Bulma\n\nIt is a compelling framework for customization, of course, if you don’t mind the repetition in your markup because you can make any website you can imagine. You are the design “Captain.”\n\nAccording to its official website, Tailwind CSS is a utility-first CSS framework for rapidly building custom designs. It is a highly customizable, low-level CSS framework that gives developers all the building blocks they need to build bespoke designs without annoying opinionated styles.\n\n### Advantages of Using a Tailwind Template for Your Portfolio\n\n- Provides a pre-designed, customizable web layout with Next.js components\n- Serves as a digital business card to showcase your skills, creativity, and personality\n- Allows you to create a visually appealing and functional portfolio without starting from scratch\n- Enables you to focus on personalizing and adding your content\n\nTailwind templates often come with pre-designed components, styles, and configurations, helping developers kickstart their projects quickly. These templates may include standard features such as routing, state management, and authentication, implemented using Tailwind and possibly other related libraries.\n\n## Why Use Tailwind for Portfolio Websites?\n\n![Tailwind Portfolio Template](https://images.unsplash.com/photo-1423666639041-f56000c27a9a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3ZWJzaXRlJTIwYXBwfGVufDB8fHx8MTcyMTc4NzA4Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Customizability\n\nTailwind CSS is a utility-first framework that allows you to [create unique designs](https://themewagon.com/themes/) without being restricted by predefined styles. This means you can easily tailor your portfolio to match your brand and style. Plus, with responsive utility classes, ensuring your portfolio looks great on any device is straightforward, offering a seamless user experience.\n\n### Speed of Development\n\nTailwind portfolio templates come with various pre-built components and layouts, significantly speeding up the process. You can quickly assemble your portfolio by reusing these components. These templates often have a minimal setup, allowing for rapid deployment so you can focus more on content creation rather than configuration.\n\n### Modern Aesthetics\n\nTailwind templates typically feature sleek, contemporary design elements that help your portfolio stand out in a crowded market. These templates include beautiful animations and effects, enhancing user engagement without compromising performance.\n\n### Performance Optimization\n\nTailwind CSS excels in performance optimization. It generates minimal CSS, only including the styles you use in your project, resulting in faster loading times, which is crucial for user retention and SEO. The optimized code and ability to purge unused styles mean improved performance metrics for your portfolio.\n\n### Documentation and Community Support\n\nTailwind templates come with comprehensive documentation, making it easier to customize and extend them according to your needs.\n\n#### Advantages of the Tailwind CSS Community\n\n- Vibrant and supportive\n- Offers a wealth of resources, tutorials, and plugins\n- Helps enhance and elevate your portfolio\n\n### SEO-Friendliness\n\nTailwind templates emphasize [semantic HTML](https://www.semrush.com/blog/semantic-html5-guide/), which helps search engines better understand and index your content. The fast-loading pages and clean structure also improve SEO rankings, allowing your portfolio to gain visibility.\n\n### Craft Stunning UIs and Convert Visitors With MagicUI\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## 12 Amazing Tailwind Portfolio Templates for a Great Online Presence\n\n![Tailwind Portfolio Template](https://images.unsplash.com/photo-1494778752932-64ee27ba2a37?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjE3ODcwOTN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Magic UI's Portfolio Template\n\nThe [Magic UI](https://pro.magicui.design/docs/templates/startup) portfolio template is a complete, customizable solution designed for developers to showcase their work to the world. It saves you over 100 hours of development time with easy configuration, built-in advanced animations, and a 1-click setup.\n\n#### Efficient Portfolio Setup With MagicUI\n\n- Sections include Hero, About, Work, Education, Projects, Hackathon, Contact, and Blog\n- Easily update text and images\n- Deploy your portfolio live to Vercel in minutes\n\n### 2\\. React Portfolio Template\n\nChetan Verma's  React Portfolio Template is a testament to simplicity and elegance.\n\n#### Features of the Next.js and TailwindCSS Template\n\n- Built with Next.js and TailwindCSS\n- Offers a clean and modern design\n- Ideal for showcasing skills and projects\n\nIts responsiveness ensures your portfolio looks fantastic on any screen, making it a top choice for those searching for a user-friendly solution.\n\n### 3\\. EdgeFolio - Nextjs React Blog Portfolio TailwindCSS Template\n\nEdgeFolio’s components are styled with Tailwind CSS, giving you access to a wealth of pre-designed UI components that can be customized to match your brand. The Markdown/MDX blogging system built on Next.js makes creating and sharing dynamic and rich content easy. At the same time, integration with the ConvertKit newsletter platform lets you connect with your audience and grow your mailing list.\n\n### 4\\. Portfolio Tailwind\n\nPortfolio Tailwind is a multi-purpose portfolio web template with 2 unique variations: a Personal Portfolio and an Agency portfolio site. This Tailwind CSS portfolio template is packaged with all the [essential UI components](https://careerfoundry.com/en/blog/ui-design/ui-element-glossary/) needed to create various portfolio sites.\n\n### 5\\. Atom\n\nAtom is a Portfolio HTML Template made with the latest technologies like Tailwind CSS Alpine.JS, among others, and based on a vibrant and creative design.\n\n### 6\\. Cleopatra\n\nCleopatra offers a feature-rich admin dashboard template built with Tailwind CSS, designed with developers in mind, and packed with options. While some components may not be fully functional, Cleopatra provides the flexibility to customize and add functionality to suit your needs.\n\n### 7\\. Astro Portfolio\n\nAstro Portfolio offers a free and dynamic template for crafting your portfolio website using Astro 4.0 alongside Tailwind CSS. This combination ensures a smooth and customizable experience tailored to your creative needs.\n\n### 8\\. Prima Persona\n\nPrima Persona offers a simple yet elegant one-page Tailwind template designed to make a professional and personal statement online.\n\n### 9\\. Landing\n\nLanding is a free Tailwind CSS template designed to create a stunning and functional landing page. It features a variety of cutting-edge elements, making it perfect for effectively showcasing your product or service.\n\n### 10\\. Simple Light\n\nSimple Light is a free landing page template crafted with TailwindCSS and fully coded in React / Next.js. It is designed to offer all the essential components developers need to create a stunning landing page for SaaS products, online services, and more.\n\n### 11\\. Stoman\n\nStoman is an open-source React portfolio template that's available on GitHub. It uses Tailwind CSS for styling and the Framer Motion library to add cool animated effects. It also supports dark mode, which is helpful if you want to create a dark-themed website.\n\n### 12\\. Geeky Nextjs\n\nGeeky Nextjs is a user-friendly blog template built with Next.js and Tailwind CSS.\n\n#### Benefits\n\n- Ensures fast website performance\n- SEO-friendly\n- Easy to manage\n\nWith an up-to-date design and powerful features, Geeky Nextjs is perfect for creating a high-performance blog.\n\n## Key Features To Look for in a Tailwind Portfolio Template\n\n![Tailwind Portfolio Template](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyMTc4NzEwNHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Customization Options\n\nCustomization is critical to making your portfolio stand out. Look for a template that offers flexibility in:\n\n- Colors\n- Fonts\n- Layouts\n- Content\n\nTailoring the template to match your personal or professional branding ensures your portfolio is unique and reflects your style.\n\n### SEO Optimization: Features that Help Improve Search Engine Visibility\n\nAn SEO-optimized template is crucial for increasing your portfolio’s visibility in search engine results.\n\nLook for templates with built-in SEO features, such as:\n\n- Clean URLs\n- Meta tags\n- Optimized images\n\nThese features help improve your search engine ranking, making it easier for potential clients or employers to find you.\n\n### Performance: Fast Loading Times and Efficient Code\n\nPerformance is another essential feature to consider. A template with fast loading times and efficient code enhances user experience and keeps visitors on your site longer. Slow-loading websites can frustrate users and lead to higher bounce rates. Efficient, clean code ensures your portfolio runs smoothly without lag or errors.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## How To Customize Your Tailwind Portfolio Template\n\n![Tailwind Portfolio Template](https://images.unsplash.com/photo-1519337364444-c5eeec430101?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxvbiUyMGxhcHRvcCUyMHdpdGglMjBwZXJzb258ZW58MHx8fHwxNzIxNzg3MTE4fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Start With the Basics\n\n#### Colors\n\nChoose a color scheme that matches your brand. You can easily customize the color palette in your Tailwind configuration file and apply these styles throughout your components.\n\n#### Fonts\n\nPick something that is readable and has personality. Google Fonts offers numerous free options to integrate into your project easily.\n\n###  2. Arranging Your Portfolio's Layout\n\nYour portfolio's layout is crucial to showcasing your work effectively.\n\n#### Effective Portfolio Layout\n\n- Keep It Clean and Simple: Ensure your layout is easy to navigate.\n- Include Essential Sections: Consider \"About Me,\" \"Projects,\" and a \"Contact\" form.\n- Utilize Magic UI Components: Use reusable sections like the Card component to display projects.\n- Simplify Updates: Easily add or remove projects without changing layout code.\n\nThis approach lets you update your portfolio by adding or removing projects without altering your layout code.\n\n### 3\\. Adding Personal Branding Elements\n\n- Start With Your Logo: Position it centrally on your homepage or in the navigation bar.\n- Create a Compelling Bio: Share your background, skills, and passions in the \"About Me\" section.\n- Connect Personally: Use this space to narrate your story and engage with potential clients or employers.\n\n### 4\\. Using Magic UI for Interactive and Animated Elements\n\n[Magic UI](https://magicui.design/) excels at adding interactive and animated elements to your portfolio. Over 20 animated components built with React, Tailwind CSS, Framer Motion, and TypeScript can breathe life into your portfolio. For instance, utilize the Shimmer Button component to create engaging call-to-action buttons or the Carousel component to showcase your projects dynamically.\n\nThese components are highly customizable, enabling you to:\n\n- Adjust animations, styles, and behaviors to match your branding.\n- Create a stunning, interactive portfolio with minimal effort.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in web development. This free and open-source UI library offers over 20 animated components meticulously crafted with React, TypeScript, Tailwind CSS, and Framer Motion.\n\n### Advantages of MagicUI\n\n- Suitable for All Skill Levels: Ideal for both seasoned developers and novices.\n- Visually Appealing Elements: Offers interactive components that enhance your web applications.\n- Effortless Integration: Create stunning user interfaces with ease.\n\n### Personalization at Your Fingertips\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling adaptation to cater to your branding and design requirements. Whether you prefer a clean and minimalistic design or a vibrant and colorful tapestry, MagicUI can effortlessly adapt to match your desired aesthetics.\n\nWith a keen focus on animation and a design-centric approach, MagicUI bridges the gap between design and development, empowering you to craft captivating digital experiences that leave a lasting impact on your users.\n\n### Time-Saving Pro Features\n\n- Premium Features: Save thousands of hours with MagicUI Pro\n- Easy Landing Page Creation: Design beautiful, high-converting landing pages\n- Stunning Templates: Access visually appealing templates optimized for conversions\n- Competitive Edge: Your secret weapon in the digital landscape\n  Are you ready to revolutionize your web development process with MagicUI? Start by exploring our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/tailwind-vs-bootstrap.mdx",
    "content": "---\ntitle: \"A Detail Comparison Between Tailwind Vs Bootstrap\"\ndescription: \"Tailwind vs Bootstrap: Which one should you choose? This comparison breaks down the features and functionalities of both frameworks.\"\nimage: https://cdn.magicui.design/assets/ed550d32-49f2-42ff-967f-6d9d35b9f4d0.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-12\"\nfeatured: false\n---\n\nAre you struggling to decide between Tailwind and Bootstrap for your next project? Comparing two popular CSS frameworks, Tailwind CSS and Bootstrap, can help you determine which is best for UI development. This blog will delve into the differences between these frameworks to help you make an informed decision and enhance your UI development skills.\n\nMagic UI's [React component library](https://magicui.design/) offers a valuable solution for comparing Tailwind CSS and Bootstrap. With its user-friendly interface and diverse components, Magic UI can streamline your development process, making the decision-making process easier in choosing the ideal [UI frameworks](https://magicui.design/blog/ui-frameworks) for your project.\n\n## **Why Use CSS Frameworks?**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1621839673705-6617adf9e890?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxjc3N8ZW58MHx8fHwxNzE5MDU4OTIyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nCSS (Cascading Style Sheets) is a stylesheet language used to style the HTML elements in a webpage. A CSS framework is a library that enables developers to design more standard-compliant websites using CSS more easily. These libraries are ready-to-use, so there is no need to write long and monotonous CSS codes.\n\nInstead of starting every project from zero, a CSS framework offers you tools that can quickly make a user interface that can be repeated more than once during the whole project. CSS frameworks such as Tailwind CSS and Bootstrap can help you code your designs far more quickly. And here, time equals money. It’s worth it if you can produce the same design with acceptable performance in around 70% less time.\n\n### Related Reading\n\n- [Component Libraries](https://magicui.design/blog/react-libraries)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n\n## **What Is Tailwind?**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1587620962725-abab7fe55159?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzE5MDU4NDAyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nTailwind CSS is a favorite CSS framework for modern user interface development. The framework adopts a utility-first approach with a vast collection of utility classes that can be combined to create tailored styles, offering unparalleled flexibility in design. Tailwind CSS streamlines the development process, leading to faster and more efficient coding with its modular and intuitive syntax. Its growing community and extensive documentation make it a favored choice among web developers seeking a highly versatile CSS framework.\n\n### Utility-First Approach\n\nTailwind CSS provides a wide array of utility classes, allowing developers to apply styles directly in the markup and making customization quick and convenient.\n\n### Customizable Design System\n\nDevelopers can effortlessly customize the default design system and create design tokens to ensure brand consistency and a unique look.\n\n### Responsive Design\n\n[Tailwind CSS](https://www.material-tailwind.com/blog/7-reasons-why-you-should-use-tailwind-css) includes responsive utility classes, enabling the creation of mobile-friendly and adaptive layouts effortlessly.\n\n### Flexbox and Grid Support\n\nBuilt-in flexbox and grid utilities facilitate the creation of complex layouts without additional CSS.\n\n### Dark Mode Support\n\nTailwind CSS provides utilities to support and customize dark mode for websites and applications.\n\n### Theming and Color Schemes\n\nDevelopers can consistently change color schemes and styles throughout the project with Tailwind CSS's theme configuration.\n\n### PurgeCSS Integration\n\nTailwind CSS can be combined with PurgeCSS to remove unused CSS, leading to smaller file sizes and faster website loading.\n\n### Active Community\n\nThe framework has a thriving community that continuously contributes plugins, extensions, and resources to enhance its capabilities.\n\n### Free and Customizable UI Components for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers, offering a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. These highly customizable components enable seamless adaptation to match your desired branding and design requirements.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## **When To Use Tailwind**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1522252234503-e356532cafd5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxjb2RlfGVufDB8fHx8MTcxOTA1ODg5MXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Agile Development\n\nTailwind CSS is perfect for Agile development teams due to its utility-first approach. This approach eases the coding process, providing a streamlined workflow for rapid and adaptive development cycles. Agile teams can make changes on the fly and accelerate their delivery timelines.\n\n### Brand Consistency\n\nTailwind CSS is your best bet if you want to establish a consistent brand identity. With Tailwind, you can precisely design your UI to reflect your brand’s specific colors and styles, helping you maintain a strong and cohesive visual identity across your digital platforms.\n\n### Mobile Responsiveness\n\nTailwind CSS comes with excellent built-in responsive design tools that make creating mobile-friendly websites or applications simple. Using Tailwind, you can ensure that your UI looks fantastic and functions smoothly across all devices, enhancing your user experience and broadening your reach.\n\n### Design Flexibility\n\nIf you desire the flexibility to design without being bound to a specific visual style, Tailwind offers a more minimalist foundation that allows you to create your UI as needed. With Tailwind, you can work dynamically, adapting your design choices to suit your changing requirements without much constraint.\n\n## **What Is Bootstrap?**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1517180102446-f3ece451e9d8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxib290c3RyYXB8ZW58MHx8fHwxNzE5MDU4ODYwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nThe Bootstrap CSS Framework is a popular choice for developers when it comes to building modern, responsive websites and applications. It provides numerous advantages, making it a preferred option for many developers.\n\n### Pre-built Components and Rapid Prototyping\n\nOne key benefit of using Bootstrap is its rapid development capabilities. The framework comes with a plethora of pre-designed templates, components, and styles that can be readily used to build websites and applications. This feature allows developers to start with a solid foundation, saving them time and effort in creating components from scratch.\n\n### Building for Any Device with Bootstrap\n\nAnother key advantage of Bootstrap is its responsive design capabilities. The framework is built with a mobile-first approach, ensuring that websites and applications look and function well on various screen sizes and devices. The grid system in Bootstrap is fundamental in ensuring responsive design and consistent placement of elements across different screen sizes. This feature allows developers to build websites that adapt seamlessly to various devices, providing a superior user experience.\n\n### Efficiency and Resources for Developers\n\nBootstrap offers an extensive component library with UI elements such as navigation bars, modals, forms, and carousels. These components can be easily integrated into projects, saving time and effort in coding. Bootstrap has a large and active community of developers that provides extensive documentation, tutorials, and resources. This community support is valuable for developers to troubleshoot issues, find solutions, and stay updated on best practices.\n\nAll these features make [Bootstrap CSS Framework](https://www.geeksforgeeks.org/what-are-the-benefits-of-implementing-the-bootstrap/) a robust and reliable choice for developers looking to create responsive websites and applications efficiently.\n\n## **When To Use Bootstrap**\n\nTailwind Vs Bootstrap\n\nBootstrap is handy for projects that need to be done quickly, especially if there's not a lot of money or many developers to work on. It's also good if you're working with old systems or if the people building the website are just starting out with CSS.\n\n### Quick Prototyping & MVP Development\n\nBootstrap has many ready-to-make pieces, such as menus, buttons, and forms. This means you can put together websites fast, perfect for testing new ideas or getting a basic version of your project up and running without spending much time on design. It's like using a shortcut to create something that works.\n\n### Tight Deadlines\n\nBootstrap can be a big help for projects that must be finished quickly. Using its ready-made components means you can save time and meet deadlines that would be hard to hit if you had to code everything from scratch.\n\n### Limited Development Bandwidth\n\nIf you don't have many developers or if they're really busy, Bootstrap lets you make nice-looking sites without needing a lot of coding. This is great for small teams or projects that don't have a lot of people to work on them.\n\n### Integrating with Legacy Systems\n\nBootstrap works well with older internet browsers, so it's easier to use it with old systems that are still running. This is helpful for updating a website's look without having to change everything behind the scenes.\n\n### Beginner-Friendly\n\nFor people who are new to making websites, Bootstrap is a good place to start. It has lots of examples and guides to help you learn, and you don't need to know a lot of CSS to make something that looks good. It's like having a helpful guide as you start building websites.\n\nIn short, if you need to create a website quickly, don't have many resources, need to work with old systems, or are just learning, Bootstrap can make things much easier. It's a tool that helps you create websites quickly and keep improving them.\n\n## **How Are Tailwind & Bootstrap Similar?**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1603202662747-00e33e7d1468?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8ZGlzY3Vzc2lvbnxlbnwwfHx8fDE3MTkwNTg0NDJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nBoth frameworks abstract the actual CSS away from your workflow, so you don’t have to worry about writing a lot of CSS directly. You can instead focus on developing your user experience. This is achievable because you simply need to include the various class names in your HTML code, and the frameworks will take care of the real CSS behind the scenes.\n\nImplementing many classes in your HTML markup results in a busy-looking markup, but these frameworks streamline and speed up the process of designing UIs. They have been around for an enormous amount of time. They are used for developing small-scale and big enterprises, indicating their flexibility to cater to diverse businesses. Tailwind and Bootstrap have extensive community support and documentation available as well.\n\n### Free and Customizable UI Components with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **Key Differences: Tailwind Vs Bootstrap**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1479920252409-6e3d8e8d4866?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHxvbiUyMGNvbXB1dGVyfGVufDB8fHx8MTcxOTA1ODgyOXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nTailwind CSS and Bootstrap are popular CSS frameworks, but they have different approaches and features that make them unique. Here are the key differences between the two frameworks:\n\n### Approach\n\nTailwind CSS follows a utility-first approach, allowing developers to apply small utility classes directly in HTML for a modular and customizable styling process. In contrast, Bootstrap is a component-based framework that includes predefined components with pre-styled elements, making it more opinionated in design.\n\n### Setup\n\nTailwind CSS requires Node.js and npm to set up, and developers use a configuration file for customization. On the other hand, Bootstrap can be set up using npm or a simple CDN link, offering flexibility in how it is incorporated into projects.\n\n### Customization and Flexibility\n\nTailwind CSS excels in customization and flexibility due to its utility-first approach, allowing developers to create unique designs effortlessly. Bootstrap offers a more structured and opinionated approach, which might not suit projects requiring extensive customization.\n\n### Learning Curve\n\nTailwind CSS's utility classes make it easier for developers to learn and use, reducing the learning curve and speeding up the development process. With its predefined components and CSS classes, Bootstrap might be more straightforward for beginners but could be limiting for experienced developers seeking more granular control.\n\n### Plugins and Extensions\n\nBootstrap has extra tools for more features like calendars, slideshows, and animations, which expands what you can do. Tailwind CSS's popular plugins usually add more options or help it work well with other design libraries.\n\n### Tooling and Integration\n\nBootstrap fits well with jQuery and modern tools like React and Angular for making web pages. Tailwind CSS is great for working with PostCSS and JavaScript tools to eliminate styles you don't use and set up your design preferences.\n\n### Templates and Themes\n\nBootstrap has lots of free and paid designs you can use to make your site look good quickly. Tailwind CSS might not have as many ready-made designs since it's all about making your own unique look. There are growing libraries of Tailwind CSS components you can use.\n\n### HTML Markup\n\nTailwind CSS involves adding multiple utility classes directly in HTML markup, clarifying applied styles. Bootstrap typically involves using predefined class names in HTML markup, offering a cleaner and more semantic structure.\n\n### Use Cases\n\nTailwind CSS is suitable for projects prioritizing customization and flexibility, allowing for a unique and tailored design. Bootstrap is ideal for projects that require quick prototyping, consistent styling, and a wide range of pre-designed components, providing a convenient and efficient development process.\n\n### Popularity\n\nAs of 2023, [Tailwind CSS](https://betterprogramming.pub/why-tailwind-css-became-so-popular-a-developers-guide-11213c08fa46) has seen a significant surge in popularity and adoption among developers worldwide. While still a widely used framework, Bootstrap has experienced a relatively slower growth rate than Tailwind CSS.\n\n## **Which Top Companies Use Tailwind? What About Bootstrap?**\n\nSeveral firms have embraced Tailwind CSS and Bootstrap, showcasing their widespread adoption and relevance in the online development community.\n\nDue to its rich customization and theming capabilities, Tailwind is used by organizations like TED, Buzzfeed, Stripe, Medium, BlaBlaCar, Exyplis, Bazzite, and GitHub CoPilot. This highlights the framework’s ability to generate unique designs and components while retaining a streamlined development approach.\n\nMastercard, Spotify, LinkedIn, Twitter, Lyft, Snapchat, Udemy, Upwork, and Duolingo all utilize Bootstrap’s built-in elements and responsive grid framework. This demonstrates the framework’s ability to enable quick web development while ensuring a uniform design language across projects.\n\n## **Between Tailwind Vs Bootstrap, Is One Better Than The Other?**\n\n![Tailwind Vs Bootstrap](https://images.unsplash.com/photo-1530099486328-e021101a494a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkaXNjdXNzaW9ufGVufDB8fHx8MTcxOTA1ODQ0Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Freedom to Customize Design with Tailwind CSS\n\nIf you like the freedom to make completely custom components and designs from the ground up without worrying about actually writing CSS and managing the files and selectors that go with it, Tailwind CSS is a no-brainer. You can create a design system that's truly unique to your brand and easy to maintain.\n\n### Tailwind's Utility-First Approach\n\nThe Tailwind CSS utility-first approach makes it very flexible to build custom styles and requires less thinking about overriding styles and creating new components.  It's very customizable and a developer can create a site in a short amount of time.\n\n### Customization and Performance\n\nIf your design is unique or doesn't neatly fit into a standard UI framework like Bootstrap, Tailwind CSS is the better choice because it allows you to make everything from scratch. The lack of unused styles can also mean better website performance.\n\n### Prebuilt Components with Bootstrap\n\nBootstrap appeals to many backend developers who might not have a strong sense of design because it offers many plug-and-play components. You don't have to think about how things will look or interact with each other; you just bring your content and plug it into the components. This is a great option if you're developing an MVP or want to prototype the UI with many rapidly available components.\n\nIf design isn't your forte, you can also use a theme from the many available around the web, so you don't have to do much design work.  This can be a good option if you're looking to get something up and running quickly or don't have the time to spend on the design part of the project.\n\n## **Check Out Our React Component Library for Design Engineers**\n\nTailwind CSS Tailwind CSS is a utility-first CSS framework that provides low-level utility classes to help developers build custom designs. It does not include pre-designed components like Bootstrap and instead offers a set of utility classes that developers can use to create their designs from scratch.\n\n### Rapid Customization\n\nWith Tailwind CSS, developers can quickly build unique, custom designs without writing any CSS themselves. It encourages a functional approach to styling, where classes are applied to HTML elements to achieve the desired styling. This modular approach gives developers more control over the design but may require more upfront work when starting a new project.\n\n### Out-of-the-Box Styling\n\nBootstrap, on the other hand, is a more traditional CSS framework that offers a wide range of pre-designed components like buttons, navigation bars, and models. Developers can use these components out of the box, reducing the amount of custom styling needed. Bootstrap includes a grid system, responsive breakpoints, and many pre-designed components commonly used in web design. This makes it a great choice for quickly prototyping a new project or following common design patterns across many websites.\n\n### MagicUI's Integration with Tailwind CSS and Bootstrap\n\nTailwind CSS MagicUI components are built with Tailwind CSS, a utility-first CSS framework that allows developers to create custom designs from a set of utility classes. By using Tailwind CSS, developers can quickly and easily customize the styles of MagicUI components using pre-defined utility classes. This makes it easy to adapt MagicUI components to match design requirements or branding guidelines.\n\nBootstrap MagicUI components can also be easily integrated into Bootstrap projects. By combining MagicUI's animated React components with Bootstrap's pre-designed components, developers can create stunning user interfaces with minimal effort. MagicUI components can be customized using Bootstrap's utility classes to adjust colors, spacing, typography, and more, making creating unique designs that match the project's requirements easy. Developers can mix and match [MagicUI](https://magicui.design/) and Bootstrap components to create visually appealing and interactive user interfaces that will impress.\n\n### MagicUI's Focus on Animation and Design\n\nMagicUI's primary focus is on animation and design. By providing a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion, MagicUI enables developers to create visually appealing user interfaces that capture users' attention. With [MagicUI](https://magicui.design/), developers can easily add interactive elements like animated buttons, sliders, and modals to their projects without writing complex animations themselves. This allows developers to focus on creating engaging user experiences that keep users coming back for more.\n\n### MagicUI Pro: A Premium Offering for Pro Users\n\nWith the [free component library](https://magicui.design/), MagicUI Pro offers additional features like website templates to help developers save thousands of hours and create beautiful landing pages for their projects. MagicUI Pro also includes components and templates to help developers convert visitors into customers. Using MagicUI Pro, developers can easily create stunning websites that will impress users and drive conversions.\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/text-animation-css.mdx",
    "content": "---\ntitle: \"Top 15 Text Animation CSS Examples You Can Use\"\ndescription: \"Explore 15 top Text Animation CSS examples to make your website’s text stand out with dynamic effects.\"\nimage: https://cdn.magicui.design/assets/4upqdrgtbth.jpg\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nConsider you’re scrolling through a website, intrigued by its content, when suddenly, you’re hit with a wall of text. What’s the first thing you do? Most users would immediately bounce away from the page. Sure, you might be interested in the content, but the overwhelming visual of the text made you lose all interest.\n\nOne of the best ways to avoid this scenario is to use CSS text animation. You can create a more visually appealing website with text animations that grab users' attention and improve their overall experience. Learning text animation CSS is a [web design best practice](https://magicui.design/blog/web-design-best-practices) that will help you create appealing websites that engage visitors and enhance their experience. In this article, we’ll share the top 15 text animations on CSS to help you get started.\n\nMagicUI’s startup landing page template makes incorporating CSS text animations into your next web design project easy. With pre-built sections and a fully customizable interface, you can achieve your specific design goals while creating a beautiful website that animates text to your liking.\n\n## What Are Text Animations?\n\n![Text Animation CSS](https://cdn.magicui.design/assets/j1mxpgoyli9.jpg)\n\nText animations are a dynamic and engaging [web design element](https://study.com/academy/lesson/what-is-web-design-definition-elements.html#:~:text=The%20elements%20of%20web%20design,layout%2C%20content%2C%20and%20navigation.) that can transform your website from static to captivating. Adding movement and visual interest to your text can enhance user experience, boost engagement, and leave a lasting impression.\n\n### The Impact of Text Animations \n\n#### Increased User Engagement\n\nStudies have shown that websites with animations can significantly improve user engagement and time spent on the page. For example, a study by Adobe found that websites with animated elements saw a [39% increase in user engagement](https://moldstud.com/articles/p-creating-engaging-user-interfaces-with-animation#:~:text=Additionally%2C%20a%20report%20by%20Adobe%20found%20that%2039%25%20of%20users%20are%20more%20likely%20to%20share%20content%20if%20it%20contains%20animations.) compared to those without.\n\n#### Improved Conversion Rates\n\n[Animated text](https://levitatemedia.com/learn/text-animation#:~:text=Text%20animation%2C%20as%20the%20name,certain%20area%20on%20the%20screen.) can enhance the overall user experience, leading to higher conversion rates. Users who are more engaged and enjoy their time on a website are likelier to take desired actions, such as purchasing or signing up for a newsletter.\n\n#### Enhanced Brand Recall\n\nUnique and memorable text animations can help your brand stand out and be remembered. When users associate your brand with visually appealing and engaging animations, they are more likely to recall your brand when making purchasing decisions.\n\n### Introducing MagicUI  \n\nMagicUI is a free, open-source UI library designed to simplify the creation of stunning web applications. With over 20 animated components, MagicUI offers a range of visually appealing and interactive elements that can be easily integrated into your projects. [By using MagicUI](https://pro.magicui.design/docs/templates/startup), you can save time and effort and create exceptional user interfaces without extensive coding knowledge.\n\n### How MagicUI Can Benefit You \n\n#### Accelerate Development \n\n[MagicUI's pre-built components](https://pro.magicui.design/docs/templates/startup) allow you to quickly add animations to your website without starting from scratch. This saves time and effort, especially for developers with limited animation expertise.\n\n#### Create Consistent User Experiences\n\nMagicUI's components follow a unified design language, ensuring a consistent and professional look and feel across your website. This helps to improve user experience and strengthen your brand identity.\n\n#### Easily Customize\n\nMagicUI components are highly customizable, allowing you to tailor them to match your branding and design requirements. You can adjust colors, fonts, and other properties to create unique and personalized animations.\n\n#### Stay Up-to-Date\n\nMagicUI is actively maintained and updated, ensuring you can access the latest features and improvements. This helps you keep your website modern and engaging.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## How Text Animations Work (A Step-by-Step Guide)\n\n![Text Animation CSS](https://cdn.magicui.design/assets/1ahixlv1uqih.jpg)\n\nText animations are created using CSS properties that define how text elements should move, change appearance, or interact with other elements on a web page. The two primary properties involved are animation and keyframes.\n\n### The Animation Property: Mastering the Basics\n\n[The animation property](https://www.geeksforgeeks.org/css-animation-property/#:~:text=The%20CSS%20animation%20property%20is,%2Dtiming%2Dfunction%20animation%2Ddelay) is a shorthand property that combines several individual animation properties into a single declaration. It allows you to control various aspects of an animation, such as:\n\n#### Animation-name\n\nSpecifies the name of the keyframe animation sequence to use.\n\n#### Animation-duration\n\nSets the duration of the animation in seconds or milliseconds.\n\n#### Animation-timing-function\n\nDefines the speed curve of the animation (e.g., linear, ease-in-out).\n\n#### Animation-delay\n\nSpecifies the delay before the animation starts.\n\n#### Animation-iteration-count\n\nDetermines the number of times the animation should repeat.\n\n#### Animation-direction\n\nSets the direction the animation plays (e.g., standard, reverse).\n\n#### Animation-fill-mode\n\nControls the style of the element before and after the animation.\n\n### The Keyframes Rule: Defining the Stages of Animation\n\n[The keyframes rule](https://www.w3schools.com/cssref/css3_pr_animation-keyframes.php#:~:text=The%20%40keyframes%20rule%20specifies%20the,of%20CSS%20styles%20many%20times.) is used to define the different stages of an animation. Each keyframe represents a specific point in time within the animation, and its properties determine the element's appearance at that point. Keyframes are typically defined using percentages (e.g., 0%, 50%, 100%) to indicate their position within the animation sequence.\n\n#### Understanding Keyframes in a Text Animation\n\nKeyframes allow you to precisely control the appearance of an element at different points in time. You can create complex and visually appealing animations by setting properties like opacity, transform, color, and font size for each keyframe.\n\n#### Keyframe Animation Sequence\n\n- Initial State: The first keyframe (usually 0%) defines the element's initial appearance. This is the starting point from which the animation begins.\n- Intermediate States: Additional keyframes can be added to define the element's appearance at various points throughout the animation. These keyframes can be used to create smooth transitions between different states.\n- Final State: The final keyframe (usually 100%) defines the desired appearance of the element at the end of the animation. This is the target state that the animation aims to achieve.\n\n#### Animating Multiple Properties Within a Single Sequence\n\nYou can animate multiple properties within a single keyframe sequence. This allows you to create complex animations that involve changes in various aspects of an element's appearance. For example, you could animate a text element's opacity and transform properties to create a fading and rotating effect.\n\n### A More Advanced Example: Combining Multiple Animations and Keyframes\n\nHere's a more advanced example that combines multiple animations and keyframes:\n\n#### HTML\n\n```html\n<h1 id=\"animated-text\">Animated Text</h1>\n```\n\nUse code with caution.\n\n#### CSS\n\n```css\n#animated-text {\n  animation: fadeInRotate 2s ease-in-out infinite;\n}\n```\n\n```css\n@keyframes fadeInRotate {\n  0% {\n    opacity: 0;\n    transform: rotate(0deg);\n  }\n  50% {\n    opacity: 1;\n    transform: rotate(180deg);\n  }\n  100% {\n    opacity: 1; \n    transform: rotate(360deg);\n  }\n}\n```\n\nIn this example, the text element fades in and rotates continuously. The fadeInRotate animation has three keyframes:\n\n- 0%: The text starts invisible and rotates 0 degrees.\n\n- 50%: The text becomes visible and rotates 180 degrees.\n\n- 100%: The text remains visible and rotates 360 degrees.\n\nBy understanding the animation property, the keyframe rule, and the concept of keyframe sequences, you can create a wide range of dynamic and engaging text animations for your web projects.\n\n### MagicUI: A Quick Overview\n\nMagicUI is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today\n\n## 15 Text Animation Examples with Explanations & Use Cases\n\n![Text Animation CSS](https://cdn.magicui.design/assets/8n1o4a2dv9.jpg)\n\n### 1\\. Fade In/Out: Seamlessly Transition Text with Fade In and Fade Out Animations\n\nFade animations allow text to appear or disappear smoothly, creating a smooth transition between elements or sections. This transition is excellent for maintaining a site's flow, highlighting important information, and emphasizing key points. Users can engage with this animation while loading a page, transitioning between sections, or navigating through a story.\n\n### 2\\. Hover Effects: Create Interactive Text that Engages Users\n\nHover text animations trigger when users hover over a text box. This [kind of text animation](https://filmora.wondershare.com/more-tips/text-animation-examples.html) provides visual feedback to enhance user engagement. You can use hover text animations on interactive elements, like buttons and links, to create a more engaging experience. This text animation highlights vital information and guides users' attention.\n\n### 3\\. Typing Effect: Capture User Attention with a Realistic Typewriter Animation\n\nThe typing effect simulates a typewriter effect by animating text letter by letter. This animation adds a sense of authenticity and suspense to the text. You can use the typing effect for headers, introductions, and calls to action. It is great for storytelling, creating a sense of suspense or mystery, and enhancing user engagement.\n\n### 4\\. Underline Reveal: Highlight Important Text with Underline Reveal Animation\n\nThe underline reveals text animation highlights specific text by animating an underline upon hover. This effect draws attention to important information, creating a sense of urgency or importance. Use this animation on links, call to action, and to emphasize key points. Underline reveal animations add a touch of visual interest while guiding users' attention.\n\n### 5\\. Text Highlighting: Make Important Text Stand Out with Highlighting Animations\n\nText highlighting animations emphasize text by animating a color or background change that makes it visually stand out. You can use this effect to draw attention to important information, quotes, and callouts. Text highlighting animations create a visual hierarchy, guide users' attention, and add a touch of personality or creativity to your website.\n\n### 6\\. Text Scrolling: Create a Dynamic Experience with Scrolling Text\n\nText scrolling animations continuously scroll text horizontally or vertically to create a dynamic experience. You can use scrolling text for headlines, product lists, and news tickers. This animation engages users, creates a sense of urgency or excitement, and adds a touch of dynamism to your website.\n\n### 7\\. Text Rotation: Add Unique Visual Interest to Your Website with Rotating Text\n\n[Text rotation animations](https://keenanpayne.com/rotating-text-css-animation/) rotate text to specific degrees, adding a unique and visually interesting element to your website. Use this animation for titles, logos, and attention-grabbing elements. Text rotation can create a sense of movement or dynamism or add a playful or unexpected element to enhance user engagement.\n\n### 8\\. Text Skew/Distortion: Grab Attention with Skewed or Distorted Text\n\nText skew animations apply a temporary or warp effect to text for emphasis. This type of animation creates a visually striking and attention-grabbing impact. You can use skewed text animations for creative titles, promotions, or special offers. Text skew animations add a playful element to your website and create a sense of surprise or intrigue.\n\n### 9\\. Text Path Animation: Create Unique Experiences with Path Text Animation\n\nText path animations allow you to animate text along a defined path for a visually exciting and engaging experience. Use this type of animation for introductions, logos, and navigation menus. Path text animation creates a sense of movement or direction and adds a touch of creativity or personality to your website.\n\n### 10\\. Color Change Animation: Gradually Change Text Color to Create Visual Interest\n\nColor change text animations gradually change text color to create a sense of transition or progression. You can use this effect for transitions, emphasis, mood changes, or to create a sense of excitement or anticipation. Color change animations add a touch of personality or style to your website to enhance user engagement.\n\n### 11\\. Text Size Change: Dynamically Alter Text Size to Emphasize Key Points\n\nText size change animations dynamically increase or decrease text size to create a sense of emphasis or importance. You can use this animation for headlines, calls to action, and any text that requires emphasis. Size change animations create a sense of urgency or excitement, adding drama or emotion to your website.\n\n### 12\\. Text Glitch Effect: Create a Futuristic Feel with Glitch Text Animations\n\nText glitch effect animations simulate a digital glitch effect on text, creating a visually striking and attention-grabbing impact. You can use glitch text animations for modern designs, creative titles, and attention-grabbing elements. This animation adds a futuristic or retro feel to your website while enhancing user engagement.\n\n### 13\\. Text Wave Animation: Add a Sense of Rhythm to Your Website with Wave Text Animations\n\nText wave animations create a wave-like movement on text, adding a sense of rhythm or fluidity to your website. Use this animation for playful elements, titles, and headers. Wave text animations create a sense of energy or excitement while adding personality and creativity to your site.\n\n### 14\\. Particle Text Animation: Enhance User Engagement with Unique Particle Text Effects\n\nParticle text animations break down text into particles that animate individually, creating a visually striking and unique effect. You can use particle text animations for creative introductions, special effects, and unique visuals. This kind of animation adds a sense of dynamism or complexity to your website and can create a sense of mystery or intrigue.\n\n### 15\\. Kinetic Typography: Customize Text Animation for a More Personalized User Experience\n\nKinetic typography animations allow you to animate text based on user interaction or scroll position for a personalized and immersive experience. Use this type of text animation for dynamic content, interactive experiences, and engaging visuals. Kinetic typography creates a sense of personalization or customization and adds a touch of interactivity to enhance user engagement.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n\n- Framer Motion React\n\n- React Animations\n\n- React Text Animation\n\n- React Scroll\n\n- MUI Transitions\n\n- React Spring\n\n## How MagicUI Can Help with Text Animations\n\n![Text Animation CSS](https://cdn.magicui.design/assets/9yl37nbcg6n.jpg)\n\nMagicUI offers a powerful way to simplify the process of creating text animations. With its extensive library of pre-built components, you can easily add stunning animations to your web projects without writing complex CSS code from scratch.\n\n### Key Benefits of Using MagicUI\n\n#### Pre-built Components \n\nMagicUI offers a wide range of [ready-to-use text animation](https://pro.magicui.design/docs/templates/startup) components, including fade-in, fade-out, typing effects, hover animations, and more. These components are designed to be highly customizable, allowing you to tailor them to your specific needs.\n\n#### Customization Options \n\nMagicUI components provide extensive customization options, enabling you to modify their appearance, behavior, and timing. You can easily adjust colors, fonts, durations, and other properties to create unique and visually appealing animations.\n\n#### Reduced Development Time \n\nBy using [MagicUI's pre-built components](https://pro.magicui.design/docs/templates/startup), you can significantly reduce the time it takes to create text animations. This allows you to focus on other aspects of your project and deliver your website or application faster.\n\n#### Consistent Design \n\nMagicUI components adhere to a unified design language, ensuring a consistent look and feel across your project. This helps to create a cohesive and professional user experience.\n\n#### Easy Integration \n\nMagicUI components are designed to be seamlessly integrated into your React projects. You can add animated text elements to your website or application with a few lines of code.\n\n### How to Use MagicUI for Text Animations \n\n#### 1\\. Install MagicUI \n\nUse your preferred package manager (e.g., npm, yarn) to install MagicUI into your React project.\n\n#### 2\\. Import Components \n\nImport the desired text animation components from the MagicUI library into your React components.\n\n#### 3\\. Customize Components\n\nUse props to customize the components' appearance, behavior, and timing.\n\n#### 4\\. Render Components\n\nRender the components in your JSX code to display the animated text elements on your web page.\n\n### Example\n\n```javascript\nimport { FadeIn, Typewriter } from \"magicui\"\n\nfunction MyComponent() {\n  return (\n    <div>\n      <FadeIn>Welcome to my website!</FadeIn>\n      <Typewriter text=\"This is a typing effect.\" />\n    </div>\n  )\n}\n```\n"
  },
  {
    "path": "apps/www/content/blog/text-loading-bar.mdx",
    "content": "---\ntitle: Build a Custom Text Loading Bar From Scratch\ndescription: >-\n  Learn to build a responsive and accessible text loading bar with pure CSS,\n  Tailwind CSS, and React. Our guide provides practical code and real-world\n  examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/b0a42477-e563-4c3f-8146-70bf8c7634e2/text-loading-bar-work-in-progress.jpg\nauthor: Dillion Verma\ntags:\n  - text loading bar\n  - css progress bar\n  - react components\n  - tailwind css\n  - web development\npublishedOn: \"2025-12-12T08:43:06.170545+00:00\"\nfeatured: true\n---\n\nA **text loading bar** isn't just a visual progress indicator; it's a UI element that gives users real-time updates with descriptive text, like _\"Processing file 2 of 10...\"_. This kind of specific feedback is way better at managing expectations than a generic spinner, making it a surprisingly powerful tool in your UI toolkit.\n\n## Why a Text Loading Bar Still Matters in Modern UI\n\n![A cartoon person stands beside a progress bar indicating 'Uploading file 3 of 5... 60% complete'.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2b11d2a9-2c3c-411f-812a-7379388bd2d8/text-loading-bar-uploading-progress.jpg)\n\nIn a world full of ambiguous spinners and pulsating dots, the humble text loading bar offers something invaluable: clarity. While a spinning icon just signals that _something_ is happening, a text indicator tells the user _what_ is happening. This small distinction has a huge psychological impact.\n\nWhen someone sees \"Uploading file 3 of 5...\", they immediately get a sense of control and understanding. The process is no longer an abstract wait but a tangible, finite task. This transparency cuts down on user anxiety and makes the wait feel shorter, which in turn makes your application feel more responsive and trustworthy.\n\n### Managing Expectations and Building Trust\n\nAt its core, any loading indicator's job is to manage the user's perception of time. A generic animation can get frustrating fast if it drags on, leaving people wondering if the app has frozen. A text loading bar neatly sidesteps this entire problem.\n\nIt provides a clear frame of reference. Users see progress, understand the current step, and can anticipate when it will finish. This is especially crucial for multi-step processes where ambiguity leads to high abandonment rates. This concept has a long history for a reason; it popped up with early graphical interfaces, and even back then, studies showed that providing real-time text updates cut user abandonment during long waits by an estimated **35%**.\n\n> By communicating clearly, you turn a moment of potential frustration into an opportunity to build user trust. The message is simple: \"We know you're waiting, and here's exactly what we're doing for you.\"\n\n### Key Scenarios for Text Indicators\n\nYou don't need a text loader for every micro-interaction, but it really shines in situations where clarity is paramount. Getting the foundations of good user experience right is key, and you can always go deeper by [mastering user experience design principles](https://www.superhub.biz/master-user-experience-design-principles-for-better-ux) for better UI outcomes.\n\nThink about using one for:\n\n- **Multi-file uploads or downloads:** Let users know which file is currently being processed (e.g., \"Downloading report_final.pdf...\").\n- **Sequential data processing:** Clearly state the current stage of a complex backend task (e.g., \"Step 2: Analyzing data...\").\n- **Software installations or updates:** Provide specific feedback on which component is being installed or configured.\n\n## Building a Foundational Bar with Pure CSS\n\n![A minimalistic loading bar with an orange left end showing 'Loading... 4%' progress.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/eb421023-e41c-415d-bfed-5569d9b6fd5d/text-loading-bar-4-percent.jpg)\n\nBefore we get into fancy frameworks and libraries, let's roll up our sleeves and build this thing from scratch with pure CSS and HTML. This approach is not just lightweight and universally compatible; it gives you a gut-level understanding of how a **text loading bar** actually works.\n\nThe core idea is pretty simple: we're just layering elements. We'll have a container, a \"fill\" element that shows the progress, and a text label sitting on top.\n\nWhile you could use a `<progress>` tag, I find a simple `<div>` structure offers way more flexibility for custom styling, especially when you need a clean text overlay. By using a parent container to hold both the progress fill and the text, we get fine-grained control over positioning everything just right.\n\n### Structuring the HTML\n\nFirst things first, let's get the markup sorted. It's surprisingly straightforward. All we need is a main wrapper for the bar and two children inside it: one for the colored fill and another for the text itself. This separation is the key to managing their styles independently.\n\nHere’s the basic structure I usually start with:\n\n<div className=\"progress-bar-container\">\n  <div className=\"progress-bar-fill\" style={{ width: \"60%\" }}></div>\n  <span className=\"progress-bar-text\">Loading... 60%</span>\n</div>\nThis simple setup gives us all the hooks we need for our CSS. The container\ndefines the boundaries, the fill element handles the visual progress, and the\nspan holds our dynamic text.\n\n### Styling with CSS\n\nNow for the fun part—bringing the structure to life with CSS. The container needs a defined position and a bit of styling, while the fill element gets its color and initial width. The real trick is using CSS positioning to slap the text label directly on top of the bar.\n\nLet's break down the styles:\n\n- **`.progress-bar-container`**: I always set this to `position: relative` so we can absolutely position its children inside. We’ll also give it a background color, a nice `border-radius`, and—crucially—`overflow: hidden` to keep the fill contained.\n- **`.progress-bar-fill`**: This gets a vibrant background color and a `height` of `100%`. The `width` is what we'll be updating dynamically with JavaScript.\n- **`.progress-bar-text`**: Here, we use `position: absolute`, stretch it to the full width and height, and then use flexbox or `text-align` to center the text perfectly. A contrasting `color` is a must for readability.\n\nThis layering technique is a classic web design pattern that's been proven effective long before modern frameworks were even a thing. When CSS3 came along and introduced smooth animations, these bars exploded in popularity. In fact, they became so critical for user retention that by 2010, jQuery plugins for text overlays had seen over **2.5 million** downloads on GitHub. It's fascinating to [explore the history of CSS progress bars](https://css-tricks.com/css3-progress-bars/) and see just how much they’ve evolved.\n\n### Simulating Progress with JavaScript\n\nA static bar doesn't do much, so we need a little JavaScript to simulate a loading process. This snippet will incrementally update the `width` of our fill element and change the text content to match, creating a fully functional text loading bar.\n\n```js\nconst fill = document.querySelector(\".progress-bar-fill\")\nconst text = document.querySelector(\".progress-bar-text\")\nlet progress = 0\n\nconst interval = setInterval(() => {\n  progress += 10\n  if (progress <= 100) {\n    fill.style.width = progress + \"%\"\n    text.textContent = \"Loading... \" + progress + \"%\"\n  } else {\n    clearInterval(interval)\n    text.textContent = \"Complete!\"\n  }\n}, 500)\n```\n\nThis simple update loop gives you a complete, working example. You now have a solid, framework-agnostic component that’s easy to drop into any project and adapt as needed.\n\n## Crafting an Animated Bar with Tailwind CSS\n\nWhile plain CSS gives you total control from the ground up, a utility-first framework like [Tailwind CSS](https://tailwindcss.com/) can seriously speed things up. It lets you build a sleek, animated **text loading bar** right in your HTML using pre-built utility classes, which means you can often skip writing a separate stylesheet altogether.\n\nThis approach is a lifesaver for projects where you need to move fast. Instead of jumping between HTML and CSS files, you can style your component entirely with classes like `bg-blue-500`, `flex`, and `items-center`. What you get is a clean, modern component built in a fraction of the time.\n\n### Setting Up the HTML Structure for Tailwind\n\nGood news—the HTML structure is almost identical to the plain CSS version. We still need a container, a fill element, and a text label. The big difference is that all the styling now lives in the `className` attributes.\n\nThis makes your markup way more descriptive and self-contained. You can tell an element's background color, positioning, and size just by reading the class names. It’s a really powerful way to see the UI take shape directly in your code.\n\n<div className=\"relative h-8 w-full overflow-hidden rounded-full bg-gray-200\">\n  <div\n    className=\"h-full rounded-full bg-indigo-600 transition-all duration-500 ease-in-out\"\n    style={{ width: \"75%\" }}\n  ></div>\n  <span className=\"absolute inset-0 flex items-center justify-center text-sm font-medium text-white\">\n    Processing... 75%\n  </span>\n</div>\n\n### Applying Utility Classes for Style and Animation\n\nLet's break down how Tailwind's utility classes bring this component to life. This is where you see the real magic of a utility-first workflow. If you're new to the framework, our guide on how to [install and set up Tailwind CSS](https://magicui.design/blog/tailwind-css-install) will get you up and running in no time.\n\n- **The Container (`<div>`)**:\n  - `relative w-full bg-gray-200 rounded-full h-8 overflow-hidden`: This sets the stage. We make it a full-width, gray, rounded container with a fixed height and clip any overflow from the fill element.\n\n- **The Fill Element (`<div>`)**:\n  - `bg-indigo-600 h-full rounded-full`: This styles the progress bar itself with a rich indigo color, making sure it fills the container's height and keeps the rounded shape.\n  - `transition-all duration-500 ease-in-out`: Here’s the secret sauce for our animation. These classes apply a smooth, **500ms** transition to any property that changes—in this case, the `width`.\n\n- **The Text Label (`<span>`)**:\n  - `absolute inset-0 flex items-center justify-center`: We layer the text over the entire container using `absolute` and `inset-0`. Then, we use flexbox utilities (`flex`, `items-center`, `justify-center`) to nail the perfect horizontal and vertical centering.\n  - `text-sm font-medium text-white`: Finally, we style the text itself with a small size, medium font weight, and white color so it pops against the indigo fill.\n\n> This utility-driven method doesn't just speed up development; it also enforces a consistent design system. By pulling from the predefined spacing, colors, and transitions in your Tailwind config, you ensure your loading bar feels right at home with the rest of your application's look and feel.\n\nWith this setup, any JavaScript function that updates the inline `style` for the width will now trigger a fluid, polished animation automatically. This simple mix of structured HTML and descriptive utility classes gives you a production-ready, animated text loading bar without writing a single line of custom CSS.\n\n## Developing a Reusable React and TypeScript Component\n\nWhen you're ready to move beyond one-off styles and utility classes, a component-based framework like [React](https://react.dev/) is the logical next step. Building a reusable **text loading bar** with React and [TypeScript](https://www.typescriptlang.org/) is a game-changer for scalability, giving you consistency, type safety, and much easier maintenance across your entire application.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/TPACABQTHvM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nInstead of copying and pasting markup and styles, you create a single, robust component that can be imported and configured anywhere you need it. Think about it: if you have loading states all over a complex app, this approach is a lifesaver. Need to tweak the animation or styling? You change it in one place, and the update propagates everywhere instantly.\n\nThis decision tree helps visualize where a reusable React component fits into the bigger picture of UI development.\n\n![Flowchart for choosing UI tech stack: Basic CSS for simple UIs, Tailwind for rapid dev, or React for reusable components.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f749ada7-9a67-4174-aedb-58aaebcd4f29/text-loading-bar-tech-stack.jpg)\n\nAs you can see, while plain CSS is perfect for simple needs and Tailwind is king for rapid development, React is the clear winner when you're building a design system or a scalable component library.\n\nTo give you a clearer picture, here’s how the three methods we've covered stack up against each other.\n\n### Comparison of Text Loading Bar Implementations\n\nThis table breaks down how our three approaches—Pure CSS, Tailwind CSS, and React with TypeScript—compare across key development aspects. It should help you pick the right tool for your specific project needs.\n\n| Feature              | Pure CSS & JS                                     | Tailwind CSS                                        | React & TypeScript                                      |\n| :------------------- | :------------------------------------------------ | :-------------------------------------------------- | :------------------------------------------------------ |\n| **Setup Complexity** | Low. Just HTML, CSS, and a bit of JS.             | Medium. Requires a build step and config file.      | High. Needs a full React environment.                   |\n| **Scalability**      | Poor. Prone to code duplication.                  | Good. Utility classes promote consistency.          | Excellent. Encapsulated and reusable by nature.         |\n| **Maintainability**  | Difficult. Changes require finding all instances. | Moderate. Utility strings can be hard to refactor.  | Excellent. Update one component, it updates everywhere. |\n| **Dynamic Data**     | Manual DOM manipulation required.                 | Can be combined with JS, but not its core strength. | Seamless. Built for handling dynamic state via props.   |\n| **Best For**         | Simple websites, quick demos, or learning.        | Rapid prototyping and utility-first projects.       | Complex applications and design systems.                |\n\nEach approach has its place. The key is knowing which one fits the scale and complexity of what you're building.\n\n### Defining Props With a TypeScript Interface\n\nThe first step to crafting a solid React component is defining its API with TypeScript. By creating an interface for our component's props, we enforce type safety right from the start. This means anyone using our `TextLoadingBar` will get clear instructions—and helpful compile-time errors—if they pass in the wrong type of data.\n\nHere’s what that looks like:\n\n- `progress`: The current progress value (**0-100**). This will be a required number.\n- `labelText`: Optional text to display over the bar.\n- `color`: An optional Tailwind CSS class for the bar's color.\n\nThis simple interface makes our component flexible yet completely predictable, preventing a ton of potential bugs down the road.\n\n### Building the Component Structure\n\nWith our props defined, we can build out the functional component itself. We'll use the incoming props to dynamically set the bar's width, the text it displays, and its color. You'll notice we're using React's `className` attribute for the Tailwind classes and a `style` object for the dynamic width.\n\nThe component is pretty straightforward: a container div, a progress div whose width is tied to the `progress` prop, and a `span` to overlay the text.\n\nThis self-contained component is now ready to be dropped into any part of your application. Want to learn more about structuring components effectively? Check out our deep dive on how to [create a React component library](https://magicui.design/blog/create-react-component-library).\n\n### Managing State and Dynamic Rendering\n\nIn a real-world app, the `progress` value isn't going to be static. It will come from your application's state, likely managed by a hook like `useState` or a global state manager like Redux or Zustand. As that state updates—say, during a file upload or a multi-step form completion—the component will automatically re-render to show the new progress.\n\n> This component-based model is incredibly effective. A Baymard Institute study found that e-commerce sites using text-enhanced progress bars saw a **19%** higher checkout completion rate. Similarly, Microsoft's Fluent Design system incorporates text bars in **85%** of its apps, which reduced perceived wait times by **27%** in large-scale user tests.\n\nThe beauty of this approach is that our `TextLoadingBar` component is completely \"dumb.\" It doesn't need to know _how_ the progress is calculated or where it comes from; it just needs to receive the `progress` prop and render what it's told. This separation of concerns is a fundamental principle of clean React development, and it's what makes your codebase so much easier to understand and maintain as it grows.\n\n## Optimizing for Accessibility and Performance\n\n![A minimalist loading animation displaying 45% progress with an orange sphere and curved lines.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f1a8713a-4a5b-4026-9e9a-f744e76975bd/text-loading-bar-loading-progress.jpg)\n\nA great text loading bar isn't just about looking slick; it needs to be inclusive and snappy. A sluggish, inaccessible component can tank the user experience, especially for anyone relying on assistive technologies. The real goal is to build a loader that clearly communicates what’s happening to _everyone_, without bogging down your app.\n\nThis boils down to two critical areas: making sure screen readers can understand it and ensuring the animations are buttery smooth. These aren't just \"nice-to-haves\"—they're hallmarks of a professional, user-friendly interface that respects every visitor.\n\n### Making Your Text Loading Bar Accessible\n\nTo make your loading bar truly accessible, you have to give screen readers the semantic context they need to interpret and announce its status. This is exactly what ARIA (Accessible Rich Internet Applications) attributes were designed for. They bridge the gap by adding meaning that standard HTML tags can't convey on their own.\n\nWhen you implement these attributes correctly, you transform a purely visual element into a meaningful announcement for assistive tech users. To really nail this, it's worth getting familiar with the best practices in [web accessibility audits and improvements](https://onenine.com/the-ultimate-guide-to-web-accessibility-audits-and-improvements-boost-your-websites-reach-and-compliance/).\n\nHere are the essential ARIA roles and properties you'll need:\n\n- **`role=\"progressbar\"`**: This is the big one. It tells screen readers, \"Hey, this thing is a progress bar,\" setting the right expectation immediately.\n- **`aria-valuenow`**: This announces the current progress. You'll update this attribute dynamically with JavaScript as the value changes (e.g., \"60\").\n- **`aria-valuemin=\"0\"`**: Defines the starting point, which is almost always zero for a progress bar.\n- **`aria-valuemax=\"100\"`**: Sets the goal post, typically **100** for a percentage-based loader.\n\n> Without these attributes, a screen reader might just ignore the element or read out a jumble of meaningless style info. With them, it delivers a clear, actionable announcement like, \"Progress bar, 60 percent.\" Big difference.\n\n### Boosting Animation Performance\n\nPerformance is the other side of the coin. A choppy, stuttering animation can make your entire site feel slow and broken, which completely defeats the purpose of having a loading indicator in the first place. The secret to smooth animations is steering clear of CSS properties that trigger expensive browser repaints and reflows.\n\nInstead of animating the `width` property—a common mistake that can cause janky layout shifts—it's far more efficient to use CSS `transform`. Specifically, `transform: scaleX()` on the fill element is your best friend here. Transforms are offloaded to the browser's GPU, which results in silky-smooth animations that don't bog down the main thread.\n\nIf you want to dive deeper into creating efficient animations, our guide on how to trigger https://magicui.design/blog/css-animation-on-scroll is packed with performance-friendly techniques that apply here, too.\n\n## Common Questions About Text Loading Bars\n\nWhen you start dropping a **text loading bar** into your projects, you'll inevitably run into a few tricky scenarios. It's how you handle these little details that really separates a good component from a great one. Let's walk through some of the most common challenges I see developers face.\n\n### How Can I Make the Text Always Readable?\n\nThis is probably the biggest headache. When the progress is low, the loading bar's background color often matches the text color, making your label completely disappear. A popular trick is the dual-text method, where you layer two text elements with contrasting colors. It works, but it can feel a bit heavy.\n\nA more elegant solution I've come to prefer is using a bit of CSS magic with `mix-blend-mode: difference;`. This clever property inverts the text color based on whatever background is behind it, guaranteeing high contrast at every single point in the animation. If you want something even simpler, a subtle `text-shadow` or a thin `stroke` can often be just enough to lift the text off the background and keep it legible.\n\n### Determinate vs Indeterminate Loading Bars\n\nKnowing when to use each type is absolutely crucial for creating a good user experience. They serve very different purposes.\n\n- **Determinate Bar**: You’ll want to use this anytime you can actually calculate the progress of an operation, like a file upload. It shows a real value (e.g., \"75% complete\") and gives the user a solid idea of how much time is left. A text loading bar is almost always determinate.\n- **Indeterminate Bar**: This is your go-to when the wait time is a total unknown. It just shows a continuous, non-specific animation to signal that the system is working, but can't promise when it'll be done.\n\n> The key takeaway here is to _always_ use a determinate bar when you can show real, tangible progress. Faking it with a bar that mysteriously hangs at 90% is a quick way to erode user trust once they catch on to the pattern.\n\n### Will a Text Loading Bar Hurt Performance?\n\nIf you build it poorly, then yes, absolutely. A common pitfall is using JavaScript to frequently update an element's `width`. This triggers expensive browser repaints and can make your whole UI feel jerky and unresponsive.\n\nTo sidestep this performance trap, lean on CSS transforms for the visual animation. Instead of animating `width`, animate `transform: scaleX()`. This offloads the heavy lifting to the GPU, resulting in buttery-smooth performance. You should still update the `aria-valuenow` attribute with JavaScript for accessibility, but throttling those updates with `requestAnimationFrame` will ensure you aren't flooding the main thread with too many changes at once. This keeps your entire app feeling snappy.\n\n---\n\nReady to stop building from scratch and start shipping beautiful UIs faster? **Magic UI** offers a massive library of over **150** free, open-source animated components and premium templates built with React, TypeScript, and Tailwind CSS.\n\nExplore the components at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/time-and-date-picker.mdx",
    "content": "---\ntitle: Build a React Time and Date Picker from Scratch\ndescription: >-\n  A complete guide to building a responsive and accessible time and date picker.\n  Learn to use React, TypeScript, and Tailwind CSS with practical examples.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-19a16671-181f-4720-9718-4e0d2b01500e.jpg\nauthor: Dillion Verma\ntags:\n  - time and date picker\n  - React components\n  - TypeScript\n  - Tailwind CSS\n  - UI development\npublishedOn: \"2025-11-20T09:15:39.52961+00:00\"\nfeatured: true\n---\n\nA **time and date picker** is exactly what it sounds like: a single UI component that lets someone pick both a calendar date and a specific time. You see them everywhere in booking, scheduling, and event management apps. Their whole purpose is to make scheduling foolproof and stop users from fumbling with manual inputs.\n\n## Why a Custom Time and Date Picker Matters\n\nEver tried to book a flight and felt like you were wrestling with the calendar? It’s a classic developer trap: falling back on the default browser pickers. The problem is, they often create a clunky, frustrating experience for the user.\n\nThese native components look and behave differently across browsers, their mobile UIs can be a nightmare, and they almost never have the specific features a business needs. This is where a custom component completely changes the game.\n\nBuilding your own isn't just about making it look pretty. It's about creating a tool that feels intuitive, matches your brand, and respects your user's time. A well-designed **time and date picker** can genuinely streamline a user's workflow, slash input errors, and give your conversion rates a healthy bump.\n\n### The Problem with Default Pickers\n\nThe biggest headache with default browser pickers is the total lack of control. A native date input might look sharp in Chrome on a desktop, but then on Safari for iOS, it looks completely different and is way less usable.\n\nThis kind of inconsistency throws users off and shatters the cohesive feel of your app. On top of that, they give you almost zero room to customize business logic, like blocking out certain days or specific time slots.\n\nFor anything more complex than a basic form—think flight booking systems or service schedulers—you need more. You need a component that can handle your business rules, slot perfectly into your UI, and work seamlessly on any device.\n\n> A custom picker transforms date selection from a potential roadblock into a smooth, integrated part of the user journey. It’s an investment in user experience that pays off through higher engagement and fewer abandoned forms.\n\n### Boosting UX and Business Metrics\n\nThe move to graphical date pickers was a massive win for user interaction. In the old days, people had to type out dates by hand, which led to a constant stream of formatting errors. Was it day/month/year or month/day/year? It was a mess.\n\nOnce interactive calendars became the norm, enterprise UX teams saw date entry error rates drop by as much as **40%**. The improvement was immediate and significant.\n\nThe infographic below shows just how big the business impact can be when you switch to a custom solution.\n\n![Infographic about time and date picker](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9463271d-3b26-4db9-aab7-2ad48f5a0230.jpg)\n\nAs you can see, a custom component doesn't just reduce errors; it helps people get things done faster and directly lifts conversions. This data makes it crystal clear: a better UI leads directly to better business outcomes.\n\nWhen you're thinking through why a custom **time and date picker** matters for your project, tools like Framer can be a lifesaver if you want to [prototype custom designs with Framer](https://www.framer.com/) before writing a single line of code. Picking the right building blocks is also crucial; check out our guide to the [best React component library](https://magicui.design/blog/best-react-component-library) to see how pre-built systems can give you a major head start.\n\n## Crafting the Perfect Development Setup\n\nA smooth build always starts with a solid foundation. Before we can get our hands dirty building the custom **time and date picker**, we need to get our development environment set up and dialed in. Trust me, a poorly configured setup is a recipe for slow builds, cryptic errors, and a lot of wasted time.\n\nWe're going with a modern stack that's all about speed and reliability. This approach ensures all the pieces—our bundler, language, and styling library—play nicely together. It frees you up to focus on the actual component logic instead of wrestling with config files.\n\n![Developer coding in a well-lit workspace](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/cab82714-d931-486b-afdb-10ba11d0a691.jpg)\n\n### Bootstrapping with Vite and TypeScript\n\nFirst things first, let's get our React project off the ground. We’re skipping `create-react-app` and going straight for **Vite**. Why? Its build server gives you near-instant hot module replacement (HMR), meaning your app updates in the browser almost immediately as you code. For component development, this speed is a total game-changer.\n\nNext up is **TypeScript**. This isn't just about jumping on a trend; it's a practical move that helps you squash bugs before they even happen. By enforcing type safety, your component props and state become predictable and far easier to debug, especially as the application scales.\n\n> Kicking off your project with Vite and TypeScript from the get-go builds a really robust foundation. This combo doesn't just speed up your development cycle—it also cuts down on runtime errors, leading to more stable, maintainable code down the road.\n\n### Integrating Tailwind CSS for Styling\n\nWith the project structure in place, it’s time to talk styling. We'll be using **Tailwind CSS**, a utility-first framework that lets you build custom designs right inside your JSX. I find this approach is perfect for a component like a time and date picker because it keeps your styles co-located with the markup, making them incredibly easy to manage and tweak.\n\nTo get Tailwind working with Vite, you'll need to install it and then create two config files: `tailwind.config.js` and `postcss.config.js`. These files are what tell Tailwind how to process your styles and which files it needs to scan for utility classes.\n\nGetting this part right is key. For a detailed walkthrough, our post on [how to install Tailwind CSS with Vite](https://magicui.design/blog/tailwind-css-install) is an excellent resource. A proper configuration ensures all your utility classes compile correctly, so you can start styling without a hitch.\n\nOnce this is all done, you’ll have a clean, powerful, and organized project—the perfect canvas for building our custom component.\n\nAlright, with our development environment set up and ready to go, it's time to dive into the fun part: building the actual calendar grid for our custom **time and date picker**. This is the heart of the whole component. The plan is to create something truly modular and reusable from scratch, focusing on clean code that behaves exactly as you'd expect.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/VZ6Qpe3sjhM\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nWe'll be using [TypeScript](https://www.typescriptlang.org/) to define super clear interfaces for our component's props and state. This isn't just for show—it creates a contract. Anyone using our component will know precisely what data it needs, like a `selectedDate` and an `onDateChange` callback function. This level of predictability is what really separates a professional, production-ready component from a quick hack.\n\n### Taming Date Logic with `date-fns`\n\nLet's be honest: handling date logic by hand is a nightmare. It’s a classic source of bugs. You've got time zones, leap years, and months with different numbers of days, creating a minefield of weird edge cases.\n\nTo avoid all that pain, we'll bring in a lightweight and powerful library called [`date-fns`](https://date-fns.org/).\n\nUnlike some of the heavier date libraries out there, `date-fns` is tree-shakable. That means only the specific functions we actually use get bundled into our final application, keeping our component lean and fast.\n\nFor our calendar, we’ll lean on `date-fns` for a few critical jobs:\n\n- **Generating the Days:** It will help us create the grid of all the days for whatever month is currently showing.\n- **Handling Empty Cells:** A calendar month rarely starts perfectly on the first day of the week. We need a way to calculate and show those empty slots at the beginning.\n- **Month Navigation:** We need simple functions to jump to the previous or next month when a user clicks the navigation arrows.\n\nUsing this library lets us focus on the UI and state management instead of getting bogged down reinventing date calculations from scratch.\n\n### Defining Component Props and State\n\nBefore we even think about writing JSX, we need to establish a clear contract for how our component will work. This is where TypeScript really proves its worth. We'll start by defining an interface for the component's props, making its API completely explicit.\n\n```tsx\n// src/components/DatePicker.tsx\n\ninterface DatePickerProps {\n  selectedDate: Date | null\n  onDateChange: (date: Date) => void\n}\n```\n\nThis small interface tells us everything we need to know. The component expects a `selectedDate` (which can be `null` when nothing is selected yet) and a function to call when a new date is picked. Simple and clear. Inside the component itself, we'll use local state to manage which month is currently being displayed.\n\nUnderstanding the key differences between state and props is crucial for building reusable React components. This table breaks down their roles within our date picker.\n\n### State vs Props for the Date Picker Component\n\n| Concept   | Role in Date Picker                                                                                              | Example Usage                                                                                                            |\n| :-------- | :--------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- |\n| **Props** | Data passed _into_ the component from its parent. This is how the parent controls the component.                 | `selectedDate` is a prop because the parent component needs to know and control the final selected date.                 |\n| **State** | Data managed _inside_ the component. It's used for internal UI logic that the parent doesn't need to know about. | The `currentMonth` being viewed is state. The user can navigate months without affecting the final `selectedDate` value. |\n\nThis distinction allows us to build a more flexible and predictable component.\n\n> By separating the _controlled_ value (`selectedDate`) from the _internal_ display state (like the current month view), we build a more flexible component. The parent component controls the final value, while the date picker manages its own internal UI logic.\n\nNow, for the visuals. Styling our calendar grid is where [Tailwind CSS](https://tailwindcss.com/) shines. We’ll use its utility classes to build a clean, responsive layout directly in our JSX. For instance, creating the seven-column layout for the days of the week is as easy as adding `grid` and `grid-cols-7` to a container.\n\nWe'll apply classes directly to the header elements, the navigation buttons, and each individual day cell in the grid. This utility-first approach is fantastic because it keeps our component completely self-contained and super easy to customize later without ever touching a separate CSS file.\n\n## Integrating an Intuitive Time Selector\n\nOkay, so we've got a working calendar. Now, let's bring in the other half of the equation: the time selector. A great **time and date picker** shouldn't feel like two separate things glued together. It needs to be a single, smooth experience. This is where we'll build a clean time input that feels right at home next to our calendar.\n\nThere are a few ways to tackle this. You could go with the classic hour and minute dropdowns everyone knows, or maybe a slick scrolling interface that’s perfect for mobile. For this guide, we'll stick to a straightforward but highly effective selector using React and Tailwind CSS.\n\n![A sleek and modern time picker UI component shown next to a calendar.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9ec54f25-06d4-4b2e-8a86-667f7ff1d64a.jpg)\n\n### Unifying Date and Time State\n\nHonestly, building the UI is the easy part. The real trick is managing the state so the date and time selections play nicely together. When someone picks a date and then a time, it should trigger one clear, predictable update. The best way I've found to do this is to manage a single JavaScript `Date` object for both.\n\nThink of it this way: when a user clicks a day, we update our state. When they tweak the hours or minutes, we modify that _exact same_ `Date` object. This simple approach completely sidesteps any state synchronization headaches and keeps the component logic lean.\n\n> The key is to treat the date and time as two parts of one whole. By consolidating them into a single `Date` object, you ensure data integrity and avoid complex state synchronization issues, which also helps prevent unnecessary component re-renders.\n\n### Building the Time Input Component\n\nLet’s get our hands dirty and create a new component, `TimeInput`. Its only job will be to render the hour and minute selectors. It will take in the currently selected `Date` as a prop and have a handler function to pass any changes back up to the parent.\n\nWe can use simple `<select>` dropdowns for this. We’ll just generate an array for the hours (**0-23**) and another for the minutes—let's use **15-minute** intervals (**0, 15, 30, 45**) for now—and then map over them to create the `<option>` elements.\n\nThis is where you see the real-world value of a combined picker. In appointment scheduling systems, for example, implementing a solid date picker alone can slash booking errors by around **35%** and boost user speed by up to **25%**. Adding precise time selection on top of that is non-negotiable for any business that runs on a tight schedule. You can [discover more about these UX improvements](https://wpforms.com/what-is-the-difference-between-a-datepicker-and-a-timepicker/) from recent research by digital form providers.\n\n### Refactoring for a Combined State\n\nTime to bring it all together in our main `DateTimePicker` component. We just need to make a small tweak to our state management. Instead of only tracking the date, we'll manage a full `Date` object that includes the time.\n\nOur `onDateChange` handler from the calendar now needs to be smart enough to preserve the existing time when updating the date. Likewise, the new `onTimeChange` handler from our `TimeInput` will update the hours and minutes while leaving the date untouched.\n\nHere's a quick rundown of the logic:\n\n1.  **Initialize State:** Kick things off with `useState(new Date())` to hold the complete date and time.\n2.  **Handle Date Selection:** When a new date is picked, create a new `Date` object. Set the year, month, and day from the calendar selection, but pull the hours and minutes from the _current_ state.\n3.  **Handle Time Selection:** When the time changes, do the opposite. Create another new `Date` object, this time setting the hours and minutes from the time input but keeping the year, month, and day from the current state.\n\nThis approach keeps every update clean and correct, giving you a robust and reliable **time and date picker** that just works.\n\n## Making Your Picker Accessible and Global\n\nWe've built a functional time and date picker, which is great. But to take it from good to truly professional, we need to make sure it's usable by everyone, everywhere. This last leg of development is all about accessibility (a11y) and localization (i18n)—the details that create a truly inclusive component.\n\nMaking something accessible means anyone can use it, including people who rely on assistive technologies like screen readers or navigate exclusively with a keyboard. This isn't just a \"nice-to-have\" feature you tack on at the end; it’s a fundamental part of building a quality UI, especially for a complex component like our calendar.\n\n![A world map with glowing dots indicating global user connectivity.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f822c454-9710-4068-8991-21d2a6dbe7c4.jpg)\n\n### Implementing ARIA for Screen Readers\n\nAccessible Rich Internet Applications (**ARIA**) attributes are your best friend for adding context that screen readers need to make sense of your UI. Since our calendar is built from `<div>` elements instead of a standard `<table>`, we have to explicitly tell assistive tech how to interpret its structure.\n\nHere’s how to do it:\n\n- **`role=\"grid\"`:** Slap this onto the main calendar container. It tells screen readers, \"Hey, this is a grid of interactive cells, kind of like a spreadsheet.\"\n- **`role=\"row\"`:** Use this for each week's container inside the grid.\n- **`role=\"gridcell\"`:** Apply this to every individual day element.\n- **`aria-label`:** This one is crucial. Use it on your navigation buttons (\"Previous month\") and each date cell (\"January 1, 2024\") to give clear, human-readable descriptions.\n\nThese attributes won't change how your component looks one bit, but they make a world of difference for screen reader users, making it fully navigable and understandable. This kind of attention to detail is a hallmark of robust [user interface design patterns](https://magicui.design/blog/user-interface-design-patterns).\n\n### Enabling Full Keyboard Navigation\n\nNext up, let's make sure someone can use the entire **time and date picker** without ever touching a mouse. This is all about managing focus and handling keyboard events. The goal is an intuitive experience: arrow keys move through the calendar, and the Enter key makes a selection. Simple.\n\n> A truly accessible component allows users to perform all key actions with a keyboard. For our picker, this means navigating between days, switching months, and selecting a final date and time, all without ever touching a mouse.\n\nYou can pull this off by adding a `tabIndex=\"0\"` to the currently focused day, which makes it a focusable element. From there, attach an `onKeyDown` event listener to the grid container to handle arrow key presses, moving focus logically from one day to the next.\n\n### Adapting for a Global Audience\n\nNow for the final touch: localization (i18n). This is the process of adapting your component for different languages and regions. For a **time and date picker**, this mostly boils down to date formats and language. A user in the United States expects `MM/DD/YYYY`, while someone in Germany expects `DD.MM.YYYY`.\n\nUsing a library like `date-fns` makes this almost trivial. It has fantastic built-in support for different locales, letting you format dates and display month or day names in just about any language. You simply pass a locale object to its formatting functions, and it handles the rest. This last step ensures your component feels native to users, no matter where they are.\n\nDon't underestimate the impact of getting this right. Poor date and time inputs are a major reason for form abandonment rates that can exceed **20%**. On the flip side, analytics consistently show that a well-designed, intuitive picker can boost form completion rates by up to **30%**, especially in industries that lean heavily on scheduling and reservations.\n\n## Common Questions About React Date Pickers\n\nWhen you're deep in the code, building or plugging in a **time and date picker**, you'll inevitably run into the same handful of questions that pop up for every developer. Getting these right is the difference between a component that just _works_ and one that's genuinely robust and ready for the real world.\n\nLet's walk through some of the most common hurdles I've seen and how to clear them.\n\n### How Can I Disable Specific Dates?\n\nPretty much any scheduling tool needs this. You'll want to block out holidays, past dates, or any day that's already booked solid. This is a non-negotiable feature for booking systems.\n\nThe simplest way is to pass a function or an array of dates to your component as a prop.\n\nThen, as you’re rendering the calendar grid, you just run a quick check for each day. Is this date in the disabled array? Or does it fail a condition, like being earlier than today?\n\nIf the answer is yes, you slap on a few Tailwind CSS classes like `opacity-50` and `pointer-events-none`. This visually grays out the date and, more importantly, makes it unclickable. It’s a clean way to signal to the user that a date is off-limits while keeping your component flexible for different use cases.\n\n### What Is the Best Way to Handle Time Zones?\n\nTime zones can feel like a minefield, but the industry standard approach is surprisingly simple. The golden rule is to **always store date and time in Coordinated Universal Time (UTC)** on your server. This gives you a single, unambiguous source of truth.\n\nOn the front end, you can let the browser do the heavy lifting. The native JavaScript `Date` object is smart enough to use the user's local time zone by default when displaying dates.\n\nSo, your workflow looks something like this:\n\n1.  A user picks a date and time in their own time zone.\n2.  Before you send that data to your backend, you convert it to a UTC string using a method like `date.toISOString()`.\n3.  When you fetch that data back from the server, you just pass the UTC string to the client. The browser will automatically handle converting it back into the user's local time for display.\n\n> Sticking to a UTC-first approach on the backend simplifies everything. It eliminates ambiguity and ensures that time data is consistent across all users, regardless of their geographical location. For more complex needs, a library like `date-fns-tz` can be invaluable.\n\n### Can I Customize the Picker Beyond Tailwind CSS?\n\nOf course. Tailwind’s utility classes are incredible for getting things built fast, but sometimes you need a **time and date picker** with a more bespoke, branded feel.\n\nYour first stop should be your `tailwind.config.js` file. This is where you can extend the default theme with your brand's specific colors, fonts, and spacing. This keeps your design system consistent across the entire application, not just the picker.\n\nFor component-specific styles that are more complex, you can use Tailwind’s `@apply` directive in a separate CSS file to bundle utilities into custom classes. And if you need truly dynamic, prop-based styling, you can always reach for a CSS-in-JS library like Styled Components or Emotion. This lets you write highly adaptable styles while still pulling from Tailwind’s powerful design tokens.\n\n---\n\nReady to build stunning, high-performance web interfaces with less effort? **Magic UI** offers over **50** customizable blocks and **150+** free animated components built with React, TypeScript, and Tailwind CSS. [Start building beautiful landing pages in minutes at magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/typescript-vs-javascript-differences.mdx",
    "content": "---\ntitle: TypeScript vs JavaScript Differences A Modern Developer's Guide\ndescription: >-\n  Explore the critical TypeScript vs JavaScript differences in type safety,\n  tooling, and ecosystem. Choose the right language for your next project.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/0c54696e-9841-43bd-ada3-d4a7e4ae8726/typescript-vs-javascript-differences-data-comparison.jpg\nauthor: Dillion Verma\ntags:\n  - typescript vs javascript differences\n  - typescript\n  - javascript\n  - web development\n  - type safety\npublishedOn: \"2025-12-23T07:43:29.587198+00:00\"\nfeatured: true\n---\n\nAt its core, the main difference is simple: **TypeScript is JavaScript with an added layer of static type-checking**. Think of it as a protective shell around your code. This lets you spot and fix entire classes of errors while you're still writing the code, not after it's shipped to users. This makes for more predictable and stable code, especially as applications get bigger.\n\nJavaScript, on the other hand, is all about dynamic flexibility. Its nature allows for quick iteration and prototyping, which is perfect for smaller projects or when you just need to get something running fast.\n\n## Why Compare TypeScript vs JavaScript Today\n\nIn the world of web development, the choice between JavaScript's dynamic freedom and TypeScript's structured safety isn't just a technical detail—it's a strategic one. For years, JavaScript was the undisputed king of the web, loved for its universal browser support and simple syntax that let developers build interactive experiences quickly.\n\nBut as web applications ballooned in size and complexity, JavaScript’s lack of a type system started to show its cracks. Maintaining and scaling large JS codebases became a genuine challenge. This is the exact problem [TypeScript](https://www.typescriptlang.org/), a project from Microsoft, was designed to solve by adding an optional, but powerful, layer of static typing right on top of the JavaScript you already know.\n\n![A balance scale shows 'SAFETY' with a blue shield weighing more than 'SPEED' with a lightning bolt.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9f814a5e-fe12-49ff-b63e-a0393ec64d45/typescript-vs-javascript-differences-safety-balance.jpg)\n\n### The Rise of a New Standard\n\nThe developer community has been steadily moving toward type-safe languages, and the numbers don't lie. In a huge shift, TypeScript overtook both Python and JavaScript in August 2025 to become the most-used language on [GitHub](https://github.com/) for the first time. This marked a major turning point after JavaScript had held the top spot for over a decade.\n\nAccording to GitHub's Octoverse 2025 report, TypeScript's usage exploded with a massive **66% year-over-year (YoY) growth**, blowing past JavaScript's 24.8%. You can dig into the full GitHub report on [developer trends and language adoption](https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/) to see the data for yourself.\n\nThis comparison isn't about crowning a winner. It’s about helping you make the right call for your project's unique needs. The table below breaks down the key trade-offs at a glance.\n\n<div className=\"my-6 w-full overflow-x-auto rounded-lg border\">\n  <table className=\"relative w-full text-sm\">\n    <thead className=\"bg-muted border-b\">\n      <tr className=\"hover:bg-muted/50 m-0 border-b transition-colors\">\n        <th\n          scope=\"col\"\n          className=\"min-w-[120px] px-4 py-3 text-left font-semibold\"\n        >\n          Consideration\n        </th>\n        <th\n          scope=\"col\"\n          className=\"min-w-[200px] px-4 py-3 text-left font-semibold\"\n        >\n          JavaScript (Dynamic Flexibility)\n        </th>\n        <th\n          scope=\"col\"\n          className=\"min-w-[200px] px-4 py-3 text-left font-semibold\"\n        >\n          TypeScript (Structured Safety)\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr className=\"hover:bg-muted/50 m-0 border-b transition-colors\">\n        <td className=\"min-w-[120px] px-4 py-3 text-left font-medium\">\n          Project Scope\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Ideal for small projects, scripts, and rapid prototypes.\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Better for large, complex applications requiring long-term\n          maintainability.\n        </td>\n      </tr>\n      <tr className=\"hover:bg-muted/50 m-0 border-b transition-colors\">\n        <td className=\"min-w-[120px] px-4 py-3 text-left font-medium\">\n          Error Detection\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Errors are found at runtime, which can impact users.\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Catches type-related errors during compilation, before code is run.\n        </td>\n      </tr>\n      <tr className=\"hover:bg-muted/50 m-0 border-b transition-colors last:border-b-0\">\n        <td className=\"min-w-[120px] px-4 py-3 text-left font-medium\">\n          Developer Experience\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Simple setup with no compilation step, allowing for faster iteration.\n        </td>\n        <td className=\"min-w-[200px] px-4 py-3 text-left\">\n          Superior tooling, autocompletion, and safer code refactoring.\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n\n## Understanding The Core Language Differences\n\nThe biggest difference between TypeScript and JavaScript boils down to one core concept: how they handle data types. It’s the philosophical divide that informs everything else.\n\nJavaScript is **dynamically typed**. What does that mean? The type of a variable isn't checked until your code is actually running in the browser (at runtime). This gives you a ton of flexibility, which is great for whipping up prototypes and getting ideas off the ground quickly without the upfront ceremony of defining every little thing.\n\nBut that freedom has a dark side. It's incredibly easy for subtle, sneaky bugs to creep into your code and go completely unnoticed until a real user stumbles upon them. A function that expects a number might get a string, and instead of a clean calculation, you get a weird concatenation. We’ve all been there, scratching our heads over bugs that should have been obvious.\n\nTypeScript, on the other hand, is **statically typed**. Think of it as a smart, protective layer built on top of JavaScript. It asks you to declare the types for your variables, function parameters, and what your functions return. All this information is checked when you _compile_ your code—long before it ever sees a browser. It’s a safety net that catches an entire class of errors right in your editor.\n\n![A visual comparison showing JavaScript's loose typing versus TypeScript's structured type system.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/90ff980d-2245-4fd8-a361-1619622a93ff/typescript-vs-javascript-differences-typing-comparison.jpg)\n\n### Dynamic vs. Static Typing: A Practical Example\n\nLet’s make this concrete. Imagine a simple function to calculate the total price of an item. In JavaScript, you might write something like this.\n\n**JavaScript Example (Dynamic Typing)**\n\n```javascript\nfunction calculateTotal(price, quantity) {\n  // This could easily return \"1002\" instead of 200 if quantity is \"2\"\n  return price * quantity\n}\n\nlet total = calculateTotal(100, \"2\") // No error happens here, but the result is wrong\nconsole.log(total) // Outputs NaN, a classic runtime bug\n```\n\nJavaScript tries its best but ends up with `NaN` (Not-a-Number). The code doesn't crash, it just fails silently. This kind of bug can sit dormant for weeks, causing weird UI glitches or even messing up financial data before anyone notices.\n\nNow, let's see how TypeScript stops this dead in its tracks.\n\n**TypeScript Example (Static Typing)**\n\n```typescript\nfunction calculateTotal(price: number, quantity: number): number {\n  return price * quantity\n}\n\n// This line will light up with a compile-time error instantly\nlet total = calculateTotal(100, \"2\")\n// Error: Argument of type 'string' is not assignable to parameter of type 'number'.\n```\n\nThe moment you type that line, TypeScript’s compiler—right inside your code editor—starts screaming. It tells you immediately that you’re passing a string where a number is expected. You’re forced to fix the bug before the code is even allowed to become JavaScript. You can explore more advanced examples like this in our guide for building a visual [code comparison component](https://magicui.design/docs/components/code-comparison).\n\n> This \"shift-left\" philosophy is the heart and soul of TypeScript. It yanks bug detection out of the chaotic, unpredictable world of runtime and puts it squarely in the controlled environment of your development phase. That saves a massive amount of time and prevents real-world production headaches.\n\n### Diving Deeper: The Power of TypeScript's Type System\n\nTypeScript's value proposition goes way beyond just adding `:number` or `:string` to your code. It introduces a rich set of tools that help you build robust, self-documenting, and readable applications—features that are completely absent in plain JavaScript.\n\nLet's quickly look at some of the fundamental differences that really matter on large projects.\n\nThis table provides a high-level overview of where each language stands on key features.\n\n### Core Feature Comparison: JavaScript vs. TypeScript\n\n| Feature               | JavaScript                                                 | TypeScript                                                 |\n| :-------------------- | :--------------------------------------------------------- | :--------------------------------------------------------- |\n| **Typing**            | **Dynamic**: Checked at runtime. Flexible but error-prone. | **Static**: Checked at compile-time. Catches errors early. |\n| **Type Definitions**  | Not available. Types are inferred at runtime.              | Interfaces, Types, Enums for explicit definitions.         |\n| **Tooling**           | Good editor support, but limited static analysis.          | Excellent autocompletion, refactoring, and error-checking. |\n| **Compilation**       | Not needed. Runs directly in the browser or Node.js.       | Requires a compilation step to transpile to JavaScript.    |\n| **Advanced Features** | Lacks generics, decorators, and advanced type inference.   | Rich support for Generics, Enums, Mixins, and more.        |\n\nThis structured approach is what truly separates the two, allowing TypeScript to scale in ways that become painful with JavaScript.\n\nSome of the most powerful constructs TypeScript gives you are:\n\n- **Interfaces**: These let you define the \"shape\" of an object, creating a strict contract for your data. This is a lifesaver when working with complex API responses or component props.\n- **Enums**: They provide a way to create a set of named constants. This makes your code infinitely more readable and prevents bugs from simple typos (think `Status.Published` instead of a \"magic string\" like `\"published\"`).\n- **Generics**: This is where things get really powerful. Generics let you create reusable functions, classes, or components that can work with a variety of types while still maintaining full type safety.\n\nThis isn't just a niche preference anymore; it's a massive industry shift. The **2024** State of JS survey found that **80% of developers are now using TypeScript**. This isn't just hype—it's a direct response to the pain of managing large JavaScript codebases. Teams are tired of the constant threat of runtime errors. Data backs this up, showing that typed codebases have **15-50% fewer defects** and require **20-30% fewer debugging hours**. You can get more context on this trend from [this detailed analysis of developer surveys](https://www.youtube.com/watch?v=96pARvK83CA). It’s clear the community has made a choice: stability and long-term maintainability are winning.\n\n## How Tooling Defines The Developer Experience\n\nBeyond type safety, one of the biggest **typescript vs javascript differences** comes down to the developer experience (DX) delivered by their tooling. TypeScript doesn't just bolt on types; it fundamentally changes how you write and interact with your code, essentially turning your editor into an intelligent co-pilot. This tight integration is a massive reason why so many developers are making the switch.\n\n![Laptop with code editors, a green checkmark, and a 'TS' badge, illustrating TypeScript's benefits for code quality.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/7d667816-2f71-4caf-9127-a3ce8a0476bc/typescript-vs-javascript-differences-typescript-development.jpg)\n\nWith TypeScript, all that rich type information does more than just catch errors. It powers a suite of incredibly precise development tools right inside editors like VS Code. Features that feel almost magical—like hyper-accurate autocompletion, intelligent \"go-to-definition,\" and safe, automated refactoring—are all possible because your editor understands the exact shape of your data.\n\n### The Integrated TypeScript Environment\n\nTypeScript's tooling feels so cohesive because the language and the tools were built to work together from day one. The TypeScript compiler (`tsc`) is way more than just a transpiler; it’s a powerful static analysis engine that has a complete understanding of your entire project.\n\nThis synergy creates a seamless workflow with immediate feedback. If you try to call a method that doesn't exist on an object or pass the wrong type of argument to a function, your editor flags it instantly. This prevents a whole class of bugs from ever making it to runtime and dramatically boosts both productivity and confidence.\n\n> For developers, this means spending less time hunting through files or manually tracing how data flows. The editor becomes a reliable source of truth, guiding you toward correct code and making large-scale changes feel much less risky.\n\nIn contrast, getting a similar level of code intelligence in a plain JavaScript project requires a more fragmented approach. You have to assemble and configure a collection of separate tools just to replicate what TypeScript gives you out of the box.\n\n### The JavaScript Tooling Mosaic\n\nIn the JavaScript world, developers lean on a combination of tools to enforce quality and streamline their workflow. The typical stack includes:\n\n- **Linters like ESLint:** To catch common coding mistakes and enforce style guides.\n- **Formatters like Prettier:** To keep code formatting consistent across the team.\n- **JSDoc comments:** To manually annotate code with type information, hoping the editor can parse it for better autocompletion.\n\nWhile these tools are powerful, they all operate as separate entities. Getting them to play nicely together takes careful configuration, and the insights they provide can never match the depth of a language with a built-in type system. JSDoc helps, for sure, but it's verbose and just not as reliable as native TypeScript for describing complex data structures.\n\nFor an example of how specific styling tools can enhance the DX within the JavaScript ecosystem, check out this guide on using [Tailwind CSS with React Native](https://market.gluestack.io/blog/tailwind-css-react-native). It’s a great setup, but it also highlights the need to manually integrate distinct tools to build a productive environment.\n\nThe real difference here is **integration versus assembly**. TypeScript provides a deeply integrated tooling experience where the language server has a complete, accurate picture of your codebase from the start. JavaScript requires you to build that experience yourself by piecing together linters, formatters, and annotation systems, which often leads to more config overhead and less precise feedback. That integrated approach is a compelling reason why so many teams choose TypeScript for building scalable applications.\n\n## Diving Into Compilation and Performance\n\nOne of the most common points of confusion in the TypeScript vs. JavaScript debate is what happens with compilation and performance. Many developers hear \"compile step\" and immediately worry about a slower workflow or, even worse, a hit to their app's runtime speed. But the reality is a lot more nuanced, and modern tooling has made most of these concerns a thing of the past.\n\nThe most important thing to get straight is that TypeScript has **zero direct impact on runtime performance**. Your TypeScript code never actually runs in the browser or on a server. It gets transpiled into clean, standard, readable JavaScript first. The code that’s finally executed is just plain old JavaScript, so it runs exactly as it would if you’d written it by hand.\n\nThe real conversation, then, isn't about the executed code. It’s about **build-time performance**—the time it takes for the TypeScript compiler to check all your types and turn your `.ts` files into `.js` files.\n\n### How TypeScript Compilation Evolved\n\nFor a while, this build step could be a real bottleneck. In the early days, massive enterprise projects with hundreds of thousands of lines of code could see compilation times drag. The original TypeScript compiler (`tsc`) was written in JavaScript, and while it worked, it could definitely start to chug on a huge codebase. This led to longer waits during development and in CI/CD pipelines.\n\nThis created a very real trade-off: was the safety net of types worth the slower feedback loop? It was a legitimate question that sometimes led teams to stick with JavaScript and its ecosystem of separate linters and tools.\n\n> The game changed when the ecosystem shifted its focus to high-performance, next-generation tooling. Development has accelerated dramatically, all aimed at keeping the developer experience fast and fluid, even on the biggest projects.\n\nThese new tools have all but erased the compilation overhead, making the decision to adopt TypeScript a whole lot easier. We've moved from JavaScript-based compilers to much faster alternatives written in native languages.\n\n### The Modern Compiler Speed Revolution\n\nThe big breakthrough came from compilers written in languages like Rust and Go, which do the same job as `tsc` but in a tiny fraction of the time. Tools like [SWC (Speedy Web Compiler)](https://swc.rs/) and [esbuild](https://esbuild.github.io/) quickly became mainstays in modern dev stacks because they are unbelievably fast.\n\nThis speed revolution hit a new high in 2025. One of the most significant recent **typescript vs javascript differences** is the arrival of TypeScript’s own native compiler, `tsgo`. As outlined in TypeScript 7.0, `tsgo` delivers up to **10x faster type-checking** than the old JavaScript-based `tsc`. For a massive codebase like Sentry’s, `tsgo` slashed compilation time from 133 seconds down to just 16.25 seconds—that's an **8.19x speedup**. VSCode saw an even bigger improvement, going from 89.11 seconds to a mere 8.74 seconds, a **10.2x gain**. You can dig into all the benchmarks and technical details in the [official TypeScript 7.0 progress report](https://devblogs.microsoft.com/typescript/progress-on-typescript-7-december-2025/).\n\nThis means that today, the compilation step just isn't the barrier it once was. The performance comparison now looks like this:\n\n- **Runtime Performance**: Identical. TypeScript becomes JavaScript, so there's no difference for the end-user.\n- **Build-Time Performance**: It used to be a drawback for TypeScript, but that problem is largely solved. Modern native compilers have made the process so quick it’s barely noticeable in the daily workflow.\n\nSo, while TypeScript introduces a compile step that plain JavaScript doesn’t have, the tooling has caught up and eliminated the performance penalty. Teams can now get all the advantages of type safety—fewer bugs, easier maintenance, and incredible editor support—without giving up the fast feedback loop that keeps developers productive.\n\n## Navigating The Ecosystem And Library Support\n\nA language's real-world power often boils down to its community and the libraries you can use with it. Because TypeScript is a superset of JavaScript, it automatically inherits the entire **npm** ecosystem—the largest package registry on the planet. This means you can pull virtually any JavaScript library into a TypeScript project.\n\nBut this seamless integration also highlights one of the key **typescript vs javascript differences** you'll face day-to-day. The question isn’t _if_ you can use a library; it’s _how_ you get type safety when you do.\n\n### The Role Of Type Definition Files\n\nTo bridge the gap between TypeScript’s typed world and JavaScript’s untyped one, the community created **type definition files**. These files, which end in `.d.ts`, act like a blueprint. They describe the shapes and function signatures of a JavaScript library's code without ever touching the original source.\n\nThis is where the **DefinitelyTyped** repository becomes your best friend. It’s a massive, community-driven project hosting type definitions for thousands of popular JavaScript packages. If you install a library that doesn't ship with its own types, you can usually just install its corresponding `@types` package from npm. Just like that, TypeScript understands how to work with it.\n\n> This community effort is the backbone of TypeScript's ecosystem compatibility. It lets developers adopt TypeScript without ditching their favorite JavaScript tools, wrapping a safety net around code that wasn't originally built with types.\n\n### Native Support vs. Community Types\n\nAs TypeScript has exploded in popularity, the ecosystem has matured. You'll now run into two common scenarios when working with third-party libraries, and each offers a slightly different developer experience.\n\n- **Libraries with Native TypeScript Support:** The best-case scenario. Many modern libraries are now written directly in TypeScript. These packages bundle their own `.d.ts` files, giving you a first-class, typed experience right out of the box. The definitions are guaranteed to be accurate and up-to-date because they’re generated from the same source code.\n\n- **Libraries with Community-Provided Types:** For older or JavaScript-native libraries, you'll lean on the `@types` packages from DefinitelyTyped. These are incredibly valuable, but they're maintained by volunteers. Occasionally, this means types might be slightly out of sync with a library's latest version, or you might find missing definitions for more obscure features. In rare cases, you might even have to write your own type definitions to fill a gap.\n\nAll the major frontend frameworks—React, Angular (which is built _with_ TypeScript), and Vue—have robust, built-in support for TypeScript. This ensures a smooth, fully-typed workflow from the start when you're using the industry's most popular tools. For developers working in the React ecosystem, understanding how different components handle types is crucial. You can explore a curated list of popular [React libraries](https://magicui.design/blog/react-libraries) and see for yourself how many now prioritize native TypeScript support.\n\nUltimately, TypeScript’s brilliant strategy for integrating with the existing JavaScript world is one of its greatest strengths. You might have to manually manage type definitions here and there, but the vast majority of the ecosystem is well-supported, giving you access to an enormous collection of tools with the added confidence of type safety.\n\n## How To Choose The Right Language For Your Project\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/HCXPJmtV47I\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTurning a detailed comparison into an actual decision takes a clear framework. When you're weighing TypeScript against JavaScript, it's never about which one is \"better\" in a vacuum. It's about which is the right tool for the job you have right now. The choice really boils down to your project's scope, the team you're working with, and your long-term goals.\n\nJavaScript's dynamic nature makes it a fantastic pick when you need to move fast. It absolutely shines in situations where getting something built quickly is more important than having a rigid structure from day one.\n\n- **Small personal projects and scripts:** For a simple portfolio or a quick utility script, the overhead of setting up TypeScript just doesn't make sense.\n- **Rapid prototyping:** When you need to throw together a proof-of-concept, JavaScript lets you see your changes instantly without a compile step getting in the way.\n- **Environments with limited build tools:** For simple websites or snippets, vanilla JavaScript runs straight in the browser with zero extra configuration.\n\nOn the other hand, TypeScript starts to feel essential as a project grows in complexity and more people get involved. Its static typing is a safety net that pays for itself over and over again.\n\n### When TypeScript Is The Strategic Choice\n\nTypeScript is the clear winner for projects where maintainability and scalability are the top priorities. The initial effort of defining types creates a solid foundation, preventing whole categories of bugs and making the code far easier for everyone to understand.\n\nYou should seriously consider TypeScript in these scenarios:\n\n- **Large-scale enterprise applications:** For complex systems with tons of moving parts, TypeScript’s strict contracts are what keep things stable.\n- **Open-source libraries:** If you're building tools for other developers, providing clear type definitions is a must for adoption and usability.\n- **Collaborative team projects:** In a team, TypeScript acts as living documentation. It makes it much easier for developers to work together without stepping on each other's toes.\n\nAs you weigh your options, think about how each language fits into your workflow. This decision will touch everything from daily coding to high-level strategy, influencing [the distinction between project management and product management](https://aicofounder.co.uk/blog/project-management-vs-product-management) by shaping both immediate deliverables and the product’s future.\n\n> The core decision comes down to a trade-off: Are you optimizing for initial development speed or for long-term project health and scalability? Answering this question honestly will almost always point you to the right language.\n\n### Making A Practical Decision\n\nTo help you visualize the path forward, especially regarding dependencies, here’s a decision tree. It helps you think through whether the libraries you need have native types, community-supported types, or if you'll need to roll your own.\n\n![A decision tree flowchart for library support, asking about Native, Community, or DIY types leading to integration or alternative solutions.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/456ebf03-b5e6-4f6f-af66-84d9d289b5c1/typescript-vs-javascript-differences-decision-tree.jpg)\n\nThis flow shows that even if a library doesn't have official support, there are clear paths to integrating it effectively into a TypeScript project.\n\nMaking the right technology choice at the start is a critical step in building a successful application. For a deeper dive into this topic, check out our guide on how to choose a tech stack at [https://magicui.design/blog/how-to-choose-tech-stack](https://magicui.design/blog/how-to-choose-tech-stack).\n\n## Frequently Asked Questions\n\nWhen you're weighing TypeScript against JavaScript, a few key questions always seem to pop up. Let's tackle the most common ones developers ask when they're trying to decide which tool is right for the job.\n\n### Is TypeScript Replacing JavaScript?\n\nNot at all. Think of TypeScript as a superset of JavaScript, not a replacement. It builds directly on top of JavaScript, which means every valid `.js` file is also a valid `.ts` file right out of the box.\n\nThe real relationship here is one of enhancement. TypeScript adds a robust type-checking layer that catches errors during development, long before your code ever hits the browser. When you're done, it compiles right back down to plain, universal JavaScript.\n\n### Can I Use TypeScript For Frontend and Backend?\n\nAbsolutely, and this is one of its biggest selling points.\n\n- **Frontend:** All the major frameworks—React, Angular, Vue—have first-class TypeScript support. It's pretty much the standard for building complex, scalable user interfaces these days.\n- **Backend:** With [Node.js](https://nodejs.org/en), you can leverage TypeScript to build resilient, maintainable server-side applications. Some frameworks, like [NestJS](https://nestjs.com/), are even built entirely with TypeScript in mind.\n\nThis lets your team use a single, type-safe language across the entire stack. That means more consistent code and less mental gymnastics from switching between different languages.\n\n### Does TypeScript Make My Application Slower?\n\nNope. TypeScript has **no impact on the runtime performance** of your application. The type-checking is a development-time-only process. It happens before the code is even run.\n\nWhat you deploy is optimized JavaScript that runs just as fast as if you'd written it by hand. While there's a compilation step, modern tooling like [SWC](https://swc.rs/) and `tsgo` make it so fast you'll barely notice it in your workflow. Your users certainly won't.\n\n### Is TypeScript Harder to Learn Than JavaScript?\n\nIf you're brand new to static typing, there's a bit of a learning curve. You'll need to get comfortable with concepts like interfaces, generics, and type annotations. But that initial investment pays off fast.\n\n> For anyone already familiar with JavaScript, the transition is surprisingly smooth. You can adopt TypeScript gradually—just rename your `.js` files to `.ts` and start adding types where they make sense. The improved autocompletion and error-checking often make developers more productive in the long run.\n\nUltimately, the ability to write safer, self-documenting code makes learning TypeScript a valuable step for any serious developer.\n\n---\n\nReady to build stunning, high-performance UIs with the power of TypeScript? **Magic UI** offers a comprehensive library of over **50** customizable components and templates built with React, TypeScript, and Tailwind CSS. Accelerate your development and create beautiful landing pages in minutes. Explore our components at [https://magicui.design](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/ui-animation.mdx",
    "content": "---\ntitle: \"A Beginner's Guide to UI Animation for Web Design\"\ndescription: \"Discover how to enhance web design with UI animation. Our beginner’s guide covers essential techniques and tips.\"\nimage: https://cdn.magicui.design/assets/6257d0b4-e5e1-408c-adaf-c97c19856072.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nConsider visiting a website looking for a product or service. You scan the homepage for helpful information, but the site could be more exciting and active; you quickly lose interest and leave. You then Google your original search again, but this time, you pick a different site with more interactive elements and engaging UI animations. Things like this help capture your attention, guide your browsing experience, and make the site feel more alive.\n\nYou can guess what this article is about. That’s right! UI animations. And while these little details might seem trivial, they make a world of difference within the broader scope of [web design best practices](https://magicui.design/blog/web-design-best-practices). In this guide, we’ll cover the basics of UI animations for web design and how they can help improve your site’s user experience and overall performance.\n\nOne way to familiarize yourself with UI animation is to experiment with a template with some built-in built-in. The MagicUI startup landing page template is an excellent tool for this. It comes with a collection of UI animations and has many premade sections that can help you organize your content and get your site up and running quickly.\n\n## What is UI Animation?\n\n![UI Animation ](https://images.unsplash.com/photo-1581287053822-fd7bf4f4bfec?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxVSXxlbnwwfHx8fDE3MjQ4MzYxMDF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nUI animation is the purposeful addition of [motion graphics to user interface](https://www.uxpin.com/studio/blog/ui-animation-examples/#:~:text=UI%20animation%20or%20user%20interface,immersive%20and%20enjoyable%20user%20experience.) elements. It breathes life into static interfaces, guiding users through the interaction process, improving usability, and enhancing the overall user experience (UX). In simpler terms, UI animation is the art of making digital interfaces more engaging and dynamic by adding movement to their elements. This can range from subtle transitions between screens to more complex animations that illustrate processes or convey information.\n\n### The Benefits of UI Animation\n\n#### 1\\. Improved user experience\n\nAnimations can make interfaces feel more intuitive and responsive. For example, a smooth transition between screens can create a seamless user flow. At the same time, subtle animations, such as a button pulsing when hovered over, can provide visual feedback on user actions.\n\n#### 2\\. Enhanced engagement\n\n[Well-designed animations](https://www.awwwards.com/websites/animation/) can capture user attention and encourage interaction. For instance, an animated hero section can draw the user's eye and entice them to explore further.\n\n#### 3\\. Better understanding of information\n\nAnimations help clarify relationships between elements and make information more accessible to understand. For example, a progress bar that fills up over time can visually represent the completion of a task, making it easier for users to track their progress.\n\n#### 4\\. Enhanced brand identity\n\nAnimations can contribute to a consistent and memorable brand experience. Designers can create a unique and recognizable interface using animations that align with the brand's aesthetic and values. In addition to these benefits, UI animations can also:\n\n- Reduce cognitive load: Animations can help users process information more efficiently by providing visual cues. Create a more enjoyable experience: Animations can add a touch of fun and excitement to the user interface, making it more enjoyable to use.\n- Differentiate from competitors: Well-executed animations can help a website or app stand out. Overall, UI animations are valuable for creating engaging and effective user interfaces. By carefully considering the purpose and design of animations, designers can create experiences that delight users and drive business success.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n\n## Types of UI Animation\n\n![UI Animation ](https://cdn.magicui.design/assets/0wxzplhzrkab.jpg)\n\n### Micro-Interactions: The Subtle Art of Feedback\n\nMicro-interactions are often overlooked yet crucial [elements of UI design](https://www.toptal.com/designers/prototype/a-practical-guide-to-ui-animation). They provide instant visual feedback to user actions. They are subtle animations with a short duration, yet they can significantly enhance the user experience by making the interface more responsive and alive.\n\n#### Examples\n\n- Hover effects: Buttons that pulsate, change color, or grow slightly when hovered over. Click animations: Checkboxes that animate when clicked or dropdown menus that slide down smoothly. Tooltips: Animated tooltips that appear when a user hovers over an element, providing additional information.\n- Haptic feedback: Vibrations or other physical sensations accompanying user actions, such as swiping or tapping.\n- Importance: Micro-interactions can improve usability; by providing immediate feedback, users can understand the state of their actions.\n- Create a sense of delight: They can add a touch of personality and make the interface more enjoyable.\n- Enhance accessibility: Micro-interactions can provide auditory or haptic feedback for users with visual impairments.\n\n### Loading and Progress: Keeping Users Informed\n\nLoading and progress animations are essential for maintaining user engagement and preventing frustration, especially when tasks take longer than expected. They provide visual cues about the status of ongoing processes, such as loading data, processing information, or completing a task.\n\n#### Examples\n\n- Spinning loading icons: The classic animated circles or dots indicating a process are in progress.\n- Progress bars: Horizontal or vertical bars that fill up over time, showing the completion percentage.\n- Animated skeletons: Placeholders gradually reveal content as it loads, giving users a preview of what to expect.\n- Countdown timers: Visual indicators show the time left before a process is complete.\n- Importance: Loading and progress animations can Reduce perceived wait time. By providing visual feedback, they can make tasks take less time.\n- Improve user satisfaction: They can help prevent users from feeling frustrated or abandoned.\n- Increase trust: They can demonstrate that the system works and the user's input is processed.\n\n### Navigation: Guiding Users Through the Interface\n\n[Navigation animations](https://dribbble.com/tags/navigation-animation) guide users through the interface and make it easier for them to navigate. They can highlight menu items, indicate transitions between pages, and provide visual cues about the current location within the interface.\n\n#### Examples\n\n- Menu animations: Items that slide in or out, expand or collapse, or fade in and out.\n- Page transitions: Effects like fading, sliding, or zooming that accompany transitions between pages.\n- Breadcrumbs: Animated breadcrumbs that show the user's current location within the hierarchy of pages.\n- Parallax scrolling: Background elements that move at different speeds than the foreground, creating a depth effect. Importance:\n- Navigation animations can Enhance user experience: They can make the interface more intuitive and engaging.\n- Improve usability: They can help users understand the interface's structure and navigate it more easily. Create a sense of immersion: They can create a more immersive and engaging experience for the user.\n\n### Storytelling and Branding: Creating Emotional Connections\n\nStorytelling and branding animations create a specific mood or tell a brand story. They can be found on hero sections, landing pages, or other website areas. These animations can build a strong brand identity, engage users emotionally, and make the website more memorable.\n\n#### Examples\n\n- Animated hero sections: Animated visuals that tell a story about the brand's values or products.\n- Brand-specific animations: Animations that use the brand's colors, typography, and imagery to create a cohesive visual experience.\n- Emotional storytelling: Animations that evoke specific emotions, such as joy, excitement, or nostalgia.\n- Interactive animations allow users to interact with the content, creating a more engaging experience.\n- Importance: Storytelling and branding animations can Create a strong brand identity. They can help to differentiate the brand from competitors and make it more memorable.\n- Engage users on an emotional level: This can create a deeper connection with users and increase their likelihood of remembering the brand.\n- Make the website more memorable: They can help create a lasting impression and make it more enjoyable.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to create a beautiful and functional startup landing page.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## Implementing UI Animation\n\n![UI Animation](https://images.unsplash.com/photo-1607798748738-b15c40d33d57?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxjb2RlcnxlbnwwfHx8fDE3MjQ4MzYxMjh8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### UI Animation and Transitioning: What You Should Know to Get Started\n\nUI animation helps create a more interactive user experience. It can show visitors their actions have been registered and help move them through a web page. For instance, if a user clicks on a button, you can animate it to show that their action has been recognized. This helps create a more intuitive experience and can reduce the likelihood of users becoming frustrated or confused. Animation can also create engaging storytelling experiences by moving users through visual changes.\n\nAs a user scrolls down a page, you can animate elements to transition into view. This helps to create a more dynamic experience. UI animation can also be less visually jarring than sudden transitions. Instead of a web page abruptly changing when a user clicks on a button, you can animate the transition to create a smoother visual experience. Users can become frustrated with sudden changes, but a well-implemented UI animation can create more seamless transitions that improve the user experience.\n\n### Implementing UI Animation\n\nModern [web development frameworks](https://www.techtarget.com/searchcontentmanagement/definition/web-development-framework-WDF) offer powerful tools for creating animations. Some popular methods include:\n\n### CSS Animations\n\n[CSS animations](https://www.w3schools.com/css/css3_animations.asp) are the simplest way to create animations and transitions on a website. Using CSS, you can define animations and transitions directly within your stylesheets. Animations and transitions can also be implemented directly within your HTML code.\n\n### Transition and Animation Properties\n\nThe transition property lets you specify how CSS properties should change over time. The animation property defines a sequence of animation keyframes that can be applied to elements.\n\n#### Example\n\n```css\n.button {\n    transition: background-color 0.3s ease-in-out;\n}\n.button:hover {\n    background-color: #007bff;\n}\n```\n\n#### Use Code With Caution \n\nAdvantages\n\n- Simple to implement.\n- Suitable for basic animations.\n\nDisadvantages\n\n- Limited customization options.\n- It can be challenging for complex animations.\n\n#### JavaScript Libraries \n\n- Framer Motion: A powerful JavaScript library for building React components with animation.\n- GSAP: A high-performance animation library for JavaScript.\n\n#### Example (using Framer Motion)\n\n```javascript\nimport { motion } from \"framer-motion\"\n\nconst Button = () => {\n  return (\n    <motion.button whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>\n      Click me\n    </motion.button>\n  )\n}\n```\n\n#### Use Code With Caution.\n\nAdvantages\n\n- Extensive customization options.\n- Suitable for complex animations and interactions.\n\nDisadvantages\n\n- It can be more complex to use.\n- It may require additional learning.\n\n#### UI Libraries \n\n- MagicUI: A free and open-source UI library with pre-built animated components.\n\n#### Example (using MagicUI)\n\n```javascript\nimport { Button } from \"magicui\"\n\nconst MyComponent = () => {\n  return <Button variant=\"primary\">Click me</Button>\n}\n```\n\n#### Use Code With Caution.\n\nAdvantages\n\n- Save time and effort.\n- Ensure consistency and quality.\n- Easy to integrate.\n\nDisadvantages\n\n- It may be less customizable than building animations from scratch.\n\n#### Benefits of using a UI library\n\n- Save Time: Pre-built components eliminate the need to code animations from scratch.\n- Maintain Consistency: Ensures design consistency across your website.\n- Easier Integration: Components integrate seamlessly with popular frameworks like React and Tailwind CSS.\n\n## Designing a Website with MagicUI\n\n![UI Animation ](https://images.unsplash.com/photo-1487611459768-bd414656ea10?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8b24lMjBsYXB0b3B8ZW58MHx8fHwxNzI0ODM2MTQyfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n[MagicUI is a UI library](https://pro.magicui.design/docs/templates/startup) designed for web designers and engineers to enhance the user experience. It features a comprehensive collection of pre-built animated components and is especially useful for creating visually appealing and interactive websites. With MagicUI, you can build dynamic websites without extensive coding. This empowers you to focus on the creative aspects of your designs rather than getting bogged down in technical details.\n\n### Get Ready to Create with MagicUI’s Extensive Library of Components\n\n[MagicUI offers various components](https://pro.magicui.design/docs/templates/startup), including buttons, modals, dropdowns, progress bars, and more. Each element is carefully crafted to provide a visually pleasing and intuitive user experience. You can easily add these components to your project to help you organize information and create a logical flow to your website. Users will find your site more engaging and easier to navigate, leading to a better overall experience and more favorable impressions of your brand.\n\n### Customize MagicUI Components to Fit Your Design Needs\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), allowing you to tailor them to your design needs. You can modify colors, fonts, sizes, and other properties to ensure that the components seamlessly integrate with your brand identity. This means you can add dynamic features to your website without sacrificing your unique look and feel.\n\n### Apply Animation Presets to Bring Your Designs to Life\n\nMagicUI offers a [variety of animation](https://pro.magicui.design/docs/templates/startup) presets that can be applied to components with just a few lines of code. This allows you to quickly add dynamic effects to your website without creating animations from scratch. The animation presets help you make more engaging designs that capture your users' attention and encourage them to explore your site further.\n\n### Easy Integration with React and Tailwind CSS\n\nMagicUI is [designed to work smoothly](https://pro.magicui.design/docs/templates/startup) with popular web development frameworks like React and Tailwind CSS. This makes integrating MagicUI components into your existing projects easy, saving time and effort.\n\n### Get Started with MagicUI in Just a Few Steps\n\nTo get started with MagicUI, follow these steps:\n\n#### 1\\. Installation\n\nInstall MagicUI using npm or yarn package manager.\n\n#### 2\\. Import Components\n\nImport the desired components into your React project.\n\n#### 3\\. Customize and Integrate\n\nCustomize the components using props and integrate them into your design.\n\n#### 4\\. Explore MagicUI Pro (Optional)\n\nFor pre-built website templates and additional features, consider exploring MagicUI Pro.\n\n### MagicUI: A Beginner’s Best Friend for Creating Dynamic Websites\n\nMagicUI allows designers to [create dynamic and engaging websites](https://pro.magicui.design/docs/templates/startup) with minimal effort. By providing a rich library of pre-animated components, [MagicUI frees designers](https://pro.magicui.design/docs/templates/startup) from the complexities of coding animations, allowing them to focus on the creative aspects of their designs. With MagicUI, you can easily add visual interest and interactivity to your website, making it more engaging and memorable for your users.\n\n## Creating Engaging User Experiences with UI Animation\n\n### Animation Psychology: How Users Respond to UI Animation\n\nUI animation is a powerful tool for enhancing the user experience and creating memorable websites. By understanding the psychology of animation, you can effectively leverage this technique to engage your audience and achieve your design goals.\n\n#### Attention\n\nAnimations can capture attention and draw users' eyes to essential elements. For example, a subtle animation highlighting a call-to-action button can encourage users to take the desired action.\n\n#### Engagement\n\n[Interactive animations](https://dreamfarmstudios.com/blog/interactive-animation/) encourage users to explore and interact with the website. For example, a hover animation on a menu item can indicate that it is clickable, prompting users to investigate further.\n\n#### Emotional Connection\n\nAnimations can evoke emotions and create a memorable experience. For example, a heartwarming animation associated with a charity website can make a positive emotional connection with users.\n\n### Best Practices for UI Animation \n\n#### Keep it Simple\n\nAvoid overly complex animations that distract or confuse users. Focus on creating animations that are visually appealing and easy to understand.\n\n#### Be Consistent\n\nUse a consistent [style and timing for animations](https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function) throughout your website. This will help to create a cohesive and professional experience.\n\n#### Consider Accessibility\n\nEnsure animations are accessible to users with disabilities. Use alternative text for images and videos, and avoid using animations that may be difficult for users with visual impairments to perceive.\n\n#### Test and Iterate\n\nTest your animations on different devices and browsers to ensure compatibility. Gather feedback from users to identify any issues and make improvements.\n\n### Case Studies of Successful UI Animation\n\n#### Airbnb\n\nAirbnb uses subtle animations to guide users through booking and create a more immersive experience. For example, the map view animates smoothly as users zoom in and out, providing a seamless and engaging user experience.\n\n#### Dribbble\n\nDribbble employs animations to showcase user portfolios and create a visually engaging platform. The \"Like\" button animates when clicked, providing instant feedback to users.\n\n#### Mailchimp\n\nMailchimp's animated email templates make the email creation process more enjoyable and engaging. The drag-and-drop interface features smooth animations that make it easy for users to create visually appealing emails.\n\nExperiment with different animation styles and techniques to find what works best for your design goals.\n\n## Tips for Effective UI Animation\n\n![UI Animation ](https://cdn.magicui.design/assets/c0oy5tv1zvh.jpg)\n\n### Keep UI Animations Straightforward\n\nAvoid overly [complex animations](https://amp.dev/documentation/guides-and-tutorials/develop/animations/introduction_to_animations/) that can distract or confuse users. Focus on creating animations that are visually appealing and easy to understand.\n\n### Consistency Is Key \n\nUse a consistent style and timing for animations throughout your website. This will help to create a cohesive and professional experience.\n\n### Accessibility Matters\n\nEnsure animations are accessible to users with disabilities. Use alternative text for images and videos, and avoid using animations that may be difficult for users with visual impairments to perceive.\n\n### Test and Iterate\n\n[Test your animations](https://www.linkedin.com/advice/3/how-can-you-effectively-use-animation-special-zdypf#:~:text=Absolutely%2C%20using%20animation%20sparingly%20and,important%20to%20use%20it%20judiciously.) on different devices and browsers to ensure compatibility. Gather feedback from users to identify any issues and make improvements.\n\n### Use Animations Sparingly\n\nUse animations sparingly. Use them strategically to highlight essential elements or enhance the user experience.\n\n### Prioritize Functionality\n\nEnsure that animations do not interfere with your website's core functionality. The primary goal should be improving usability, not creating a visually impressive experience.\n\n### User Control Enhances the Experience\n\nAllow users to control animations, such as providing an option to disable them. This can accommodate users with visual sensitivities or preferences for a more minimalist experience.\n\n### Use Appropriate Timing\n\nChoose animation durations appropriate for the context. Fast animations can provide quick feedback, while slower animations emphasize essential elements.\n\n### Avoid Overloading Users\n\nToo many animations can be overwhelming and distracting. Use them sparingly and strategically to enhance the user experience.\n\n### Test on Different Devices\n\nEnsure your animations look and perform well on various devices, including mobile phones, tablets, and desktops.\n\n### Consider the User's Context\n\nThink about the users' goals and the context in which they interact with your website. Use animations that support the users' tasks and enhance their experience.\n\n### Avoid Clutter in UI Animation\n\nMore animations can make the interface manageable and help you focus on the essential elements. However, use animations selectively and sparingly.\n\n### Test on Different Browsers and Devices\n\nEnsure that your animations work as expected across different browsers and devices.\n\n### Consider the Impact on Performance\n\nAnimations can impact page load times and overall performance. Optimize your animations to ensure a smooth user experience.\n\n### Use Animations to Guide Users\n\nAnimations can guide users through the interface and highlight essential elements. For example, a subtle animation can indicate that a button is clickable or a menu is open.\n\n### Use Animations to Provide Feedback\n\nAnimations can provide visual feedback to users, such as indicating a task's completion or an action's success.\n\n### Use Animations to Create a Memorable Experience\n\nAnimations can help create a memorable and engaging user experience. For example, a well-designed animation can make a website feel more alive and interactive. By following these tips, you can create effective UI animations that enhance the user experience and contribute to your website's success. Remember to use animations strategically and thoughtfully to positively impact your users.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI library](https://pro.magicui.design/docs/templates/startup). We designed this tool specifically for design engineers, and it shows. The library offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. What sets MagicUI apart from other libraries is our focus on UI animation. The components within this library help bridge the gap between design and development so that you can create stunning user interfaces for your web applications with minimal effort.\n\n### The UI Animation Components of MagicUI\n\n[MagicUI features](https://pro.magicui.design/docs/templates/startup) a range of visually appealing and interactive elements that can be easily integrated into web applications. The library’s highly customizable components enable seamless adaptation to match your desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to allow developers to craft captivating digital experiences.\n\nFor example, the animated components in [MagicUI help enhance user experience](https://pro.magicui.design/docs/templates/startup) by making your website feel more responsive. Along with our free component library, MagicUI Pro allows you to save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/ui-card-design.mdx",
    "content": "---\ntitle: Mastering UI Card Design Principles\ndescription: >-\n  Explore essential UI card design principles. Learn to build functional,\n  visually appealing cards that improve user experience and engagement on any\n  platform.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-7f571bc3-8464-43a2-9baa-faac8197120c.jpg\nauthor: Dillion Verma\ntags:\n  - ui card design\n  - ui components\n  - ux design principles\n  - interface design\n  - component design\npublishedOn: \"2025-10-25T10:06:37.630675+00:00\"\nfeatured: true\n---\n\nUI card design is really all about creating those small, rectangular modules you see everywhere online. Think of them as _digital playing cards_, each holding a little packet of related information. They’re incredibly flexible containers for text, images, and buttons, making complex data **easy to scan and digest** at a glance.\n\n## Why UI Cards Are the Building Blocks of Modern Design\n\n![Stylized illustration of various UI cards floating and arranging themselves, symbolizing modular design.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/5f5cab1f-0eea-4eae-9d86-17ce5108c5e8.jpg)\n\nI like to think of UI cards as the LEGO bricks of a digital interface. Each card is its own self-contained unit—a bite-sized piece of information that users can quickly understand. From your social media feed to an e-commerce store, cards have become a true cornerstone of modern design.\n\nThis modular approach is fantastic for bringing order to potential chaos. Instead of hitting users with a wall of text or a jumble of images, cards group everything into neat, scannable chunks. This cuts down on cognitive load, letting people process what they're seeing much faster and with way less effort.\n\n### The Power of Modularity and Flexibility\n\nThe real magic of UI card design is in its modularity. Since every card works like an independent component, you can easily rearrange, filter, and stack them to create responsive layouts that just _work_. This adaptability is key to a consistent and intuitive experience on any device, from a huge desktop monitor to a tiny smartphone screen.\n\n> A well-designed card doesn't just present information; it tells a story at a glance. It guides the user's eye from the main image to the headline, and finally to the call-to-action, creating a clear and logical path.\n\nThis is why mastering card-based layouts isn't just a passing trend. It's a fundamental skill for anyone creating scalable, user-friendly digital products. In fact, using cards effectively is often a key part of broader strategies, as highlighted in these [Top 7 Website Design Tips For Small Business Success](https://sharpetools.com/blog/top-7-website-design-tips-for-small-business-success/).\n\nBy getting a handle on how to structure these essential pieces, you unlock the ability to build interfaces that are both beautiful and incredibly functional. To dig deeper into this foundational concept, check out our guide on [what UI components are](https://magicui.design/blog/what-are-ui-components) and see how they form the backbone of modern apps.\n\n## Deconstructing the Anatomy of a Perfect UI Card\n\nIf you want to get good at **UI card design**, you have to know what they're made of. Don't think of a card as just one thing. Think of it as a tiny, self-contained system where every single piece has a job to do. When all those pieces work together, you get a user experience that's clear, intuitive, and just plain works.\n\nA great card is like a well-designed storefront window. Its job is to grab your attention and give you just enough information to make you want to step inside—or in this case, click. It's a careful balancing act between looking good and being useful. By breaking a card down into its core parts, we get a practical blueprint for building modules that are both beautiful and functional.\n\n### The Foundational Elements\n\nAt its heart, every UI card is built on a few non-negotiable elements. These are the pieces that give the card its structure and purpose.\n\n- **The Container:** This is the card's skeleton—the box that holds everything together. It uses color, borders, or a subtle shadow to separate its contents from the rest of the page, creating a neat, digestible chunk of information.\n- **Media Element:** This is often the star of the show. An image, video, or illustration can grab a user's attention far faster than text ever could. It sets the tone and provides immediate context. In fact, studies show that content with relevant images gets **94% more views** than content without.\n- **Headline or Title:** This is the most important piece of text on the card. It needs to be short, descriptive, and easy to scan, telling the user exactly what the card is about in a heartbeat. A clear headline anchors the card’s entire information hierarchy.\n\n> The secret to effective card design lies in establishing a clear visual hierarchy. Your design should effortlessly guide the user's eye from the most important element (often the image or headline) down to the secondary information and finally to the call-to-action.\n\n### Supporting and Actionable Components\n\nOnce you've laid the foundation, supporting elements add context and nudge the user toward an action. These components add depth, turning the card from a static display into something interactive.\n\nLet's break down the most common components you'll be working with.\n\n| Key Components of Effective UI Cards |\n| :----------------------------------- | :------------------------------------- | :------------------------------------------------------------------------------- |\n| **Component**                        | **Primary Function**                   | **Design Best Practice**                                                         |\n| **Container**                        | Groups and separates content.          | Use subtle shadows or borders to lift it off the page without being distracting. |\n| **Media**                            | Grabs attention and provides context.  | Ensure images are high-quality, relevant, and optimized for fast loading.        |\n| **Headline**                         | Communicates the primary subject.      | Keep it concise, scannable, and use a larger font size to establish hierarchy.   |\n| **Supporting Text**                  | Offers a brief description or details. | Limit it to 1-2 short sentences. Brevity is key.                                 |\n| **Call-to-Action (CTA)**             | Prompts a specific user action.        | Use a clear, action-oriented label (e.g., \"View Project\") on a prominent button. |\n\nEach element plays a crucial role in the card's overall effectiveness.\n\nFor instance, supporting text offers a quick summary or extra detail that backs up the headline. It should be short and sweet, giving just enough context without creating a wall of text.\n\nFinally, you have the **Call-to-Action (CTA)**, which is the whole point of the card. Whether it’s a button that says \"Learn More\" or an icon for \"Add to Cart,\" the CTA tells the user exactly what to do next. To see how these elements come together in a real-world component, check out how you can build a flexible and accessible [MUI Card component](https://magicui.design/blog/mui-card) that follows these very principles.\n\nBy deconstructing a card into these essential parts, you can approach the design process with a clear strategy. Every component has a purpose, and understanding how they all interact is the key to creating UI cards that not only look fantastic but also get users to take action.\n\n## Applying Fundamental Card Design Principles\n\nKnowing the anatomy of a card is one thing, but applying core design principles is what turns a simple box into a genuinely effective user experience. These principles are the invisible hand guiding a user's eye, building trust, and making every click feel natural. Without them, even a perfectly built card can feel cluttered and confusing.\n\nThe real goal here is to create a visual language that users get instantly. It's a delicate dance between **visual hierarchy**, **consistency**, and **accessibility**. When you nail this trio, the card doesn’t just show information—it communicates it, making the user's journey feel completely seamless.\n\nThe explosion of card-based layouts wasn't an accident. They were the perfect answer to our need for modular, bite-sized content on screens of all shapes and sizes. This design pattern really hit the mainstream after [Google's Material Design](https://m2.material.io/) framework championed it back around **2013**. By **2015**, cards were absolutely everywhere, celebrated for their knack for structuring information in a way that just clicks with users. You can dig deeper into some of these [foundational mobile app design trends on fuselabcreative.com](https://fuselabcreative.com/mobile-app-design-trends-for-2025/).\n\n### Establishing a Clear Visual Hierarchy\n\nVisual hierarchy is simply the art of arranging things to show what's most important. For a UI card, it’s about telling the user exactly what to look at first, second, and third, all in a split second. You can pull this off by playing with a few key visual cues.\n\n- **Size and Scale:** Make the most important element—like a product shot or a big headline—the largest. It's an instant magnet for the user's attention.\n- **Color and Contrast:** A vibrant call-to-action (CTA) button practically jumps off a muted background, screaming, \"Click me!\" This signals its role as the primary action.\n- **Whitespace:** Don't fear the void! Using whitespace (or negative space) effectively keeps a card from feeling claustrophobic. It gives elements room to breathe and makes the whole thing much easier to scan.\n\n> By strategically using these visual cues, you create a clear focal point. This ensures users can scan the card in seconds and extract the most critical information without conscious effort, reducing cognitive load significantly.\n\n### Ensuring Consistency and Scannability\n\nConsistency is the bedrock of a trustworthy interface. When all your cards speak the same design language—using the same fonts, button styles, and spacing—users quickly learn the rules of the road. This predictability builds confidence and makes the entire experience feel intuitive, not chaotic.\n\nScannability and consistency are two sides of the same coin. Let's be real: users rarely read every single word. They scan for keywords and things that catch their eye. Breaking up text into short snippets, using bullet points, and adding bold headings makes your cards infinitely easier to digest at a glance.\n\nThis infographic breaks down the typical hierarchy of a well-structured UI card.\n\n![Infographic about ui card design](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/536ce39e-31c7-4266-a6e3-18c36ef354bc.jpg)\n\nYou can see how the container neatly holds everything, leading the eye from the main image down to the text and finally to a clear, actionable button.\n\n### Designing for Accessibility\n\nA truly great design is one that works for everyone. Accessibility isn't some optional add-on; it's a non-negotiable part of the process. It means making sure your cards are just as usable for people with visual impairments or other diverse abilities.\n\nHere are a few key things to keep in mind:\n\n1.  **Sufficient Color Contrast:** Text has to stand out from its background. If it doesn't, it's unreadable. Use tools like a [WCAG contrast checker](https://webaim.org/resources/contrastchecker/) to get it right.\n2.  **Readable Text Size:** Ditch the tiny fonts. Your body text needs to be large enough to be read comfortably on any device, from a massive monitor to a small phone screen.\n3.  **Clear Focus States:** When someone navigates using a keyboard, interactive elements like buttons and links need a visible outline when they're selected. This is a lifeline for users who rely on screen readers or keyboard navigation.\n\nWhen you weave these principles into your design process, you’re no longer just making a box with stuff in it. You’re crafting a powerful, inclusive, and highly effective tool for communication.\n\n## Exploring Common UI Card Patterns in Action\n\n![An assortment of UI card examples from different apps, like e-commerce, social media, and news, laid out neatly.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8583a854-3f05-4bf5-aa64-b11ea3cc3276.jpg)\n\nTheory is one thing, but seeing **UI card design** out in the wild is where it all clicks. Cards aren't a one-size-fits-all solution. They’re more like chameleons, adapting their shape and content to solve a specific problem for a specific user. By looking at a few common patterns, we can see how great design always follows function.\n\nEach pattern is a little masterclass in information hierarchy. An e-commerce site needs to sell. A news app needs to inform. A social platform needs to connect. The card is the vehicle for these goals, and its design is the map that gets the user where they need to go. Let’s break down some of the most effective examples you see every day.\n\n### The E-commerce Product Card\n\nThe product card is the absolute workhorse of online retail. Its one and only job? Conversion. Every pixel is engineered to grab your attention and get you to click.\n\n- **Dominant Image:** The product is the star of the show. A big, high-quality image takes up most of the space, letting you visually size up the item in a split second.\n- **Essential Information:** Just below the image, you get the bare minimum needed to make a decision: the product name, maybe the brand, the price, and often a star rating for a bit of social proof.\n- **Clear Action:** A big, bold \"Add to Cart\" button or a quick-view icon is the unmistakable call-to-action. There’s no ambiguity between seeing something you like and buying it.\n\nThis whole structure works because it mimics how we shop in a real store—you scan the shelf, see the product, check the price tag, and decide if it’s going in your cart.\n\n### The Content and Article Card\n\nHop over to any news site, blog, or content aggregator, and you'll find article cards. Here, the goal is pure engagement—getting you to click through and actually read the full piece.\n\n> A well-designed content card is the ultimate teaser. It gives you just enough to pique your curiosity without spoiling the story, making you feel like you _have_ to know more.\n\nThese cards are all about text hierarchy. The headline is the main event—it needs to be bold and intriguing. It's usually followed by a short snippet that adds a little context. A smaller featured image often tags along to add some visual flair and keep the feed from becoming a wall of text. The publication and date are there, but they’re downplayed to keep your focus right where it belongs: on the content.\n\n### The Social Media Profile Card\n\nOn platforms like [LinkedIn](https://www.linkedin.com/) or X (formerly Twitter), profile cards are digital business cards. They condense a person's or a brand's entire identity into a tiny, easy-to-digest package. The main goal here is recognition and connection.\n\nA profile picture or logo is almost always the anchor, creating an instant human connection. The name is displayed prominently, followed by a short bio or a key identifier like a job title. Most importantly, these cards are loaded with action buttons like \"Follow,\" \"Connect,\" or \"Message,\" making the next step in building that relationship totally obvious.\n\nGetting these designs right has a massive impact. For every dollar invested in UX design—which includes crafting intuitive card layouts—the return can be as high as **$100**. That’s a staggering ROI, and it comes from happier, more loyal users. In fact, well-executed **UI card design** has been shown to boost conversion rates by over **200%**. You can dig into more of the business value of great UX in recent studies on maze.co.\n\n## The Future of Cards with AI and Micro-Interactions\n\n![Futuristic illustration of dynamic, intelligent UI cards that respond to user interaction with subtle animations and glowing effects.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/2a8f3c3d-8d28-49aa-b77d-52e2664ac288.jpg)\n\nAs we look ahead, the humble, static card is on the verge of a massive upgrade. It's evolving into something far more intelligent and alive, thanks to two powerful forces: artificial intelligence and the subtle magic of micro-interactions.\n\nThese aren't just buzzwords. They're fundamentally changing cards from simple containers of information into dynamic, personalized experiences that feel like they're built just for you.\n\nImagine scrolling through an e-commerce app where the product cards don't just sit there. Instead, they cleverly rearrange themselves based on your browsing habits, bubbling the things you'll love right to the top. That's the power of AI-driven design in action, and it's closer than you think.\n\n### The Rise of Intelligent, Personalized Cards\n\nArtificial intelligence is what will make our interfaces feel deeply personal. Instead of showing the same grid of content to everyone, AI algorithms can watch and learn from user behavior—every click, hover, and past purchase—to tailor what each card displays on the fly.\n\nA news app could surface articles it knows you’ll find fascinating. A travel site might tempt you with destinations based on your recent daydreams and searches.\n\nThis kind of hyper-personalization makes for a much more relevant and efficient experience. We're seeing AI get baked right into design tools, helping us create data-driven components faster than ever. The results speak for themselves: companies that have leaned into AI-enhanced card UIs are reporting huge wins, like feature adoption jumping by over **20%** and even doubled in-app sales after a redesign. You can see more of these [emerging UI/UX design trends on uxpin.com](https://www.uxpin.com/studio/blog/ui-ux-design-trends/).\n\n> AI-powered cards can anticipate what a user needs, turning a passive scroll session into an active, guided journey. The interface learns from you, becoming more helpful and intuitive with every single interaction.\n\n### Making Interfaces Feel Alive with Micro-Interactions\n\nIf AI provides the brains, micro-interactions provide the soul. These are the tiny, purposeful animations that breathe life into an interface when you interact with it. Think of a button that gently shifts when you hover over it, or an item that smoothly expands to show more details when you tap.\n\nThese small moments are doing some heavy lifting behind the scenes:\n\n- **Provide Immediate Feedback:** They instantly confirm that the system got your command, like an item hopping into your cart.\n- **Guide the User:** A subtle bounce or a soft pulse can draw your eye to the most important button on the screen.\n- **Create Delight:** A well-crafted, buttery-smooth animation can make an interface feel polished, responsive, and genuinely fun to use.\n\nWhen you weave these little animations into your design, the interface stops feeling like a static document and starts feeling like a responsive, living system. By combining the predictive power of AI with the satisfying feedback of micro-interactions, the future of **UI card design** is shaping up to be more intuitive, personal, and delightful than ever before.\n\nTo see how you can bring these ideas to life, check out our guide on [creating stunning UI animations](https://magicui.design/blog/ui-animation).\n\nAs you start building more and more interfaces, you’ll notice the same questions about **UI card design** keep popping up. Think of this section as a quick cheat sheet—a place to get straight answers that reinforce the core principles we’ve covered and help you navigate real-world design challenges.\n\nIt's the stuff that bridges the gap between knowing the theory and actually putting it into practice day-to-day.\n\n### What Makes a UI Card Design Truly Successful?\n\nA great UI card is a three-way balancing act: it has to look good, be dead simple to use, and actually do its job. If a card is just pretty, it's failed. If it's functional but confusing, it's failed. Success happens when a card gets its core message across in a split second.\n\nThis all comes down to a crystal-clear visual hierarchy. Your user's eye should naturally flow from the most critical piece of info straight to the call-to-action, no friction involved. You get there by keeping the design clean and using whitespace to let every element breathe. A truly successful card just feels right—it delivers value at a glance and nudges the user to take that next step.\n\n### How Does Responsiveness Impact UI Card Design?\n\nResponsiveness isn't a feature you tack on at the end; it's baked in from the very beginning. A card that looks amazing on a 27-inch monitor but falls apart on a phone is a broken design. The beauty of cards is their modular nature, which makes them perfect for responsive layouts, but you have to plan for it.\n\nHere’s how to nail responsive cards:\n\n- **Flexible Grids:** Use a fluid grid that lets your cards rearrange themselves gracefully. They might sit in a three-column layout on a desktop, but they should neatly stack into a single, scrollable column on mobile.\n- **Content Prioritization:** You just don't have the same real estate on a small screen. Be ruthless. Hide or condense less critical information to keep things from feeling cramped. The main message and the primary CTA always get top billing.\n- **Optimized Media:** Make sure any images or videos inside your cards are compressed for mobile. They need to load fast without looking like a pixelated mess.\n\n### What Are the Most Common Mistakes to Avoid?\n\nEven pros fall into the same traps. The absolute biggest one is **information overload**. A card is supposed to be a summary, not a novel. When you cram in too much text, too many buttons, or a bunch of competing visuals, you completely overwhelm the user and kill the card’s main purpose: scannability.\n\n> The most effective UI cards are masters of restraint. They understand that what you choose to leave out is just as important as what you put in. Simplicity is the ultimate sign of a confident and user-focused design.\n\nAnother classic mistake is **inconsistent styling**. When cards in the same interface have different fonts, button styles, or spacing, it creates visual chaos. It feels unprofessional. Consistency builds trust and makes the entire experience feel cohesive. And finally, don't ever neglect accessibility. Using poor color contrast or tiny, unreadable fonts isn't just bad design—it's a critical failure that excludes people.\n\n---\n\nReady to build interfaces that not only look incredible but are also a joy to use? **Magic UI** offers a library of **150+** free, open-source animated components and stunning templates to bring your vision to life in minutes. [Start creating with Magic UI today](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/ui-framework-for-react.mdx",
    "content": "---\ntitle: Choosing a UI Framework for React\ndescription: >-\n  Discover the best UI framework for React. This guide explores key features,\n  benefits, and how to evaluate options to streamline your development.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-4119338f-87b0-4f7d-8ad5-8753c3f454f5.jpg\nauthor: Dillion Verma\ntags:\n  - ui framework for react\n  - react ui libraries\n  - frontend development\n  - react components\n  - magic ui\npublishedOn: \"2025-11-04T09:02:34.962924+00:00\"\nfeatured: true\n---\n\nEver tried to build a piece of complex furniture without instructions or pre-cut parts? You'd spend ages measuring, cutting, and hoping every piece fits together perfectly. That’s a lot like building a web application's user interface from scratch.\n\nA **UI framework for React** is like getting a professional, flat-pack furniture kit. Instead of starting with raw lumber, you get a box full of perfectly crafted, ready-to-use components like buttons, forms, and navigation bars that are guaranteed to fit together. This simple shift saves a massive amount of time and headache.\n\n## What Is a UI Framework for React\n\n![A sleek and modern user interface with various components like charts and graphs.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/382c6d62-65a6-4c93-98f8-1185e5aca846.jpg)\n\nWithout a framework, you're on the hook for designing every single button, styling every input field, and manually ensuring that everything looks and acts the same across your entire app. It’s not just tedious; it's a recipe for inconsistency, which can seriously degrade the user experience.\n\nThis is where a **UI framework for React** steps in. It’s a comprehensive toolkit of reusable components designed to solve these exact problems. These aren't just basic HTML elements; they're fully functional, beautifully designed pieces of your front end, all built to play nicely with React.\n\n### Core Components of a React Framework\n\nAt its heart, a good framework is a collection of dependable building blocks that handle all the common UI chores. This frees you and your team up to focus your energy on what makes your app unique, rather than reinventing the wheel for the hundredth time.\n\nHere's what you typically get right out of the box:\n\n- **Pre-designed Components:** A huge library of elements like modals, cards, alerts, and menus that are ready to drop into your project.\n- **Design System:** A built-in set of rules, patterns, and principles that keeps your app's look and feel cohesive from one page to the next.\n- **Built-in Accessibility:** Many frameworks are designed with accessibility standards (like ARIA attributes) from the ground up, making your app usable for everyone.\n- **Responsiveness:** Components are almost always designed to adapt beautifully to different screen sizes, from a tiny phone to a huge desktop monitor.\n\n> The core idea is simple: develop faster, maintain better consistency, and ship a more polished product. You're standing on the shoulders of countless developers who have already solved the everyday challenges of UI design.\n\nThe React ecosystem is absolutely massive. It now powers over **11 million websites worldwide**, which is nearly **4.8% of the entire internet**. This incredible adoption rate shows just how powerful and flexible it is for building modern web apps.\n\nBy choosing a UI framework, you’re plugging directly into this powerful ecosystem and getting a huge head start. To get a better feel for the options out there, check out our guide on the [fundamental differences in UI frameworks](https://magicui.design/blog/ui-frameworks). It’s the perfect primer for making a smart decision for your next project.\n\n## Why Use a React UI Framework\n\nLet's be honest, picking a UI framework for your React project isn't just a technical detail—it's a strategic call that ripples across your timeline, budget, and the final quality of your product.\n\nThink about it this way: you could try to build a car engine by hand, forging every single piston and screw yourself. While that’s technically possible, it’s a whole lot smarter (and faster) to start with professionally engineered parts. A UI framework is exactly that: a toolbox full of high-quality, pre-built parts for your user interface.\n\nThis approach gives you some serious advantages right out of the gate. Let’s break down the four big reasons why using a React UI framework is a complete game-changer for development teams.\n\n### Accelerate Your Development Timeline\n\nThe most immediate win? A massive boost in speed. Instead of grinding away writing CSS for a dropdown menu or wrangling the state for a modal window from scratch, you just import a component that’s already built, tested, and ready to roll. That alone saves countless hours of repetitive, mind-numbing work.\n\nThis efficiency isn't just a small-scale win; it compounds across the entire project. React is all about reusable components, and a framework supercharges this by giving your team a shared library to pull from. In fact, studies show that adopting React can slash development costs by up to **40%** compared to old-school methods, mostly because you're not constantly reinventing the wheel. You can see more on developer trends in the [2025 Stack Overflow developer survey](https://survey.stackoverflow.co/2025/technology).\n\n> By leaning on pre-made components, your team can finally stop rebuilding the same basic elements and start focusing on the unique features that actually deliver value to your users. It’s a fundamental shift that helps you stay competitive and ship products faster.\n\n### Ensure Universal Design Consistency\n\nA great app speaks a single, consistent visual language. A UI framework is your secret weapon for making that happen, providing a unified design system from the start. Every button, every card, and every form field follows the same stylistic rules.\n\nThis helps you sidestep a classic problem: different parts of an app, built by different developers, slowly starting to look and feel like they belong to separate products. The framework is the guardian of your aesthetic, ensuring a professional, polished, and trustworthy user experience on every single screen. And it's not just about looking good—this consistency makes your app more predictable and intuitive for people to use.\n\n### Bake In Accessibility from the Start\n\nBuilding an inclusive app that everyone can use—including people with disabilities—is non-negotiable in modern web development. But let’s face it, correctly implementing accessibility standards like ARIA (Accessible Rich Internet Applications) can be a real headache. It's complex, tedious, and easy to get wrong.\n\nThis is where a good **UI framework for React** becomes invaluable. It handles most of the heavy lifting for you by building accessibility right into the components themselves. This typically includes:\n\n- **Proper ARIA Roles:** Components come tagged with the correct roles and attributes, making them easy for screen readers to understand.\n- **Keyboard Navigation:** Users can navigate interactive elements like menus and modals using just their keyboard—no mouse required.\n- **Focus Management:** The framework intelligently manages focus, guiding users through complex interactions without leaving them lost or confused.\n\n### Tap Into Community and Support\n\nFinally, when you adopt a popular framework, you’re not just getting code—you’re joining a community. You're never coding in a vacuum. You get instant access to a massive group of developers who have almost certainly tackled the same challenges you're facing right now.\n\nThis support system is a huge safety net. It comes with extensive documentation, tons of tutorials, and a network of peers who are ready to help you out. On top of that, active frameworks get regular updates that add new features, patch security holes, and keep everything compatible with the latest versions of React.\n\n## How to Evaluate a UI Framework\n\nPicking the right **UI framework for React** feels a lot like choosing a foundational partner for a big project. The choice you make upfront will echo through the entire development lifecycle, so it’s worth getting right. But how do you cut through the noise and move from a sea of options to a confident decision?\n\nThe trick is to look past the flashy landing pages and focus on what will actually impact your day-to-day work and the final quality of your app.\n\nThis simple decision tree helps frame the initial choice. If you need to move fast, a framework is almost always the answer.\n\n![Infographic about ui framework for react](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/9aa5fb5d-e56f-442a-9e71-b3bf60fcaa38.jpg)\n\nAs the graphic shows, when speed is the priority, leveraging a framework beats building everything from the ground up, hands down.\n\n### Assess the Component Library\n\nFirst things first, dive into the heart of the framework: its components. A great library isn't just a numbers game; it's about having the _right_ building blocks. Does it cover the essentials your project needs, like complex data tables, versatile date pickers, or solid form elements?\n\nThen, look closer at the quality. Are the components well-designed, accessible out of the box, and battle-tested? Honestly, a framework with fewer, more polished components is often way more valuable than one boasting hundreds of half-baked options.\n\n### Evaluate Customization and Theming\n\nYour app needs to look like _your_ app, not a clone of the framework's documentation site. That’s why customization is non-negotiable. See how easy it is to change colors, fonts, spacing, and component styles. Does it play nicely with modern tools like [Tailwind CSS](https://tailwindcss.com/) for intuitive theming, or are you going to be stuck fighting a tangled mess of CSS overrides?\n\n> A framework should serve your design system, not force you into its own. The best options provide a solid, unopinionated foundation that you can easily mold to fit your unique visual identity without writing mountains of override styles.\n\n### Analyze the Developer Experience\n\nA fantastic developer experience (DX) is a huge productivity booster. It’s what makes working with a tool a joy instead of a chore. For me, it boils down to a few key things:\n\n- **Documentation Quality:** Is the documentation clear, thorough, and packed with real-world examples? Bad docs can turn a five-minute task into a frustrating hour-long scavenger hunt.\n- **API Design:** Are the component props logical and easy to remember? A clean, predictable API means you spend less time referencing docs and more time building.\n- **Community and Support:** Is there an active community on [GitHub](https://github.com/) or Discord? A buzzing community is a great sign that the project is alive and that you’ll be able to find help when you hit a wall.\n\nTo see a direct comparison of how popular frameworks perform on these points, check out our detailed guide to the [best React UI frameworks](https://magicui.design/blog/best-react-ui-framework).\n\nTo give you a clearer picture, here’s a quick rundown of how some well-known frameworks compare on these crucial features.\n\n### React UI Framework Feature Comparison\n\nThis table offers a snapshot of popular React UI frameworks, highlighting their strengths and ideal use cases to help guide your decision.\n\n| Framework      | Component Variety                                                     | Customization                                                               | Performance Focus                                                    | Best For                                                                                  |\n| :------------- | :-------------------------------------------------------------------- | :-------------------------------------------------------------------------- | :------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |\n| **MUI**        | Extensive; covers everything from basic inputs to complex data grids. | High, with a robust theming system. Can be complex.                         | Good, but can be heavy if not optimized.                             | Enterprise applications and projects needing a vast component library out of the box.     |\n| **Chakra UI**  | Strong, with a focus on accessibility and composition.                | Excellent; built with style props for easy, inline customization.           | Very good; components are designed to be composable and lightweight. | Developers who prioritize accessibility, customization, and a great developer experience. |\n| **shadcn/ui**  | A curated collection of high-quality, unstyled components.            | Maximum; you copy-paste components into your project to own and style them. | Excellent; you only add the components you use.                      | Teams that want full control over styling and prefer a non-library approach.              |\n| **Ant Design** | Massive library with an enterprise-grade design language.             | Moderate; designed for consistency but can be hard to override.             | Good, though the bundle size can be large due to its scope.          | Data-intensive back-office systems and internal tools.                                    |\n\nEach framework strikes a different balance. Your job is to find the one whose trade-offs best align with your project's goals.\n\n### Check Performance and Bundle Size\n\nLast but certainly not least, think about performance. Every kilobyte counts, especially for users on slower mobile networks. A bloated framework can kill your app's initial load time and create a sluggish user experience.\n\nLook for frameworks built with performance in mind. Key things to check for are support for **tree-shaking** (which automatically removes unused code) and a minimal core footprint. Some frameworks even publish performance benchmarks, giving you a transparent look at the impact they’ll have on your app's speed.\n\n## Spotlight on Magic UI\n\nMost UI frameworks are all about function—giving you a massive box of practical, workhorse components. But what if you want your interface to do more than just _work_? What if you want it to feel alive and create a little bit of delight for your users?\n\nThat's exactly where a new breed of toolkits comes in, and [Magic UI](https://magicui.design/) is leading the charge. It's less of a traditional component library and more of an animation and design system built for developers who want to craft truly memorable experiences.\n\nThe whole idea behind Magic UI is that modern web apps shouldn't feel static. It's built on the powerhouse combo of **Framer Motion** and **Tailwind CSS**, delivering a collection of beautifully crafted components designed to move with purpose. This sharp focus on fluid, meaningful animation is what makes it stand out in the crowded **ui framework for react** space.\n\nJust take a look at their homepage. You can immediately feel the difference.\n\n![Screenshot from https://magicui.design/](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fb2aa6ad-7c31-4ed5-a402-8550007fda81.jpg)\n\nThe animated grid, the interactive glows—it all speaks to a library that’s built from the ground up to help you create something dynamic and engaging right out of the box.\n\n### Animation Made Simple\n\nLet's be honest, implementing slick animations is often a huge pain. You see something amazing on Dribbble, but turning that vision into reality can mean days of wrestling with complex CSS or clunky JavaScript libraries. Magic UI cuts right through that frustration.\n\nThe goal here is to make high-quality animation accessible to everyone. Forget spending hours fighting with keyframes and transition logic.\n\n> With Magic UI, you can drop a stunning, interactive component into your project with a simple copy-paste. It frees you up to think about the bigger picture instead of getting bogged down in the weeds of implementation.\n\nThis couldn't be more relevant today. React's dominance just keeps growing. The latest Stack Overflow Developer Survey shows it's now used by **49% of developers**, making it the undisputed king of the frontend. As more of us build with React, the demand for tools that simplify tough jobs—like animation—is only going to get louder. You can dig deeper into [current React trends on Netguru](https://www.netguru.com/blog/react-js-trends).\n\nFrom animated grids and buttons to slick text effects, every component is designed to be both visually impressive and ridiculously easy to use. You can check out the full collection and get started over at the [Magic UI documentation](https://magicui.design/docs).\n\n### How It Works: A Practical Example\n\nGetting a Magic UI component into your project is refreshingly simple. Since it's a collection of individual components, not some giant, monolithic library, you just grab the code for the element you need. That's it. This keeps your app lean and free of code you're not even using.\n\nWant to add a dynamic, animated grid? You just install the dependencies and paste the component's code right into your file.\n\nHere’s a quick peek at what that looks like:\n\n```jsx\nimport { cn } from \"@/lib/utils\"\n\nimport { AnimatedGrid } from \"./components/magicui/animated-grid\"\n\nconst MyAwesomePage = () => {\n  return (\n    <div className=\"bg-background relative flex h-full w-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <AnimatedGrid\n        className={cn(\n          \"[min-height:300px] [min-width:500px] [--duration:20s] [--gap:1rem]\"\n        )}\n      />\n    </div>\n  )\n}\n\nexport default MyAwesomePage\n```\n\nThis straightforward, declarative approach means you can build incredibly rich, animated interfaces with surprisingly little effort.\n\n## Integrating a UI Framework into Your Project\n\nTheory is great, but seeing a **React UI framework** come to life in your own project is where the real fun begins. Let's walk through the actual, hands-on steps of adding a modern framework, using Magic UI as our example. The whole point is to get you from a blank slate to a beautiful, working component in just a few minutes.\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/UGm8djxwC5s\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nOne of the best things about Magic UI is that it isn’t some massive, all-or-nothing library. You’re not bloating your project by installing a giant dependency. Instead, you just pull in the individual, self-contained components you actually need. This approach keeps your project lean and free of dead code.\n\n### Initial Project Setup\n\nBefore you can add any slick animations, you need a basic React project up and running with its core dependencies—especially [Tailwind CSS](https://tailwindcss.com/). Most modern React frameworks like [Next.js](https://nextjs.org/) make this ridiculously easy with simple command-line prompts that get you a new project with Tailwind already configured.\n\nIf you’re starting a new project with Next.js, this one command is all you need:\n\n```bash\nnpx create-next-app@latest my-app --typescript --tailwind --eslint\n```\n\nThat single line scaffolds a brand-new project and handles the TypeScript and Tailwind CSS setup for you. Honestly, it’s the fastest way to lay down a production-ready foundation.\n\n### Installing Your First Component\n\nOnce your project is ready to go, you can start cherry-picking Magic UI components. Let's grab the eye-catching `AnimatedGrid` component as our first victim. The process uses the Magic UI command-line interface (CLI) to pull the component directly into your project.\n\nFirst, you need to initialize the CLI inside your project's main folder:\n\n```bash\nnpx magic-ui-cli@latest init\n```\n\nThis little command takes care of setting up the necessary utilities and configurations. From there, you can add any component you want.\n\n```bash\nnpx magic-ui-cli@latest add animated-grid\n```\n\nNow, this command does something pretty cool. It doesn't just add another line to your `package.json`. It physically copies the `AnimatedGrid` component's source code right into your project, usually creating a `components/magicui` folder for it.\n\n> This \"copy-paste\" method is a core part of the philosophy. It gives you **full ownership** of the code. You can tweak it, restyle it, and bend it to your will without fighting against library defaults or writing a mountain of CSS overrides.\n\n### Using the Component in Your App\n\nWith the component now living in your local codebase, using it is as simple as importing it like you would any other React component.\n\nLet's crack open a page file (for Next.js, that’s probably `app/page.tsx`) and drop in the `AnimatedGrid`. From there, you can customize how it looks and behaves using standard props and familiar Tailwind CSS classes.\n\nHere’s a practical, copy-paste-ready example to get you started:\n\n```jsx\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedGrid } from \"@/components/magicui/animated-grid\"\n\nexport default function Home() {\n  return (\n    <div className=\"bg-background relative flex min-h-screen w-full flex-col items-center justify-center overflow-hidden rounded-lg border md:shadow-xl\">\n      <h1 className=\"z-10 text-center text-5xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\">\n        Welcome to Your New Site\n      </h1>\n      <AnimatedGrid\n        className={cn(\n          \"[min-height:500px] [--duration:30s] [--gap:1rem]\",\n          \"absolute inset-0 h-full w-full\"\n        )}\n      />\n    </div>\n  )\n}\n```\n\nAnd just like that, you’ve woven a sophisticated, animated background into your page. This simple workflow—initialize, add, and import—is how you’ll work with every component in the Magic UI ecosystem. It makes building visually rich interfaces incredibly fast.\n\n## Making the Right Choice for Your Project\n\nPicking a **UI framework for React** isn't about finding some mythical \"best\" option. It's about finding the best fit for _your_ project. The right answer always comes down to a careful balance between your project’s scope, your team's skills, and what you’re ultimately trying to build.\n\nWhat works perfectly for a data-heavy enterprise dashboard would be total overkill for a sleek, animation-focused marketing site. It’s all about context.\n\nThink of this as your final mental checklist before you commit. You need a strategic mindset that sees past the initial setup. Don't just consider how fast you can build something today; think about the long-term reality of maintaining it, scaling it, and getting new developers up to speed down the line.\n\n### Your Final Evaluation Checklist\n\nTo pull it all together, run through these critical questions when you're comparing frameworks:\n\n- **Project Scope:** Does this framework’s component library actually match the features you need? Not just for the MVP, but for where the product is headed?\n- **Team Skills:** Is your team more comfortable getting their hands dirty with deep customization (like [shadcn/ui](https://ui.shadcn.com/))? Or would they be more productive with a library that offers more ready-to-go solutions (like [MUI](https://mui.com/))?\n- **Design Goals:** Are you just trying to build a standard, functional interface, or is a highly polished, beautifully animated user experience a top priority?\n- **Performance Needs:** How much does bundle size and initial load time really matter for your app? Will the framework’s footprint fit within your performance budget?\n\n> Ultimately, the right framework should feel like an accelerator, not an obstacle. It should empower your team to build better and faster, aligning perfectly with both your technical requirements and your creative vision.\n\nOf course, the UI framework is just one piece of the puzzle. It's smart to zoom out and look at your entire development ecosystem. Getting familiar with the broader landscape of [essential product management tools and technology stacks](https://www.aakashg.com/best-product-management-tools/) can give you the context needed to make holistic tech decisions that support your product from start to finish.\n\nFor projects where that aesthetic polish, modern animations, and a top-notch developer experience are non-negotiable, a toolkit like **Magic UI** really starts to shine. It was built specifically for teams that want to create interfaces that don't just work flawlessly but actually _delight_ users with fluid, meaningful interactions. It gives you a clear path to crafting memorable digital experiences without the usual friction that comes with complex animation work.\n\n---\n\nReady to build interfaces that feel alive? Explore the components and templates from **Magic UI** and see how easy it is to add a touch of magic to your next React project. [Get started for free](https://magicui.design).\n"
  },
  {
    "path": "apps/www/content/blog/ui-frameworks.mdx",
    "content": "---\ntitle: \"9 Best UI Frameworks With Visually Appealing Component Libraries\"\ndescription: \"Create beautiful and user-friendly interfaces with these top UI frameworks that offer visually appealing component libraries for your projects.\"\nimage: https://cdn.magicui.design/assets/b6ea4254-8819-4116-a4a6-d38e2b98fddb.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you tired of spending hours searching for the ideal UI Framework for your next design project, only to feel overwhelmed? UI Frameworks are an essential component of the digital design process, impacting the efficiency and quality of your work. Finding the right one can be a daunting task. In this article, we'll provide valuable insights to help you discover the best UI framework for your design project, empowering you to maximize your creativity, efficiency, and quality without unnecessary challenges.\n\nDiscover how Magic UI's user-friendly [React component library](https://magicui.design/) can help you achieve your design project objectives and seamlessly integrate UI Frameworks into your workflow. With Magic UI, you can streamline your design process, enhance your creativity, and deliver exceptional design projects that stand out. Start benefiting from Magic UI today, and get ready to transform your design experience!\n\n## **What Are UI Frameworks**\n\n![UI Frameworks](https://cdn.magicui.design/assets/37g3r8z67jh.png)\n\nDeveloping a user interface (UI) that is both visually appealing and functional can be a time-consuming task for developers. This is where UI frameworks come in. UI frameworks are pre-made sets of code that provide developers with powerful tools to create user interfaces more efficiently. They are designed to simplify the development process, saving developers time and effort. The UI frameworks emphasize responsiveness, ensuring that the UI adapts to different screen sizes and devices. They also prioritize the user experience, with user-friendly interactions and intuitive navigation at the forefront.\n\nUI frameworks are handy tools for developers. They help eliminate redundant coding and provide consistent styling for [UI components](https://www.ibm.com/docs/hu/pm-and-q/2.6.3?topic=framework-ui). With a UI framework, developers can focus more on user interaction and functionality, speeding up the overall UI development process.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **Why Use UI Frameworks?**\n\n![UI Frameworks](https://cdn.magicui.design/assets/xyfouq3j4en.png)\n\n## **Benefits of Using UI Frameworks**\n\n### 1\\. Faster development\n\nUsing UI frameworks can speed up the front-end development process because developers can access pre-written code libraries and ready-to-use, tested components. This means they don’t have to write code for every component from scratch, saving valuable time and effort.\n\n### 2\\. Stunning and consistent UI design\n\nThe best frameworks provide professionally styled UI components, such as buttons, menus, carousels, and sliders, which help build aesthetically pleasing UIs. A UI framework ensures a consistent UI design throughout the application, creating a cohesive user experience.\n\n### 3\\. Less maintenance\n\nBy leveraging a UI framework, developers write less code, which means less maintenance. This reduced codebase simplifies debugging and updating the application, making ongoing maintenance easier and more efficient.\n\n### 4\\. Responsive UI design\n\nUI frameworks like Ext JS offer pre-built responsive UI elements that enhance the user experience. This feature ensures that UI design components adapt seamlessly to various screen sizes and devices, such as desktops, mobile devices, laptops, and tablets.\n\n### 5\\. Cross-browser compatibility\n\nTop UI and JavaScript frameworks are designed to be cross-browser compatible. This means developers can create UI designs and applications that work efficiently across browsers using a single code base. In other words, the UI components provided by these frameworks are tailored to function seamlessly on various browsers.\n\n## **Building Stunning Interfaces with MagicUI**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today.\n\n## Challenges And Limitations Of UI Frameworks\n\n![UI Frameworks](https://cdn.magicui.design/assets/wdg3z9v3c5c.png)\n\n### 1\\. Performance Considerations in Complex Applications\n\nAlthough UI frameworks offer many advantages, some pre-built templates, components, and libraries might not cater well to complex applications with specific requirements. In such cases, we may need more flexibility and customization beyond what the UI framework provides. This can lead to additional coding and slow down the development process, affecting the overall performance of the UI framework.\n\n### 2\\. Performance Overheads\n\nSome UI frameworks have rich and extensive features, including multiple pre-built components and styles. These features offer benefits, but they can also result in larger file sizes. This, in turn, leads to longer loading times and reduced performance, especially in resource-intensive projects.\n\n### 3\\. Potential Compatibility Issues with Other Libraries or Frameworks\n\nIt is essential to manage dependencies carefully and conduct thorough testing. This will ensure the UI framework behaves consistently across different platforms and devices.\n\n### 4\\. Versioning and Maintenance\n\nRegular updates and fixes for UI frameworks bring improvements and new features.They can also introduce incompatibilities that require careful migration and testing.\n\n### 5\\. Vendor Lock-In\n\nChoosing a particular UI framework may tie us to a specific vendor, making it challenging and expensive to switch to a different framework later on. It’s essential to consider more flexible and cost-effective options.\n\nWhile these challenges and limitations exist when using UI frameworks, it’s crucial to remember that their benefits far outweigh the drawbacks. The efficiency and productivity gains from using UI frameworks make them valuable for web development.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- [What Is NextJS](https://magicui.design/blog/what-is-nextjs)\n\n## **9 Most Popular UI Frameworks For Designers**\n\n![UI Frameworks](https://cdn.magicui.design/assets/c17hfs51k7.png)\n\n### 1\\. Magic UI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/docs) for free today at MagicUI.\n\n### When to Use Magic UI\n\nMagic UI is ideal for creating captivating user interfaces with minimal effort, bridging the gap between design and development. It's perfect for design engineers looking to craft visually appealing digital experiences.\n\n### 2\\. React JS\n\nReact is a prevalent JavaScript framework built by Facebook for developing beautiful and functional UIs. It provides pre-built JavaScript code libraries or snippets called components. These components are the building blocks of a React-based app. These are reusable components, meaning you can use them across projects. This means you don’t have to write code for common UI elements for different projects repeatedly. In React framework, you can create any UI element, such as buttons and menus, as custom React components.\n\n### When to Use React\n\nReact.js excels at constructing user interfaces, particularly within single-page applications. Its robustness shines when creating interactive interfaces, minimizing development timelines through component reuse.\n\n### 3\\. Bootstrap\n\nBootstrap is a widely adopted CSS framework that provides a set of predefined UI components and styles for building responsive web applications. It is easy to use with simple and consistent components. Bootstrap also has a large community and extensive documentation.\n\n### When to use Bootstrap\n\nBootstrap is ideal for developers who need a straightforward solution with minimal customization.\n\n### 4\\. Angular\n\nBuilt by Google, Angular is used by thousands of web developers to build single-page applications. It is a TypeScript-based framework that utilizes component-based architecture. Like React, once you build an interface or UI component in Angular, you can reuse it in various projects. Top Angular component libraries include Onsen UI, Angular Material, and Ignite UI.\n\n### When to Use Angular\n\n### 5\\. Semantic UI\n\nSemantic UI is a UI framework that focuses on the semantics of HTML. It provides a simple and intuitive way to create responsive websites. Semantic UI uses human-friendly HTML, which makes it easy for developers to understand and use. It also comes with a wide range of pre-built components that can be used to create custom designs.\n\nDespite its status as a newcomer, Semantic-UI has rapidly ascended to prominence within the framework landscape. Distinguished by its intuitive user interface and simplified functionality, it leverages natural language constructs to render code self-explanatory.\n\n### When to use Semantic-UI\n\nSemantic-UI excels in scenarios necessitating a lightweight and sleek user interface design, catering to an excellent user experience.\n\n### 6\\. Sencha Ext JS\n\nThe amalgamation of Sencha Ext JS and Sencha Touch has resulted in a robust JavaScript framework primed to create cross-platform mobile applications. Esteemed for its high-performance UI components, including pivot grids, trees, lists, forms, HTML5 calendars, and D3 adapters, Sencha Ext JS empowers developers to attain optimal outcomes.\n\n### When to use Sencha Ext JS\n\nSencha Ext JS serves well in scenarios demanding a steep learning curve, despite potential challenges such as bugs and crashes. Although it boasts a substantial fan base, alternatives offering easier learning curves and enhanced security are available.\n\n### 7\\. Vue.js\n\nVue.js is a progressive JavaScript framework known for its simplicity and flexibility. It allows developers to build user interfaces and single-page applications incrementally. Gaining rapid popularity, Vue.JS is celebrated for its simplicity and straightforwardness, effectively mitigating complexities often encountered by Angular developers. With advantages spanning reduced size and a component-based architecture, Vue.JS development also employs a two-way binding mechanism.\n\n### When to Use Vue.js\n\nGreat for rapid prototyping due to its simplicity and ease of integration.\n\nIdeal for small to medium-sized projects where you need a lightweight framework.\n\nCan be easily integrated into projects using other JavaScript libraries.\n\n### 8\\. Svelte\n\nSvelte is a relatively new front-end framework that shifts much of the work to the compile step, resulting in highly optimized and performant JavaScript code. This sets it apart from frameworks like React and Vue, which synchronize code to update the document object model in alignment with the application state.\n\n### When to use Svelte\n\nSvelte is most suited for compact app projects managed by smaller teams.Its limited support community cautions against employing it for complex undertakings.\n\n### 9\\. Ember.js\n\nEmber.js is an opinionated framework for building ambitious web applications. It provides a solid convention-over-configuration approach, a powerful CLI, and a rich set of out-of-the-box features. Introduced in 2011, Ember.js employs a component-based architecture and employs two-way data binding akin to Angular. It proficiently handles the demands posed by contemporary technologies, making it an ideal choice for complex web and mobile applications.\n\n### When to Use Ember.js\n\nIdeal for projects that benefit from strong conventions and best practices.\n\nBest for complex web applications with multiple dynamic features and interactions.\n\n## **Factors To Consider When Choosing A UI Framework**\n\n### 1\\. Project Requirements\n\nWhen choosing a UI framework, it is critical to consider your project requirements. These requirements could vary from the complexity of the UI design to the project's scalability. An enterprise solution with a complex UI and countless elements will necessitate a UI framework like [Ext JS](https://www.sencha.com/products/extjs/) specifically designed for enterprise-grade app development.\n\n### 2\\. Performance and Loading Times\n\nStudies have repeatedly shown that long loading times can discourage users from engaging with an app or website. Therefore, it is vital to evaluate the performance of a UI framework. Assess whether the UI components, such as data grids, load quickly, are responsive, and are cross-browser compatible.\n\n### 3\\. Design Consistency\n\nConsistency in UI design is crucial for front-end developers and organizations. A uniform design ensures that all UI elements are consistent across a web app or site. A good UI framework offers UI elements created using the best design principles, allowing you to produce a uniform UI and deliver a predictable user experience.\n\n### 4\\. Learning Curve and Documentation\n\nToday's fast-paced software development landscape requires developers and organizations to focus on delivering high-performance apps quickly. Opt for a UI framework that is easy to learn, use, and integrate to save time and effort. Detailed documentation and additional learning resources facilitate learning about the framework's features and implementation, making integration easier.\n\n### 5\\. Integration with Existing Projects\n\nIf you plan to incorporate a UI framework into an existing project to enhance its UI design, assess its ability to integrate with your project. Analyze your app's architectural design pattern and determine whether the framework supports it.\n\n### 6\\. Customizability and Flexibility\n\nWhile top UI frameworks offer beautifully designed and responsive UI components, customization may be necessary to meet project requirements. Select a framework that supports customization for this purpose.\n\n### 7\\. Security Considerations\n\nSecurity is a significant concern, particularly with open-source frameworks. Third-party developers may provide untested components, potentially laden with malware. Common security vulnerabilities include Cross-Site Scripting (XSS), Distributed Denial of Service (DDoS), and SQL Injection. Always evaluate a framework's security and the security features it offers to mitigate risks.\n\n### 8\\. Performance Testing and Optimization\n\nA high-quality framework should function seamlessly across various web apps and efficiently handle data. For example, top frameworks like [Ext JS](https://www.sencha.com/products/extjs/) offer a robust JS grid capable of processing large datasets without compromising app performance, enhancing user experience.\n\n## **The Future Of User Interfaces**\n\n![UI Interfaces](https://cdn.magicui.design/assets/6otzipnomkc.png)\n\nAdvancements in technology are continuously shaping the future of user interfaces. Modern UI Frameworks will continue evolving to become even more versatile. As the digital landscape expands to encompass a wider array of devices, including smartwatches, IoT devices, and even smart home appliances, UI Frameworks must be adaptive and responsive to this diverse ecosystem.\n\n### Emphasizing Accessibility and Inclusivity in UI Frameworks\n\nModern UI Frameworks will also place a significant emphasis on accessibility and inclusivity. Ensuring that digital experiences are available to all users is critical in today's society. In the future, I foresee UI Frameworks becoming more inclusive, accommodating users with disabilities and diverse needs.\n\n### Emphasizing Accessibility and Inclusivity in UI Frameworks\n\nBeyond traditional screen-based interfaces, the future will likely introduce new interaction methods such as voice and gesture-based interfaces. As virtual assistants and smart speakers become more prevalent, UI Frameworks must support voice commands and gestures to provide a seamless user experience.\n\n### Enabling Practical Augmented and Virtual Reality Experiences\n\nAugmented and virtual reality are also on the horizon, potentially revolutionizing how users interact with digital content. Modern UI Frameworks will be crucial in making AR and VR interfaces practical and user-friendly. By enabling developers to create immersive and interactive experiences, UI Frameworks will make it easier for users to adopt these emerging technologies.\n\n### Integrating Artificial Intelligence for Sophisticated Interactions\n\nArtificial intelligence (AI) is another area that will impact the future of UI Frameworks. As AI-driven interactions become more sophisticated, UI Frameworks must support complex interactions between users and intelligent systems. Conversational interfaces, predictive recommendations, and personalized experiences are just a few examples of how AI will shape the future of UI design.\n\n### The Versatile and Inclusive Future of UI Frameworks\n\nThe future holds exciting possibilities for UI Frameworks. By focusing on versatility, accessibility, and inclusivity, UI Frameworks will pave the way for innovative user experiences across various devices and interfaces. Voice and gesture-based interactions, augmented and virtual reality, and AI-driven experiences are all on the horizon, and UI Frameworks will play a critical role in making these futuristic interactions practical and user-friendly.\n\n## Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a revolutionary UI framework designed for design engineers who want visually striking web applications. The framework offers over 20 animated components crafted with React, TypeScript, Tailwind CSS, and Framer Motion. With MagicUI, creating visually appealing and interactive elements has never been easier. This UI framework allows you to effortlessly integrate captivating components into your web applications, enabling the creation of stunning user interfaces with minimal effort.\n\n### Highly Customizable Components for Maximum Flexibility\n\nOne of MagicUI's key features is its highly customizable components, which facilitate seamless adaptation to match your desired branding and design requirements. With MagicUI, you can easily tweak and fine-tune each component to align with your design preferences, ensuring a consistent and polished look across your entire web application. Whether you're looking to revamp your existing UI or create a new one from scratch, MagicUI's customization options allow you to create the perfect user interface for your project.\n\n### Bridging the Gap Between Design and Development\n\n[MagicUI](https://magicui.design/) takes a design-centric approach, focusing on animation and aesthetics to deliver captivating digital experiences. By incorporating MagicUI into your projects, you can bridge the gap between design and development, allowing designers and developers to collaborate seamlessly. With MagicUI, you can easily translate your design visions into interactive web components, bringing your ideas to life with stunning visual effects and animations. This design-first approach empowers you to create engaging user interfaces that captivate your audience from the first interaction.\n\n### MagicUI Pro: Elevating Your Web Design Projects\n\nMagicUI also offers MagicUI Pro, a premium offering that provides even more value for your web design projects. With MagicUI Pro, you can save thousands of hours and create beautiful landing pages that convert visitors into customers. MagicUI Pro includes a range of website templates designed to maximize user engagement and drive conversions. Whether you're building a portfolio, a business website, or an e-commerce platform, [MagicUI](https://magicui.design/) Pro empowers you to create stunning web experiences that leave a lasting impression on your audience.\n\n### Unlock the Power of MagicUI Today\n\nReady to take your web design projects to the next level? Start using the MagicUI [React component library](https://magicui.design/) for free today and experience the power of MagicUI for yourself. With MagicUI, you can effortlessly create captivating user interfaces that stand out from the crowd and delight your users.\n\n[Get started with MagicUI](https://magicui.design/docs) and unlock the full potential of your web design projects.\n"
  },
  {
    "path": "apps/www/content/blog/ui-libraries.mdx",
    "content": "---\ntitle: \"15 of The Best UI Libraries For Your Web Design Project\"\ndescription: \"Discover 15 top UI libraries to enhance your web design project. Explore our curated list of essential tools to create a standout user interface.\"\nimage: https://cdn.magicui.design/assets/e14f9414-3942-43a5-810b-9e75592bc322.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nConsider you're working on a website project, and you've fine-tuned your goals, nailed your target audience, and mapped out the pages you'll need. But as you begin the actual web design process, you realize your site could benefit from a few extra features. To achieve these goals, you'll need to incorporate additional user interface components, and that's where UI libraries come in.\n\nThese collections of pre-designed UI elements can help you quickly enhance your site with visually appealing, customizable modules that will improve your website's usability and overall user experience. This guide will introduce you to 15 UI libraries and provide insight into the [web design best practices](https://magicui.design/blog/web-design-best-practices) for your project.\n\nMagicUI's startup landing page template can help you start with UI libraries immediately. This fully responsive template includes various customizable UI components you can easily mix and match to achieve your design goals.\n\n## The Power of UI Libraries in Web Design\n\n![UI Libraries](https://cdn.magicui.design/assets/s8drj85hdq.jpg)\n\nUI libraries have transformed web development, offering pre-built components, design systems, and styling tools that streamline development. By [leveraging these libraries](https://medium.com/@talktorahul.b/top-ui-libraries-for-effortless-web-development-dd9d1b789bb2), developers can create visually appealing and consistent user interfaces more efficiently.\n\n### Key Benefits of Using UI Libraries\n\n#### Increased Efficiency\n\nPre-built components reduce development time and effort, allowing developers to focus on core functionalities rather than reinventing the wheel.\n\n#### Improved Consistency\n\nAdherence to a defined design system ensures a cohesive user experience across different pages and components, enhancing brand recognition and user satisfaction.\n\n#### Enhanced Accessibility\n\nMany UI libraries prioritize accessibility standards, making websites more inclusive for users with disabilities and improving overall user experience.\n\n#### Faster Time-to-Market\n\n[Rapid prototyping and development](https://www.interaction-design.org/literature/topics/rapid-prototyping?srsltid=AfmBOooKhVjcq23Qi9REdjqR7T285tkIq4PDW_9DFK56bgTg0z6v6SxD), enabled by UI libraries, lead to faster product launches and increased time-to-market.\n\n### Incorporating MagicUI into Your Project\n\n[MagicUI is a versatile UI library](https://pro.magicui.design/docs/templates/startup) that offers a collection of animated components designed specifically for design engineers. Its integration into your web design project can provide several advantages:\n\n#### Streamlined Development\n\nThe pre-built components and design system accelerate development, allowing you to build complex user interfaces more efficiently.\n\n#### Enhanced Visual Appeal\n\nAnimated components add visual interest and engagement to your website, making it more captivating and memorable for users.\n\n#### Customization Options\n\n[MagicUI offers flexibility](https://pro.magicui.design/docs/templates/startup) for tailoring components to match your brand's style and preferences, ensuring a cohesive and personalized user experience.\n\n#### Accessibility Focus\n\nThe library adheres to accessibility standards, making your website more inclusive for users with disabilities and improving overall user experience.\n\n### Additional Considerations  \n\n#### Framework Compatibility\n\nEnsure that MagicUI is compatible with your chosen frontend framework (React, Vue, Angular, etc.) to avoid compatibility issues and ensure smooth integration.\n\n#### Learning Curve\n\nFamiliarize yourself with [MagicUI's documentation and API](https://pro.magicui.design/docs/templates/startup) to effectively utilize its features and customize components to your specific needs.\n\n#### Community Support\n\nConsider the size and activity of MagicUI's community for resources, assistance, and potential contributions.\n\nBy [incorporating MagicUI](https://pro.magicui.design/docs/templates/startup) into your web design project, you can create visually stunning and user-friendly interfaces while saving time and effort. The library's pre-built components, animation capabilities, and customization options make it a valuable tool for designers and developers seeking to build exceptional web experiences.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Top 15 UI Libraries\n\n![UI Libraries](https://cdn.magicui.design/assets/yz5vd538w1h.jpg)\n\n### 1\\. Material-UI (MUI): Customizable Components for Your New React App\n\nMaterial-UI, or MUI, is a [popular React component library](https://medium.com/@talktorahul.b/top-ui-libraries-for-effortless-web-development-dd9d1b789bb2) based on Google's Material Design principles. Material-UI offers developers a comprehensive suite of customizable components for building modern, responsive user interfaces. With its extensive component library, customizable themes and styles, accessibility support, and strong community, Material-UI is a versatile choice for developers looking to streamline their web development process and create visually appealing applications.\n\n### 2\\. Tailwind CSS: Utility Classes for Building Custom Designs\n\nTailwind CSS is a utility-first CSS framework that provides predefined utility classes for building custom and responsive designs without writing CSS from scratch. By combining these classes, developers can create unique and visually appealing styles without extensive CSS knowledge. Tailwind CSS offers flexibility, customization, and integration with popular frameworks, making it a popular choice for developers seeking a more efficient and streamlined approach to CSS development.\n\n### 3\\. Ant Design: A Design System for Enterprise Applications\n\nAnt Design is a system for enterprise-grade applications that offers a comprehensive set of components focusing on usability and performance. With its extensive component library, internationalization support, accessibility compliance, and high-quality design and documentation, Ant Design is well-suited for building large-scale applications that require a robust and reliable UI framework.\n\n### 4\\. Chakra UI: Create Accessible and Maintainable React Applications\n\nChakra UI is a modular and accessible UI library for building accessible and maintainable React applications. With its themeable components, accessibility-focused design, strong community, and integration with other popular libraries, Chakra UI provides developers a flexible and efficient way to create accessible and visually appealing user interfaces.\n\n### 5\\. Bootstrap: The Most Popular Front-End Framework\n\nBootstrap is a popular HTML, CSS, and JavaScript framework for building responsive websites and applications. With its grid system, pre-built components, responsive design support, and large and active community, Bootstrap offers developers a comprehensive set of tools for creating modern and responsive web interfaces.\n\n### 6\\. Semantic UI React: A Human-Friendly Approach to Building UIs\n\nSemantic UI React is a React component library based on Semantic UI, offering a human-friendly interface for building responsive web applications. With its human-readable class names, customizable components, responsive design support, and strong community, Semantic UI React provides developers with a more intuitive and efficient way to build web interfaces.\n\n### 7\\. Mantine: A Performance-Focused React Component Library\n\nMantine is a React component library focused on performance, accessibility, and developer experience. With its customizable themes and styles, accessibility support, performance optimization, and integration with other popular libraries, Mantine provides developers a high-quality and efficient UI library for building modern web applications.\n\n### 8\\. PrimeReact: A UI Library for Enterprise Applications\n\nPrimeReact is a React UI component library designed for enterprise-grade applications, offering a comprehensive set of components and features. With its [extensive component library](https://magicui.design/blog/what-is-a-component-library), performance optimization, accessibility support, and integration with other popular libraries, PrimeReact is a reliable choice for building large-scale and complex web applications.\n\n### 9\\. Blueprint UI: A Library for Complex Data-Rich Applications\n\nBlueprint UI is a React component library designed for building complex data-rich applications. With its data visualization components, form components, responsive design support, and strong community, Blueprint UI provides developers the tools they need to create efficient and informative data-driven interfaces.\n\n### 10\\. Bulma: A Modern CSS Framework\n\nBulma is a modern CSS framework for building responsive websites and applications. With its grid system, pre-built components, responsive design support, and large and active community, Bulma offers a flexible and efficient way to create visually appealing and responsive web interfaces.\n\n### 11\\. Onsen UI: Create Hybrid Mobile Apps with Web Technologies\n\nOnsen UI is a hybrid mobile app UI framework that allows you to build native-like apps using web technologies. With its cross-platform compatibility, pre-built components, performance optimization, and integration with popular frameworks, Onsen UI provides developers a powerful tool for creating high-quality mobile applications.\n\n### 12\\. Vuetify: A Material Design Component Library for Vue.js\n\nVuetify is a Vue.js UI component library offering a comprehensive set of components for building modern and responsive web applications. With its extensive component library, customizable themes and styles, accessibility support, and strong community, Vuetify provides developers a flexible and efficient way to build visually appealing Vue.js applications.\n\n### 13\\. Nuxt.js: A Framework for Building Server-Rendered Vue.js Applications\n\nNuxt.js is a framework for building server-rendered Vue.js applications, offering a set of pre-built components and features for efficient development. With its server-side rendering, pre-built components, performance optimization, and integration with other popular libraries, Nuxt.js provides developers with a powerful tool for building fast and scalable Vue.js applications.\n\n### 14\\. Next.js: A Framework for Building Server-Rendered React Applications\n\nNext.js is a React framework for building server-rendered React applications, offering a set of [pre-built components](https://cloud.google.com/dialogflow/cx/docs/concept/prebuilt-component#:~:text=Prebuilt%20components%20are%20a%20collection,such%20as%20name%20and%20address) and features for efficient development. With its server-side rendering, pre-built components, performance optimization, and integration with other popular libraries, Next.js provides developers with a powerful tool for building fast and scalable React applications.\n\n### 15\\. Quasar Framework: A Framework for Building Cross-Platform Applications\n\nQuasar Framework is a cross-platform framework for building web, mobile, and desktop applications using Vue.js. With its cross-platform compatibility, pre-built components, performance optimization, and integration with other popular libraries, Quasar Framework provides developers a versatile and efficient way to build applications running on multiple platforms.\n\n## Choosing the Right UI Library\n\n![UI Libraries](https://cdn.magicui.design/assets/cgggn7h21n.jpg)\n\n### Framework Compatibility: Ensuring Smooth Integration with Your Frontend Framework\n\n[Choosing a UI library](https://www.linkedin.com/advice/0/how-do-you-choose-right-ui-design-library-skills-web-design-qavjc#:~:text=Choosing%20the%20ideal%20UI%20design,performance%20optimization%2C%20and%20browser%20support.) compatible with your frontend framework ensures smooth integration and avoids costly compatibility issues. First, ensure the library works with your framework (React, Vue, Angular, etc.). Then, assess the documentation and community resources available for the library within your framework. Finally, consider how easily the library will integrate with your existing code structure and dependencies. If you are starting a new project, choosing a different UI library may be worthwhile to avoid future headaches.\n\n### Design Style: Matching Visual Directions\n\nEvery web design project has a visual direction that must be reflected in your chosen UI components. For this reason, it’s crucial to evaluate a library’s design style before selecting it. Aim for a library with a visual aesthetic that aligns with your project’s overarching goals. This will help create a cohesive and appealing user experience.\n\nYou should also consider how customizable the components are to ensure you can tweak their appearances to match your brand’s unique style. Finally, assess the library’s theming capabilities to ensure you can modify the overall look and feel of the UI to match your project’s requirements.\n\n### Feature Set: Ensuring the Library Meets Your Project Needs\n\nNot all UI libraries are created equal. The features and components they offer can vary significantly from library to library. For this reason, it is essential to evaluate a library’s feature set before making your selection. Start by assessing the component library to ensure it has all the elements for your project.\n\nNext, consider additional features the library may offer, such as accessibility support, performance optimization, theming, and integration with other popular libraries. Finally, prioritize the most essential features for your project and select a library that covers them.\n\n### Community and Support: Prioritizing a Well-Supported Library\n\nA UI library is only as good as the community that supports it. Before selecting, evaluate the library’s community size and activity to ensure ample resources and support are available when needed. Next, consider the library’s documentation quality and any available learning resources.\n\nA well-documented library with comprehensive learning resources can make it easier to learn and use. Finally, community engagement in forums and discussion groups should be assessed, as this can indicate the quality of support available.\n\n### Ease of Customization: Flexibility is Key\n\nOne of the most significant [advantages of using a UI library](https://www.sencha.com/blog/7-reasons-to-use-ui-component-libraries-to-style-web-apps/) is the ability to customize it to fit your project’s unique requirements. For this reason, you’ll want to select a library that allows plenty of flexibility and customization to ensure you can tailor its components to your specific design needs.\n\nStart by evaluating the library’s overall flexibility and customization options. Next, assess its theming capabilities and support for custom styling. Finally, consider the ability to modify individual components to ensure you can create the perfect design for your project.\n\n### Performance: Ensuring Your Library is Optimized \n\nUsing an extensive UI library can impact your web application’s performance—especially if you’re building a complex or enterprise-level project. For this reason, it’s vital to assess your library’s performance before and after implementation. Start by evaluating the library’s performance impact on your web application.\n\nNext, look for optimization efforts or performance benchmarks to ensure the library meets your project’s performance requirements. Finally, conduct your performance tests in your specific use case to identify potential issues before they impact your users.\n\n## How MagicUI Helps You Design Interactive Websites\n\n[MagicUI creates interactive websites](https://pro.magicui.design/docs/templates/startup) that are rich with animations and transitions. This open-source library offers over 20 animated components specifically for React applications. Each element is built with TypeScript, Tailwind CSS, and Framer Motion to ensure a smooth, customizable, and visually appealing user experience.  With MagicUI, I can create engaging websites that impress visitors and keep them returning.\n\n### Bring Any Design to Life with MagicUI\n\nEach component in [MagicUI comes with built-in animations](https://pro.magicui.design/docs/templates/startup) that help bring websites to life. You can use these interactive elements to create a more engaging user experience for your web applications. Instead of jumping from page to page, users can interact with your website and enjoy visually appealing transitions, making your application feel more like a game and less like a boring old website.\n\n## Choosing the Right UI Library for Your Web Design Project\n\n![UI Libraries](https://images.unsplash.com/photo-1586953208448-b95a79798f07?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxVSXxlbnwwfHx8fDE3MjQ3NDk0NjR8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Framework Compatibility: The Crucial First Step\n\n[Selecting the proper UI library](https://www.linkedin.com/advice/0/how-do-you-choose-right-ui-design-library-skills-web-design-qavjc#:~:text=When%20choosing%20a%20UI%20design,and%20adhere%20to%20accessibility%20standards.) for your web design project is crucial to ensuring a successful and efficient development process. Several factors should be considered when making this decision:\n\n- The first step is to ensure compatibility. The UI library should be compatible with your frontend framework (React, Vue, Angular, etc.) to avoid compatibility issues and ensure smooth integration.\n- Next, consider support. Evaluate the library's level of support for your specific framework, including documentation, community resources, and updates.\n- Finally, assess integration ease. Consider how seamlessly the library integrates with your existing project structure and dependencies.\n\n### Design Style and Preferences: What Do You Want It to Look Like?\n\nNext, you'll want to match your project's visual direction. The library's design style should align with your project's overall visual direction to create a cohesive and visually appealing user experience.\n\nAlso, consider customization. Evaluate the library's flexibility for customization, allowing you to tailor components to match your brand's unique style and preferences. It's also wise to assess the ability. Consider the library's theming capabilities and support for custom styling to modify your application's overall appearance quickly.\n\n### Feature Set: What Does the Library Offer?\n\nLike a car, not all UI libraries are created equal. Some perform better than others, and some have features better suited to your specific needs. You'll want to evaluate the component library to determine if it offers the necessary components for your project.\n\nAlso, consider additional features. Evaluate the library's extra features, such as theming, accessibility support, performance optimization, and integration with other popular libraries. Finally, prioritize essential features. Determine which features are most important for your project and select a library that offers those features.\n\n### Community and Support: You'll Want Some Backup\n\nIf you run into trouble using a library, knowing someone else has solved the problem or can help you figure it out is excellent. So, research community size. Evaluate the size and activity of the library's community to assess the availability of resources, support, and potential contributions.\n\nNext, consider documentation and learning resources. A well-documented library with comprehensive learning resources can make it easier to learn and use. Finally, evaluate community engagement. Consider the level of engagement and responsiveness within the community, as this can indicate the quality of support available.\n\n### Ease of Customization: Can You Make It Your Own?\n\n[Off the shelf UI components](https://gun.io/news/2023/08/custom-component-libraries-vs-off-the-shelf-components/) are great, but they rarely fit your project’s needs right out of the box. So, you'll want to evaluate flexibility. Consider the library's flexibility for customization, allowing you to tailor components to match your project's specific requirements and branding.\n\nNext, assess theming capabilities. Evaluate the library's theming capabilities and support for custom styling to modify your application's overall appearance quickly. Finally, consider component customization. Evaluate the library's ability to customize components to meet your design needs.\n\n### Performance: How Fast Will It Go?\n\nJust like a car, some UI libraries perform better than others. You'll want to consider performance impact when evaluating a library's performance impact on your web application, especially for large or complex projects.\n\nNext, assess optimization efforts. Consider the library's optimization efforts and performance benchmarks to ensure it meets your project's performance requirements—finally, test performance in your specific use case. Conduct performance tests to evaluate the library's performance in your project's specific context.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## 10 Best Practices for Implementing UI Libraries\n\n![UI Libraries](https://images.unsplash.com/photo-1531539134685-27d854339120?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxkaXNjdXNzfGVufDB8fHx8MTcyNDc0OTQ3M3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Understand Your Project Requirements: Define Your Goals\n\n[Before using a UI library](https://sunscrapers.com/blog/ui-component-library-in-a-react-project/), you must define your project's goals. What are you trying to achieve? Who are you building it for? What are their needs and preferences? What are your design standards? Next, assess the specific features and components you need from a UI library to achieve your unique objectives. Finally, consider your project's complexity and the customization level required. The answers to these questions will help you narrow your options and select the best UI library for your project.\n\n### 2\\. Research and Evaluate UI Libraries: Find the Perfect Fit\n\nOnce you understand your project requirements, it’s time to research UI libraries that fit your needs. Start by identifying potential candidates based on your specifications and framework compatibility. Next, evaluate each library's features, documentation, community support, and performance. Also, consider factors like design style, ease of use, and customization options. Doing your homework will pay off in the long run and help you avoid headaches.\n\n### 3\\. Start with a Small-Scale Implementation: Avoid Unnecessary Headaches\n\nOnce you settle on a UI library, resist the urge to dive into your project’s codebase and implement many components simultaneously. Instead, start with a small-scale implementation. Begin by implementing a few components from the chosen library in a small-scale project or prototype. This will allow you to evaluate the library's performance, integration, and compatibility with your existing codebase. You’ll also identify potential challenges or limitations before they become more significant issues that slow your project down.\n\n### 4\\. Follow Best Practices for Component Usage: Keep It Clean\n\nAs you implement UI components into your project, follow best practices for their usage. Adhere to the library's recommended usage guidelines. Use components as intended and avoid unnecessary modifications that could introduce bugs. Leverage the library's built-in features and customization options to keep your code clean and efficient.\n\n### 5\\. Prioritize Accessibility: Don’t Forget the Basics\n\nWhen it comes to web design, accessibility should always be a top priority. This is especially true when implementing a UI library. Start by ensuring that the library you choose supports accessibility standards. Next, use ARIA attributes and semantic HTML elements to make your components accessible to users with disabilities. Finally, test your application with assistive technologies to identify and address accessibility issues.\n\n### 6\\. Consider Performance Optimization: Don’t Let the Library Drag You Down\n\nUI libraries can introduce a fair amount of code to your application. This can hurt your site’s performance, especially when using a large or complex library. Before implementing a UI library, evaluate the potential performance impact on your web application. Next, optimize component usage and reduce unnecessary rendering. Finally, leverage performance-enhancing techniques like lazy loading and code splitting to improve your application’s performance.\n\n### 7.  Maintain Consistency and Branding: Make It Your Own\n\nWhile UI libraries can give your project a polished look, it’s important to customize them to fit your unique design requirements. Start by adhering to your project's design guidelines and branding standards. Next, customize the UI library's components to match your brand's visual identity. Finally, ensure consistency across different parts of your application to create a cohesive user experience.\n\n### 8\\. Leverage the Community and Documentation: Don’t Go It Alone\n\nOne of the most significant [benefits of using UI libraries](https://www.sencha.com/blog/benefits-of-using-a-ui-framework-in-enterprise-applications/) is the resources available to help you. Take advantage of the library's community forums and documentation for support and guidance. Seek help from other developers who have experience using the library. Finally, stay updated with the latest releases and improvements.\n\n### 9\\. Regularly Update and Maintain: Keep Things Fresh\n\nLike any other code you implement into your project, UI libraries require regular maintenance. First, keep your UI library and its dependencies up-to-date to benefit from new features, bug fixes, and security improvements. Next, regularly review and maintain your codebase to ensure it remains efficient and well-structured. Finally, consider using version control to track changes and manage updates effectively.\n\n### 10\\. Continuously Evaluate and Improve: Don’t Settle\n\nFinally, don’t make the mistake of thinking that implementing a UI library into your project is a one-and-done task. Instead, regularly assess the effectiveness of the UI library in meeting your project's goals. Gather feedback from users and stakeholders to identify areas for improvement. Be open to exploring alternative UI libraries if necessary.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a free and [open-source UI library](https://pro.magicui.design/docs/templates/startup) that we designed specifically for design engineers. The collection offers over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI aims to bridge the gap between design and development with a focus on animation and a design-centric approach. The library empowers us to craft captivating digital experiences.\n\n### Create Stunning Interfaces with MagicUI\n\nMagicUI provides a range of [visually appealing and interactive elements](https://pro.magicui.design/docs/templates/startup) that can be easily integrated into web applications. Using animated components, we can create stunning user interfaces with minimal effort. The highly customizable components enable seamless adaptation to match our desired branding and design requirements.\n\n### Save Time with MagicUI Pro\n\nAlong with our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save you thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/user-interface-design-patterns.mdx",
    "content": "---\ntitle: Mastering user interface design patterns\ndescription: >-\n  Discover practical guidance on user interface design patterns to improve\n  usability, consistency, and rapid prototyping—your blueprint for better apps.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-44821f73-f833-40a1-9e05-e979a73dbbe4.jpg\nauthor: Dillion Verma\ntags:\n  - user interface design patterns\n  - UI patterns\n  - UI design principles\n  - web design\n  - Magic UI\npublishedOn: \"2025-10-27T10:04:49.76993+00:00\"\nfeatured: true\n---\n\nUser interface design patterns are the reusable solutions to the design problems we all face time and time again. Think of them as a shared language between a person and a piece of technology. They're the reason so many different apps and websites feel intuitive, almost familiar, from the first time you use them.\n\nThese are **time-tested blueprints** that help us create interfaces people just _get_ without a second thought.\n\n## Why UI Design Patterns Matter\n\n![A well-organized workspace with design blueprints, a laptop, and various tools, symbolizing the structured nature of UI design patterns.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f13017a0-943e-4278-92f3-7573f10b5418.jpg)\n\nHere's an analogy. Imagine trying to build a house without any architectural plans. You'd have to figure everything out from scratch—how a door should swing open, the right height for a kitchen counter, where the windows should go. The whole process would be slow, costly, and you'd probably end up with a house that's confusing and awkward to live in.\n\nUI design patterns are those architectural plans, but for digital products. They give us proven, reliable solutions for common interaction challenges, so we don't have to constantly reinvent the wheel. When you see a shopping cart icon or a standard login form, you know exactly what to do. No instructions needed.\n\nThat instant familiarity is the real power of using established patterns.\n\n### Reducing Cognitive Load\n\nThe human brain can only juggle so much information at once. When a user has to learn a completely new interface, they’re forced to burn mental energy just figuring out how things work. Designers call this **cognitive load**.\n\n> By using established UI design patterns, we dramatically lower that mental effort. Users can stay focused on what they actually want to do—like find a piece of information or buy something—instead of getting bogged down by the mechanics of the interface itself.\n\nThis makes for a much smoother and more satisfying experience. A well-designed interface feels effortless, almost like an extension of your own thoughts. For a closer look at the building blocks that make up these patterns, check out our guide on https://magicui.design/blog/what-are-ui-components.\n\n### Building Trust and Consistency\n\nConsistency is the bedrock of good design. When similar elements look and behave in predictable ways across an app, users start to build confidence and trust in the product. Design patterns are what make this consistency possible, from one page to the next.\n\nThis is especially critical in complex creative software, like the [best music production software](https://blogs.digitalhubkey.com/best-music-production-software), where a fluid and intuitive interface is everything. Following these established conventions helps you create a dependable product that feels natural from the very first click.\n\n## The Evolution of Digital Interfaces\n\nTo really get why modern **user interface design patterns** are such a big deal, you have to rewind the clock. For the earliest computer users, getting anything done was a cryptic, frustrating exercise. They were stuck with the **command-line interface (CLI)**—a blank screen and a blinking cursor where you had to type exact, unforgiving commands to make anything happen.\n\nForget icons or windows. There wasn’t even a mouse. This was a world built for engineers, and it completely shut out the average person. The digital world was locked behind a wall of code, and something had to give. Computing needed to become a tool for everyone, not just a handful of experts.\n\nThe breakthrough started cooking in the 1970s at Xerox's Palo Alto Research Center (PARC). Researchers there invented the first **graphical user interface (GUI)**, swapping out typed commands for visual, real-world metaphors. Their work showed that regular users could finish tasks up to **60% faster** with a GUI. This was a massive leap, and it set the stage for a revolution. You can really see how these foundational ideas took root by diving deeper into the early history of UX design.\n\n### The WIMP Revolution\n\nThe GUI didn't just change the screen; it introduced a whole new language of interaction. This language, known by the acronym **WIMP**, gave us a set of patterns so intuitive that they still power most desktops today. It made the digital world feel like a physical space you could actually interact with.\n\n- **Windows:** These were containers for programs and files, letting you juggle multiple tasks at once.\n- **Icons:** Simple pictures representing files and apps made everything instantly recognizable.\n- **Menus:** Instead of memorizing commands, you could just browse a list of options.\n- **Pointers:** The mouse-controlled arrow gave us a way to directly point at and manipulate things on the screen.\n\nThe WIMP model, made famous by the Apple Macintosh in 1984, made computing visual, direct, and approachable. It created a consistent set of rules that, once learned, could be applied everywhere, blowing the doors wide open for millions of new users.\n\n### The Mobile-First Era\n\nJust when we thought we had it all figured out, another massive shift happened. The smartphone explosion of the late 2000s completely rewrote the rules. Tiny touchscreens and the absence of a mouse and keyboard demanded a whole new vocabulary of **user interface design patterns**. Our fingers became the primary input.\n\n> Patterns like 'swipe,' 'pinch-to-zoom,' and 'tap' became second nature. These gestures allowed for fluid, direct manipulation of content, making interfaces feel more tangible and responsive.\n\nThis mobile-first world forced designers to solve new problems, especially how to navigate on such small screens. The \"hamburger menu,\" that little three-line icon, became the standard way to tuck away navigation without hogging precious screen real estate. Card-based layouts also took off, giving us a clean, scrollable way to organize bite-sized chunks of information.\n\nIt just goes to show you—UI patterns aren't set in stone. They're constantly evolving right alongside our technology and our expectations.\n\n## A Practical Guide to Common UI Patterns\n\nTo really get a handle on the huge world of **user interface design patterns**, it helps to organize them into a sort of toolkit. The best way to do that is to group them by what they _do_. Thinking about patterns based on their function gives you a clear mental framework, so you can quickly grab the right solution for whatever design challenge you’re facing.\n\nMost patterns slot neatly into one of four main groups. Each group tackles a different part of the user's journey, from how they enter information to how they make sense of what's on the screen. Getting these categories down is the first step toward building an experience that just _flows_.\n\nThis diagram maps out how interfaces have evolved, starting from the early text-based systems and moving toward the visual, touch-friendly interfaces we all use today.\n\n![Infographic about user interface design patterns](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/96ec3945-0c6a-4988-8486-f0ec14be82d8.jpg)\n\nYou can see a clear trend toward more direct and intuitive interactions, which shows just how much technology has shaped what users expect from a digital product.\n\n### Input And Output Patterns\n\nThink of this category as the ongoing dialogue between the user and the system. Input patterns are how users talk to the interface, and output patterns are how the system talks back. They are the absolute bedrock of any interaction.\n\n- **Input Patterns:** These are all the familiar elements like forms, buttons, dropdowns, and toggles. They're the tools users grab to make choices, type in data, and tell the interface what to do next.\n- **Output Patterns:** This is how the system responds. We're talking about notifications, status messages, confirmation pop-ups, and progress bars. They confirm actions have been received and keep the user in the loop.\n\n> A well-designed input/output loop feels like a clear, responsive conversation. When a user clicks a \"Submit\" button (input), a success message (output) should pop up right away, confirming the action was completed. This simple feedback loop prevents confusion and builds trust.\n\n### Navigation Patterns\n\nSo, how do people get from point A to point B in your product? That’s where navigation patterns come in. They provide the map and the signposts, making sure users can move around without ever feeling lost or confused.\n\nCommon navigation patterns include things like top-level menus, tab bars, breadcrumbs showing a user’s trail, and search bars for when someone knows exactly what they want. The explosion of mobile devices also gave us patterns like the navigation drawer (the \"hamburger menu\") to save precious screen real estate.\n\nThe shift to touchscreens was a huge driver for these changes. By 2020, smartphones made up over **80%** of global mobile phone sales, which made touch-based gestures like swipe and tap universally understood. In fact, the average person now taps their screen more than **2,600 times a day**—that’s a stat that shows just how central these interactions have become. You can read more about [the evolution of UI/UX design and its impact on modern patterns](https://www.calibraint.com/blog/evolution-of-ui-ux-design).\n\n### Content Structuring Patterns\n\nOnce a user lands on a screen, they have to figure out what they're looking at. Content structuring patterns are all about organizing information so it’s easy to digest and scan.\n\nThese patterns are crucial for taming complexity and keeping users from getting overwhelmed. A few of the most common ones are:\n\n1.  **Cards:** These are self-contained boxes of content that neatly group related information together. To see how to use them well, you can [explore our detailed guide on UI card design](https://magicui.design/blog/ui-card-design).\n2.  **Grids:** A layout system that arranges content into clean rows and columns, giving the whole screen a sense of order.\n3.  **Carousels:** A rotating slideshow of content, perfect for showing off multiple items without taking up too much space.\n\nPatterns like these help create a clear visual hierarchy, guiding the user's eye to the most important information first.\n\n## Bringing UI Patterns to Life with Magic UI\n\n![A designer's hands arranging geometric blocks on a digital tablet, representing the construction of a user interface with Magic UI components.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/60c60ade-03b5-466c-9149-0765a44f1973.jpg)\n\nKnowing the theory behind user interface design patterns is one thing. Actually building them with a bit of flair and efficiency? That’s a whole different ball game. This is exactly where a solid component library becomes your best friend.\n\nInstead of reinventing the wheel by coding every button, grid, and form from scratch, you can grab pre-built, production-ready components that bring these patterns to life instantly.\n\nThat's the idea behind Magic UI. It's a collection of animated, interactive React components that are perfect for this job. They don't just copy standard patterns; they give them a modern spin with fluid motion, creating experiences that feel both intuitive and surprisingly fresh. Let’s look at how you can use them to solve some common design challenges.\n\n### Structuring Content with Animated Grids\n\nOne of the most basic tasks in UI design is just showing a bunch of stuff—blog posts, products, portfolio pieces—in a way that’s clean and easy to scan. A simple, static grid works, but let's be honest, it can feel a little dull.\n\nThis is where animated grid patterns can add a much-needed layer of polish. Magic UI's animated grid components use subtle motion to guide the user's eye, making content feel more alive as it loads onto the screen.\n\n> A well-implemented animation isn't just decoration; it’s a form of feedback. It guides the user's attention and makes the interface feel responsive and alive, which can significantly improve the perception of performance.\n\nRather than content just popping into existence, it can gracefully fade, slide, or scale into place. This small detail can turn a basic content layout into a genuinely delightful interaction, making your site feel more professional and thoughtfully designed.\n\n### Creating Engaging Navigation with Bento Boxes\n\nThe **bento box** is a super popular pattern right now for organizing different kinds of information into a compact, tile-based layout. It’s a great-looking way to present features, links, or key selling points on a landing page.\n\nMagic UI pushes this concept a step further by making these bento boxes interactive. You can easily build a grid where hovering over a box triggers an animation, pops up more information, or creates a subtle glow effect. This solves a big design problem: how do you show a lot of information without totally overwhelming the user?\n\n- **Before:** A static list of features is easy for users to scan past and ignore.\n- **After:** An interactive bento grid naturally encourages people to explore. Users are invited to mouse over different sections, which turns a passive look into an active discovery.\n\nWith this approach, navigation starts to feel less like a chore and more like a fun, interactive experience.\n\n### Improving Usability with Dynamic Input Forms\n\nLet's face it: forms are essential, but they're often the biggest source of user frustration. A clunky, confusing form is the fastest way to lose someone. This is where dynamic components can make the entire process feel a lot smoother.\n\nFor instance, Magic UI has interactive input fields that give you instant visual feedback. Think of a field that gently animates when you click into it, or a submit button that shows a loading spinner after it's been pressed. These tiny touches provide immediate confirmation that the system is listening to the user's actions.\n\nThis is really just scratching the surface. By combining these powerful building blocks, you can implement almost any **user interface design pattern** quickly and with real style. To see everything that's possible, take a look at the full library of [Magic UI components and their documentation](https://magicui.design/docs/components). It’s packed with live demos and code snippets you can drop right into your projects to start building more engaging interfaces today.\n\n## How to Choose the Right UI Pattern\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/uwNClNmekGU\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nPicking the right **user interface design pattern** feels a bit like an art and a science, a mix of gut feeling and hard data. It’s not just about what looks cool. A pattern has to actually _work_—it needs to line up perfectly with what the user is trying to do, what the business needs to achieve, and what’s technically possible.\n\nGet it wrong, and you’ll frustrate people. Fast.\n\nThink of it like picking a tool from a toolbox. You wouldn't grab a sledgehammer to hang a picture frame. In the same way, forcing a complex carousel onto a page where a simple grid would do the job just overcomplicates things and hurts the experience. The first step is always to get a crystal-clear understanding of the problem you're trying to solve.\n\n### A User-Centered Decision Framework\n\nThe best way to choose a pattern is to ground every decision in a user-centered framework. That just means you’re constantly asking questions about your users, their environment, and the information they need. A pattern that’s a dream to use on a huge desktop monitor could easily become a nightmare on a tiny phone screen.\n\nTo make a smart choice, you have to weigh these key factors:\n\n- **User Needs:** What is the user actually trying to get done here? The pattern you choose has to make that task feel effortless.\n- **Business Goals:** Does this pattern help the business? Whether that’s boosting sign-ups or keeping users engaged, it has to serve a purpose.\n- **Information Architecture:** How is all your content organized? The pattern’s job is to present that information logically so people aren’t left scratching their heads.\n- **Technical Feasibility:** Can your team actually build and support this thing? A flashy, bug-ridden component is a thousand times worse than a simple one that just works.\n\n> The most effective UI patterns are often the most invisible. When a design works seamlessly, users don't notice the individual patterns; they only notice how easy it is to get things done.\n\n### Validating Your Choices\n\nNever just assume your first idea is the best one. Great design is all about iterating and validating—in other words, testing your assumptions with real people. It's so easy to fall into the trap of chasing trends, which is how we end up with interfaces that are stylish but completely unusable.\n\nLuckily, we have a whole toolkit for validating patterns. Methods like **heuristic evaluation**, first laid out by the legendary Jakob Nielsen, give us a solid set of principles to measure usability. His \"10 Usability Heuristics\" are still a bible for many designers today.\n\nThe rise of massive pattern libraries like Google's [Material Design](https://material.io/), which is used in an estimated **70% of top Android apps**, has also helped standardize best practices and cut down development time for countless teams. You can see how these principles and libraries have shaped the field in this [deep dive into user interface design](https://en.wikipedia.org/wiki/User_interface_design).\n\n### Testing and Iteration\n\nAt the end of the day, nothing beats feedback from actual users. It’s the ultimate reality check. Two of the most powerful methods for getting that feedback are:\n\n1.  **Usability Testing:** This is where you watch a handful of people try to use your design. It's the quickest way to find out what's broken. Famous research showed that testing with just **five users** can reveal about **85%** of the usability problems.\n2.  **A/B Testing:** This is more scientific. You pit two different patterns against each other to see which one performs better on specific metrics, like getting more clicks or helping users finish a task faster.\n\nBy grounding your choices in a solid framework and then testing them with real-world data, you can move beyond guesswork. You’ll be able to pick UI design patterns that don’t just look good, but deliver real, measurable results.\n\n## A Few Common Questions About UI Design Patterns\n\nAs you start working more with UI patterns, a few questions always seem to pop up. Let's clear the air on some of the most common ones.\n\n### UI Patterns vs. Design Systems: What's the Difference?\n\nThis is a big one. Think of a **UI pattern** as a single, battle-tested solution to a common problem—like a modal for confirmations or a tooltip for extra info. A **design system**, on the other hand, is the entire toolbox. It bundles all those individual patterns together into a shared library, complete with rules, guidelines, colors, and typography.\n\nFor example, a specific button _style_ is a pattern. When that button is standardized as part of Google's [Material Design](https://m3.material.io/), with rules for spacing, color, and usage, it becomes part of a design system. This is why teams often use a library like **Magic UI**—it gives you ready-made patterns that work together consistently right out of the box.\n\n- **Scope:** Patterns solve one problem at a time. Systems create a cohesive design language for an entire product.\n- **Components:** A pattern might be a single element. A system includes everything from colors and fonts to page templates.\n- **Governance:** Design systems are the source of truth, managing updates and versioning for all the patterns they contain.\n\nUnderstanding this helps you decide whether you just need a quick, effective pattern for a specific feature or if it's time to invest in a full-blown design system to keep a complex product consistent.\n\n> With **Magic UI Pro**, you get the best of both worlds: powerful standalone patterns and a cohesive component library that helps you build faster.\n\n### How Do I Keep Up With All the New Trends?\n\nThe world of UI design moves fast. New devices, new interactions, new trends—it can feel like a lot to keep up with. The trick is to stay informed without getting overwhelmed.\n\nHere’s a simple strategy that works for me:\n\n1.  Find a few quality design newsletters and actually read them. They do the hard work of curating what's new and interesting.\n2.  Spend a little time each week browsing communities like [Dribbble](https://dribbble.com/) and [CodePen](https://codepen.io/). It’s a great way to see what others are building and get a dose of inspiration.\n3.  The best way to learn is by doing. Grab a few **Magic UI** components and spin up a small sandbox project to see how they feel in a real interface.\n\nThis keeps you in the loop, balancing passive learning with hands-on practice so you can confidently bring fresh, proven **user interface design patterns** into your work.\n\n### When Should I Innovate vs. Stick to Convention?\n\nThis is the classic tug-of-war in design. Pushing the boundaries can lead to incredible, fresh user experiences, but straying too far from what people already know can just leave them confused and frustrated. The key is finding a healthy balance.\n\nBefore you introduce something totally new, make sure you have a good reason.\n\n- **Set a Goal:** What are you actually trying to improve with this new pattern? Is it faster? Clearer? More engaging?\n- **Test Everything:** Don't just assume your cool new idea is better. Use A/B tests and look at the metrics to prove it actually improves usability.\n- **Respect the Rules (Before You Break Them):** Start with familiar layouts and interactions. You can then introduce innovative elements within that comfortable structure, rather than throwing users into the deep end.\n\n| Practice       | The Upside                    | The Downside                    |\n| :------------- | :---------------------------- | :------------------------------ |\n| **Innovation** | Makes your product stand out  | Can have a steep learning curve |\n| **Convention** | Instantly usable and familiar | Can feel a bit bland or generic |\n\nFollowing these ideas will help you apply **user interface design patterns** with purpose. For more practical examples, dive into the [Magic UI documentation](https://magicui.design/docs) and community forums—you'll find tons of real-world use cases and code snippets.\n\n> The bottom line? Focus on patterns that solve a real user need while also hitting your business goals.\n\nOnce you have clear answers to these questions, you'll be able to build interfaces that feel both intuitive and delightful.\n\nAnd if you want to speed things up, try building your next project with the **Magic UI** component library. The live demos and copy-paste blocks let you get patterns up and running in minutes, giving you more time to focus on what really matters: creating a great design.\n\n---\n\nReady to build stunning interfaces with patterns that just work?\n\nHead over to **[Magic UI](https://magicui.design)** to explore over **150** animated components and templates designed to make your job easier and more fun. Join the thousands of developers and designers who are cutting their iteration time in half.\n"
  },
  {
    "path": "apps/www/content/blog/user-interface-themes.mdx",
    "content": "---\ntitle: A Guide to User Interface Themes\ndescription: >-\n  Discover how user interface themes work. Our guide covers core components,\n  design best practices, popular types like dark mode, and implementation.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-c189d9d5-507c-4155-aeb9-a9c6f9cd56f2.jpg\nauthor: Dillion Verma\ntags:\n  - user interface themes\n  - ui design\n  - dark mode\n  - web design\n  - ui components\npublishedOn: \"2025-10-02T07:39:49.266934+00:00\"\nfeatured: true\n---\n\nA **user interface theme** is the complete visual and interactive system that gives a website or app its distinct look and feel. It’s way more than just a color palette. Think of it as a comprehensive _design language_ that makes sure every button, font, and layout works together to create a smooth, intuitive experience.\n\n## What Are User Interface Themes Anyway?\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4622fdac-f2ff-4d64-8917-08b9d1c5395e.jpg)\n\nImagine a UI theme as the architectural style of a house. The architect doesn't just pick a paint color and call it a day. They design a whole system where the windows, doors, roofline, and materials all follow a single, unified vision—whether it's modern, classical, or industrial. In the same way, a UI theme sets the rules for every single element on the screen.\n\nThis design language makes the user’s journey feel predictable and seamless. When you tap a button, you have a certain expectation for how it will look and behave, just like the other buttons in the app. That consistency is no accident; it’s the direct result of a solid, well-executed theme.\n\n### From Static Skins to Dynamic Experiences\n\nBack in the early days of the web, themes were basically just static \"skins\" that swapped out colors and fonts. Fast forward to today, and they've become dynamic systems that can adapt to user preferences and different environments. The most common example is the now-ubiquitous light and dark mode, which lets people choose the experience that’s easiest on their eyes.\n\nThis evolution points to a huge shift in design thinking. Modern **user interface themes** are all about flexibility and personalization, giving users more say in how they interact with their digital world. A great theme nails several key goals:\n\n- **Strengthens Brand Identity:** A unique theme makes a product instantly recognizable, reinforcing brand colors, typography, and personality.\n- **Improves Usability:** Consistency reduces the mental effort for users, since they don't have to relearn how things work from one screen to the next.\n- **Increases User Engagement:** An interface that’s both beautiful and intuitive encourages people to stick around, building loyalty over time.\n\n### The Power of Themes in Modern Web Development\n\nNowhere is the impact of themes more obvious than in the world's most popular content management system. As of 2025, WordPress powers over **43% of all websites**, making its theme ecosystem a massive force in web design. Over **25%** of these themes are built specifically for e-commerce, while around **30%** focus on minimalist designs that put clean, user-friendly interfaces first. You can dive deeper into these stats over at [WPExperts' post on WordPress statistics](https://wpexperts.io/blog/wordpress-statistics-2025/).\n\n> A great UI theme doesn't just make a product look good; it makes the product feel _right_. It builds an unspoken trust between the user and the interface by creating a world with consistent rules and predictable outcomes.\n\nUltimately, a thoughtfully designed theme is the soul of a digital product. It's what turns a random collection of components into a cohesive, intuitive, and memorable experience that keeps people coming back for more.\n\n## Exploring Popular Types of UI Themes\n\nJust as architectural styles give a city its character, different types of **user interface themes** define the feel of our digital spaces. Each style delivers a unique user experience, shaped by specific goals and user preferences. While the options are nearly endless, a few dominant styles have become the bedrock for millions of websites and apps.\n\nThe most fundamental choice any designer makes is between a light and a dark theme. A **Light Theme**, with its dark text on a bright background, is the digital equivalent of ink on paper. It’s no wonder it’s often the default for content-heavy sites where readability is king.\n\nOn the flip side, a **Dark Theme** inverts this, placing light text on a dark background. This style has exploded in popularity, and for good reason—it can reduce eye strain in low light and even save battery life on modern OLED screens where black pixels are simply turned off.\n\n### Material, Minimal, and Flat Designs\n\nBeyond the simple light/dark split, several key design philosophies guide how themes are built. Each one has a distinct take on visual hierarchy, depth, and how users should interact with the elements on screen.\n\n- **Material Design:** This is Google's brainchild, inspired by the physical world. It uses subtle shadows, layers, and motion to make interface elements feel tangible and responsive, almost like you could reach out and touch them.\n- **Minimalist Design:** This approach is all about subtraction. It strips away every non-essential element, putting the focus squarely on the content and core functions. Think generous white space, a tight color palette, and clean typography for a calm, uncluttered vibe.\n- **Flat Design:** A forerunner to modern minimalism, flat design threw out skeuomorphism (designs that mimic real-world objects) in favor of simple, two-dimensional elements and bright, bold colors. Its main goal is clarity and a straightforward user experience.\n\nIf you want to see how these philosophies are put into practice, our detailed guide on the most popular [UI frameworks](https://magicui.design/blog/ui-frameworks) is a great next step. It can also be helpful to see these concepts in action. Exploring popular [free website templates](https://blog.soloist.ai/uncategorized/free-website-templates-for-businesses/) is a fantastic way to understand how these different styles come together to serve various business needs.\n\n### Specialized and Branded Themes\n\nWhile the styles above are great starting points, many companies need something more specific. This is where specialized or fully custom **user interface themes** come into play, creating everything from playful, gamified interfaces to serious, data-heavy dashboards.\n\nA **High-Contrast Theme**, for example, is built with accessibility as its top priority. Designed for users with low vision, it uses a limited palette with starkly different tones to ensure everything is as readable as possible, often going above and beyond standard accessibility guidelines.\n\nThen you have the **Brand-Centric Theme**, which is custom-built from the ground up to reflect a company's unique identity. It weaves in brand colors, bespoke typography, and custom icons to forge a digital presence that’s instantly recognizable and memorable.\n\nThis chart shows just how popular different color palette strategies are within these themes, with monochromatic—using shades of a single color—being the clear favorite.\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fbfbe6fa-af82-40e0-a2cf-4dcfc773c2ca.jpg)\n\nWhat this tells us is that a massive **40%** of designers lean on monochromatic palettes. Their inherent simplicity and cohesiveness make them a safe but incredibly effective foundation for almost any UI theme.\n\nTo help you visualize the differences between the most common styles, we've put together a simple comparison table.\n\n### Comparison of Common UI Theme Types\n\n| Theme Type     | Key Characteristics                                                                | Pros                                                                                       | Cons                                                                            | Best For                                                                |\n| :------------- | :--------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------ | :---------------------------------------------------------------------- |\n| **Light**      | Dark text on a light background. High contrast, clean, and open feel.              | Excellent readability in bright light, feels familiar, great for text-heavy sites.         | Can cause eye strain in low-light environments, higher energy use on OLED.      | Blogs, news sites, e-commerce, productivity apps.                       |\n| **Dark**       | Light text on a dark background. Reduced glare and modern aesthetic.               | Reduces eye strain at night, saves battery on OLED, highlights content like photos/videos. | Can reduce readability for long text passages, potential for \"halation\" effect. | Media streaming, code editors, creative portfolios, trading dashboards. |\n| **Minimalist** | Abundant white space, limited color palette, focus on typography and core content. | Uncluttered, calming, fast-loading, puts focus entirely on the user's task.                | Can feel generic if not executed well, may lack strong visual personality.      | Portfolios, agency websites, SaaS products with a focus on usability.   |\n\nThis table should give you a clear, at-a-glance understanding of where each theme shines and what its potential drawbacks are. Choosing the right one is all about balancing your brand's personality with your users' needs and context.\n\n## The Building Blocks of Every UI Theme\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/e1425fa1-3307-463a-87e5-0a8cacf66ef1.jpg)\n\nA great UI theme isn't just a splash of color. It's a disciplined system of interconnected design decisions, all working in harmony.\n\nThink of it like a recipe. You can't just toss ingredients in a bowl and hope for the best. You need the right elements, in the right amounts, to create something cohesive and satisfying. In the same way, a polished theme is built from several core ingredients that transform a basic interface into a seamless design system.\n\n### Color Palettes and Typography\n\nThe first thing anyone notices is the **color palette**. This is way more than just picking a few colors you like; it’s about creating a visual hierarchy that tells users what to look at.\n\n- **Primary Colors:** This is your brand's signature. It's the color you'll see the most.\n- **Secondary Colors:** These play a supporting role, highlighting less critical information without stealing the show.\n- **Accent Colors:** These are your showstoppers. You save them for the important stuff—call-to-action buttons, links, and notifications—to grab attention instantly.\n\nJust as critical is **typography**, the system of fonts that gives your content personality and structure. A solid typographic system uses defined sizes, weights, and styles to distinguish headings from body text and captions, making everything on the page easier to scan and read.\n\n> A well-crafted theme creates a predictable visual rhythm. Users shouldn't have to think about where to look or what to click; the design should guide them there naturally.\n\n### Iconography, Spacing, and Component States\n\nBeyond colors and fonts, a few other elements really define a theme's character. **Iconography**, for instance, acts as a universal visual shorthand. Whether you choose filled, outlined, or two-tone icons, the key is consistency. Stick with one style.\n\nThen there's **spacing**. This is the unsung hero of good design. The margins, padding, and negative space between elements create breathing room and define relationships on the page. Without proper spacing, even the best-looking interface feels cluttered and chaotic.\n\nFinally, every interactive element needs to account for its various **component states**. A button isn’t just a static rectangle; it has a life of its own. It needs distinct styles for its default, hover, active, and disabled states. These visual cues are crucial for letting users know the interface is responding to their actions. These components are so foundational, we dedicated a whole guide to explaining [what UI components are](https://magicui.design/blog/what-are-ui-components).\n\nThe market for well-structured themes shows just how valuable this is. In 2025, the average premium theme costs around **$59**, with some bestsellers like Avada selling over a million copies. This demand proves that people are more than willing to pay for sophisticated, feature-rich interfaces built on these solid design principles.\n\n## Best Practices for Designing Effective UI Themes\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/DFMn2Fxm9Aw\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nKnowing the building blocks of a great UI theme is one thing. Actually piecing them together into a system that’s both beautiful and functional? That’s a whole different ball game. Crafting an effective **user interface theme** is less about picking pretty colors and more about a thoughtful approach that balances aesthetics with raw usability. Every single design choice needs to have a purpose.\n\nAnd that process always, always starts with one non-negotiable: accessibility. An interface that isn't usable by everyone isn't just flawed—it's broken. This means baking in established guidelines from the very beginning to create an experience that works for every single user.\n\n### Prioritize Accessibility from Day One\n\nAccessibility isn't a checkbox you tick off at the end of a project. It's the concrete foundation you build everything on top of. Your theme's color palette, for instance, has to meet the Web Content Accessibility Guidelines (WCAG) contrast standards. This is crucial for making sure text is legible for users with visual impairments.\n\nA light gray text on a white background might look minimalist and clean to you, but for some users, it’s practically invisible. This is where a contrast checker tool becomes your best friend. Use one to validate that all your text and interactive elements meet at least the AA standard, which calls for a contrast ratio of **4.5:1** for normal text.\n\n> A theme that is beautiful but inaccessible has failed at its most fundamental job. The goal is to create interfaces that empower every user, regardless of their abilities.\n\nBut it doesn't stop at color. A truly accessible theme has to support keyboard navigation and play nicely with screen readers. The visual hierarchy you create with colors and spacing needs to translate into a logical, navigable structure for anyone using assistive technologies.\n\n### Plan for Scalability and Consistency\n\nA great theme isn't a one-and-done project; it’s built to grow and adapt. If you plan for scalability right from the start, you’ll save yourself countless hours of soul-crushing rework down the line. The secret? **Design tokens** (or CSS custom properties).\n\nInstead of hardcoding a hex value like `#007bff` every time you need your primary blue, you define a token like `--color-primary`. Now you have a single source of truth. Need to update the entire theme's primary color? You change one line of code. This simple system is the backbone of any scalable and maintainable UI.\n\nConsistency is the other side of that coin. To create a seamless user journey, you have to apply your theme's rules uniformly across every single component and screen.\n\n- **Define All Component States:** A button isn't just a button. It has `hover`, `active`, `focus`, and `disabled` states. Each one needs a distinct design so users get clear, immediate visual feedback for every interaction.\n- **Use Motion Thoughtfully:** Animation can be a powerful tool for guiding a user's attention and making an interface feel alive and responsive. But it must have a purpose—think a subtle fade-in on a modal—not just be for decoration, which can quickly become distracting.\n\nThinking about these details is also crucial for the bigger picture, like how your theme supports a user's entire journey. For more on that, it’s worth learning about [user onboarding best practices](https://screencharm.com/blog/user-onboarding-best-practices). By sticking to these principles, you'll build themes that aren't just visually appealing, but are also robust, inclusive, and genuinely a joy to use.\n\n## How to Implement User Interface Themes\n\n![Image](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/782343d7-cdf3-40b2-8d36-186ac6648167.jpg)\n\nAlright, let’s get our hands dirty. Moving from a polished design concept to a real, live application is where the magic truly happens. Implementing a **user interface theme** isn't just about flipping a switch; it's a methodical process that turns your abstract ideas into something your users can actually see, touch, and feel.\n\nThe modern way to do this revolves around a single, central system that acts as the command center for your entire app's look. It all starts with defining your theme’s core ingredients—colors, fonts, spacing—as **design tokens**.\n\nThink of these tokens as variables for your design system. Instead of hardcoding a hex value like `#FFFFFF` everywhere you need a white background, you create a token like `colors.background`. This one small shift is the secret sauce to building themes that can be switched on the fly with almost zero effort.\n\n### Setting Up Your Theming Foundation\n\nFirst things first: you need a central theme file. This file is your configuration hub, the place where you’ll define all your design tokens for every theme you want to support, like light and dark modes.\n\nFor example, your `colors.background` token might be `#FFFFFF` in your light theme, but it flips to `#121212` in your dark theme.\n\nOnce those tokens are defined, you start referencing them throughout your entire component library. Every button, every navigation bar, every single element becomes \"theme-aware\" because it’s not using a static, hardcoded value. It's pulling its style from that centralized source. The result? When a user toggles the theme, the whole app updates instantly and perfectly, because everything is listening to the same set of instructions.\n\nThe sheer size of the theme market shows just how powerful this is. As of September 2025, the [WordPress](https://wordpress.org/) ecosystem alone boasts over **30,000** themes. With nearly 13,000 free options on WordPress.org and another 12,000 on [ThemeForest](https://themeforest.net/), it’s clear there’s a massive global demand for adaptable designs. [WPZOOM](https://www.wpzoom.com/blog/wordpress-statistics/) offers some great insights into the scale of this ecosystem.\n\n### A Practical Theme Toggler Example\n\nLet's see what this looks like in practice with a simple React MDX example. The code below shows a basic `Card` component and a `ThemeToggler` button. The key here is how the `Card`'s styling isn’t fixed—it’s determined by a `theme` prop that can be either 'light' or 'dark'.\n\n```jsx\n// A simple themed Card component\nconst Card = ({ theme, children }) => {\n  const styles = {\n    light: {\n      backgroundColor: \"#ffffff\",\n      color: \"#111827\",\n      border: \"1px solid #e5e7eb\",\n    },\n    dark: {\n      backgroundColor: \"#1f2937\",\n      color: \"#f9fafb\",\n      border: \"1px solid #4b5563\",\n    },\n  }\n\n  const currentStyle = styles[theme]\n\n  return (\n    <div className=\"rounded-lg p-6 shadow-md\" style={currentStyle}>\n      {children}\n    </div>\n  )\n}\n\n// Example usage with a toggler state (managed by React's useState)\n// const [theme, setTheme] = useState('light');\n// <Card theme={theme}>This is a themed card!</Card>\n```\n\n> This example gets right to the heart of theming: component styles are not static. They are dynamic variables that react to a global state, allowing the entire UI to transform with a single click.\n\nOf course, building a full-fledged theme switcher means managing this state across your entire application. Thankfully, libraries like Magic UI offer pre-built solutions that take care of all the tricky logic and animations for you.\n\nYou can check out the documentation for an [animated theme toggler component](https://magicui.design/docs/components/animated-theme-toggler) to see how you can add this feature with just a few lines of code. By taking this component-based, token-driven approach, you can build dynamic, visually impressive interfaces without breaking a sweat.\n\n## Common Questions About UI Themes\n\nAs you start working more with **user interface themes**, you’ll probably run into the same questions that trip up most designers and developers. Things like telling the difference between a UI kit and a theme, or figuring out the right way to build a dark mode that doesn’t hurt your eyes.\n\nLet's clear up some of that confusion. Here are straightforward answers to the most common questions we hear.\n\n### UI Kit Versus UI Theme\n\nThis one comes up all the time. Are UI kits and UI themes the same? Not exactly, but they are partners in crime.\n\nA **UI kit** is your box of LEGOs. It’s a complete set of pre-built, reusable components—the buttons, form fields, navigation bars, and cards that you’ll use to construct your app. The kit itself is usually unstyled, focusing purely on function and structure. It's the raw material.\n\nA **UI theme** is the style guide you apply to those LEGOs. It dictates the colors, typography, spacing, and shadows that give your interface a consistent, branded look and feel. It’s the paint, the finish, and the overall aesthetic.\n\n> Simply put: a UI kit is the _what_ (the components), and a UI theme is the _how it looks_ (the styling). You apply a theme to a kit to make it yours.\n\n### The Role of Design Tokens in Theming\n\nSo how do you actually manage all this styling across a big application? That's where design tokens come in. They are the secret sauce for any modern, scalable **user interface theme**.\n\nThink of design tokens as variables for your design decisions. Instead of hardcoding a hex code like `color: #007bff;`, you create a token and use that instead, like `color: var(--color-primary);`. This might seem like a small change, but it's incredibly powerful.\n\nWhen you want to switch your entire app from light to dark mode, you don't have to hunt down every single color value. You just update your core tokens.\n\n- **Light Theme:** `--color-background: #FFFFFF;`\n- **Dark Theme:** `--color-background: #121212;`\n\nSuddenly, every component that uses that token updates automatically. This is how you keep your interface perfectly consistent and make theme management something you can handle in minutes, not days.\n\n### Key Accessibility Rules for Dark Mode\n\nBuilding a great dark mode isn't as simple as just flipping a switch and inverting your colors. To make it comfortable and usable for everyone, you have to nail the accessibility.\n\nHere are the non-negotiables:\n\n1.  **Ditch Pure Black:** Never use a pure black background (`#000000`) with pure white text. That extreme contrast causes an effect called \"halation,\" where the text seems to glow and blur into the background, causing serious eye strain. A dark gray (like **`#121212`**) is much easier on the eyes.\n2.  **Mind Your Contrast:** Every piece of text and every button still needs to pass WCAG AA contrast standards against the new dark background. This is a must for readability, especially for users with visual impairments.\n3.  **Desaturate Your Colors:** Bright, punchy accent colors can look almost painfully vibrant on a dark screen. Pulling back the saturation a bit helps them sit more naturally in the design while still grabbing attention when they need to.\n\n### Applying a Theme to an Existing App\n\nWhat if you have an app that’s already built? Can you just drop a new UI theme on top of it? Well, yes... but how painful it will be depends entirely on how the app was built in the first place.\n\nIf the app was made with a component library that supports theming or was styled using CSS custom properties (design tokens), you're in luck. The process can be pretty straightforward, sometimes as simple as changing a few lines in a config file.\n\nBut if the styles are hardcoded all over the place—inline styles, messy stylesheets—then you’re looking at a much bigger job. It often means a major refactor of all the CSS to get things organized. This is exactly why thinking about your theming strategy from day one saves so much time and frustration down the road.\n\n---\n\nReady to stop wrestling with code and start building beautiful interfaces in minutes? With **Magic UI**, you get access to over **50** customizable blocks and templates built with React, Typescript, and Tailwind CSS. Explore our library of **150+** free animated components and see how easy it can be to create stunning landing pages. [Get started with Magic UI today!](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/visual-hierarchy-in-web-design.mdx",
    "content": "---\ntitle: A Guide to Visual Hierarchy in Web Design\ndescription: >-\n  Master visual hierarchy in web design with our guide. Learn core principles\n  and practical tips to create intuitive, high-converting websites.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/f6e65fb4-3d55-47de-983a-a8ed41de3b1e/visual-hierarchy-in-web-design-visual-hierarchy.jpg\nauthor: Dillion Verma\ntags:\n  - visual hierarchy in web design\n  - ui design principles\n  - user experience\n  - conversion optimization\n  - front-end development\npublishedOn: \"2025-12-10T09:53:07.982392+00:00\"\nfeatured: true\n---\n\nEver land on a website that just _feels_ right? You instantly know where to click, where to read, and what to do next without a moment's hesitation. Now, picture the opposite: a site that’s chaotic, confusing, and makes you want to hit the \"back\" button immediately.\n\nThe difference between these two experiences almost always comes down to one thing: **visual hierarchy**.\n\nThink of a well-designed webpage like a perfectly organized storefront. Your eyes are naturally drawn to the big, bold window display (the headline), then to the featured products on mannequins (subheadings and images), and finally to the smaller price tags and descriptions (the body text). This entire journey is carefully orchestrated, not accidental.\n\nVisual hierarchy is this strategic art of arranging elements to signal their importance. It's about creating a seamless path for the user's eye, guiding their attention from one point to the next in a logical, intuitive sequence. It transforms a simple collection of text and images into a clear, scannable, and effective communication tool. A well-executed hierarchy is a cornerstone of modern [web design best practices](https://magicui.design/blog/web-design-best-practices).\n\n### The Goal of a Strong Hierarchy\n\nAt its core, the goal is to eliminate friction and reduce the user's cognitive load. When a page has a clear visual order, people don’t have to waste mental energy just figuring out where to look. This makes their experience smoother, more enjoyable, and far more efficient.\n\nA strong visual hierarchy helps you nail several key outcomes:\n\n- **Improves Scannability:** Let's be real—people scan, they don't read. A good hierarchy lets them quickly grasp the page structure and find what they need.\n- **Directs Attention:** It’s your tool for pointing a giant, invisible arrow at the most important stuff, like your call-to-action (CTA) buttons or key value propositions.\n- **Enhances User Experience:** It makes navigating your site feel effortless and intuitive, which is crucial for reducing frustration and keeping people from bouncing.\n- **Boosts Comprehension:** By presenting information in a structured, logical way, you help users process and remember it more effectively.\n\nUltimately, visual hierarchy is about answering one question for the user: \"What's the most important thing here?\" In our mobile-first world, where screen real estate is precious, making this prioritization crystal clear isn't just a nice-to-have—it's essential for creating an experience that works.\n\n## The Building Blocks of Visual Hierarchy\n\nTo get a real handle on visual hierarchy, you first need to understand the pieces that make it up. These aren't just abstract theories; they're the practical tools designers use every single day to guide a user’s eye and bring a sense of order to the screen. Think of them as the grammar of design. Each principle works with the others to form clear, coherent visual \"sentences\" that people can understand in an instant.\n\nWhen you combine these building blocks the right way, you create a clear path for the user. It tells them what to read first, what to click next, and what’s just supporting information. This deliberate arrangement is what separates a page that feels intuitive from one that feels like a total mess.\n\n### Size and Scale Command Attention\n\nThe most straightforward way to signal importance is with **size and scale**. Our brains are just wired to notice bigger things first, and that instinct translates directly to web design. Simply put, bigger elements feel more important and grab our attention immediately.\n\nFor example, a hero section's headline is almost always the largest piece of text on the page, locking it in as the primary message. Call-to-action buttons are often beefed up in size compared to other links to pull the user's focus right where you want it. This isn't just about making things big for the sake of it; it's about creating a deliberate contrast in scale between your primary, secondary, and tertiary elements.\n\n### Color and Contrast Create Focal Points\n\nColor and contrast are your power tools for creating an emotional connection and, more importantly, for drawing the eye. Bright, bold colors naturally pop against more muted backgrounds, creating instant focal points. This is exactly why you'll see crucial buttons like \"Buy Now\" or \"Sign Up\" decked out in a brand's most vibrant accent color.\n\nContrast—the difference between elements—is just as vital. High contrast, like classic black text on a white background, makes things easy to read. Low contrast, on the other hand, can make text a real chore to get through and cause eye strain. Using contrast strategically helps your key information stand out, making sure your most important messages aren't just seen, but easily absorbed.\n\n> **Key Takeaway:** The human eye is a sucker for contrast. A single, brightly colored button on an otherwise neutral page is one of the most effective ways to tell a user, \"Click here!\"\n\nThis classic pyramid model shows how content is typically layered on a webpage, starting with the most prominent headline and moving down to the finer details.\n\n![Inverted pyramid diagram showcasing content hierarchy: Headline, Subheadings, Body Text, and Details with arrows.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/779eaaac-cffd-40b6-8012-ebb85f0cb836/visual-hierarchy-in-web-design-content-hierarchy.jpg)\n\nThe shape itself is a great reminder: you should have fewer high-importance elements (like a single main headline) and progressively more elements of lower importance as you go down the page.\n\n### Typography Guides the Reader\n\nTypography is so much more than just picking a pretty font. It’s about structuring text to be scannable and digestible. A well-defined typographic hierarchy uses different font sizes, weights (like bold or regular), and styles to create obvious levels of information.\n\nJust think about a standard blog post:\n\n- **H1 (Title):** The biggest and boldest text, designed to grab you immediately.\n- **H2/H3 (Subheadings):** Smaller than the title but bigger than the body, breaking the content into bite-sized, scannable sections.\n- **Body Text:** The smallest, standard-weight text, optimized for comfortable, long-form reading.\n\nThis simple structure lets users scan the subheadings to get the gist of an article without having to read every single word.\n\n### Whitespace and Repetition Build Rhythm\n\nSometimes, what you _don't_ see is just as important as what you do. **Whitespace**, often called negative space, is the empty area around elements on a page. It’s a surprisingly powerful tool for cutting down on clutter and creating logical groups.\n\nElements that are close together are seen as related—a principle called proximity. By leaving generous whitespace between different sections, like a feature list and a testimonial block, you create a clean visual separation that makes the layout much easier to process. This \"breathing room\" is essential for preventing users from feeling overwhelmed.\n\nFinally, **repetition** creates a sense of consistency and predictability. When you use the same styles for similar elements—like making all clickable links the same color or all section headings the same font—you teach users the rules of your site. This consistency creates a comfortable rhythm, letting them navigate your interface confidently and without confusion.\n\nBelow is a quick-reference table summarizing these core principles. It breaks down how each one is used in practice and the psychological effect it has on the user's journey through your site.\n\n### Core Principles of Visual Hierarchy\n\n| Principle              | How It Is Used                                                                       | Impact on User                                                                                      |\n| ---------------------- | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- |\n| **Size and Scale**     | Making key elements like headlines and CTAs larger than less important ones.         | Immediately draws attention to what's most important, establishing a clear starting point.          |\n| **Color and Contrast** | Using bright or contrasting colors for buttons and links to make them stand out.     | Creates focal points, guides the eye to interactive elements, and improves readability.             |\n| **Typography**         | Using different font sizes, weights (bold), and styles for headings and body text.   | Organizes text into a scannable structure, allowing users to quickly grasp the main ideas.          |\n| **Whitespace**         | Adding empty space around elements and sections to reduce clutter and group content. | Improves comprehension by separating distinct ideas and prevents the user from feeling overwhelmed. |\n| **Repetition**         | Applying consistent styles (e.g., color, font) to similar elements across the site.  | Creates a sense of predictability and order, making the interface feel intuitive and easy to learn. |\n\nBy mastering these five principles, you move from just placing elements on a page to intentionally designing a user experience. You're no longer just decorating; you're communicating.\n\n## Why Visual Hierarchy Drives Business Success\n\nA strong visual hierarchy isn't just about making a website look good; it's a powerful tool that directly impacts your bottom line. When a user lands on your page and can instantly figure out where to look and what to do, they're far more likely to stick around. This isn't an accident—it's the result of a deliberate, well-planned hierarchy guiding their eyes.\n\nFumble this, and you leave them stranded in a sea of visual noise. Confusion quickly turns into frustration, and before you know it, they’ve bounced off your site and landed on a competitor’s. A weak hierarchy isn’t just a design problem; it’s a direct line to lost opportunities.\n\n### Boosting Engagement and Reducing Friction\n\nThink of an effective visual hierarchy as a tour guide for your visitors. It points out the most important landmarks (your value proposition), shows them the best path to take (the user flow), and makes sure the final destination (your CTA) is impossible to miss. This clarity is a game-changer for user engagement.\n\nWhen information is structured logically, people can scan and absorb it without much effort. The reality is, users only read about **20% to 30%** of the text on a webpage, so scannability is everything. A solid hierarchy ensures that your key messages get noticed even during a quick glance. This cuts down on user friction and keeps them on your site longer. If you want to see the hard data, check out [VWO's comprehensive analysis](https://vwo.com/blog/web-design-statistics/) on how design influences behavior.\n\n### From Clicks to Conversions\n\nAt the end of the day, your website has a goal: make a sale, get a lead, or earn a subscriber. A clear visual hierarchy is directly tied to improving the user experience and steering people toward these critical actions. This is the core of [what is Conversion Rate Optimization Explained](https://mayurnetworks.com/blog/what-is-conversion-rate-optimization). By applying principles like size, color, and contrast, you can make your calls-to-action pop off the screen.\n\nThis is where design turns directly into revenue. A big, bold \"Add to Cart\" button or a well-defined \"Sign Up Now\" form isn't just about aesthetics; it's about performance. The design actively funnels attention toward conversion points, making the desired action feel like the most natural next step. To explore this further, our guide on [how to improve website conversion rates](https://magicui.design/blog/how-to-improve-website-conversion-rates) offers more practical strategies.\n\n> An intuitive site structure doesn't just guide users; it builds trust. When a website feels professional and easy to use, it signals credibility and reliability, turning skeptical visitors into loyal customers.\n\nInvesting in a solid **visual hierarchy in web design** is really an investment in your business. It elevates your website from a simple digital brochure to a strategic tool that actively guides behavior, improves key metrics, and drives real results. It’s no surprise that over **61%** of website redesigns are kicked off by a bad user experience—proving just how vital a well-structured interface is for keeping customers and growing your business.\n\n## Building Interfaces with React and Tailwind CSS\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/L2KHCWJ3gjs\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nTheory is great, but turning design principles into working, breathing code is where the real fun begins. For developers, tools like [React](https://react.dev/) and [Tailwind CSS](https://tailwindcss.com/) are the perfect sandbox for building interfaces that aren't just beautiful, but also make perfect sense to the user.\n\nWhat we're aiming for here is a collection of reusable, accessible components that guide people through a page without them even realizing it.\n\nTailwind’s utility-first approach is an absolute game-changer for this. Instead of getting bogged down writing custom CSS, you apply tiny, pre-built classes right in your JSX. This gives you direct control over every piece of the hierarchy puzzle—typography, spacing, color, you name it. It's incredibly fast for prototyping and building out designs with a clear sense of order.\n\n### Crafting Hierarchy with Tailwind Utilities\n\nLet's start with the basics: a headline and a call-to-action button. These are the bread and butter of almost any webpage. A strong visual hierarchy screams that the main message (your headline) and the most important action (that button) are the stars of the show.\n\nHere’s how you can pull this off in a simple React component using Tailwind CSS. Notice how we're using utility classes for font size, weight, and color contrast to make things pop.\n\n```jsx\nfunction HeroCTA() {\n  return (\n    <div className=\"p-8 text-center\">\n      <h1 className=\"mb-4 text-5xl font-extrabold text-gray-900\">\n        Build Amazing Websites Faster\n      </h1>\n      <p className=\"mb-8 text-lg text-gray-600\">\n        The ultimate UI library for modern web development.\n      </p>\n      <button className=\"rounded-lg bg-blue-600 px-8 py-3 text-lg font-bold text-white transition-colors hover:bg-blue-700\">\n        Get Started Now\n      </button>\n    </div>\n  )\n}\n```\n\nSee what’s happening here? The `<h1>` instantly demands attention with `text-5xl` and `font-extrabold`, making it the undeniable king of the component. Meanwhile, the button uses a bold `bg-blue-600` and generous padding (`py-3 px-8`) to create an unmissable target for the user's cursor. This is a perfect, textbook example of a strong **visual hierarchy in web design**.\n\n### Accelerating Development with Magic UI\n\nOf course, building every component from the ground up is one way to do it. But component libraries like **Magic UI** can put your development on hyperdrive. These are pre-built, production-grade blocks that come with visual hierarchy principles already baked right in. You can stitch together stunning, effective landing pages in minutes, not days.\n\nMagic UI components are built with React and Tailwind CSS, so they’re a breeze to integrate and customize. If you're new to the framework, getting it set up is simple. We have a full guide on [how to install Tailwind CSS](https://magicui.design/blog/tailwind-css-install) to get you running quickly.\n\n> When you use pre-built blocks, you’re not just saving time. You're standing on the shoulders of professional designers who have already figured out the tough hierarchy challenges for you. This frees you up to focus on what makes your content unique.\n\n### Deconstructing a Magic UI Block\n\nLet's pull back the curtain on a typical hero section from Magic UI to see how it puts these ideas into practice. A hero block has one job: make an immediate impact. Its hierarchy is absolutely critical for convincing a visitor to stick around.\n\nHere’s a simplified breakdown of how a Magic UI hero component is structured right out of the box:\n\n- **Primary Element (Headline):** It grabs you with the largest font size and the heaviest weight (`text-6xl`, `font-bold`). This is the core value prop, and it’s the very first thing your eyes are drawn to.\n- **Secondary Element (Description):** The text underneath is smaller and has less visual weight (`text-xl`, `text-muted-foreground`). It adds important context but doesn't fight the headline for the spotlight.\n- **Tertiary Elements (CTAs):** The main call-to-action button pops with a high-contrast background. Any secondary link, like \"Learn More,\" will have a subtler, outlined style. This gently nudges users toward the most important action.\n\nThis built-in structure means you can drop a component into your project and instantly have a well-organized, high-impact section. It's visual hierarchy made practical, saving you countless hours of design and development and ensuring your interfaces are effective from the very first line of code.\n\n## How to Test and Refine Your Visual Hierarchy\n\nGreat design isn't a \"set it and forget it\" kind of deal. It’s a living process that breathes and evolves with real user feedback. Building a strong visual hierarchy is your starting point, but the real magic happens when you test, analyze, and tweak it based on what your audience _actually_ does.\n\nWithout that crucial feedback loop, you're just guessing.\n\nThis is where a data-driven approach shifts your process from subjective hunches to objective facts. Instead of relying on gut feelings, you can use powerful tools to see exactly how people interact with your interface. These insights are pure gold for making smart improvements.\n\n### Uncovering User Behavior with Heatmaps\n\nOne of the best ways to put your **visual hierarchy in web design** to the test is with **heat mapping**. Tools like [Hotjar](https://www.hotjar.com/) or [Microsoft Clarity](https://clarity.microsoft.com/) create visual overlays on your site, showing you exactly where people click, move their cursors, and how far they scroll down the page.\n\nThink of it like putting on a pair of glasses that lets you see your site through your users' eyes. The \"hot\" spots (usually red or yellow) show where all the action is, while the \"cold\" spots (blue or no color) reveal which elements are getting completely ignored.\n\nThis can be a powerful—and sometimes humbling—reality check. You might discover that users are clicking on a non-interactive image over and over again while totally missing your main call-to-action button. That’s an instant signal that your intended focal point isn't hitting the mark and needs to be more prominent.\n\nThe image below from Microsoft Clarity shows how a heatmap visualizes clicks, giving you a crystal-clear picture of what's grabbing attention.\n\n![Illustration comparing two web page designs with distinct visual hierarchies, highlighted user engagement, and analysis tools.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/3243a251-39a4-463c-8e2a-387a983b0e37/visual-hierarchy-in-web-design-visual-comparison.jpg)\n\nThis kind of visual data is invaluable for pinpointing where your hierarchy is working and where it's falling flat. By combining this with analytics, you can start to quantify user patterns and refine your hierarchy to perfectly align with how people naturally behave. It's an iterative process that turns a static design into a user-centered experience that drives up engagement and conversions. You can find more practical tips on this in [these visual hierarchy principles](https://www.ronins.co.uk/hub/visual-hierarchy-principles-in-web-design/).\n\n### Validating Your Choices with A/B Testing\n\nWhile heatmaps show you _what's_ happening, **A/B testing** helps you understand _why_ and figure out what works better. The method is simple: you create two versions of a page (Version A and Version B) with one key difference, then show each version to a different segment of your audience.\n\nFrom there, you just measure which one performs better for a specific goal. For example, you could test things like:\n\n- A bright green CTA button vs. a subtle blue one.\n- A huge, centered headline vs. a smaller, left-aligned one.\n- A clean single-column layout vs. a two-column grid.\n\nBy tracking metrics like click-through rates, time on page, or conversions, you get undeniable proof of which design choice is more effective. This cuts out the guesswork and lets you make informed, incremental improvements to your visual hierarchy over time.\n\n> A/B testing isn't just about picking a \"winner.\" It's about learning what makes your audience tick—what colors they respond to, which layouts they find intuitive, and what words compel them to act.\n\n### Establishing a Continuous Improvement Loop\n\nTesting your visual hierarchy shouldn't be a one-time thing. User expectations change, and so should your design. The most successful websites operate on a continuous loop of feedback and refinement.\n\nIt breaks down into four simple steps:\n\n1.  **Design:** Build your interface using established visual hierarchy principles.\n2.  **Test:** Use tools like heatmaps and A/B tests to gather real-world user data.\n3.  **Analyze:** Dig into the data to figure out what’s working and what isn’t.\n4.  **Refine:** Make targeted adjustments based on what you learned, then start the cycle again.\n\nWhen you adopt this iterative mindset, you ensure your site’s hierarchy stays sharp, effective, and perfectly aligned with both your users' needs and your business goals. It transforms your design from a static project into a constantly improving asset that delivers better results for the long haul.\n\n## Common Visual Hierarchy Mistakes to Avoid\n\nKnowing the principles of visual hierarchy is one thing, but spotting where you’ve broken them in your own work? That’s a whole different skill. Even the most well-intentioned designs can fall flat if they stumble into common traps that leave users confused, frustrated, and ready to bounce.\n\nThese mistakes quietly sabotage your entire user experience, turning a great concept into a cluttered, ineffective mess. Learning what _not_ to do is just as important as learning the principles themselves. It gives you a sharper eye for critiquing your own work and ensures the final product is clear, focused, and actually works.\n\n![Before and after comparison of a web page, showing improved visual hierarchy from cluttered to minimalist design.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/dc7ce7ed-107b-4674-a695-3bade153fc67/visual-hierarchy-in-web-design-ui-comparison.jpg)\n\n### Creating Visual Clutter\n\nThis is probably the most common mistake out there: trying to make _everything_ important. When every single element on the page is screaming for attention—big fonts, bold text, bright colors everywhere—the result is pure visual chaos.\n\nThis \"everything is a priority\" approach always backfires. If everything is loud, nothing is. The user is left feeling overwhelmed, with no idea where to look first. The fix is to be ruthless with your prioritization. Pick the **one thing** you want the user to do or see, and give it the most visual weight. Everything else should be scaled back to support that main goal, not compete with it.\n\n### Lacking Sufficient Contrast\n\nPoor contrast is a silent killer of good design. When your text color is too close to its background, it’s a struggle to read. This isn't just a minor annoyance; it causes real eye strain and frustration.\n\nBeyond being a poor user experience, it’s also a massive accessibility fail, effectively locking out anyone with a visual impairment. Always, always check your contrast ratios. Use an online tool to make sure your color pairings meet at least **WCAG AA standards**. Readability should never be sacrificed for a trendy, low-contrast aesthetic.\n\n> **Key Insight:** A design with weak contrast forces users to work harder just to understand the content. This friction adds up, often leading them to abandon the page entirely in search of an easier experience elsewhere.\n\n### Using Inconsistent Styling\n\nInconsistency is a surefire way to confuse your users. If buttons, links, or headings look different from one page to the next, you shatter their mental model of how your site works. Suddenly, they have to re-learn your interface with every click, which completely disrupts their flow.\n\nThe solution is simple: create a consistent design system and stick to it.\n\n- **Links:** All clickable text should look and behave the same way, every time.\n- **Buttons:** Your primary, secondary, and tertiary buttons need consistent, distinct styles that are used for their intended purpose across the entire site.\n- **Headings:** The styles for your H1, H2, and H3 tags should be uniform to maintain a clear typographic scale.\n\nWhen you apply styles consistently, you build a predictable and intuitive experience. Users feel more confident and navigation becomes second nature. This is a fundamental part of creating a strong **visual hierarchy in web design** that people can actually trust.\n\n## Got Questions About Visual Hierarchy? Let's Clear Them Up.\n\nWe've walked through the what, why, and how of building a solid visual hierarchy. But theory is one thing, and practice is another. To help you connect the dots, here are some straight answers to the questions that pop up most often when people start applying these ideas.\n\n### How Does Visual Hierarchy Affect SEO?\n\nThis is a great question. While visual hierarchy isn't something Google's algorithm \"sees\" directly, its impact on SEO is huge—just indirect.\n\nThink about it: a strong visual guide improves the user experience. When people land on your page and can instantly figure out what to do and where to go, they stick around longer. They interact more. This lowers your bounce rate and bumps up session duration, two signals that tell search engines your page is high-quality and relevant.\n\nPlus, a well-structured page uses proper heading tags (H1, H2, H3) to create that hierarchy. This not only helps human readers scan your content but gives search engine crawlers a perfect map of your information, which can definitely help with indexing and visibility.\n\n### What's the First Thing to Consider When Planning a Layout?\n\nBefore you even touch a color palette or pick a font, you have to start with the page's primary goal. The absolute first question to ask is: **\"What is the number one action I want a user to take here?\"**\n\nIs it to buy a product? Sign up for a newsletter? Book a demo? Whatever that core action is, it becomes the north star for every design decision you make. Your main call-to-action (CTA) should be the king of the hill—the most visually dominant element on the page. Everything else is there to support it and guide the user's eye right to it.\n\n> A layout without a clear goal is like a map without a destination. It might look interesting, but it won't lead your users anywhere meaningful.\n\n### Is It Possible to Have _Too Much_ Visual Hierarchy?\n\nOh, absolutely. It's a classic rookie mistake, and it has a name: **visual noise** or **design clutter**.\n\nThis happens when you try to make _everything_ important. Every button is bright red, every headline is bold and huge, every icon is animated. When everything is screaming for attention, nothing actually gets it. The result? Your user is overwhelmed and has no idea where to look first. They get confused, frustrated, and they bounce.\n\nEffective hierarchy is about making deliberate choices. It’s about contrast. You have to be selective, giving serious visual weight _only_ to the elements that truly matter and letting the rest play a supporting role.\n\n---\n\nReady to skip the guesswork and build interfaces with a powerful hierarchy baked right in? **Magic UI** gives you a library of **50+** professional, open-source React and Tailwind CSS components. They're designed to help you build stunning, effective landing pages in a fraction of the time.\n\n[Explore Magic UI Components](https://magicui.design)\n"
  },
  {
    "path": "apps/www/content/blog/waitlist-landing-page.mdx",
    "content": "---\ntitle: \"How To Create a High Converting Waitlist Landing Page With Examples\"\ndescription: \"Build anticipation for your product launch. Capture leads with a waitlist landing page. Use Magic UI's startup template and start now!\"\nimage: https://cdn.magicui.design/assets/f6d8c5d7-4162-4916-8278-dabf95a07433.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nCrafting a compelling waitlist landing page can be the game-changer you've been looking for! These type of [landing page examples](https://magicui.design/blog/landing-page-examples) serve as a tool to generate excitement and capture leads before the product even hits the market.\n\nWhether you're a seasoned entrepreneur or a newbie to the startup, a well-designed waitlist landing page can make all the difference in creating interest and anticipation for your offerings. Magic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the solution for successful launch.\n\n## What Is A Waitlist Landing Page?\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1513258496099-48168024aec0?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHx0aGlua2luZyUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMjQ2MDE3OXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA waitlist landing page is a web page used to generate interest and anticipation for an upcoming product or service launch. It aims to evoke excitement and anticipation among your target audience and encourage landing page visitors to sign up and join the waitlist for:\n\n- Upcoming products\n- Features\n- Services\n\n### How does a Waitlist Landing Page work?\n\nA landing page is a [key element of email marketing](https://mailchimp.com/solutions/digital-marketing-templates/). Designed to convert leads, landing pages can help you build your email list, sell products and services, and even boost your newsletter subscribers.\n\n#### Gated Content Offers\n\nWhile it’s common to offer your leads instant access to [gated content](https://www.semrush.com/blog/what-is-gated-content/) — like downloads or webinar recordings in exchange for their signup and contact information — there are some instances when you might want to gather lead contact information only.\n\n#### Prelaunch Waitlist\n\nWhen a product or service is in the prelaunch phase, creating a waitlist landing page lets you drive excitement and anticipation around the offer while collecting contact information for interested leads.\n\n### Why are Waitlist Landing Pages important?\n\nWaitlist landing pages can generate demand and interest in a product or service before its launch. They help build your email list and collect contact information from interested leads, which can aid in planning marketing strategies and campaigns to promote the product or service effectively.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Use Cases Of A Waitlist Landing Page\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1557804506-669a67965ba0?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHx3b3JraW5nJTIwdG9nZXRoZXJ8ZW58MHx8fHwxNzIyNDYwMTg5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Building an Email List\n\nWaitlist landing pages are an excellent way to start building an [email list](https://convertkit.com/resources/blog/grow-email-list-for-free) even before your website is officially launched.\n\n#### Grow Your List\n\nYou can quickly grow your mailing list by collecting contact information from interested visitors and notifying them when your website is ready.\n\n#### Social Engagement\n\nIncluding your social media profiles on your landing page lets visitors stay in touch and engage with your brand before the website goes live.\n\n### Testing New Ideas\n\nWaitlist landing pages can also serve as a platform to test new ideas for products or services. You can gauge potential customers' interest levels by asking visitors to sign up or complete a survey expressing interest in a particular concept.\n\nYou can set a predetermined number of sign-ups or positive survey responses as a validation point before launching a new product or service.\n\n### Creating a Waitlist\n\nWaitlist landing pages make it simple to build a list of potential clients eagerly waiting for your business, training, software, event, course, or product to launch officially.\n\nBy asking people to join the waitlist, you create a sense of exclusivity and anticipation, generating excitement around your upcoming offering.\n\n### Building a Sense of Urgency\n\nIncluding a countdown timer on your waitlist landing page can create a [sense of urgency](https://unicornplatform.com/blog/how-to-launch-a-waitlist-and-build-hype-for-your-product/) among visitors, encouraging them to sign up sooner rather than later.\n\nImplying that your product or services are in high demand and that the offer is available for a limited time can boost signups and generate more interest in your upcoming launch.\n\n### MagicUI: A Design Engineer's Dream Tool\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers.\n\n#### Features of Our Component Collection\n\n- Over 20 animated components\n- Built with React, TypeScript, Tailwind CSS, and Framer Motion\n- Visually appealing and interactive elements\n- Easy integration into web applications\n- Create stunning user interfaces with minimal effort\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\n#### Why Choose MagicUI\n\n- Focus on animation and design-centric approach\n- Bridges the gap between design and development\n- Empowers the creation of captivating digital experiences\n- Free component library available\n- MagicUI Pro saves thousands of hours\n- Create beautiful landing pages with website templates\n- Convert visitors into customers\n\nDiscover the perfect solution for your startup with our startup landing page template. Designed to attract and engage your audience, this template offers a professional and polished look to kickstart your online presence. Today, use our startup landing page template ([https://pro.magicui.design/docs/templates/startup](https://pro.magicui.design/docs/templates/startup)) to transform your website and captivate your visitors. Start now!\n\n## What Elements Are Included On A High-Converting Waitlist Landing Page\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1529339017023-c2f2ce633d0d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxfHxzdGlja3klMjBub3RlfGVufDB8fHx8MTcyMjQwNjUwMHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Product Value Proposition\n\nA waitlist landing page must capture the essence of the product or service you're building. This usually includes:\n\n- A compelling headline\n- A subheading\n- 2-3 bullet points highlighting unique features or user benefits\n\nSupporting visuals, such as images or mock-ups, can create excitement and showcase that the product is actively being developed.\n\n### Waitlist Value Proposition\n\nIn addition to the product value proposition, it's essential to communicate the value of joining the waitlist. This could include:\n\n- Behind-the-scenes launch information\n- Exclusive discounts\n- Early access benefits\n\nSpelling out the benefits of being on the waitlist can incentivize visitors to sign up.\n\n### High-Quality Imagery\n\nVisuals play a crucial role in engaging visitors and conveying information. Incorporating high-quality images of MVPs or prototypes can help build excitement and demonstrate that the product is actively being worked on. Research shows that incorporating visuals into content can increase engagement and retention.\n\n### Call-To-Action (CTA)\n\nThe primary call to action on a waitlist landing page is usually to join an email list. By capturing visitor emails, you can build a list of interested leads to engage with in the future.\n\nA clear and compelling [CTA button](https://www.optimizely.com/optimization-glossary/call-to-action/) can encourage visitors to sign up and stay informed about the launch.\n\n### Deadline/Launch Date\n\nPeople want to know when the product or service will be available. Providing a specific launch date or a rough timeframe for completion can set expectations and help visitors plan ahead. Adding a sense of urgency can also encourage more sign-ups for the waitlist.\n\n### Social Sharing Buttons\n\nBuilding hype around a new product, service, or business can be essential for reaching revenue targets. Including [social sharing buttons](https://blog.hubspot.com/blog/tabid/6307/bid/29544/the-ultimate-cheat-sheet-for-creating-social-media-buttons.aspx) on the landing page can encourage visitors to share the page with their networks, increasing visibility and interest in the upcoming launch.\n\n## How To Design A High-Converting Waitlist Landing Page?\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1648854006531-361649aa182c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxmaWdtYXxlbnwwfHx8fDE3MjI0NjAyNDJ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Choosing a Reliable Landing Page Builder\n\nWhen designing a high-converting waitlist landing page, starting with a reliable landing page builder is crucial. Select a tool that offers excellent landing page templates, interactive components, and elements like animations that align with current design trends.\n\n[Magic UI](https://pro.magicui.design/docs/templates/startup) is an excellent choice as it provides various templates and animated components to make your page stand out and capture visitors' attention.\n\n### Planning the Page Design\n\nCreate a clean, aesthetically pleasing design for a successful waitlist landing page encouraging lead conversion.\n\n#### Design Foundation\n\nUtilize landing page [templates to kickstart your design process](https://www.office.xerox.com/latest/COLFS-02UA.PDF). Incorporate colors that reflect your brand identity and add your logo to ensure the page accurately represents your business.\n\n#### Clear Focus\n\nAvoid overwhelming visitors with information and use design elements to guide them toward the email signup and opt-in form.\n\n#### Landing Page Inspiration\n\nLook at successful landing page examples to understand what works best. Typically, effective landing pages have a clean design with vibrant pops of color that draw attention to crucial sections and essential information.\n\n### Including Key Elements\n\nYour waitlist landing page should prominently display your offer, whether a new product, service, software, early access to a limited-time offer, or an exclusive tutorial. Use images, videos, and clear copy to build excitement around the offer.\n\n#### Page Organization\n\nHeaders help maintain [page organization](https://www.helpscout.com/blog/value-proposition-examples/) and prevent readers from missing vital elements. To guide readers through the page, incorporate bullet points, bold statements, and quotes in different colors.\n\n#### Exit Intent Popups\n\nConsider adding a popup form that triggers when visitors are about to leave the page. This provides them with a second chance to sign up for the offer.\n\n#### Urgency Tactics\n\nIncluding a countdown timer can also instill a sense of urgency, boosting conversions and creating anticipation.\n\n### Perfecting Your CTA\n\nThe call to action (CTA) on your waitlist landing page is critical to its success. Your CTA should be clear and straightforward, prompting visitors to take the desired action. An eye-catching CTA button can encourage visitors to complete the signup or opt-in form.\n\n### Creating a Signup Form\n\nIncorporate a signup form using tools like Typeform or Jotform embedded within your landing page. Keep the form concise by including only necessary fields like email addresses and first names.\n\nLonger forms can lead to page abandonment and lost leads. Capture and manage form submissions automatically, organizing them into a spreadsheet or CSV file for further action.\n\n### Adding a Thank You Page\n\nA thank you page is essential for a waitlist or upcoming launch landing page. This page should offer additional details and inform respondents that they will receive further communication via email once the offer is ready. A clear thank you page helps manage expectations and minimize follow-up inquiries.\n\n### A/B Testing Your Landing Page\n\nIt is crucial to A/B test your waitlist landing page to identify practical elements like copy and CTAs. Testing allows you to refine your page layout and content, enhancing conversions and setting the stage for a successful product or service launch.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 3 Examples Of Waitlist Landing Page\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1649252504279-b8a8480e8875?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxpZGVhdGlvbnxlbnwwfHx8fDE3MjI0MDY4NTl8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Going Pro Yoga\n\nGoing Pro Yoga has a waitlist landing page that promotes their upcoming [online platform for yoga teachers](https://yttmasterclass.ck.page/). They offer founding members free lifetime membership and early access to the platform.\n\n#### Clear Communication\n\nThe headline is straightforward about what is coming soon, and the page copy provides a glimpse into the platform's benefits.\n\n#### Call to Action\n\nThe standout CTA button contrasts with the background, making it more visible and likely to attract clicks.\n\n### 2\\. Gyre\n\nGyre offers relationship management services in the [Web3 space](https://dribbble.com/shots/20746419--Gyre-Waitlist-for-WEB3), helping users coordinate across platforms like:\n\n- Telegram\n- Twitter\n- Discord\n\n#### Futuristic Design\n\nThe waitlist landing page adopts a futuristic aesthetic common in Web3 landing pages. It features:\n\n- Modern typography\n- Gradient designs\n\n#### Design Enhancements\n\nWhile the page includes input fields for email and name, a CTA button, and links to their Twitter and Medium profiles, improving the button color for better visibility and adding some explanatory text might enhance user experience.\n\n### 3\\. OpenTable\n\nOpenTable's waitlist landing page is designed to simplify the restaurant reservation process for diners and dining facilities.\n\n#### Platform Features\n\nThe platform allows users to discover, book, and experience various culinary delights. The page aims to capture visitors' [eagerness to gain early access](https://dribbble.com/shots/3020769-Join-the-Waitlist) to:\n\n- New restaurants\n- Chef specials\n- Exclusive dining events\n\n#### Visual Appeal\n\nThe color theme reflects the vibrancy and diversity of the culinary world, maintaining an inviting feel that speaks to the warmth and sophistication of dining experiences.\n\n## Best Practices For Designing A Waitlist Landing Page\n\n![Waitlist Landing Page](https://images.unsplash.com/photo-1523240795612-9a054b0db644?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx0ZWFtJTIwZGlzY3Vzc3xlbnwwfHx8fDE3MjI0NjAyNjV8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Choose a Clean, Minimal Design\n\nStarting with a minimalistic design for your waitlist landing page is essential. Opting for a layout with plenty of white space avoids overwhelming visitors and focuses their attention on your core message.\n\nA simple theme with limited font variations significantly enhances the user experience, making navigation intuitive.\n\n#### Customizable Templates\n\n[Magic UI's templates](https://pro.magicui.design/docs/templates/startup) offer clean, minimalistic designs that can be easily edited to match your brand.\n\n### Compelling Headline\n\nA compelling headline is a must for a waitlist landing page. The headline must instantly grab visitors' attention and communicate the benefits of joining the waitlist.\n\nPhrases like \"Be the first to experience \\[Product Name\\]\" or \"Secure your early access to \\[Service Name\\]\" create a sense of exclusivity and urgency.\n\n### Visible Call-to-Action (CTA)\n\nThe CTA on your waitlist landing page is crucial. Ensure it's prominently displayed and encourages visitors to submit their email addresses.\n\n#### Compelling CTAs\n\nCTAs like \"Sign up for exclusive access\" or \"Join the waitlist now\" can be highly effective. The design of the CTA button should be eye-catching, making it stand out on the page. You can even use Magic UI's animated or shimmer [CTA button](https://pro.magicui.design/docs/templates/startup) to make the CTA more visible to visitors.\n\n### Social Proof and Testimonials\n\nAdding social proof or testimonials to your waitlist landing page can boost credibility. Including quotes from beta testers and industry experts, or displaying any awards or recognitions your product has received adds authenticity and can persuade more visitors to join the waitlist.\n\n### Engage with Visuals and Multimedia\n\nIncorporate engaging visuals, animations, or short videos to explain your product or service. This makes your waitlist landing page more interactive and memorable.\n\n### Offer an Incentive or Giveaway (Optional)\n\nOffering an incentive or giveaway—such as a free trial, a discount, early access, or a gift—is an optional tactic for [increasing signups](https://www.masslight.com/posts/prelaunch-waitlist-startup) for your waitlist.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a game-changer in UI libraries, offering over 20 animated components to make your landing pages pop. With MagicUI, you can easily create visually stunning and interactive elements that seamlessly integrate into your web applications. The best part? It's free and open-source, allowing you to craft captivating digital experiences effortlessly.\n\n### Bridging the Gap Between Design and Development\n\nOne of the challenges in creating landing pages is ensuring they are visually appealing and technically sound. [MagicUI](https://magicui.design/) bridges the gap between design and development by offering highly customizable components that can be adapted to match your branding and design requirements seamlessly. This means you can focus on creating beautiful landing pages without dealing with the technical complexities.\n\n### MagicUI Pro: Elevate Your Landing Page Game\n\nWith [MagicUI Pro](https://pro.magicui.design/), you can take your landing page design to the next level. Using our website templates, you can save thousands of hours and create a beautiful landing page that converts visitors into customers. MagicUI Pro equips you with everything you need to make a stunning startup landing page that captures attention and drives results.\n\n### Design Made Easy With MagicUI\n\nThe call-to-action (CTA) is one of the most crucial elements of a landing page. With MagicUI, you can effortlessly design compelling CTAs that drive conversions. Our [startup landing page template](https://pro.magicui.design/docs/templates/startup) is the perfect starting point for creating a CTA that resonates with your target audience and compels them to act.\n\n[Get MagicUI today](https://magicui.design/) and see the difference it can make in your landing page design.\n"
  },
  {
    "path": "apps/www/content/blog/web-animation-tools.mdx",
    "content": "---\ntitle: \"Top Web Animation Tools Of 2024\"\ndescription: \"Discover the top 10 web animation tools of 2024 to create stunning, engaging visuals for your website easily. \"\nimage: https://cdn.magicui.design/assets/6a85f602-fe8a-4368-9fce-c25e9a93c2a6.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nA well-placed animation can mean the difference between a website visitors bounce away from and one that draws users in, captures their attention and encourages them to stick around for a while. But, creating stunning visual effects can be daunting, especially for those lacking coding skills. Thankfully, web animation tools can simplify this process, making creating attractive animations for your site easier. Animation not only helps improve your site’s visual appeal but can also boost your SEO. Make note of the [web design best practices](https://magicui.design/blog/web-design-best-practices) to be top of your game.\n\nThat’s because search engines like Google favor sites that employ creative elements to enhance the user experience. So, if you want to improve your site’s performance in search results, animations can help. This guide will introduce you to ten of the best web animation tools of 2024. By familiarizing yourself with these resources, you can choose the right one for your next web design project.\n\nMagicUI’s startup landing page template can also help you achieve your goals. This resource features a clean, modern design with plenty of space for animations to help you create a professional-looking startup website.\n\n## What are Website Animations?\n\n![Web Animation Tools](https://cdn.magicui.design/assets/4x9yauk9gqn.jpg)\n\n[Website animations](https://mainmatter.com/blog/2021/01/29/web-animations-intro/) are dynamic visual elements that add movement and interactivity to web pages. They can range from subtle transitions to complex, attention-grabbing effects. Animations can enhance the user experience, making websites more engaging, enjoyable, and memorable.\n\n### Why Use Website Animations? \n\n#### Increased User Engagement\n\n[Animations can capture attention](https://www.digitalsilk.com/digital-trends/website-animations/#:~:text=Animations%20in%20web%20design%20refer,bringing%20inanimate%20objects%20to%20life.) and encourage users to explore a website more deeply. A study by NNGroup found that animations can significantly improve user engagement and satisfaction.\n\n#### Improved Brand Storytelling\n\nAnimations can more effectively convey a brand's personality and message. For example, a playful animation can create a fun and friendly atmosphere, while a sophisticated animation can convey a sense of luxury and elegance.\n\n#### Enhanced Information Clarity\n\nAnimations can visually represent complex data or processes, making them easier to understand. For instance, an animated progress bar can clearly show the status of a loading process.\n\n#### Create Interactive Experiences \n\nAnimations like hover effects, click animations, or parallax scrolling can create interactive elements that encourage user participation.\n\n### Types of Website Animations \n\n#### Micro-interactions\n\nSubtle animations that respond to user actions, such as button hovers or form field interactions.\n\n#### Transitions\n\nAnimations occur when elements change their state, such as appearing, disappearing, or resizing.\n\n#### Full-Fledged Animations\n\nComplex animations involving multiple elements can tell a story or convey a message.\n\n### How Website Animations Work \n\nWebsite animations are typically created using CSS, JavaScript, or specialized animation libraries. CSS provides basic animation capabilities, while JavaScript allows for more complex and interactive animations. Animation libraries, such as GreenSock, Lottie, and Framer Motion, offer pre-built animations and simplify creating custom animations.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Top Web Animation Tool of 2024\n\n![Web Animation Tools](https://cdn.magicui.design/assets/uo0310xul2.jpg)\n\n### MagicUI: The UI Library for Animation Nerds\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components](https://magicui.design/blog/startup-landing-page) are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today\n\n### Building Animations with MagicUI\n\n#### What is MagicUI? \n\n[MagicUI is a UI library](https://pro.magicui.design/docs/templates/startup) with over 20 pre-built animated components that make it easy to create stunning web applications. It is built with React, TypeScript, Tailwind CSS, and Framer Motion and is designed specifically for design engineers. That means it looks great and helps bridge the gap between design and development.\n\n### Key Features of MagicUI\n\n#### A Rich Collection of Animated Components\n\nMagicUI is [loaded with animated UI](https://pro.magicui.design/docs/templates/startup) components for building user interfaces. From buttons, cards, modals, and progress bars to more complex elements like charts and data visualizations, MagicUI has many options to help you create your next web app.\n\n#### Unparalleled Customization\n\nEvery component in [MagicUI is meticulously designed](https://pro.magicui.design/docs/templates/startup) to be visually appealing and interactive. However, you’re not locked into the default styles. MagicUI gives you granular control over each component's colors, fonts, and other styles to create a unique user experience that aligns perfectly with your vision.\n\n#### Seamless Integration\n\n[MagicUI is built for speed](https://pro.magicui.design/docs/templates/startup) and efficiency. It works seamlessly with popular frameworks like React and Tailwind CSS to minimize development time. You can easily integrate it into your existing web projects, so you can focus on building a delightful user experience rather than getting caught up in the technical details.\n\n#### A Design-Centric Approach\n\nMagicUI was [created with a strong focus](https://pro.magicui.design/docs/templates/startup) on design. This ensures that the components not only look great but they’re also user-friendly. This commitment to aesthetics and usability makes it easier for designers and developers to collaborate effectively and create exceptional user interfaces.\n\n### How to Implement MagicUI\n\n#### Install MagicUI\n\nYou can install [MagicUI into your project](https://pro.magicui.design/docs/templates/startup) using npm or yarn.\n\n#### Import Components\n\nNext, you can import the desired components from the [MagicUI library](https://pro.magicui.design/docs/templates/startup) into your React code.\n\n#### Customize Components\n\nEach component comes with props that you can use to modify its appearance and behavior to your specific needs.\n\n#### Animate Components\n\n[MagicUI’s components](https://pro.magicui.design/docs/templates/startup) come pre-animated out of the box, but you can also create custom animations using Framer Motion for even greater flexibility.\n\n### Real-World Examples of MagicUI\n\n#### E-Commerce Websites \n\nE-commerce websites can particularly benefit from [MagicUI’s animated components](https://pro.magicui.design/docs/templates/startup). For example, you might use animated product cards that hover to reveal additional details.\n\n#### Landing Pages\n\nAnimated components add visual appeal and interactivity to landing pages. For instance, a hero section could have an animation that scrolls smoothly, highlighting key features and benefits.\n\n#### Dashboards\n\n[Dashboards love MagicUI](https://pro.magicui.design/docs/templates/startup). You can provide a dynamic and engaging overview of key metrics with animated charts and data visualizations.\n\n#### Mobile Apps\n\nMobile apps can also [use MagicUI](https://pro.magicui.design/docs/templates/startup) to create a stunning user experience. For example, you might leverage animated transitions between screens to enhance the overall experience and build a sense of fluidity.\n\nBy leveraging [MagicUI's extensive component library](https://pro.magicui.design/docs/templates/startup), customization options, and seamless integration, you can rapidly create stunning and interactive web applications that captivate your audience and drive engagement.\n\n### MagicUI: A Quick Overview\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. [MagicUI components](https://pro.magicui.design/docs/templates/startup) are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n## Best Practices for Implementing Website Animations\n\n![Web Animation Tools](https://images.unsplash.com/photo-1622674850896-dafe9f125ed2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzI0OTU0NTMwfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### User Experience: Optimizing Animations for Your Audience\n\nFocus on user-friendliness when implementing animations. Excessive animations can overwhelm users. Instead, animations should enhance user experience, not detract from it. For example, consider using subtle animations to indicate loading progress or provide visual feedback for user interactions.\n\nEnsure animations are relevant. Make specific animations serve a purpose and contribute to overall website goals. Avoid using animations solely for decorative purposes, as they may distract users from the main content. Finally, avoid distracting animations. Ensure animations do not interfere with a user's ability to navigate and interact with a website. For instance, avoid using animations covering important content or making clicking on elements difficult.\n\n### Performance: Speeding Up Your Animations\n\n[Optimize animations for speed](https://www.linkedin.com/advice/3/how-can-you-optimize-animations-faster-page-load-shpff#:~:text=Use%20lightweight%20file%20formats%20like,size%20further%20without%20compromising%20quality.). Use techniques like lazy loading to ensure animations don't negatively impact page load times. This means loading animations only when they are visible in the viewport. Minimize file size. Optimize images and other assets used in animations to reduce loading times. Use appropriate file formats and compression techniques to minimize file size without compromising quality.\n\nTest performance across different devices. Ensure animations load and perform smoothly on various devices and in different network conditions. Check your website on other browsers, operating systems, and device types to identify and address performance issues.\n\n### Accessibility: Making Animations Inclusive\n\nProvide alternative content. For users with disabilities, ensure there is alternative content or text descriptions for animations. This helps users who may not be able to perceive or understand animations. Avoid flashing animations. Excessive flashing can be harmful to users with photosensitive epilepsy. Use flashing animations sparingly and ensure they are not too frequent or intense.\n\nTest for accessibility. Use assistive technologies to ensure animations are accessible to users with disabilities. Screen readers, keyboard navigation, and other assistive technologies should be able to interact effectively with animations.\n\n### Mobile Responsiveness: Optimizing for Small Screens\n\nDesign for different screen sizes. Ensure responsive animations look great on various\n\ndevices, including smartphones and tablets. Use responsive design principles to ensure animations adapt to different screen sizes and orientations. Consider touch interactions. [Design animations](https://www.invisionapp.com/defined/design-animation) that are intuitive and easy to use on touchscreens. Avoid animations that are difficult to tap or interact with on smaller screens.\n\nTest on mobile devices. Thoroughly test animations on different mobile devices to ensure they function as expected. Pay attention to mobile device performance, responsiveness, and overall user experience.\n\n### Additional Factors to Consider When Implementing Website Animations\n\n#### Animation Speed\n\nThe speed of your animations can significantly impact the user experience. Too slow animations can be frustrating, while too-fast animations may be difficult to perceive. Experiment with different speeds to find the optimal balance for your website.\n\n#### Cultural Considerations\n\nBe mindful of cultural differences and sensitivities when using animations. Some animations may be offensive or inappropriate in certain cultures. Research cultural norms and avoid using animations that could be perceived as offensive.\n\n#### Performance Monitoring\n\nMonitor your website's performance regularly to ensure animations are not negatively impacting page load times. Use tools like Google PageSpeed Insights to identify and address any performance issues.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## 5 Real-World Examples of Website Animations\n\n![Web Animation Tools](https://images.unsplash.com/photo-1657256031855-68029292ff34?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHxhaXJibmJ8ZW58MHx8fHwxNzI0OTU0NTQxfDA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Airbnb: Setting the Tone with Animation  \n\nAirbnb's website is a prime example of how [animations can enhance the user](https://www.svgator.com/blog/website-animation-examples-and-effects/) experience and storytelling. One notable animation is the subtle zoom-in effect when hovering over a listing, blurring the background and drawing the user's attention to the selected property. Additionally, Airbnb employs parallax scrolling to reveal hidden content and add depth to the website, creating a more immersive and engaging browsing experience.\n\n### 2\\. Spotify: Creating a Dynamic Interface  \n\nSpotify's website showcases how animations can create a visually appealing and interactive interface. The music player features a pulsating animation that syncs with the beat of the music, providing a dynamic and engaging visual element. Moreover, the playlist covers animate when hovered over, offering a subtle hint of the music within. These animations contribute to Spotify's brand identity and make the listening experience more enjoyable.\n\n### 3\\. Apple: Mastering Subtlety  \n\nApple's website is renowned for its minimalist design and effective use of subtle animations. One notable example is the smooth transition of the hero image when scrolling down the homepage, seamlessly leading the user into the next section. Apple also employs animations to highlight key features and products, drawing attention to important information without being overly distracting.\n\n### 4\\. Adobe: Showcasing Creativity  \n\nAdobe's website leverages animations to showcase its creative tools and products engagingly. The homepage features a rotating carousel of [animated product demos](https://www.nibblevideo.com/product-videos/), providing a glimpse into each tool's capabilities. Additionally, Adobe uses animations to highlight key features and benefits of its products, making them more accessible and appealing to potential users.\n\n### 5\\. Nike: Creating a Dynamic User Experience  \n\nNike's website is a testament to the power of animations in creating a dynamic and energetic experience. The homepage features a full-screen animation of athletes in action, immediately setting the tone for the rest of the website. Nike also uses animations to highlight product features and inspire users to move, aligning with its athleticism and performance brand message.\n\nThese are just a few examples of how websites can effectively use animations to enhance the user experience and achieve goals. By studying these case studies and experimenting with different animation techniques, you can create inspiring and engaging website animations that leave a lasting impression on your audience.\n\n## 15 Emerging Trends in Website Animations\n\n![Web Animation Tools](https://cdn.magicui.design/assets/vv1vpqp1bxg.jpg)\n\n### 1\\. Micro-interactions: Tiny Animations with a Big Impact\n\nMicro-interactions are small animations that occur in response to user actions. For example, when you hover over a button, and it changes color or shape, that’s a micro-interaction. Or when you update a form field and see a little checkmark appear, that’s a micro-interaction. These tiny animations enhance the user experience, providing visual feedback that makes the interface more responsive and engaging.\n\n### 2\\. Parallax Scrolling: Creating Depth with Layered Animations\n\nParallax scrolling is a technique where background elements move at a different speed than foreground elements. This creates a sense of depth and immersion, which can be used to highlight specific elements or create a more visually interesting scrolling experience.\n\n### 3\\. Lottie Animations: Lightweight and Customizable Website Animations\n\n[Lottie animations are lightweight](https://creatmarketing.pt/en/animations-lottie-animations-light-and-scalable-for-the-web-and-apps/), cross-platform animations created using JSON files. Because they’re so efficient, Lottie animations can be easily integrated into web, mobile, and desktop applications. They offer a wide range of customization options and can be used to create everything from simple transitions to complex animations.\n\n### 4\\. Spring Animations: Physics-Based Animations for a Natural Look\n\nSpring animations use physics-based motion to create natural and engaging movement. They simulate real-world objects, creating a more realistic and intuitive user experience. Spring animations can be used for various purposes, such as animating menus, buttons, or other interactive elements.\n\n### 5\\. Interactive Storytelling: Using Animation to Engage Users\n\nInteractive storytelling uses animations to tell stories or convey information more engagingly and interactively. Animations can highlight key points, reveal hidden content, or create interactive elements that allow users to participate in the story.\n\n### 6\\. 3D Animations: Bringing a New Dimension to Website Animations\n\n3D animations incorporate three-dimensional elements into website animations, creating a more immersive and realistic experience. Use 3D animations to showcase products, visualize complex data, or create visually stunning effects.\n\n### 7\\. Animated Data Visualizations: Making Complex Information Understandable\n\nAnimated data visualizations use animations to present data in a visually appealing and informative way. These website animations can make complex information easier to understand and help tell a story with the data.\n\n### 8\\. Motion Graphics: Combining Animation, Video, and Design\n\nMotion graphics combine animation, video, and design to create visually striking and impactful content. Use motion graphics to create explainer videos, product demos, or marketing materials.\n\n### 9\\. Animated Typography: Adding Personality to Your Website\n\nAnimated typography involves animating text elements to create visually exciting and engaging typography. It can draw attention to important information, add personality to a website, or create a more dynamic and interactive experience.\n\n### 10\\. Infinite Scrolling Animations: Encouraging Users to Explore More Content\n\nInfinite scrolling animations use animations to create an endless scrolling experience, encouraging users to explore more content. This technique can display large amounts of content without requiring users to navigate different pages.\n\n### 11\\. Animated Backgrounds: Setting the Tone for Your Website\n\n[Animated backgrounds](https://animatedbackgrounds.me/) use animations to create a visually engaging and immersive experience, setting the tone for the website. Use animated backgrounds to develop a sense of motion, depth, or atmosphere.\n\n### 12\\. Animated Icons: Adding Visual Interest to Your Interface\n\nAnimated icons can add visual interest and draw attention to essential elements on your website. Use animated icons to indicate action, provide feedback, or make the interface more visually appealing.\n\n### 13\\. Animated Hero Sections: Capturing Users' Attention\n\nAnimated hero sections use animations to create visually stunning and engaging hero sections\n\nthat capture the user’s attention. Hero sections are often the first thing a user sees when they visit a website, so making them memorable and impactful is essential.\n\n### 14\\. Animated Menus and Navigation: Improving Usability with Animation\n\nAnimated menus and navigation elements improve usability and create a more interactive experience. Use animated menus to make navigation more intuitive and visually appealing.\n\n### 15\\. Animated Call-to-Action Buttons: Encouraging User Interaction\n\nAnimated call-to-action buttons make them more visually appealing and encourage user interaction. Use animations to help buttons stand out from the rest of the page and increase click-through rates.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a [free and open-source UI](https://pro.magicui.design/docs/templates/startup) library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications. These elements allow us to create stunning user interfaces with minimal effort. [MagicUI components](https://pro.magicui.design/docs/templates/startup) are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/web-application-design.mdx",
    "content": "---\ntitle: \"10 Best Web Application Design Principles\"\ndescription: \"Discover 10 web application design principles for engaging users. Learn how to boost conversions with MagicUI’s startup landing page template.\"\nimage: https://cdn.magicui.design/assets/72c52cd6-a098-43b6-8a7c-421216a80114.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nImagine you’re craving pizza. You jump on the web and find two delivery websites. One looks outdated, and the buttons are hard to read. The other is visually appealing and organized, making it easy to locate your favorite pie. Which one would you pick? If you’re like most people, you’d choose the second site and probably wouldn’t look back. The same principle applies to web apps. The better they look, the more users will trust them. This trust can lead to conversions and business growth.\n\nThis blog will discuss web application design and its significance within [web design best practices](https://magicui.design/blog/web-design-best-practices). Specifically, you’ll learn about ten design principles to help you create engaging, user-friendly web apps.  A great way to visualize these principles is by looking at a web app template. MagicUI offers a solution for this: the [startup landing page template](https://pro.magicui.design/docs/templates/startup). Using it to illustrate the design principles will help you grasp their significance and how to apply them to your web app.\n\n## What are Web Applications?\n\n![Web Application Design](https://cdn.magicui.design/assets/mlnm2s0hdrd.jpg)\n\n[Web applications](https://www.techtarget.com/searchsoftwarequality/definition/Web-application-Web-app), often called web apps, are software programs accessed through web browsers. Unlike traditional desktop applications that require installation, web apps run on remote servers and deliver content through the internet. This accessibility makes them platform-independent, allowing users to interact with them from any device with a web browser.\n\n### Key Characteristics Of Web Applications\n\n- _Client-server architecture:_ Web apps operate on a client-server model. The client (user's browser) interacts with the server, which processes requests and delivers dynamic content.\n- _Dynamic content:_ Unlike static websites, web apps can display content that changes based on user interactions or real-time data.\n- _Rich user interfaces:_ [Modern web apps](https://learn.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/modern-web-applications-characteristics) often feature complex and interactive interfaces that resemble desktop applications.\n- _Cloud-based:_ Many web apps are hosted on cloud platforms, offering scalability and accessibility.\n\n### Examples Of Popular Web Applications\n\n- _Social media platforms:_ Facebook, Instagram, Twitter\n- _Online productivity suites:_ Google Workspace, Microsoft Office\n- _365 E-commerce platforms:_ Amazon, eBay\n- _Cloud storage services:_ Dropbox, Google Drive\n\n### How are Web Applications Built?\n\nBuilding a web application involves a collaborative effort between front-end and back-end developers. Frontend development:\n\n- Focuses on the user interface (UI) and user experience (UX).\n- It consists of creating the visual elements, layout, and interactive components that users see and interact with.\n\nTechnologies used include:\n\n- HTML\n- CSS\n- JavaScript\n\n#### Backend Development\n\nSuggest a short  2-word subtopic title for this paragraph:\n\nModern frontend frameworks like React, Angular, and Vue.js are often employed to streamline development. Backend development:\n\n- Handles the server-side logic, database interactions, and application functionality.\n- Processes user requests, retrieves data and generates responses.\n- Languages like Python, Ruby, Java, and Node.js are commonly used.\n\nDatabases such as MySQL, [PostgreSQL](https://aws.amazon.com/rds/postgresql/what-is-postgresql/), MongoDB, or others store application data. Why is Good UX Necessary for Users to Navigate Easily? User Experience (UX) is the cornerstone of successful web applications. It encompasses how users interact with and perceive a product.\n\n#### UX Benefits\n\nA well-designed UX ensures:\n\n- _User satisfaction:_ A positive user experience leads to higher satisfaction levels, encouraging repeat visits and loyalty.\n- _Increased engagement:_ Intuitive interfaces keep users engaged and motivated to explore the application.\n- _Improved conversion rates:_ A seamless user journey can significantly boost conversions, whether purchasing, signing up for a newsletter, or completing a desired action.\n- _Enhanced brand reputation:_ A positive [UX reinforces a brand's image](https://raw.studio/blog/bridging-the-gap-how-brand-strategy-and-ux-design-work-together-to-create-unforgettable-experiences/) as customer-centric and trustworthy.\n- _Reduced support costs:_ A well-designed application minimizes user errors and support inquiries.\n\nKey UX principles for web applications:\n\n- _Usability:_ The application should be easy to learn, use, and navigate.\n- _Accessibility:_ The application should be accessible to users with disabilities.\n- _Desirability:_ The application should be aesthetically pleasing and enjoyable to use.\n- _Findability:_ Users should be able to locate information and complete tasks quickly.\n- _Credibility:_ The application should inspire trust and confidence in users.\n\n### Related Reading\n\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Step-by-Step Process in Making a Web Application\n\n![Web Application Design](https://cdn.magicui.design/assets/zrtunqmxz9.jpg)\n\nCreating a successful web application involves a structured approach encompassing various stages, from conceptualization to deployment.\n\n### Idea Generation and Market Research\n\n- _Identify a problem or need:_ Pinpoint a specific issue or gap in the market that your web application can address. Conduct thorough research to understand the problem's depth and potential impact.\n- _Define the target audience:_ Identify the specific group of people your application is designed to serve. Create detailed user personas to represent your target audience's characteristics, needs, and behaviors.\n- _Conduct market research:_ Analyze existing solutions, competitors, and industry trends. Identify opportunities and potential challenges.\n- _Validate the idea:_ Gather feedback from potential users to assess the viability of your concept. Consider conducting surveys, interviews, or usability tests.\n\n### Planning and Requirements Gathering: Get Organized\n\nIn this stage, you [define the project scope](https://kissflow.com/application-development/how-to-create-a-web-application/), outline its features, and gather requirements to create a solid foundation for the web application development process. This phase typically involves the following steps:\n\n- _Project scope definition:_ Clearly outline the application's core features, functionalities, and limitations.\n- _Feasibility analysis:_ Evaluate the project's technical, financial, and resource requirements.\n- _Project timeline creation:_ Develop a detailed project plan with milestones, deadlines, and resource allocation.\n- _Requirements gathering:_ Identify and document all necessary features, functionalities, and user interactions.\n- _Wireframing and prototyping:_ Create visual representations of the user interface to communicate design concepts and gather feedback.\n\n### Design and User Experience (UX): Focus on the User\n\nThe design and user experience (UX) phase of web application development emphasizes putting users first to help ensure the final application is a joy to use. This stage includes several steps:\n\n- _Information architecture:_ Structure the application's content and navigation logically and intuitively.\n- _Interaction design:_ Define how users interact with the application through various elements like buttons, menus, and forms.\n- _Visual design:_ Create an aesthetically pleasing interface that aligns with the target audience and brand identity.\n- _User testing:_ Conduct usability tests to evaluate the design's effectiveness and identify areas for improvement.\n- _Accessibility:_ Ensure the application is accessible to users with disabilities by adhering to accessibility standards.\n\n### Development: Build the Thing\n\nNow, it’s time to build the web application. The development phase typically has two major components: the front end and the back end.\n\n- _Frontend development:_ Build the user interface using HTML, CSS, and JavaScript. Choose appropriate frameworks like React, Angular, or Vue.js to enhance efficiency.\n- _Backend development:_ Develop the server-side logic and database interactions using Python, Ruby, Java, or Node.js.\n- _API development:_ Create application programming interfaces (APIs) to enable communication between different components and systems.\n- _Database design:_ Design and implement the database structure to store and retrieve application data efficiently.\n- _Integration:_ Integrate third-party services or APIs if required.\n\n### Testing: Don’t Let Bugs Bug You\n\nOnce the application is developed, testing it thoroughly before deploying it for public use is critical. Testing a web application involves several steps:\n\n- _Unit testing:_ Test individual application components to ensure they function correctly.\n- _Integration testing:_ Verify how different components interact and work together.\n- [_User acceptance testing (UAT)_](https://uit.stanford.edu/pmo/UAT)_:_ Gather feedback from end-users to validate the application meets their requirements.\n- _Performance testing:_ Evaluate the application's speed, responsiveness, and scalability under various load conditions.\n- _Security testing:_ Identify and address potential vulnerabilities to protect user data and system integrity.\n\n### Deployment: Get It Live\n\nAfter testing the web application and making any necessary revisions, it’s time to deploy it. You can follow several steps to do this:\n\n- _Server selection:_ Choose a suitable hosting environment (cloud, dedicated server, or shared hosting).\n- _Deployment process:_ Implement efficient deployment strategies, such as continuous integration and continuous delivery (CI/CD).\n- _Database configuration:_ Set up the database environment and migrate data if necessary.\n- _Domain name and DNS configuration:_ Configure the domain name and DNS settings to point to the web application.\n- _SSL/TLS certificates:_ Implement SSL/TLS certificates to encrypt data transmission and ensure secure connections.\n\n### Maintenance and Updates: Keep It Fresh\n\nYou’ve built a web application. But your job isn’t finished. To keep your application running smoothly and to ensure users have a positive experience, you’ll need to maintain it regularly. Maintenance involves:\n\n- _Monitoring:_ Continuously monitor the application's performance, uptime, and user behavior.\n- _Bug fixing:_ Address any reported issues or defects promptly.\n- _Feature updates:_ Introduce new features or functionalities based on user feedback and market trends.\n- _Security patches:_ Apply security updates and patches to protect against vulnerabilities.\n- _Scalability:_ Plan for future growth and increase the application's capacity.\n\nBy following these steps and incorporating iterative development practices, you can build a robust and successful web application that meets user needs and delivers a positive experience.\n\n### MagicUI Library for Free\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications. This allows us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## 10 Best Web Application Design Principles\n\n![Web Application Design](https://cdn.magicui.design/assets/efzmxcs6xzr.jpg)\n\n### 1\\. Step Into User-Centric Design\n\nEffective web application design starts with the users. The [user-centric design](https://www.smashingmagazine.com/2008/01/10-principles-of-effective-web-design/) puts the users' needs, preferences, and behaviors at the forefront of the design process. Instead of making assumptions about what users want, this approach relies on in-depth research to create intuitive and efficient applications that cater to specific audiences.\n\nThere are several ways to adopt a user-centric approach in web application design:\n\n- _Empathy mapping:_ Create detailed profiles of target users to understand their needs, motivations, and pain points. This enables designers to tailor the application to their specific requirements.\n- _User journey mapping:_ Visualize the steps users take to accomplish goals within the application. This helps identify potential friction points and areas for improvement.\n- _Usability testing:_ Conduct regular usability tests to gather feedback on the application's effectiveness and make data-driven design decisions.\n- _A/B testing:_ Experiment with different design variations to determine which elements yield the best results.\n\n### 2\\. A Consistent Approach to Web App Design\n\nConsistency is vital to effective web application design. A consistent interface helps users build a mental model of the application so they know what to expect while navigating it. Consistency reduces confusion and eliminates unnecessary friction, allowing users to achieve their application goals quickly.\n\nThere are several ways to ensure consistency in web application design:\n\n- _Style guides:_ Develop comprehensive style guides that outline typography, color palettes, spacing, and other visual elements for maintaining a cohesive look and feel.\n- _Pattern libraries:_ Create reusable design components to ensure consistency across different application parts.\n- _Interaction consistency:_ Use familiar and predictable interaction patterns to reduce user confusion. Consistently placing buttons in the same location or using the same hover effects.\n\n### 3\\. Keep It Simple\n\nSimplicity is an essential web application design principle. A practical web application should help users achieve their goals quickly and with minimal effort. Cluttered interfaces and overly complex designs slow users down and create a frustrating experience. There are several ways to simplify web application design:\n\n- _Information hierarchy:_ [Organize content](https://bootcamp.uxdesign.cc/the-art-of-information-hierarchy-f79dea3fcebf) in a clear and logical structure, prioritizing the most important information.\n- _Visual minimalism:_ Avoid overwhelming users with excessive clutter or unnecessary elements.\n- _White space:_ Utilize white space effectively to improve readability and create visual balance.\n- _Clear call-to-actions:_ Use prominent and well-defined calls-to-action to guide user behavior.\n\n### 4\\. Responsive Design: A Must for Modern Web Applications\n\nResponsive web design allows web applications to adapt to different screen sizes and orientations. Modern web applications must be accessible on a range of devices, from desktop computers to tablets and smartphones.\n\nResponsive design streamlines the user experience across devices, ensuring that the transition from one to another is smooth and helping to reduce the likelihood of users abandoning the application. To effectively employ responsive design in web applications, be sure to:\n\n- _Use flexible layouts:_ Responsive grids and fluid images will help your application adapt to different screen sizes.\n- _Optimize for touch:_ Make touch interactions smooth and intuitive for mobile users.\n- _Prioritize performance:_ Mobile devices often have less processing power than desktops, so optimizing images and code is crucial to ensure fast loading times on mobile devices.\n\n### 5\\. Accessibility: Design for All Users\n\nWeb applications should be designed for all users, including those with disabilities. Accessibility should be prioritized in the design process rather than as an afterthought. The Web Content Accessibility Guidelines (WCAG) provide a clear framework for improving accessibility in web applications.\n\nSome ways to ensure your application meets accessibility standards include:\n\n- _Provide alternative text:_ Use descriptive alternative text for images and non-text content.\n- _Ensure keyboard navigation:_ Users should be able to navigate the application using only the keyboard.\n- _Maintain color contrast:_ Ensure sufficient color contrast between text and background for readability.\n- _Use ARIA attributes:_ ARIA attributes provide additional information for assistive technologies.\n\n### 6.  Create a Visual Hierarchy\n\nA clear visual hierarchy helps users efficiently process information and navigate your web application. When users land on a web application, they should be able to quickly identify the most important elements on the page and understand how to use them to achieve their goals.\n\nTo create a compelling visual hierarchy in your web application, consider the following design techniques:\n\n- Use size, color, and placement to highlight the most essential elements.\n- Guide users' eyes through the interface using visual cues like lines, arrows, or gradients.\n- Consider the natural reading patterns of users to optimize the layout.\n- Create visual breathing room to improve readability and focus.\n\n### 7.  Provide Feedback to Users\n\nNo one likes to feel lost or confused while they work with a web application. That's why providing users feedback is essential as they navigate your application. Feedback can come in many forms, including:\n\n- _Real-time feedback:_ Provide immediate visual or auditory cues to confirm user actions.\n- _Progress indicators:_ Show users the status of ongoing processes to reduce anxiety.\n- _Error messages:_ Offer clear and helpful error messages that guide users toward solutions.\n- _Microinteractions:_ Add small animations or transitions to provide visual feedback and delight users.\n\n### 8.  Optimize Performance \n\nPerformance can make or break the usability of a web application. Users expect web applications to load quickly, and even a delay of a few seconds can cause frustration and lead to abandonment. To improve the performance of your web application, consider the following techniques:\n\n- [_Image optimization_](https://www.shopify.com/ph/blog/7412852-10-must-know-image-optimization-tipshttps://www.shopify.com/ph/blog/7412852-10-must-know-image-optimization-tipshttps://www.shopify.com/ph/blog/7412852-10-must-know-image-optimization-tips)_:_ Compress images without sacrificing quality to reduce file size.\n- _Code minification:_ Remove unnecessary characters from code to improve loading speed.\n- _Caching:_ Implement browser and server-side caching to store static resources.\n- _Lazy loading:_ Load content only when needed to improve initial page load time.\n- _CDN:_ Utilize a content delivery network to distribute content across multiple servers.\n\n### 9\\. Security: Protect Users, Not Just Data\n\nWeb applications often collect and store sensitive user data, from personal information to financial details. For this reason, security should be a top priority for any web application. A secure web application protects user data from malicious attacks and builds trust with users, ensuring they feel safe while using the application.\n\nTo improve web application security, start with the following techniques:\n\n- _Data encryption:_ Protect sensitive user data with strong encryption.\n- _Secure authentication:_ Implement robust login mechanisms with strong password requirements.\n- _Regular security audits:_ Conduct thorough security assessments to identify vulnerabilities.\n- _User education:_ Inform users about best practices for protecting their accounts.\n\n### 10\\. Analyze and Iterate\n\nWeb application design is a continuous process. After launching an application, you need to analyze how users interact with it and make changes to improve usability. Start by tracking user behavior and looking for anomalies indicating users are having difficulty achieving their goals. From there, you can experiment with different design variations to optimize performance.\n\n## How MagicUI Can Help You Design Great Web Apps\n\n![Web Application Design](https://cdn.magicui.design/assets/mcjpj8uv66l.jpg)\n\n[MagicUI](https://magicui.design/) contains a wealth of ready-to-use components that streamline and accelerate the design of web applications. Using a design system like MagicUI allows you to spend less time on decision-making and more time on building features that improve your application.\n\nThink of MagicUI as a design system in a box. It comes packed with pre-built, customizable components that you can mix and match to create your web application’s user interface. This not only saves you time but it also helps you maintain visual consistency across your application.\n\n### Accelerate Development with MagicUI’s Technical Features\n\n[MagicUI](https://magicui.design/) is built with popular technologies like React and TypeScript, it can help you accelerate your web application development. First, MagicUI contains a library of components you can easily integrate into your React projects.\n\nIf you’re familiar with React, you can quickly implement MagicUI’s components into your project without learning a new technology. Next, [MagicUI](https://magicui.design/) supports TypeScript, which can help improve the quality of your code, make it easier to maintain, and enhance your overall developer experience. Finally, MagicUI is built with Tailwind CSS, a utility-first CSS framework that lets you style components quickly with predefined classes.\n\n### Create Engaging User Experiences with MagicUI\n\n[MagicUI](https://magicui.design/) can help you create visually appealing web applications that deliver exceptional user experiences. First, the library contains various animated components that can help make your application feel alive and more engaging. In addition to animations, [MagicUI](https://magicui.design/) offers a wealth of interactive elements like modals, carousels, and tooltips to help your users navigate your application and understand your content.\n\nMagicUI’s components are built with accessibility in mind to ensure your application is usable for all.\n\n### Focus on Innovation with MagicUI\n\nUsing MagicUI to design and develop your web application can help you focus on what matters most: innovation. First, by implementing the library’s pre-built components, you can avoid being bogged down by the low-level details of UI design. This gives you more freedom to explore creative possibilities and develop unique solutions for your application.\n\n#### Accelerated Development\n\n[MagicUI](https://magicui.design/) can also help you bring your ideas to life more quickly. Combining a rich library of pre-built components, TypeScript support, and Tailwind CSS integration can help you accelerate development and make it to market sooner. As an open-source project, MagicUI is continuously updated and improved by a dedicated community of developers.\n\nLeveraging the latest library version will ensure you have access to the most up-to-date resources for building your next web application.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## Frequently Asked Questions on Web Application Design\n\n![Web Application Design](https://cdn.magicui.design/assets/23n4151afryj.jpg)\n\n### How Do I Choose The Right Technology Stack For My Web Application?\n\nSelecting the appropriate [technology stack](https://fullscale.io/blog/top-5-tech-stacks/) is crucial for the success of your web application. Start by analyzing the specific features and functionalities your application needs. This will help determine the necessary technologies.\n\nReal-time applications might benefit from Node.js and WebSocket, while data-intensive applications might require robust databases like:\n\n- PostgreSQL\n- MongoDB\n\n#### Scalability Matters\n\nChoose technologies that can handle increasing user loads and data volumes. Cloud-based platforms and scalable databases are often preferred for this.\n\n#### Development Team Expertise\n\nConsider the skills and experience of your development team. Using familiar technologies can accelerate development and reduce costs.\n\n#### Evaluate Performance\n\nEvaluate the performance implications of different technology stacks. Some technologies are better suited for high-performance applications than others.\n\n#### Consider Costs\n\nAssess the costs associated with different technologies, including:\n\n- Licensing fees\n- Cloud infrastructure expenses\n- Developer salaries\n\n#### Check Community Support\n\nA strong community and ecosystem around a technology stack can provide valuable:\n\n- Resources\n- Libraries\n- Support\n\n### What Are The Key Challenges In Web Application Development, And How Can They Be Addressed?\n\n#### Complexity: Web Applications Can Be Complicated\n\nWeb applications can be complex, requiring coordination of:\n\n- Front-end\n- Back-end\n- Database development\n\nEffective project management, clear communication, and a well-structured development process are essential.\n\n#### Security: Protecting User Data Is Critical\n\nProtecting user data is paramount. Implementing robust security measures, such as:\n\n- Encryption\n- Secure authentication\n- Regular security audits are crucial\n\n#### Performance: Speed Matters\n\nEnsuring optimal performance is essential for user satisfaction. Techniques like code optimization, caching, and load testing can help improve performance.\n\n#### Scalability: Plan for Growth\n\nBuilding applications that can handle increasing user loads requires careful planning and architecture. Cloud-based infrastructure and scalable database solutions can help.\n\n#### User Experience: Strive for Intuitiveness\n\nCreating intuitive and user-friendly interfaces is challenging. User research, usability testing, and iterative design are key to delivering a great user experience.\n\n#### Maintenance and Updates: Expect the Unexpected\n\nWeb applications require ongoing maintenance and updates. Effective version control, automated testing, and a dedicated maintenance team are essential.\n\n#### Overcoming Challenges\n\nAddressing these challenges requires combining technical expertise, effective project management, and a focus on user needs. [MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nWith our free component library, MagicUI Pro can save thousands of hours, create a beautiful landing page, and convert visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### How Can I Measure The Success Of My Web Application?\n\n#### User Acquisition: Finding New Users\n\nUser acquisition is the process of attracting users to your web application. Tracking user acquisition rates and identifying how users find your application can help you understand how to attract more users.\n\n#### User Engagement: Understanding How Users Interact with Your App\n\nUser engagement measures how users interact with your web application. Metrics like the average time on site, number of pages visited, and click-through rates can help you understand if users find your app useful and engaging. The higher the user engagement, the better.\n\n#### User Retention: Keeping Users Coming Back\n\nUser retention measures how well your web application keeps users over time. Particularly in applications that serve a specific purpose, like:\n\n- Task manager\n- Budgeting tool\n- CRM, it’s essential to retain users so they can achieve their goals\n\nIf your web application has a low user retention rate, your app needs to be more helpful and engaging, and users are turning to other solutions.\n\n### Conversion Rates: Tracking Goal Completions\n\n[Conversion rates](https://www.optimizely.com/optimization-glossary/conversion-rate/) track the percentage of users who complete a desired goal or action. For web applications, this could be signing up for an account, completing a tutorial, or purchasing. Improving conversion rates is crucial to web application success, so it is important to monitor and understand how to improve them if they are low.\n\n#### Customer Satisfaction: Gathering User Feedback\n\nCustomer satisfaction measures how well a product meets the needs and expectations of its users. The higher the customer satisfaction, the better. You can gauge [customer satisfaction](https://microdinc.com/blog/improve-customer-satisfaction/) for your web application by gathering user feedback through:\n\n- Surveys\n- Reviews\n- Support interactions\n\n### Revenue: Tracking Financial Performance\n\nIf your web application has a business model and generates revenue, tracking this metric is essential to measure its success. Understanding how much money your web application makes, how quickly it’s growing, and whether it’s meeting targets or projections will help you determine whether your application is successful or needs improvement.\n\nCalculating the return on investment for your web application will help you understand its overall success. To calculate ROI, you must first determine your net profit and then divide that number by the total cost of the application. This metric can be expressed as a percentage or a ratio.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free UI library that streamlines the web application design process. It includes a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith a focus on design and animation, MagicUI helps bridge the gap between design and development, making it easier to take a project from concept to completion.\n\n### Customize Components to Fit Your Brand\n\nEvery business has a unique brand that must be reflected in its digital products. [MagicUI](https://magicui.design/) helps you accomplish this goal by offering highly customizable components that can be effortlessly adapted to match your desired look and feel. The intuitive interface lets you create stunning web applications that function well and look exactly how you want them to.\n\n### Create Beautiful and Captivating Designs\n\nWeb application design also focuses on how a site works. While functionality is critical, designs must be visually appealing to engage users. [MagicUI](https://magicui.design/) helps you create beautiful and captivating digital experiences that increase the likelihood of converting visitors into customers.\n\n### Use MagicUI Pro for Even More Functionality\n\nMagicUI Pro offers even more functionality for web application design. With Pro, you can access additional components and templates that help you complete projects faster. For example, the [startup landing page template](https://pro.magicui.design/docs/templates/startup) enables you to create a stunning landing page to promote your business or app and convert visitors into customers.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/web-design-best-practices.mdx",
    "content": "---\ntitle: \"10 Web Design Practices to Improve Site Performance (2024)\"\ndescription: \"Boost conversions with web design best practices. Learn 10 key principles and explore MagicUI’s startup landing page template. Start building now!\"\nimage: https://cdn.magicui.design/assets/3cde219c-54e6-49fa-97f9-11e480721d0b.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-02\"\nfeatured: false\n---\n\nImagine this: you’ve built your website and are ready to go. But then, you notice something’s off. Your site isn’t performing as well as you expected. Pages are loading slowly, and you’re unsure if your audience can find what they want. You look under the hood to figure out what’s wrong, but it’s overwhelming. There are too many design elements to untangle, and you don’t know where to start.  If this scenario sounds all too familiar, you’re not alone. Many website owners face challenges like this, even after launching their sites. The good news is that there’s a solution. By studying web design best practices, you can improve your site’s performance and create a better visitor experience. This blog will explore 10 web design practices and how they can help your site.\n\nMagicUI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a valuable tool for helping you implement these practices and improve your site performance. This solution can help you create a well-designed website quickly and easily so you can get back to running your business.\n\n## Best 10 Web Design Practices for Improving Site Performance\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/o848tf8z2tp.jpg)\n\n### 1\\. Optimize Images\n\nImages often represent the most extensive files on a webpage. Optimizing them can reduce page load times by up to 80%. Use formats like WebP for better compression without sacrificing quality. Tools like ImageOptim or TinyPNG can help compress images effectively.\n\n### 2\\. Minimize HTTP Requests\n\nEach element on a webpage (images, scripts, stylesheets) requires an HTTP request. Reducing the number of requests can significantly speed up loading times by:\n\n- Combining files\n- Using CSS sprites\n- Eliminating unnecessary elements\n\n### 3\\. Leverage Browser Caching\n\nImplement caching strategies to store frequently accessed resources locally on users' devices. This reduces load times for returning visitors. Setting appropriate [cache-control headers](https://www.digitalsilk.com/digital-trends/web-design-mistakes/) can help manage how long resources are stored.\n\n### 4\\. Use a Content Delivery Network (CDN)\n\nA CDN distributes your website's content across multiple servers worldwide, ensuring faster delivery to users based on their geographic location. This can dramatically improve load times, especially for global audiences.\n\n### 5\\. Minify CSS, JavaScript, and HTML\n\nMinifying code involves removing unnecessary characters, comments, and whitespace from files. This reduces file sizes and speeds up load times. Tools like:\n\n- UglifyJS for [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n- CSSNano for CSS can automate this process\n\n### 6\\. Implement Lazy Loading\n\nLazy loading defers the loading of images and videos until needed (i.e. when they enter the viewport). This reduces initial load times and improves perceived performance, especially on pages with many media elements.\n\n### 7\\. Optimize Server Response Time\n\nA slow server response can hinder performance. Use performance monitoring tools to identify bottlenecks, and consider upgrading your hosting plan or optimizing your server configuration to enhance speed.\n\n### 8\\. Reduce Redirects\n\nEach redirect creates additional HTTP requests and increases load time. Minimize redirects by ensuring that links point directly to the final destination, reducing unnecessary steps for users.\n\n### 9\\. Utilize Asynchronous Loading for CSS and JavaScript\n\nLoading CSS and JavaScript files asynchronously allows the browser to continue rendering the page while these resources are downloaded. This can significantly improve:\n\n- Perceived load times\n- User experience\n\n### 10\\. Regularly Test and Monitor Performance\n\nUse tools like Google PageSpeed Insights, GTmetrix, or Lighthouse to test your website's performance regularly. Monitoring helps identify areas for improvement and ensures that optimizations are effective.\n\n### Integrating MagicUI for Enhanced Performance\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) offers lightweight components that can be seamlessly integrated into your web design to help you achieve these best practices. By utilizing MagicUI’s pre-built components, developers can reduce the need for custom coding, often leading to bloated files and slower load times. The components are designed with performance in mind, ensuring they are optimized for speed without compromising functionality or aesthetics.\n\n#### React Tailwind\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) components are built using React and Tailwind CSS, known for their efficiency and speed. This allows developers to create visually appealing interfaces that load quickly. MagicUI's focus on minimalism and clean design aligns perfectly with the best practices mentioned above, promoting clarity and simplicity in web design.\n\nBy leveraging [MagicUI](https://pro.magicui.design/docs/templates/startup), developers can implement responsive designs that enhance user experience across all devices. The fully responsive components make it easier to create mobile-friendly designs without sacrificing performance. This is crucial, as responsive design has increased mobile traffic retention by over 50%, ensuring users stay engaged with your content.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Key Principles of Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/hn3e0119iq.jpg)\n\n### Keep It Simple\n\nSimplicity reigns supreme in web design. A straightforward design reduces cognitive load, allowing users to navigate and interact with the site effortlessly. This principle advocates for a clean layout with [minimal distractions](https://www.lambdatest.com/blog/common-web-design-mistakes/).\n\nBy employing straightforward navigation and clear calls to action, designers can enhance usability and ensure visitors find what they need quickly.\n\n### Consistency is Key\n\nConsistency in design elements such as:\n\n- Color schemes\n- Typography\n- Layout\n\n#### Consistent Design\n\nSuch consistency fosters familiarity and trust among users. When users encounter consistent design across pages, they can navigate more intuitively.\n\n- Reducing confusion\n- Enhancing their overall experience\n\nThis principle is vital for building a cohesive brand identity and ensuring users feel comfortable interacting with the site.\n\n### Put the User First\n\nUser-centric design focuses on understanding the target audience's needs, preferences, and behaviors. This principle emphasizes gathering user feedback throughout the design process to create interfaces that resonate with users.\n\nBy prioritizing user needs, designers can enhance satisfaction and engagement, leading to higher conversion rates.\n\n### Visual Hierarchy: What Is It and Why Is It Important\n\nVisual hierarchy is the arrangement of elements to signify importance and guide user attention. This can be achieved through:\n\n- Size\n- Color\n- Contrast\n- Spacing\n\nEffective use of visual hierarchy helps users navigate content more efficiently, ensuring that they notice:\n\n- Key information\n- Call to action\n\n### Accessibility: Inclusive Design for Everyone\n\nDesigning with accessibility in mind ensures that websites are usable by individuals with diverse abilities, including those with disabilities. This principle broadens the audience reach and enhances overall usability for all users.\n\nImplementing alt text for images and keyboard navigation options is crucial for creating an inclusive web experience.\n\n### Performance Optimization: Speed Matters\n\nPerformance optimization involves techniques like image compression, caching, and minimizing [HTTP](https://www.cloudflare.com/learning/ddos/glossary/hypertext-transfer-protocol-http/) requests to enhance site speed. Fast-loading websites improve user satisfaction and retention, as users are less likely to abandon sites that load slowly.\n\nStatistics show that a delay of just a few seconds can significantly impact user engagement and conversion rates.\n\n### How MagicUI Embodies These Principles\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) exemplifies these web design principles through its thoughtfully crafted components. The library is designed to focus on simplicity and user-centricity, allowing developers to create intuitive interfaces without unnecessary complexity.\n\n- _Simplicity:_ MagicUI offers a clean and minimalistic design aesthetic, ensuring users can navigate applications easily.\n- _Consistency:_ The components maintain consistent styling and behavior, which helps users familiarize themselves with the interface quickly.\n- _Responsive Design:_ MagicUI components are built to be fully responsive, adapting seamlessly across devices. This ensures users have a consistent experience on a desktop or mobile device.\n- _Performance:_ The lightweight nature of MagicUI components contributes to faster load times, enhancing overall site performance and user satisfaction.\n\n## The Role of Responsive Design in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/b5cl28m0xjj.jpg)\n\nResponsive design enhances usability by providing a consistent experience across devices, making it easier for users to navigate and interact with the site. For example, users may visit your website on their smartphone and later return on their laptop. If your site is responsive, the user will see the same content and a similar layout on both devices.\n\nThis allows for a smoother transition between devices and reduces [user frustration](https://freshsparks.com/common-web-design-mistakes-to-avoid/). If your site weren’t responsive, the user would encounter a very different version of your site on each device. Not only would this create confusion, but it could also lead to the user abandoning your site altogether.\n\n### Capturing the Mobile Audience\n\nWith more users accessing websites via mobile devices, responsive design helps capture this audience, leading to higher traffic retention rates, which can increase by over 50%. This is crucial because Google uses mobile-first indexing, meaning the version of your indexed site is mobile. If your site isn’t responsive, it could hurt your SEO rankings and drive your site’s traffic down.\n\n### Reduced Costs with Responsive Design\n\nMaintaining a single responsive site is more cost-effective than developing separate sites for different devices. This reduces development and maintenance costs. While the initial investment in a responsive site may be higher, the costs will decrease over time.\n\n### SEO Benefits of Responsive Web Design\n\nSearch engines favor responsive websites, leading to better rankings and increased visibility. Responsive design allows for a single URL for a site's mobile and desktop versions, whereas a separate mobile site would have an entirely different URL.\n\n### Faster Load Times\n\nResponsive design often results in faster load times due to optimized images and layouts, improving user satisfaction. When users open a website, they want the page to load quickly. If it doesn’t, they’ll likely leave before the site opens.\n\nThis is especially true for mobile users, who tend to have less patience than desktop users. A responsive site helps improve:\n\n- Load times\n- Create a smoother experience for users\n\n### Future-Proofing Your Website\n\nResponsive design prepares websites for future devices and screen sizes, ensuring longevity in a rapidly evolving tech landscape. New devices are released regularly, and each has a unique screen size.\n\nA responsive site will adapt to these new sizes, whereas a mobile site will quickly become obsolete as technology changes.\n\n### Enhanced Engagement\n\nUsers are likelier to engage with a site that provides a seamless experience across devices, leading to higher conversion rates. If users encounter a website that looks completely different on their mobile device than their desktop, they may lose interest and leave the site before completing any tasks.\n\nUsers can transition between devices without noticeable changes if the site is responsive. This encourages engagement and builds trust between:\n\n- The user\n- The business\n\n### Easier Analytics Tracking\n\nA single responsive site simplifies [analytics tracking](https://chromewebstore.google.com/detail/analytics-tracker/eadbjpepaobdbloeenghnbeejhbidcpa?hl=en), allowing better insights into user behavior across devices.\n\nIf you have separate sites for mobile and desktop users, you’ll need to track them individually. This makes it difficult to get a clear picture of how users interact with your site.\n\n### Simplified Maintenance\n\nManaging one site is more accessible than managing multiple versions, streamlining updates and changes. Every time you change or update a site, you must do it for both versions if they aren’t responsive. This takes extra time and can lead to inconsistencies between the two sites.\n\n### Improved Accessibility\n\nResponsive design enhances accessibility for users with disabilities as it adapts to various assistive technologies. A screen reader will read a responsive site the same way on both:\n\n- Mobile\n- Desktop devices\n\nThis isn’t the case for separate mobile sites that often have different content and layouts.\n\n### MagicUI's Components: Fully Responsive for Optimal User Experience\n\n[MagicUI’s components](https://magicui.design/) are designed to be fully responsive, allowing developers to implement mobile-friendly designs effortlessly without sacrificing performance. This adaptability contributes significantly to user retention and engagement across platforms.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today to create a beautiful, responsive landing page to capture your target audience and convert visitors into customers.\n\n## Usability and Accessibility in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/jhwu52j74ng.jpg)\n\n### Ease of Use: Make Your Website Intuitive\n\nWebsites must be intuitive, allowing users to achieve their goals with minimal effort. When a website is easy to use, visitors can quickly find the information they need without feeling lost or confused. Improving ease of use can also boost [SEO](https://developers.google.com/search/docs/fundamentals/seo-starter-guide). Search engine spiders look for websites that:\n\n- Perform well\n- Load quickly\n\nIf your site is complicated, it may have a lot of code or excessive features that hinder performance. Simplifying your site’s design for better usability will help both:\n\n- Human visitors\n- Search engine bots\n\n### Clear Navigation: Your Website’s Roadmap\n\nEffective navigation systems help users find information quickly, reducing frustration. If your website needs better navigation, visitors may become disoriented and leave. 94% of the time, someone will leave a website after experiencing issues with its navigation. Clear navigation also helps search engine bots index your website, improving your SEO.\n\n### Accessible Content: Open Your Doors to Everyone\n\nContent should be available to all users, including those with disabilities, ensuring inclusivity. For instance, about 15% of the world’s population lives with some form of disability. Many of these individuals use the internet regularly.\n\nThey often encounter barriers that prevent them from accessing information. By designing accessible websites, you can help eliminate these barriers and make your content available to everyone.\n\n### Responsive Design: Functionality Across Devices\n\nWebsites must be functional across devices, accommodating various screen sizes and resolutions. In 2021, [over 58% of all online traffic](https://www.statista.com/statistics/1380539/time-spent-online-daily-by-device/) came from mobile devices.\n\nIf your site isn’t mobile-friendly, smartphone or tablet visitors may struggle to find information. This can lead to high bounce rates and hurt your SEO.\n\n### Feedback Mechanisms: Let Users Know They’re on the Right Track\n\nProviding users with immediate feedback enhances their understanding of interactions and actions taken on the site. If a user fills out a form on your site, they should receive a confirmation notification as soon as they submit it. This lets them know their action has been recorded and improves usability.\n\n### Error Prevention and Recovery: Designing for the Inevitable\n\nDesigning for error prevention and offering clear recovery options improves usability. For instance, if a user encounters an error on your website, they should be able to:\n\n- Quickly recover\n- Resume their task\n\nThis can be done by providing an intuitive way to fix the error, such as listing the steps to take or allowing the user to automatically return to where they started.\n\n### Consistent Layouts: The Predictability Factor\n\nConsistent layouts help users predict where to find information, enhancing their navigation experience. If you run an eCommerce site, your product pages should have a similar structure.\n\nThis will allow users to quickly locate the information they want, such as product descriptions, customer reviews, and shipping details.\n\n### Readable Content: Don’t Make Your Visitors Work to Understand Your Message\n\nThe text should be legible, with appropriate font sizes and colors that contrast nicely with the background. If content is difficult to read, visitors may get frustrated and leave your site without seeing what you offer. Use clear fonts, and ensure any custom fonts used are:\n\n- Web-friendly\n- Easy to read\n\n### Multimedia Accessibility: Don’t Exclude Anyone from Your Content\n\nIncorporating captions and transcripts for multimedia content ensures that all users can access information. If you have a video on your site, not all users can hear the audio.\n\nThis could be due to a hearing impairment, or they may simply be in a location where playing audio isn’t practical. Providing captions will allow these users to access the information contained in your video.\n\n### User Testing: Don’t Guess What Your Users Want \n\nRegular [user testing](https://www.fiverr.com/categories/programming-tech/user-testing-services) helps identify usability issues and areas for improvement, ensuring the site effectively meets user needs. You can conduct user testing at any point in your website’s lifecycle, from pre-launch to several months after it goes live.\n\n## Visual Hierarchy and Color Theory in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/kcjvlbcjhb.jpg)\n\nVisual hierarchy helps prioritize content based on importance. This can be achieved through:\n\n- _Size:_ Larger elements draw more attention.\n- _Color:_ Bright or contrasting colors can highlight key information.\n- _Spacing:_ Adequate whitespace improves readability and focus.\n\n### Explore MagicUI\n\n[MagicUI](https://magicui.design/) components utilize visual hierarchy principles to create interfaces that naturally guide user behavior and ensure that critical information is easily identifiable.\n\n### Color Theory: Evoking Emotion and Enhancing User Engagement\n\nColor theory involves understanding how colors interact and the emotions they evoke. Effective use of color can enhance user engagement and convey brand identity.\n\n- _Complementary Colors:_ Using colors that complement each other can create a visually appealing design.\n- _Limited Palette:_ A restricted color palette helps maintain consistency and focus.\n\n[MagicUI](https://magicui.design/) incorporates color theory into its components, allowing designers to create visually stunning interfaces that resonate with users.\n\n## Performance Optimization in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/iyxwn2f4nhs.jpg)\n\n[Performance optimization](https://granulate.io/blog/performance-optimization-the-basics-metrics-and-whats-wrong/) is crucial for:\n\n- Improving site speed\n- Enhancing user satisfaction\n- Improving search engine rankings\n\n### Image Compression: Reduce File Size for Faster Loading Times\n\nHigh-resolution images can significantly slow down website performance. Compressing images reduces their file size without compromising quality, leading to:\n\n- Faster loading times\n- Better user experiences\n\n### Caching: Speed Up Repeat Visits to Your Website\n\nWe are implementing browser caching, which stores specific resources on the user’s device. This reduces the need for repeat downloads and speeds up subsequent visits to the website.\n\n### Minimize HTTP Requests: Fewer Requests Mean Faster Load Times\n\nEvery file, script, or image on a webpage requires an HTTP request. Reducing these requests by combining files or using [CSS sprites](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_images/Implementing_image_sprites_in_CSS) helps the page load faster.\n\n### Performance Optimization Improves User Experience\n\nFast-loading websites keep users engaged, reducing bounce rates and increasing time spent. Studies show that a delay of even one second in page response can result in a 7% reduction in conversions.\n\n### Performance Optimization Leads to Higher Conversion Rates\n\nFaster websites directly contribute to higher conversion rates, as users are more likely to complete actions like purchases when pages load swiftly.\n\n### SEO Benefits of Performance Optimization\n\nSearch engines prioritize fast-loading websites, meaning performance optimization can lead to higher rankings and increased visibility.\n\n### MagicUI’s Lightweight Components Boost Site Speed\n\nMagicUI’s lightweight components are optimized for performance, helping designers create fast-loading, highly responsive websites. These components significantly enhance site speed, critical for user satisfaction and SEO. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- [MUI Transitions](https://magicui.design/blog/mui-transitions)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- React Spring\n\n## Common Mistakes and Current Trends in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/54e8vov6nn8.jpg)\n\n### Ditch Confusing Navigation for Good\n\nOvercomplicated navigation frustrates users and leads to high bounce rates. Aim for a clear, intuitive hierarchy with no more than 5-7 main categories.\n\n### Don’t Ignore Mobile Users\n\nWith over 50% of web traffic coming from mobile devices, it’s crucial to prioritize responsive design. Ensure your website looks and functions seamlessly across all screen sizes.\n\n### Speed Up Slow Loading Times\n\nUsers expect fast-loading pages.\n\n- Optimize images\n- [Minimize HTTP requests](https://blog.hubspot.com/marketing/reduce-http-requests)\n- Leverage caching to improve performance\n- Aim for a load time under 3 seconds\n\n### Make Clear CTAs a Priority\n\nProminent, compelling calls to action guide users to the desired action. Use action-oriented text and contrasting colors to [make CTA stand out](https://www.investopedia.com/terms/c/call-action-cta.asp).\n\n### Maintain Consistent Branding\n\nMaintain a cohesive brand identity across all pages with:\n\n- Consistent colors\n- Typography\n- Imagery\n\nInconsistencies can appear unprofessional.\n\n### Avoid Cluttered Designs\n\nWhite space is essential for readability and focus. Avoid cramming too many elements onto a page, which can:\n\n- Overwhelm users\n- Dilute key messages\n\n### Ensure Content is Accessible\n\nEnsure your website is accessible to users with disabilities by:\n\n- Providing [alt text for images](https://accessibility.huit.harvard.edu/describe-content-images#:~:text=Alt%20Text%20is%20a%20brief,relates%20to%20the%20page%20content.)\n- Captions for videos\n- Keyboard navigation\n\nThis broadens your audience and improves SEO.\n\n### Regularly Check for Broken Links\n\nRegularly test your website for broken links, which can:\n\n- Frustrate users\n- Damage credibility\n\nSet up redirects for moved pages and monitor for 404 errors.\n\n### Keep Content Fresh\n\nStale content makes your website appear neglected. Establish a content maintenance schedule and keep information current to retain user trust.\n\n### Optimize for Mobile Users, Not Just Desktop Users\n\nMore than simply simply shrinking a desktop site for mobile is required. Optimize layouts, navigation, and content for smaller screens to provide the best possible mobile experience.\n\n## The Significance of Typography and Information Architecture in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/hfioobjwnn.jpg)\n\n[Typography](https://en.wikipedia.org/wiki/Typography) creates a solid foundation for both usability and aesthetic appeal. When users land on a website, they want to absorb information quickly to find answers to their questions. Effective typography promotes this goal by optimizing readability, which:\n\n- Enhances user experience\n- Bolsters brand perception\n\nKey aspects of typography include:\n\n- Font selection\n- Hierarchy\n- Contrast\n- Spacing\n- Mobile Optimization\n\n### Typography Made Easy with MagicUI\n\n[MagicUI](https://magicui.design/) allows developers to integrate well-crafted typography into their designs easily. The library offers pre-styled text components that adhere to best practices, ensuring readability and aesthetic appeal.\n\n### Information Architecture: The Key to Intuitive User Experience\n\n[Information architecture](https://blog.hubspot.com/website/information-architecture) is essential for enhancing user navigation and overall site functionality. Effective IA involves:\n\n- User research\n- Clear hierarchy\n- Labeling\n- Multiple pathways\n- Testing and iteration\n\n#### Intuitive Navigation\n\n[MagicUI](https://magicui.design/) supports effective information architecture by providing components that can be easily arranged and customized to fit the desired structure. The library simplifies the creation of intuitive navigation systems that enhance user experience.\n\n## The Role of User Testing, Feedback, and Essential Tools in Web Design Best Practices\n\n![Web Design Best Practices](https://cdn.magicui.design/assets/akvjyvzst9a.jpg)\n\nUser testing uncovers usability issues that can drastically affect a visitor's experience on your site. By watching real users navigate your site, you can identify areas where they struggle to complete tasks or find information.\n\nThis allows you to target the right improvements to enhance usability and create a more enjoyable experience for your visitors.\n\n### Validating Design Decisions with User Feedback\n\nDesigning a website often involves making assumptions about what users want and need. [User feedback](https://gulosolutions.com/how-to-give-the-best-possible-web-design-feedback/) helps validate (or challenge) these design decisions to ensure the final product aligns with actual user expectations.\n\nThis leads to better outcomes, as you can optimize the site for its real users rather than your biases.\n\n### Gathering Insights from Real Users\n\nQuantitative data from analytics tools can reveal how users interact with your site, but it doesn’t give you the full picture. User testing and feedback provide valuable context to help you understand why users are behaving a certain way. This qualitative feedback can uncover issues that data alone may miss.\n\n### Improving Conversion Rates\n\nOptimizing your site with user testing and feedback aims to improve the user experience. A better UX can lead to higher engagement and conversion rates, whether you're trying to get users to fill out a form, make a purchase, or subscribe to your blog.\n\n### Iterative Design: Testing Early and Often\n\n[UX design](https://bootcamp.cvn.columbia.edu/blog/what-is-ux-design/) has transitioned from a linear approach to a more iterative process involving regular testing and feedback. By incorporating user testing and feedback into your design process, you can continuously improve your website's user experience.\n\n### Essential Tools for Testing and Feedback\n\nSeveral tools can help you implement these web design best practices. They include:\n\n- _Usability Testing Platforms:_ Tools like [UserTesting.com](http://UserTesting.com) and Hotjar facilitate user testing sessions.\n- _Analytics Tools:_ Google Analytics and similar platforms help track user behavior and identify trends.\n- _Feedback Tools:_ SurveyMonkey and Typeform allow for direct user feedback collection.\n- _Prototyping Tools:_ Figma and Adobe XD enable rapid prototyping and testing of design concepts.\n- _A/B Testing Tools:_ Optimizely and VWO help compare design variations to find the most effective solutions.\n\n### MagicUI: A Tool for Feedback and Iteration\n\n[MagicUI](https://magicui.design/) can be an integral part of this toolset, providing a collection of customizable components that can be easily tested and iterated upon. The library's focus on design efficiency and user-centric components empowers developers to create and refine their designs based on honest user feedback.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we specifically designed for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWe provide a range of visually appealing and interactive elements that can be easily integrated into web applications. This allows us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. With our free component library, [MagicUI Pro](https://pro.magicui.design/docs/templates/startup) can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/web-design-trends.mdx",
    "content": "---\ntitle: \"Top 15 Web Design Trends of 2024\"\ndescription: \"Discover the top 15 web design trends in 2024 that are shaping the future of websites, featuring innovative styles, layouts, and technology.\"\nimage: https://cdn.magicui.design/assets/trv6yiufaos.jpg\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-10-28\"\nfeatured: false\n---\n\nYour website needs a refresh. You can’t remember the last time you updated it, and it shows the design feels dated and doesn’t reflect your brand. Most concerning, your website turns visitors away instead of enticing them to stick around. No one wants to hang out on a site that looks like it hasn’t been touched since 2009. To make matters worse, you know that your website's aesthetics are crucial for creating an excellent first impression.\n\nYou've read that people form opinions about websites within milliseconds, and your site probably gives visitors the wrong impression. Your gut tells you it’s time to get with the times and incorporate some of the latest web design trends, but you’re not even sure what they are or how to get started. If this scenario feels familiar, you’re in the right place.\n\nIn this guide, we’ll cover 15 web design trends for 2024 and how to incorporate them into your site to help you follow [web design best practices](https://magicui.design/blog/web-design-best-practices).  MagicUI's startup landing page template will help you implement these trends and create a modern website to impress your visitors and help you achieve your business goals.\n\n## Why Great Web Design Matters?\n\n![Web Design Trends](https://cdn.magicui.design/assets/dkxrcxijwq9.jpg)\n\nIn the digital age, where attention spans are shorter than ever, first impressions matter more. [A well-designed website](https://www.kinesisinc.com/the-truth-about-web-design/) can create a positive and lasting impression on visitors, while a poorly designed website can drive them away. Studies have shown that users form an opinion about a website in just 50 milliseconds. This means the first few seconds of a visitor's experience are crucial in determining whether they will stay or leave.\n\n### Impact on User Retention\n\nA well-designed website can significantly impact user retention. A study by Adobe found that 38% of users will leave a website if the content/layout is unattractive. Investing in [modern web design](https://www.webfx.com/blog/web-design/modern-web-design/) can lead to more extended visits, higher engagement, and better conversion rates.\n\n### The Role of Design in Building Trust and Credibility\n\nBeyond first impressions and user retention, a well-designed website builds trust and credibility. A visually appealing, easy-to-navigate, and informative website can help establish a professional and trustworthy image. On the other hand, a website that is cluttered, difficult to use, or outdated can create a negative perception of a business or brand.\n\n### Why Companies Should Invest in Web Design\n\nGreat web design instills trust in your business. According to web credibility research from Stanford, [75% of users](https://www.linkedin.com/pulse/75-users-judge-companys-credibility-based-its-website-71ute/#:~:text=Here%27s%20a%20stat%20that%20might%20make%20you%20rethink%20your%20website%27s%20design%3A%2075%25%20of%20users%20judge%20a%20company%E2%80%99s%20credibility%20based%20on%20its%20website%20design.) admit to judging a company’s credibility based on their website’s design. In a day and age where 85% of B2B customers search the web before making a purchase decision, your website has the best chance of being a prospect’s “first impression” of my company and offerings. And it turns out the look and feel of your website are the primary drivers of those first impressions.\n\nFirst impressions are 94% design-related. Don’t get me wrong, quality content matters—a lot. But even the best content is rendered powerless when embedded in poor design. User behavior studies have found that visual appeal and website navigation significantly influence people’s first impressions of your brand. Positive first impressions lead to higher satisfaction. The initial impression that a user gets from your site can have a priming effect on how they perceive future interactions with your business.\n\nResearch shows that positive priming can boost user satisfaction, and, as you might expect, negative first impressions significantly drag user satisfaction. First impressions can last for years. And there’s an abundance of research to prove it. One study found that the NBA players’ careers are determined by their position in the draft, regardless of their on-court performance. Another study finds that subsequent impressions, no matter how contradictory, can never make up for the first impression – bringing a more than literal meaning to the saying that “you never get a second chance to make a first impression.”\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Website Animation Examples](https://magicui.design/blog/website-animation-examples)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## Top 15 Web Design Trends of 2024\n\n![Web Design Trends](https://cdn.magicui.design/assets/slsk1jkqdko.jpg)\n\n### 1\\. Dark Mode & Light Mode: A Personalized Web Experience Everyone Can Appreciate \n\nOffering light and dark themes allows users to customize their experience based on their preferences. Statistics show that dark mode usage is rising, with over 80% of internet users wanting the option (source: [https://www.designrush.com/trends](https://www.designrush.com/trends)). This trend caters to users who prefer a darker interface, especially in low-light conditions or for those with visual sensitivities.\n\n### 2\\. Minimalism & Simplified UI: Let the Essential Content Shine \n\nClean layouts with straightforward navigation and uncluttered interfaces are key in 2024. This focuses user attention on the essential content and enhances user experience. Minimalist designs can improve website usability and reduce cognitive load by eliminating unnecessary elements and distractions.\n\n### 3\\. 3D Graphics & Illustrations: Add Depth & Dimension to Your Website \n\n3D elements add depth, dimension, and a touch of futurism to websites. They can be used for product showcases, interactive experiences, or decorative elements. 3D graphics can create more immersive and engaging user experiences, making websites stand out.\n\n### 4\\. Augmented Reality (AR) & Virtual Reality (VR) Integration: A Unique Way to Engage Users \n\nWhile still in its early stages, [AR/VR integration](https://www.princetonreview.com/ai-education/vr-and-ar) offers a unique and immersive way for users to interact with content. This can be particularly valuable for e-commerce websites, real estate listings, or showcasing complex products. By allowing users to visualize products or experiences more realistically, AR/VR can enhance customer engagement and decision-making.\n\n### 5\\. Customizable & Interactive UIs: A Dynamic Web Experience \n\n[Websites are becoming more dynamic](https://www.wix.com/studio/blog/web-design-trends), allowing users to personalize their experience through interactive elements like drag-and-drop features, custom settings, or interactive forms. This trend empowers users to tailor websites to their needs and preferences, creating a more personalized and enjoyable experience.\n\n### 6\\. Voice User Interface (VUI) & Chatbots: Conversational Navigation \n\nVoice search and chatbots provide a hands-free way for users to navigate websites. This trend is expected to grow as voice assistants become more integrated into daily life. By offering voice-activated search and chat functions, websites can cater to users who prefer a more conversational and natural interaction.\n\n### 7\\. Gradient & Duotone Color Schemes: A Touch of Vibrancy & Sophistication \n\nGradients add a touch of vibrancy and depth to websites, while duotone color schemes offer a more sophisticated and timeless look. Gradients can create visually appealing and eye-catching designs, while duotone color schemes provide a more balanced and harmonious aesthetic.\n\n### 8\\. Microcopy & Storytelling: Create Stronger Connections with Website Visitors \n\nThe power of well-crafted microscopy (short pieces of text) helps guide users and create a stronger brand connection. Weaving storytelling into your website design can further engage visitors and leave a lasting impression. Microcopy can provide helpful instructions, clarify information, or add a touch of personality to your website. Storytelling can create a more emotional connection with users and make your website more memorable.\n\n### 9\\. Accessibility & Inclusivity: Cater to a Wider Audience \n\nWebsites should be accessible to everyone, regardless of ability. This includes using clear hierarchy, proper color contrast, and ensuring features like screen readers are fully compatible. By prioritizing accessibility, you can ensure that your website is inclusive and usable by a wider audience.\n\n### 10\\. Motion Effects: Add Personality to Your Website \n\nSubtle animations can add personality and guide users through the website. Consider animated transitions, hover effects, or parallax scrolling for a more dynamic experience (source: [https://webflow.com/interactions-animations](https://webflow.com/interactions-animations)). Motion effects can make websites more engaging and visually appealing while providing helpful cues for users.\n\n### 11\\. Glass Morphism: A Trend with Depth \n\nThis trend creates a layered effect with translucent elements, adding depth and a modern touch to website design. Glass morphism can create a visually exciting and contemporary aesthetic while providing a sense of depth and dimension.\n\n### 12\\. AI in Web Design: Streamline Your Processes \n\nArtificial intelligence is finding its way into web design tools, assisting with creating layouts, suggesting color palettes, or generating content. AI can help streamline the web design process and improve efficiency while providing valuable insights and recommendations.\n\n### 13\\. Retro Designs: Nostalgia Meets Web Design \n\nVintage design elements like pixel art, Memphis patterns, or neon colors are coming back, evoking nostalgia and playfulness. Retro designs can add a unique and nostalgic touch to websites, creating a sense of familiarity and charm.\n\n### 14\\. Skeuomorphism: Familiarity Breeds Intuition \n\nThis trend takes inspiration from real-world objects, creating familiar elements on digital interfaces to enhance user experience. Skeuomorphism can make websites feel more intuitive and natural, as users can relate to familiar design elements.\n\n### 5\\. Multiplanar Scrolling: A 3D Scrolling Experience \n\nThis technique creates a 3D scrolling experience with different elements moving at different speeds, adding depth and engagement. Multiplanar scrolling can create a more immersive and dynamic browsing experience, making websites more visually exciting.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## Integrating Trends into Your Website\n\n![Web Design Trends](https://cdn.magicui.design/assets/zeneij6962.jpg)\n\n### Identify Your Target Audience: Who Likes What?\n\nDifferent trends appeal to specific audiences. Consider who you want to reach and tailor your design choices based on their preferences. For example, a website targeting younger audiences might benefit from incorporating more bright colors and [playful animations](https://www.superside.com/blog/10-great-examples-of-animation-on-websites). A website targeting older audiences may prefer a more minimalist and classic design.\n\n### Align Trends with Your Brand: Don’t Blindly Follow Trends \n\nDon’t blindly follow trends. Choose elements that complement your brand identity and overall message. For example, a luxury brand might incorporate subtle animations and high-quality imagery, while a playful brand might use bright colors and playful typography.\n\n### Maintain Focus and Balance: Don’t Overwhelm Users \n\nWhile embracing trends is exciting, it only overwhelms users with a little going on. Choose a few key trends and use them strategically to enhance your website without sacrificing clarity. A cluttered or overly complex design can be confusing and off-putting to users.\n\n### Consider Your Website's Purpose: Choose Relevant Trends \n\nThe trends you choose should align with your website's goals. For example, an [e-commerce website](https://www.awwwards.com/websites/e-commerce/) might prioritize transparent product displays and smooth checkout, while a blog might focus on engaging storytelling and easy navigation.\n\n### Use MagicUI to Simplify the Process: Simplify Integrating Trends\n\n[MagicUI offers various customizable components](https://pro.magicui.design/docs/templates/startup) to help you quickly incorporate these trends into your website. With its pre-built, animated elements, you can create stunning user interfaces without extensive coding or design expertise.\n\n### Additional Tips for Integrating Web Design Trends \n\n#### Start With A Solid Foundation\n\nBefore incorporating trends, ensure your website has a strong foundation in usability, accessibility, and mobile responsiveness.\n\n#### Test and Iterate\n\nRegularly test your website with real users to see how they respond to your incorporated trends. Make adjustments based on their feedback. -\n\n#### Don’t Be Afraid To Experiment\n\nWeb design is an evolving field, so don’t be afraid to try new things and experiment with different trends.\n\n#### Stay Informed\n\nKeep up with the latest trends and best practices in web design to ensure your website remains relevant and engaging. By following these tips and using [MagicUI as a powerful tool](https://pro.magicui.design/docs/templates/startup), you can create a visually appealing website that effectively achieves your goal.\n\n## Best Practices and Things to Avoid\n\n![Web Design Trends](https://cdn.magicui.design/assets/cwi6ktodjkn.jpg)\n\n### Prioritize User Experience: Why It Matters and How to Do It Right\n\n[User experience, or UX](https://www.interaction-design.org/literature/topics/ux-design?srsltid=AfmBOopLWnn7bSiTa7PDj9AnjZdtd7Rrfl5T2r00YN24nf5m_txPpUFQ), refers to how a person interacts with and experiences a website or application. Good user experience means that a website is easy to use and navigate and that the users find what they need quickly. Web design plays a significant role in determining overall user experience, and poor design can frustrate users and hurt performance.\n\nFor this reason, it's crucial to prioritize user experience when designing a website. Always put the user first. Ensure your design is intuitive, easy to navigate, and visually appealing. Avoid overwhelming users with clutter or complex layouts. A well-designed website should guide users effortlessly through the content and make it easy for them to find what they’re looking for.\n\n### Test and Iterate: The Importance of Getting Real User Feedback \n\nRegularly testing your website with real users will identify any issues and help you improve. A/B testing can help you determine which design elements work best. By gathering user feedback, you can make data-driven decisions and refine your website to meet users' needs better.\n\n### Avoid Over-the-Top Trends: A Little Can Go A Long Way \n\nWhile staying current is essential, feel free to incorporate every trend. Choose those that genuinely enhance your website and align with your goals. Overusing trends can make your website feel dated or gimmicky. Instead of blindly following trends, create a timeless, functional, and visually appealing website.\n\n### Optimize for Mobile: How to Do It Right \n\nWith more people using smartphones and tablets, ensure your website is fully responsive and looks great on all devices. A mobile-friendly design is essential for providing a positive user experience. A website not optimized for mobile may be challenging to navigate and use on smaller screens, leading to higher bounce rates and lower engagement.\n\n### Load Times: What to Watch For \n\nSlow load times can lead to high bounce rates and a negative perception of your brand. Users are more likely to leave a website if it takes less time to load. Consider optimizing images, minimizing code, and using a [content delivery network (CDN)](https://www.cloudflare.com/learning/cdn/what-is-a-cdn/) to improve your website’s loading speed.\n\n### Accessibility: Why It Matters and How to Achieve It \n\nFollow accessibility guidelines like WCAG (Web Content Accessibility Guidelines) to ensure your website is accessible to people with disabilities. This includes using clear hierarchy, proper color contrast, and fully compatible features like screen readers. By making your website accessible, you can reach a wider audience and demonstrate your commitment to inclusivity.\n\n### SEO: Why Optimization Is Key for Business Success \n\nOptimize your website for search engines to improve visibility and attract organic traffic. This involves using relevant keywords, optimizing images, and creating high-quality content. A well-optimized website will appear higher in search engine results, making it easier for potential customers to find you.\n\n### Analytics: Tracking Metrics for Continuous Improvement \n\nUse analytics tools to track website performance, identify improvement areas, and measure the impact of your design choices. This data can help you make informed decisions and refine your website. By understanding how users interact with your website, you can identify areas where you can improve the user experience and achieve your goals.\n\n## Cater Your Design to Fit Your Users (Here are things to consider)\n\n![Web Design Trends](https://cdn.magicui.design/assets/c703endnpiv.jpg)\n\n### Prioritizing Content Quality When Designing Websites for Users  \n\n[Designing a website](https://www.socialmediatoday.com/content/24-things-consider-when-designing-and-developing-website) without content is like building a house without plumbing. It might look good on the outside, but it's not livable. Your website needs content to function, and so do your users. Visitors seek information, and your website’s content will satisfy their curiosity and help them achieve their goals. To enhance user experience (UX), prioritize quality website content.\n\n### Branding Consistency: Create a Cohesive Experience for Users  \n\nWhen designing your website, think about your brand. A website is a digital representation of your business, so it should reflect your brand’s personality. Building consistency across your site will help users feel comfortable and reduce confusion. Aim for a cohesive look and tone that aligns with your business’s values. This will help users trust your website and improve their overall experience.\n\n### Security: Protect Your Users  \n\nUsers visiting your website want to know that their personal information is secure. This is especially true for e-commerce websites that require billing information to process transactions. To enhance security and improve UX, implement the following measures:\n\n### Social Media Integration: Enhance User Experience with Socials  \n\n[Social media integration](https://www.indeed.com/career-advice/career-development/what-is-social-media-integration#:~:text=Social%20media%20integration%20is%20the,websites%20or%20during%20product%20showings.) can improve user experience on your website by creating a more interactive experience. For example, if visitors have questions about your products or services, they may prefer to reach out via social media instead of filling out a contact form. Social media integration can enhance your website’s content by allowing users to share your posts on their profiles. This increases your website’s reach and visibility, helping you attract more visitors.\n\n### Email Marketing: Keep in Touch with Your Users  \n\nEmail marketing isn’t dead. It’s one of the best ways to reach your audience and keep them engaged, even after they leave your website. Users who subscribe to your email list gain access to exclusive content, offers, or updates. This encourages them to return to your website and boosts their experience.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## Critical Takeaways From Web Design Trends\n\n![Web Design Trends](https://cdn.magicui.design/assets/bjp0gtl19eb.jpg)\n\n### User-Centric Design: The Golden Rule of Web Design Trends\n\n[User-centric design](https://www.iberdrola.com/innovation/what-is-user-centric) focuses on the needs and preferences of your website’s visitors. By putting users first, you can create a positive and intuitive experience that encourages engagement and builds trust.\n\n### Trend Integration: Finding Balance\n\nWeb design trends aren’t one-size-fits-all solutions. As you assess the latest trends, look for elements that complement your website’s goals and existing features. Then, visualize how they can be integrated into your site without disrupting your user experience.\n\n### Continuous Testing: The Key to Improvement\n\nOnce you launch your website, your work isn’t done. Regularly testing your site with real users helps you pinpoint areas for improvement and make data-driven decisions to enhance your website’s performance and user experience.\n\n### Mobile Responsiveness: A Must for Modern Websites\n\nWith mobile devices accounting for over half of all web traffic, ensuring your site is fully responsive is crucial. Not only does mobile responsiveness improve user experience, but it’s also a critical ranking factor for search engines like Google.\n\n### Accessibility: Making Your Website Inclusive\n\nWeb accessibility refers to designing websites anyone can use, regardless of ability. Prioritizing accessibility helps you reach a wider audience, improve SEO, and demonstrate your commitment to inclusivity.\n\n### Search Engine Optimization (SEO): Boosting Organic Traffic\n\nOptimizing your website for search engines helps improve visibility and attract organic traffic. SEO is a critical aspect of design that can’t be overlooked as you assess web design trends.\n\n### Analytics-Driven Insights: Using Data to Your Advantage\n\nWeb design is an ongoing process. Using analytics tools to track website performance, you can identify trends and make data-driven decisions to optimize your site for better user experience and performance.\n\n### High-Quality Content: Catering to Your Audience\n\nWhile optimizing your website for search engines is crucial, it’s important to remember that your real audience is human. Creating valuable, informative, and engaging content that resonates with your target audience will help improve your website’s SEO and give visitors a reason to visit.\n\n### Consistent Branding: Creating a Cohesive Experience\n\nAs you assess the latest web design trends, look for ways to maintain your brand identity and create a cohesive experience for your visitors. Consistent branding helps build trust and makes your website more memorable.\n\n### Robust Security: Protecting Your Website\n\nWebsite security is vital for protecting user data and building trust with visitors. Security also helps improve your website’s SEO and prevents unwanted bugs and crashes that can harm user experience.\n\n### Social Media and Email Marketing: Boosting Website Traffic\n\nNo website is an island. Promoting your site on social media and email marketing helps you reach a wider audience and drive traffic to your website.\n\n### Regular Updates: Keeping Your Website Fresh\n\nWeb design is an ongoing process. Using analytics tools to track website performance, you can identify trends and make data-driven decisions to optimize your site for better user experience and performance.\n\n### Load Times: Speed Matters\n\nNo one likes waiting for a website to load. 47% of users expect a webpage to load in two seconds or less, and if a site takes longer, they are likely to leave and go to a competitor. What’s more, site speed can impact both user experience and SEO.\n\n### Call-to-Actions (CTAs): Guiding Your Visitors\n\n[Blog CTAs](https://www.blogctas.com) are prompts that guide users to take specific actions on your site. Clearly defining your desired actions for visitors (e.g., sign up, buy, contact) and using effective CTAs to help them navigate your site and reach those goals will improve user experience and help you achieve your website’s goals.\n\n### Privacy and Data Protection: Building Trust \n\nIn today’s digital world, website visitors are increasingly concerned about their privacy and how their data is used. Adhering to privacy regulations and implementing security measures to protect user data will help build trust with your audience while keeping you compliant with legal requirements.\n\n### Cross-Browser Compatibility: A Consistent Experience for All Users\n\nModern websites are complex and can behave differently depending on the browser or device used. Testing your site’s compatibility across various browsers and devices will help ensure all users have a positive experience, regardless of how they access your site.\n\n### Accessibility Standards: Following the Guidelines\n\nWeb accessibility standards like WCAG ([Web Content Accessibility Guidelines](https://www.w3.org/TR/WCAG21/)) help make your website inclusive and usable by people with disabilities. Following these guidelines will help improve user experience for all visitors, regardless of ability.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI is an open-source](https://pro.magicui.design/docs/templates/startup) user interface library built for design engineers by design engineers. The colorful and interactive library features 20+ animated components created with React, TypeScript, Tailwind CSS, and Framer Motion.\n\nEach component is customizable and easily integrated into web applications to help developers create stunning user interfaces with minimal effort. With a strong focus on animation, MagicUI aims to bridge the gap [between design and development](https://pro.magicui.design/docs/templates/startup), empowering teams to craft captivating digital experiences.\n\n### Related Reading\n\n- React Spring Examples\n- Framer Motion Vs React Spring\n- GSAP Examples\n- React Transition\n- React Motion\n- React Transition Animation\n- GSAP Vs Framer Motion\n"
  },
  {
    "path": "apps/www/content/blog/website-animation-examples.mdx",
    "content": "---\ntitle: \"Top 15 Website Animation Examples\"\ndescription: \"Explore 15 standout website animation examples that captivate and engage. See what makes these designs genuinely remarkable.\"\nimage: https://cdn.magicui.design/assets/9904e992-e05b-4901-897a-7f254c8b41bb.png\nauthor: Dillion Verma\ntags:\n  - Web Design\npublishedOn: \"2024-09-01\"\nfeatured: false\n---\n\nSome web pages feel so dull that you might assume they haven’t been updated in a decade. Others, however, engage visitors right away and draw them into a captivating digital experience. These are the websites with animations. Animation is a web design trend that boosts user experience and makes your site more enjoyable. There are many different types of animations and you will need to follow [web design best practices](https://magicui.design/blog/web-design-best-practices).\n\nSome create stunning visual effects, while others serve practical purposes, like guiding users or providing feedback. Adding animations can be a great place to start if you want to improve your website. This guide will introduce 15 examples of website animations to inspire your next web design project. You’ll also get a helpful action guide for animating your website.\n\nOne way to kickstart your web design project is to use a template. If you're creating a startup website, check out MagicUI's startup landing page template. This template has a clean, modern design with plenty of space for animations. This template can help you visualize how to implement animations on your website to optimize user experience.\n\n## Why Using Animations Matters for Your Website\n\n![Website Animation Examples](https://images.unsplash.com/photo-1581934932994-e4ac37c0c882?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHxkaXNjdXNzfGVufDB8fHx8MTcyNDQzODg0OHww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Animation Boosts User Engagement and Retention\n\nIn today's digital world, website visitors are increasingly impatient. Studies show that users will leave a page if it takes more than three seconds to load. And if they have trouble with a website’s functionality, 70% of users will abandon the site altogether. Animation can help improve your website’s load time and functionality to keep users engaged and on your page longer.\n\nFor example, adding animated elements to your site can make transitions and changes between pages smoother and more visually appealing. Instead of abruptly jumping from one page to another, visitors can enjoy a smoother experience with engaging visuals. This can reduce their cognitive load and keep them from feeling overwhelmed or confused. The result is a site where visitors can easily navigate, encouraging them to stay longer and explore your offerings.\n\n### Animation Improves Visual Storytelling\n\nWhen it comes to converting visitors, visuals matter. Studies show that [91% of customers](https://venngage.com/blog/visual-content-marketing-statistics/#:~:text=Since%2091%25%20of%20consumers%20prefer%20visuals%20more%20than%20plain%20text) prefer engaging with visual content over plain text. Animation takes visual content a step further, helping you tell your brand's story and convey important information engagingly. Instead of overwhelming your visitors with a wall of text, you can use animation to help them digest critical information quickly.\n\nFor example, [animated videos](https://wyzowl.s3.eu-west-2.amazonaws.com/pdfs/Wyzowl-Video-Survey-2023.pdf) can tell your brand’s story, explain how to use a product, or illustrate complex processes that might otherwise confuse your customers.   Using animation to boost your visual storytelling can significantly improve your conversion rates.\n\n### Related Reading\n\n- [Web Application Design](https://magicui.design/blog/web-application-design)\n- [How To Make An Interactive Website](https://magicui.design/blog/how-to-make-an-interactive-website)\n- [Best Web Design Tools](https://magicui.design/blog/best-web-design-tools)\n- [Web Design Trends](https://magicui.design/blog/web-design-trends)\n- [Text Animation CSS](https://magicui.design/blog/text-animation-css)\n- [UI Libraries](https://magicui.design/blog/ui-libraries)\n- [UI Animation](https://magicui.design/blog/ui-animation)\n\n## How Website Animations Impacts UX\n\n![Website Animation Examples](https://images.unsplash.com/photo-1476905778601-2e68ba72d354?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxwZXJzb24lMjBvbiUyMG1vYmlsZXxlbnwwfHx8fDE3MjQ0Mzg5NjZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Improve Visual Appeal with Website Animation\n\nAnimation can significantly [enhance the user experience](https://deliveredsocial.com/benefits-of-creative-animation-website-design-for-businesses-in-portsmouth/#:~:text=Animation%20can%20transform%20a%20static,and%20enhance%20overall%20user%20experience.) of your website in several ways. First, they improve visual appeal. Animations can immediately grab a user's attention, making your website more visually appealing and engaging than a static design. Dynamic elements can pique curiosity and encourage users to explore further.\n\n### Animation Creates a Memorable Impression\n\nNext, animations enhance user engagement and reduce bounce rates. By providing a more interesting and interactive experience, animations can keep users on your website longer and create a memorable impression. Well-designed animations can leave a lasting impression on your visitors, making your brand more memorable.\n\n### Improve Navigation with Website Animation\n\n[Animations can improve website navigation](https://namtheartist95.medium.com/the-benefits-of-using-animation-in-web-design-2d11a5503484). They provide visual cues that can guide users through your website, making navigating and finding the information they need easier. Animations can also reduce confusion, and clear and intuitive animations can prevent user frustration and confusion.\n\n### Enhance Understanding of Your Website Content\n\nWebsite animations also enhance understanding. They can simplify complex concepts by visually explaining processes or ideas. This leads to better retention. Visual information is often easier to remember than plain text, leading to better information retention.\n\n### Increase Conversion Rates with Animation\n\nAnimations can also increase conversion rates. They improve the clarity of call-to-actions and highlight important elements, such as call-to-action buttons, making them more noticeable and encouraging conversions. Because animations create a positive user experience, they can also lead to higher conversion rates and customer satisfaction.\n\n### Improve Brand Perception with Animations\n\nFinally, animations can improve your brand's perception. They give your website a modern look, reflecting your brand's personality. Well-designed animations can also evoke emotions, creating a stronger connection with your audience.\n\n## 15 Website Animation Examples to Inspire You\n\n![Website Animation Examples](https://images.unsplash.com/photo-1648737965961-2280af0f2cf7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMGxhcHRvcCUyMHdpdGglMjB0ZWFtfGVufDB8fHx8MTcyNDQzODg2Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Microinteractions: Subtle Yet Significant\n\nMicrointeractions are small animations that happen when a user interacts with a website. For example, a button may change color and slightly animate when a user hovers over it. Microinteractions make websites feel more dynamic and improve the user experience by providing visual feedback on user actions. For instance, if a user fills out a form and submits it, a checkmark animation that celebrates their success is a microinteraction. While these animations are small, they can considerably impact user experience, making websites feel more engaging and enjoyable to use.\n\n### 2\\. Character Animation: Bring Your Mascot to Life\n\nCharacter animations are another fantastic [way to use animation](https://blog.hubspot.com/website/website-animation-examples) on your website. If your brand has a mascot or character, animating this figure can help bring your site to life and create a more engaging user experience. For example, Slack has an animated paperclip mascot that helps users navigate the platform. Similarly, Duolingo has a delightful animated owl that greets you on the website and enables you to learn a new language. Adobe also has an animated character, \"Behance,\" that helps explain the platform's features. Animating your brand's mascot or character adds personality and relatability to your site, making it more memorable and engaging for users.\n\n### 3\\. Parallax Scrolling: A Classic Web Animation Technique\n\nParallax scrolling is a technique where elements on a webpage move at different speeds as the user scrolls, creating a sense of depth and immersion. Websites like Apple's, Nike's, and Airbnb's often use parallax scrolling to create visually stunning experiences. The benefit of this technique is that it provides a dynamic and engaging scrolling expertise, making the website more visually exciting and interactive. Another website that features parallax scrolling is the U.K. government's page on the EU. This site uses parallax scrolling to present information on the transition out of the EU in a less daunting way.\n\n### 4\\. Progress Bars: Visual Indicators that Reduce Frustration\n\nProgress bars are animated indicators that visually represent the progress of a task or process. Websites that use progress bars for file uploads, downloads, or loading screens can ease user anxiety. E-commerce websites that use progress bars to indicate the checkout process can reduce frustration and abandonment. Progress bars increase user patience and reduce perceived wait times, making the website feel more responsive and user-friendly.\n\n### 5\\. Explainer Videos: A Website Animation Example That Improves Information Retention\n\nExplainer videos are animated videos that explain complex concepts or products simply and engagingly. Websites like Wistia, Biteable, and Powtoon offer explainer video creation tools. The benefit of explainer videos is that they improve information retention and understanding, making it easier for users to grasp complex ideas. For example, a website for a software company might use an explainer video to demonstrate the features of their product. A website for a medical device company might use an explainer video to explain how the device works.\n\n### 6\\. Background Animations: Subtle Effects That Set the Mood\n\n[Background animations](https://alphaefficiency.com/animated-website-background) are subtle animations in the background of a webpage that add visual interest without overwhelming the content. For example, a website for a music streaming service might have a background animation of dancing sound waves. A website for a travel agency might feature a background animation of clouds drifting across the sky. The benefit of background animations is that they set the mood and create a visually appealing experience while also providing a sense of depth and motion.\n\n### 7\\. Data Visualization: Animating Charts and Graphs to Tell a Story\n\nData visualization is the practice of animating charts and graphs to make complex data more engaging and easier to understand. Websites like Google Analytics and Tableau use data visualization techniques to present complex data clearly and visually appealingly. Data visualizations provide a clear and visually appealing way to present information, making it easier for users to understand and interpret data.\n\n### 8\\. Page Transitions: Smoothly Transition Between Pages for a Polished Feel\n\nPage transitions are animations when a user navigates between pages on a website. Instead of abruptly loading a new page, a website with page transitions will smoothly transition to the latest content using animation. For example, a website for an e-commerce store might use a subtle fade-in/fade-out transition when a user clicks on a product. A website for portfolio website might use a slide-in/slide-out transition to reveal different projects. The benefit of page transitions is that they create a polished and professional feel, improving the overall user experience and making the website feel more fluid.\n\n### 9\\. Interactive Elements: Engaging Users with Triggered Animations\n\nInteractive elements are animations triggered by user interactions, such as clicks or hovers. Websites with hover effects, tooltips, or pop-ups can increase user engagement and encourage exploration, making the website more interactive and fun. For example, a website for a restaurant might use interactive menus with animations to highlight popular dishes. A website for a fashion retailer might use interactive product carousels with animations to showcase different items.\n\n### 10\\. Animated Logos: Grab Attention with a Moving Logo\n\nAnimated logos are dynamic animations that grab attention and leave a lasting impression. Websites like Netflix and Disney use animated logos to create a memorable brand identity. The benefit of an animated logo is that it creates a memorable brand identity and sets the tone for the website, making it more recognizable and appealing.\n\n### 11\\. SVG Animations: Lightweight Animations That Won't Slow You Down\n\nSVG animations are created using Scalable Vector Graphics (SVG), which are lightweight and can be scaled without losing quality. Websites that use SVG animations for icons, logos, or other graphical elements can provide visually appealing animations without impacting website performance, making it a popular choice for web designers.\n\n### 12\\. Loading Animations: Animations that Make Loading Less Tedious\n\nLoading animations displays while a webpage is loading, making the wait time feel less tedious. Websites that use spinning loading icons or progress bars can improve user perception of website performance, making it more responsive and user-friendly.\n\n### 13\\. Animated Icons: Fun Way to Communicate Information\n\nAnimated icons are animated icons that add a touch of fun and interactivity to a website. Websites that use animated icons for social media links, call-to-action buttons, or navigation elements can communicate information in a visually appealing way, making the website more engaging and memorable.\n\n### 14\\. Text Animations: Grab Attention with Moving Text\n\nText animations are animations that are applied to text, such as typing effects, fading, or revealing. Websites that use text animations for headlines, call-to-actions, or other important text elements can draw attention to important information and increase user focus, making the website more effective at conveying messages.\n\n### 15\\. Scroll-Triggered Animations: Create a Dynamic Scrolling Experience\n\nScroll-triggered animations are activated based on the user's scrolling position. Websites that use scroll-triggered animations to reveal hidden content or create a more dynamic scrolling experience can create a more engaging and enjoyable user experience.\n\nBy incorporating these animation techniques into your website design, you can create a more engaging, visually appealing, and user-friendly experience for your visitors. Remember to use animations thoughtfully and strategically to enhance your website's effectiveness.\n\n### Unlock Your Creativity with MagicUI\n\nMagicUI is a [free and open-source UI library](https://pro.magicui.design/docs/templates/startup) that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components](https://pro.magicui.design/docs/templates/startup) are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n## Designing Website Animations with MagicUI\n\n![Website Animation Examples](https://images.unsplash.com/photo-1573165301123-3241ba3816b7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHx3ZWIlMjBkZXNpZ25lcnxlbnwwfHx8fDE3MjQ0Mzg4ODB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Pre-Built Animated Components: No More Starting From Scratch  \n\n[MagicUI's extensive library](https://pro.magicui.design/docs/templates/startup) of pre-built animated components is a huge advantage. These components are made to be used in a variety of website scenarios. You can save time and effort by utilizing MagicUI's components library when creating animations from scratch.\n\n### Customization Options: Make It Your Own  \n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), allowing you to tailor them to your brand and design preferences. You can modify their appearance, behavior, and interactions to create unique and engaging animations. This flexibility ensures that your animations align seamlessly with your website's aesthetic and user experience.\n\n### Easy Integration: Add Animations to Your Website in No Time  \n\n[Integrating MagicUI into your web](https://pro.magicui.design/docs/templates/startup) applications is a straightforward process. The library is designed to be compatible with popular frameworks like React, TypeScript, Tailwind CSS, and Framer Motion. With minimal coding required, you can quickly and easily add animations to your website.\n\n### Focus on Animation: No More Getting Sidetracked  \n\n[MagicUI's design-centric approach](https://pro.magicui.design/docs/templates/startup) prioritizes animation, making it easier for designers and developers to create captivating user experiences. The library's features and tools are specifically designed to facilitate the creation of animations, ensuring that you can produce high-quality results efficiently.\n\n### Related Reading\n\n- [Cool CSS Animations](https://magicui.design/blog/cool-css-animations)\n- [Web Animation Tools](https://magicui.design/blog/web-animation-tools)\n- [Animation Libraries](https://magicui.design/blog/animation-libraries)\n- [React Animation Examples](https://magicui.design/blog/react-animation-examples)\n- Framer Motion React\n- React Animations\n- React Text Animation\n- React Scroll\n- MUI Transitions\n- React Spring\n\n## Key Factors to Consider When Designing Website Animations\n\n![Website Animation Examples](https://images.unsplash.com/photo-1573496358349-d97974b2339b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHx3ZWIlMjBkZXNpZ25lcnxlbnwwfHx8fDE3MjQ0Mzg4ODB8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen [designing website animations](https://www.youtube.com/watch?v=mOVm5L4Fub4), it's essential to consider several key factors to ensure they enhance the user experience and contribute positively to your website's overall success. Here are some critical factors to keep in mind:\n\n### User Experience (UX) Clarity and Purpose\n\nAnimations should be clear and concise and serve a specific purpose. Avoid using animations that are purely decorative or distracting.\n\n#### Relevance\n\nEnsure animations are relevant to the content or context of the webpage. They should enhance the user's understanding or engagement with the information. Intuition Animations should be intuitive and easy to understand. Avoid using complex or confusing animations that may frustrate users.\n\n### Responsiveness Adaptive Design\n\nAnimations should adapt smoothly to different screen sizes and devices (desktop, mobile, tablet). They should also ensure that they function correctly and look visually appealing on all platforms.\n\n#### Performance Optimization \n\nResponsive animations should be optimized for performance, especially on mobile devices with limited processing power. To minimize load times, use techniques like lazy loading or CSS-only animations.\n\n### Resource Management Efficiency\n\nUse animations efficiently to avoid negatively impacting website performance. Excessive animations can slow down page loading times and frustrate users.\n\n#### File Size \n\nOptimize animation files (GIFs, videos, etc.) to reduce file size and improve loading times. Consider using web-friendly formats like SVG or CSS-based animations.\n\n#### Performance Testing \n\nRegularly test your website's performance with and without animations to ensure they don't significantly impact loading times or overall user experience.\n\n### Accessibility Inclusivity\n\nDesign animations with accessibility in mind. Ensure they are compatible with assistive technologies used by individuals with disabilities, such as screen readers or keyboard navigation.\n\n#### Alternative Content\n\nProvide alternative content for users who cannot view or interact with animations due to visual impairments or slow internet connections.\n\n### Brand Consistency Alignment\n\nEnsure animations align with your brand's overall aesthetic and messaging. They should be consistent with your website's design style and tone.\n\n### Testing and Iteration User Feedback\n\nGather feedback from users to assess the effectiveness of your animations. Make necessary adjustments based on their input.\n\n#### A/B Testing \n\nExperiment with different animation styles and placements to determine which ones perform best. Use [A/B testing](https://www.optimizely.com/optimization-glossary/ab-testing/#:~:text=A%2FB%20testing%20(also%20known,determine%20which%20one%20performs%20better.) to compare the impact of different animations on critical metrics like user engagement and conversion rates. By carefully considering these factors, you can create website animations that enhance the user experience, improve engagement, and contribute to your website's overall success.\n\n### Additional Key Factors for Designing Website Animations\n\nIn addition to the factors mentioned previously, here are some more considerations for designing effective website animations:\n\n#### Animation Timing\n\n- Duration: Choose appropriate durations for animations to avoid disrupting the user experience. Too long or too short animations can be frustrating.\n- Timing: Synchronize animations with user interactions or page loading to create a seamless experience.\n\n#### Animation Style\n\n- Consistency: Maintain a consistent animation style throughout your website to create a cohesive and professional look.\n- Simplicity: Opt for simple and elegant animations that are easy to understand and visually appealing. Avoid overly complex or distracting animations.\n\n#### Animation Direction\n\n- Natural Flow: Ensure animations follow a natural flow intuitive to users. For example, use left-to-right or top-to-bottom movements for reading-based content.\n\n#### Animation Triggers\n\n- Relevance: Trigger animations based on relevant user actions or events to avoid unnecessary distractions.\n- Timing: Consider the timing of animation triggers to provide a seamless and enjoyable experience.\n\n#### Animation Speed\n\n- Appropriate Speed: Choose a proper animation speed that is neither fast nor slow. A balance between speed and clarity is essential.\n\n#### Animation Feedback\n\n- Visual Feedback: Provide clear visual feedback to users when animations are complete or interactive elements are activated. By carefully considering these additional factors, you can create website animations that are not only visually appealing but also enhance the overall user experience and contribute to your website's success.\n\nUse our startup landing page template today.\n\n## Step-by-Step Guide to Designing Website Animations\n\n![Website Animation Examples](https://images.unsplash.com/photo-1674049405545-beb0b3fbb11b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw5fHxvbiUyMGxhcHRvcCUyMGFsb25lfGVufDB8fHx8MTcyNDQzODkyM3ww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Define Your Goals:  What Do You Want to Achieve with Your Animations?\n\n[Clearly outline the specific objectives](https://www.halo-lab.com/blog/best-website-animation-techniques) of your animations. Are you aiming to improve user engagement, explain complex concepts, enhance brand identity, or something else? Consider your target audience's preferences and expectations when determining which animations to use.\n\n### Choose the Right Animations:  What Types of Animations Will Help You Achieve Your Goals?\n\nExplore various animation types, such as micro-interactions, character animations, parallax scrolling, progress bars, explainer videos, and more. Select animations that align with your brand's overall tone, style, and messaging. Also, consider what animations will resonate with your target audience and capture their attention.\n\n### Design the Animation: How Will You Make Your Animations Visually Appealing? \n\n[Create visually appealing animations](https://fireart.studio/blog/best-website-animation-techniques-for-your-web-design/) that are consistent with your website's design aesthetics. Use design tools like Adobe After Effects, Figma, or other animation software to bring your ideas to life. Ensure your animations are consistent with your brand's style and messaging. Use a cohesive color palette, typography, and overall design aesthetic. Make sure your animations are straightforward to understand. Avoid overly complex or confusing animations that may distract from the main content.\n\n### Develop the Code: How Can You Implement Your Animations? \n\nImplement your animations using HTML, CSS, and JavaScript. This allows for greater flexibility and customization. Consider using animation libraries like GSAP, Animate.css, or MagicUI to streamline development and access pre-built animations. Finally, optimize your animations for performance to avoid slowing down your website. Use techniques like lazy loading or CSS-only animations to improve load times.\n\n### Test and Refine: How Can You Ensure Your Animations Function Properly? \n\nTest your animations across different browsers and devices to ensure they function correctly and look visually appealing on all platforms. Conduct user testing to gather feedback on the effectiveness of your animations. Identify any areas where improvements can be made. Based on testing results, iterate on your animations to make necessary adjustments and improvements.\n\n### Additional Tips for Designing Website Animations \n\nKeep it Simple: Avoid overly complex animations that can be distracting or difficult to understand. Use Animations Sparingly: Use animations sparingly to avoid overwhelming users. Prioritize User Experience: Ensure that your animations enhance the user experience rather than detract from it.\n\n## Check Out Our React Component Library for Design Engineers\n\nMagicUI is a free, [open-source UI library](https://pro.magicui.design/docs/templates/startup) made for design engineers. That's us! MagicUI has over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n[MagicUI components are highly customizable](https://pro.magicui.design/docs/templates/startup), enabling smooth adaptation to match our desired branding and design requirements.  With a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\n### Start Making Beautiful Websites Today\n\nAlong with our free component library, you can save thousands of hours and create a beautiful landing page with our website templates. Use our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today.\n\n### Related Reading\n\n- GSAP Examples\n- React Transition Animation\n- GSAP Vs Framer Motion\n- React Motion\n- React Spring Examples\n- Framer Motion Vs React Spring\n- React Transition\n"
  },
  {
    "path": "apps/www/content/blog/website-footer.mdx",
    "content": "---\ntitle: \"28 Best Practices For Your Website Footer & 13 Best Examples\"\ndescription: \"Design an impactful website footer with Magic UI's landing page template! See inspiring examples and build footers that convert.\"\nimage: https://cdn.magicui.design/assets/06cbb458-fd4c-46b4-b96e-e7490a8b837b.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nHave you ever struggled with creating an effective website footer? [Landing page examples](https://magicui.design/blog/landing-page-examples) often showcase the significance of a well-designed footer, yet many designers find themselves at a loss when implementing best practices. This blog highlights website footer design, offering valuable insights and landing page examples to help you enhance your designs. Whether you’re a seasoned designer seeking new ideas or a beginner navigating the complexities of website design, this article will surely provide actionable tips to elevate your work.\n\nIntroducing Magic UI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup), a powerful tool to help you learn more about website footer design best practices and examples. Whether you’re looking to create a sleek and professional footer or optimize your existing design, this solution is a valuable resource for designers of all levels. Start transforming your pages with compelling footers that leave a lasting impression.\n\n## What Is A Website Footer?\n\n![Website Footer](https://images.unsplash.com/photo-1527689368864-3a821dbccc34?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3ZWJzaXRlJTIwZm9vdGVyfGVufDB8fHx8MTcyMDc2NjExNXww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA [website footer](https://youtu.be/T5BACF2goFU) is a strip of content at the very bottom of a webpage and often repeated on every page. It's considered an essential part of a website. On the other hand, a website's header is the section that appears at the top of the webpage.\n\nWhile your homepage design often gives visitors a first impression of your site, your footer will likely be the last thing people see. With the right content and design, it can craft a positive and lasting impression, and importantly, it plays a crucial role in achieving your website’s main objectives.\n\n### Boost Conversions & User Engagement with Effective Footers\n\nA website footer is used to share sitemaps for navigational and search engine web crawling purposes. Depending on your website type or online presence, website footers can help users navigate your website easily while [streamlining the process](https://www.smartinsights.com/conversion-optimisation/ab-multivariate-testing/how-does-your-website-footer-impact-conversion/) of getting in touch with the right department. Well-optimized website footers have been proven to increase conversions by over 23% and revenue per visitor by 16%.\n\n## 7 Types Of Website Footer Designs\n\n![Website Footer](https://images.unsplash.com/photo-1586717791821-3f44a563fa4c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw3fHxkZXNpZ24lMjB1aXxlbnwwfHx8fDE3MjA3NjYxMzN8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Fat Footer\n\nA “fat footer” includes most of the website’s sitemap and usually categorizes links by a common theme or need. This is a [good option](https://alvarotrigo.com/blog/website-footers/) if you have many pages that users could be interested in. Companies usually include links for:\n\n- Company pages\n- Product pages\n- Solutions\n- Resources\n\nIt’s neat and easy to scan, which is what you want in a website footer. The footer also includes links to the company’s terms, privacy pages, and social profiles.\n\n### 2\\. Narrow Footer\n\nA narrow footer contains the basic information your website visitors need and has a smaller footprint than fat footers. The main benefit of a narrow footer is that you can choose its focus because you don’t have to include all your website links.\n\n### 3\\. No Footer\n\nYou may not need a footer if your website is particularly artsy or has a one-page website. You should always include\n\n- Copyright information\n- Terms of use.\n\nWhile ignoring the footer may conserve your website’s aesthetic, having a footer is best for most brands and companies. That said, even if you don’t have a footer, you could always maximize your copyright area by including social and email links.\n\n### 4\\. Product Footer\n\nBusinesses that sell a specific line of products (like SaaS companies) would benefit from a Product footer. Users' first links are for the products and their features. Company links and other pages are usually listed last in this [type of footer](https://blog.hubspot.com/website/website-footer), or sometimes not at all. This example is particularly effective, especially if it lists features first, which users usually look for when searching for a product.\n\n### 5\\. Legalese Footer\n\nA legalese footer contains pertinent legal information that website visitors should know when scrolling through your website. Apple’s footer is an emblematic example, with its paragraphs upon paragraphs of legal footnotes. You can always create a legalese footer, even if it’s a simple line, such as “All views are my own.” This type of footer can be mixed with other types, such as narrow or fat footers.\n\n### 6\\. CTA Footer\n\nCTA footers are a popular type of footer that includes a contact form, an email form, or a prompt to call your team. This type of footer is highly effective for converting traffic showing exit intent, which could be better and less annoying than an exit intent pop-up. It’s also a great way to re-engage users when they get to the bottom of the page, removing a barrier to conversion.\n\n### 7\\. Site Index Footer\n\nSite index footers include all of the links on your website — a great option if your site is small. There’s no reason not to include all your links unless you have a particularly large URL library. This type of footer is great for improving the user experience and ensuring visitors find what they’re looking for if they can’t find it using your top navigation menu.\n\nDesign Efficiency and Captivating User Interfaces with MagicUI\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nWith MagicUI, we provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\n### MagicUI's Powerhouse Features\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences.\n\nWith MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting visitors into customers with our website templates.\n\nUse our [startup landing page template](https://pro.magicui.design/docs/templates/startup) today!\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Do All Websites Require A Footer?\n\n![Website Footer](https://images.unsplash.com/photo-1517939415772-19aa53007105?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx0aGluayUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMDc2NjE1MHww&ixlib=rb-4.0.3&q=80&w=1080)\n\nWebsites need a footer, regardless of their size and scope. Not including a footer is technically possible if you're building, developing, and launching a website. Yet, it's like creating a meal without a spice or a tapestry without a vibrant pattern.\n\nIt's a subtle aspect vital for creating a wholesome, engaging experience for the audience. The footer essentially adds the final touch, providing a well-rounded, complete experience for the visitors and enhancing your website's visual appeal.\n\n### Essential Information at Your Fingertips\n\nThe website footer serves as a vital navigational element for visitors, offering quick access to important information that may not be found anywhere else on the site. It is arguably an essential element that provides additional utility to the site as it gives access to:\n\n- [Essential links](https://newmediadl.cas.msu.edu/blog/importance-website-links?page=1)\n- Contact details\n- Privacy policies and much more\n\nThink of the footer as a safety net that catches dropped links and helps visitors easily navigate your website's complexities.\n\n### Visual Harmony and Professional Polish\n\nThe footer also offers a more comprehensive visual balance to the page, creating a sense of closure for the site, much like the back cover of a book. It serves as a testament to the attention to detail and professionalism of the website. A well-designed footer can make the difference between a mediocre website and a professional one.\n\n### Beyond Aesthetics\n\nHaving a website footer is vital for [aesthetics and professionalism](https://www.linkedin.com/pulse/enhancing-user-experience-how-create-effective-footer-pankaj). It also enhances the overall user experience, making your audience more engaged and interested in your content. The footer can be a hidden gem, providing necessary information, promoting links to other important pages on your site, and enhancing the overall website experience. Next time you visit a website, don't forget to look at the footer to see what hidden treasures you might find.\n\n## What Are The Benefits Of Adding One?\n\n![Website Footer](https://images.unsplash.com/photo-1485217988980-11786ced9454?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHxoYXBweSUyMG9uJTIwbGFwdG9wfGVufDB8fHx8MTcyMDc2NjE2Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### Additional Space for Contact Information\n\nIncluding contact information in the footer section of a website is crucial for [building trust among new visitors](https://www.oscprofessionals.com/blog/how-to-build-trust-and-authority-for-your-website/#:~:text=Showcase%20Testimonials%20and%20Reviews,can%20significantly%20influence%20potential%20customers.) and prospective customers. It provides an added layer of transparency and accessibility for users looking to contact your business.\n\n### Simplified Navigation\n\nA website footer can serve as a secondary navigation tool for users, offering quick access to important pages or resources on the site. This is beneficial for visitors who prefer to scroll to the bottom of a page to find relevant information or links.\n\n### Showcase Testimonials\n\nIntegrating user reviews and testimonials into the footer section can be a powerful marketing tool. [Positive feedback from past customers](https://www.helpscout.com/blog/customer-feedback/) can influence potential buyers and boost credibility. Testimonials serve as social proof, indicating that others have had a positive experience with your products or services.\n\n### Increase Your Social Media Presence\n\nIncluding social media icons in the footer is an effective way to grow and expand your online presence. Users who are already engaged with your content might be interested in exploring your social media profiles as well. By providing easy access to these platforms, you make it simple for visitors to connect with your brand across various channels.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## What To Put In A Website Footer: 22 Things You Can Include In Your Footer\n\n![Website Footer](https://images.unsplash.com/photo-1525130413817-d45c1d127c42?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwxMHx8dGhpbmtpbmclMjBvbiUyMGxhcHRvcHxlbnwwfHx8fDE3MjA3NjYxNzZ8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Copyright\n\nIf your footer had just one element, this might be it. The year and the copyright symbol. It’s a weak but easy protection against website plagiarism. A tiny bit of code will keep the year updated automatically.\n\n### 2\\. Sitemap\n\nThis is the most common link found in footer, which links to the HTML version of the sitemap. These links are rarely clicked by visitors, but like the XML sitemap, they may help search engines find things.\n\n### 3\\. Privacy Policy\n\nThis is the second most common element in footer design. It typically links to a page explaining what information the website collects, how it’s stored and how it might be used. For most websites, it’s about tracking (analytics and remarketing), form submissions and email signups.\n\n### 4\\. Terms of Use\n\nThe “terms of use” are a bit different from privacy. They explain what the visitor agrees to by visiting the website. Like a disclaimer, they state that by using the site, the visitor agrees to certain things. For websites in highly regulated industries, you may want to put the text right in the footer. If legal text is critical, adding it to your footer will make sure that you have maximum coverage. You’ve got the fine print on every page.\n\n### 5\\. Contact\n\nVisitors expect to find contact information in the top right of the header. It’s a web design standard. It’s also standard to find a “contact” link in the bottom right (or center) of the footer. This should be a link to the contact page with a contact form, not an email link. There are lots of reasons to use a contact form rather than an email link.\n\n### 6.  Your mission. Your values\n\nLogos are good. But why not tell visitors why you’re in business? The footer is an excellent place to plant your flag and tell ‘em what you stand for.\n\n### 7\\. Phone Numbers\n\nLike the address, a phone number with a local area code is evidence to Google that you’re a local business. And like the map button, a phone number should automatically transform into a clickable button when viewed on a mobile device.\n\n### 8\\. Navigation\n\nHere’s where your footer can rescue falling visitors. If they’ve made it down this far, they must not have found what they were looking for. Time to offer some more options. The last few years have seen a usability trend called the [fat footer](https://www.progress.com/blogs/fat-vs.-slim-footers#:~:text=A%20fat%20footer%20is%20the,a%20sitemap%20of%20the%20website.).\n\nFooters now often contain the same links you’d find in a “mega-menu” dropdown in the header navigation. But this doesn’t necessarily save a visitor from falling down your page. Remember, these are visitors who didn’t find what they were looking for above.\n\n### 9\\. Social Icons\n\nThe footer is the best place to add icons that direct visitors to social networks. [According to Orbit Media](https://www.orbitmedia.com/blog/website-footer-design-best-practices/), 72% of websites include social media icons in the footer.\n\n### 10\\. Testimonials\n\nIt’s never a bad time to let your happy customers say a few words. Including testimonials in footers is a good way to add social proof throughout the site. The best testimonials support the specific marketing claims of the page they’re on, so they’re not added generically to the footer on every page.\n\n### 11\\. Email Signup\n\nThe website footer has become a very common place to let visitors subscribe. True, email sign ups are more likely to occur on a page where the visitor got value, such as a helpful blog post, it’s still not a bad idea to let visitors subscribe from the footer.\n\n### 12\\. Login\n\nNot all visitors are prospects. Some visitors may be employees, partners, affiliate or resellers. If there’s a login area for these people, the footer is the best place for it. These people come back often and know where to find things. No need to use valuable marketing real estate in the header for them. A little login link in the footer is fine.\n\n### 13\\. Press\n\nAnother type of non-prospect is the press. Realistically, only a fraction of your visitors are journalists and editors. So don’t waste precious space in your main navigation with a press link. If someone from the media does happen to visit, they’ll scroll down and find it.\n\n### 14\\. Site Search Tool\n\nIf they didn’t find it in the header, in the content area or in any of the footer links, a site search tool is the ultimate safety net. Search tools are not as common in website footers as email signup forms, so if you use one, make sure it is clearly labeled.\n\n### 15\\. Images\n\nIf you really want to dress up your footer, add an image to it. Here’s a chance to add personality to the site.\n\n### 16\\. Mini Gallery\n\nWhy not go for the full pedicure? Rather than one image, add an entire gallery. This can be particulary useful to photography websites.\n\n### 17\\. Branding\n\nImages are another chance to reinforce the brand. This is a good place to use an alternate version of your mark or use your logo in a different way.\n\n### 18\\. Upcoming Events\n\nIf you run a lot of events, the footer is a good place to promote them, since anything in the footer is likely to be seen. But don’t add this unless you always have an upcoming event, or you’ll have a hole in your safety net.\n\n### 19\\. Keywords for Search Engine Optimization\n\nText in the footer is text on every page. So it’s an excellent place to indicate your relevance to Google. If you do include your mission, your value statement or an “about us” blurb, use this as an opportunity to include your primary keyphrase.\n\n### 20\\. Awards and Certifications\n\nThese little logos instill confidence in visitors. They are a form of social proof and a powerful way to leverage the “Halo Effect.” If you’ve ever won an award, adding the logo for that award to your footer is a quick way to add credibility to every page of your site.\n\n### 21\\. Latest Articles\n\nIf you’re active in content marketing, you can give your site a “pulse” but having your latest content pushed directly in your footer.\n\n### 22\\. Call-to-Action\n\nEvery marketing page should have a call to action. So adding one to your footer is a way to make sure it appears everywhere. You should never leave visitors wondering how to take that desired action.\n\n## 6 Website Footer Design Best Practices To Optimize It\n\n![Website Footer](https://images.unsplash.com/photo-1586717799252-bd134ad00e26?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwyfHx1aSUyMGRlc2lnbnxlbnwwfHx8fDE3MjA3NjYxOTF8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Include the essentials\n\nVisitors will expect to see a few basic bits of information in your website footer. And as it’s repeated on every page of your website, these details will always be within reach for your site visitors, and you’ll only have to deal with it once. Stick to design conventions and include your privacy policy and terms of use. This will also help you appear professional and trustworthy.\n\nIt is common to add a navigation menu and contact details, such as your:\n\n- Business email\n- Phone number\n- Address\n- Social media channels\n\nYou can also create a short online form to get in touch.\n\n### 2\\. Provide clear navigation\n\nEven if your site visitors have reached the bottom of your page, it doesn’t mean that it’s time for them to leave. On the contrary - whether they’re feeling lost, disinterested, or hungry for more, you can encourage them to keep browsing by adding a clear website navigation menu in your footer.\n\n- List the various sections of your site and link to them, providing visitors with an overall understanding of the content you offer.\n- Adding a search bar will help any frustrated visitors quickly find the info they’re looking for.\n\n### 3\\. Don’t forget your contact info\n\nIt’s simple but effective: Make sure your [contact info is part of your footer](https://www.strikingly.com/content/blog/contact-info-header-footer/). While having a separate link for multiple locations is a good idea, it’s worth including your primary phone number and email address within the footer to make it as easy as possible for users to reach out.\n\n### 4\\. Make room for fine print\n\nDon’t ignore the fine print. This can include links to your:\n\n- Privacy policy\n- Service terms\n- Security practices\n- Copyright notification\n\nWhile these links are infrequently used, including the fine print in footers is an easy way to showcase regulatory compliance.\n\n### 5\\. Bring in your branding\n\nOptimize your footer by making sure that it’s consistently branded. This means including your:\n\n- [Company’s logo](https://www.tailorbrands.com/logo-maker/why-a-logo-is-important)\n- Preferred font\n- Color scheme\n- Anything else that separates you\n\nWhile your footer may not be the most exciting part of your site, it still represents your brand.\n\n### 6\\. Express your personality\n\nEvery piece of content on your website is a chance to reflect your unique personality and brand identity. The same goes for your footer. It should be cohesive with the rest of your web design to offer a smooth browsing experience.\n\nStick to your brand colors and voice. This is also a great spot to add a touch of quirky microcopy that will grab your visitors’ attention. Whether you’re inviting them to sign up for your blog or check out your social channels, try to reflect your tone and personality in your choice of words.\n\n### Design Efficiency and Stunning UIs\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## 13 Examples Of Website Footers For Inspiration\n\n![Website Footer](https://images.unsplash.com/photo-1713946598518-48d73cff540e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw2fHxkaXNjdXNzJTIwd2l0aCUyMGxhcHRvcHxlbnwwfHx8fDE3MjA3NjYyMDd8MA&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. American Chess Magazine\n\nThis footer example belongs to American Chess Magazine. They have included their branding, CTA, footer links to all essential pages of their website, and contact information with a physical address. It is one of the adaptable footer design examples for an eCommerce site that you can apply to your own website.\n\n### 2\\. Airtable\n\nAirtable has designed a white background footer with all the essential links in the navigation. They have included app store buttons for the users to download. Also, social presence and legal terms such as:\n\n- Security\n- API\n- XML sitemap\n- Terms\n- Copyright notice\n\n### 3\\. Zapier\n\nZapier allows users to integrate with various other web applications.\n\n- They have used an intelligent search option: alphabetic title search.\n- Considerable navigation for the users to reach Zapier's other web pages and applications.\n- They have included social share buttons and branding.\n- They have included copyright notices and legal and privacy information.\n\n### 4\\. Notion\n\nThe notion is a single place with various facilities, including:\n\n- Writing\n- Managing projects\n- Lead management, ect.\n\nThey have designed their footer broadly but clearly.\n\n- The left side of their footer is designed with Brand logo, social icons, and language preferences for the visitors.\n- All of their services and other information are navigated.\n- Essential part at the bottom of the footer is the legal data and privacy policy.\n\n### 5\\. Lorelei Londres\n\nLorelei Londres is a luxury hotel in Italy that strives to provide hospitality and charm. Its footer succeeds in both aspects.\n\n- Anticipating any question from a site visitor or guest, there’s contact information on the left\n- Navigation links in the center\n- Newsletter opt-in form to the right\n- On the right, there’s also the privacy policy link and the submit form directly in the footer.\n\n### 6\\. Drunk Elephant\n\nDrunk Elephant is a beauty brand that offers biocompatible skincare products. Their footer contains the information you expect:\n\n- A [well-organized menu of product categories](https://catsy.com/blog/product-categorization/#:~:text=To%20achieve%20effective%20product%20categorization,that%20are%20clear%20and%20descriptive.)\n- Ways to learn about the brand\n- Legal info\n- Social media accounts to follow, and more.\n\n### 7\\. Sendinblue\n\nSendinblue has branded its logo in the footer and a summary of \"why sendinblue\" with an internal link to improve brand awareness.\n\n- They have included navigation and social connections.\n- At the very bottom of the web footer, there are copyright notices, cookie settings, anti-spam, privacy, user agreements, legal protection, and responsible disclosure included.\n\n### 8\\. Cross Culture Connects\n\nCross Culture connects has a dark blue footer with clear messages for the site visitors, such as:\n\n- Navigations\n- Newsletter subscription option\n- Branded social presence\n- Contact, Branding\n- Anti-copyright sign\n\nThe most important part of this footer is that it includes a back-to-top button, which allows users to easily access the site.\n\n### 9\\. ConvertKit\n\nThis broad footer belongs to ConvertKit. It is designed with a:\n\n- Brand logo\n- Signup button\n- Navigations\n- Copyright icon\n- Privacy policy\n- Terms of services\n- [GDPR](https://www.linkedin.com/pulse/importance-gdpr-compliance-your-website-juan-de-souza-s1w8e?trk=article-ssr-frontend-pulse_more-articles_related-content-card#:~:text=Compliance%20with%20the%20GDPR%20is,control%20over%20their%20personal%20data.)\n- Back-to-top control\n\n### 10\\. ActiveCampaign\n\nIts footer features a minimalistic, simple, and aesthetic design with plenty of white space. The ActiveCampaign website has a fat footer with the following:\n\n- Vast navigation\n- Language choice\n- App store buttons\n- BBB (Better Business Bureau) rating\n- Legal center\n- Privacy policy\n- Search box\n\n### 11\\. Medium\n\nMedium is an online publishing platform that creates and optimizes gated blogs. You can also create and optimize a blog post with Dorik membership features. Medium has a unique website footer design with unlimited scrolling. The basic information of footers is on the right side of their footer. Includes various blog and other typical footer elements.\n\n### 12\\. Willowbrook Farm\n\nThis website footer example includes all the information a site visitor would expect to see. An organized menu leads to all the website’s pages, a tempting offer to subscribe, and a way to get in touch. The subscribe button stands out thanks to the color contrast, making it all the more inviting. The website footer design aligns with the rest of the farm’s small business website, making for a harmonious overall look.\n\n### 13\\. Letsone\n\nThis chic website footer by letsone perfectly captures the essence of their brand while providing visitors with all the information they may require.\n\n- They've created a cohesive look by using the same recognizable background as in their header.\n- They’ve also included their logo in the footer, strengthening their branding efforts.\n- All elements are arranged in a highly organized manner, with lists and headers.\n- The hierarchy is very clear, with the CTA, written in large font, placed at the top of the footer.\n- To make sure that visitors don’t miss the live chat option, they’ve made it stand out with a bright, contrasting shade of pink.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/website-header-examples.mdx",
    "content": "---\ntitle: \"25 Creative Website Header Examples To Inspire Your Design\"\ndescription: \"Get inspired with 25 creative website header examples to elevate your design and captivate your audience.\"\nimage: https://cdn.magicui.design/assets/5035ae78-e3d7-4b6f-80f9-00f8f63f2c62.png\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nHave you ever struggled to create a website header that grabs attention and serves a functional purpose? [Landing page examples](https://magicui.design/blog/landing-page-examples) often showcase best practices for website header design, offering inspiration and practical insights. To enhance your website's appeal and functionality, exploring website header examples can provide valuable guidance and creative ideas to elevate your online presence.\n\nMagic UI's [startup landing page template](https://pro.magicui.design/docs/templates/startup) is a valuable tool for learning from these examples and best practices. This resource can help you create an engaging and effective header that resonates with your target audience while optimizing your online visibility.\n\n## What Exactly Is A Website Header?\n\n![Website Header Examples](https://images.unsplash.com/photo-1502945015378-0e284ca1a5be?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw4fHx3ZWJzaXRlfGVufDB8fHx8MTcyMDg2MDMwNnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nA website header sits at the top of each page and serves several fundamental purposes. It provides more than a place for your logo; it is part of a consistent user experience that all good websites share. The design of a header may differ from site to site, but the core features that determine how a [site is navigated and experienced](https://www.sistrix.com/ask-sistrix/getting-started-seo/what-is-a-website-header-and-why-you-should-use-it/) remain the same.\n\nThis section is usually consistent across all website pages; some designs give the home page a slightly different header appearance to draw attention to featured areas.\n\nHeaders are versatile canvases focusing on:\n\n- CTA\n- Brand\n- Content\n- Video\n- Product\n\nFor instance, within a product-focused website header, the website name or logo might take a backseat, with the primary information about the product (such as ‘30% off today only!’) grabbing the spotlight. As headers can be used to advertise any messages or promotions, they offer many creative possibilities.\n\nDesign-wise, headers are typically displayed as a specific type, such as sticky or static. While you can choose either strategy, ensuring it aligns with your website's style and doesn’t impede users from reading the rest of your website comfortably is crucial. This caution and consideration in design choices are critical to a successful website.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## Types of Website Headers\n\n![Website Header Examples](https://images.unsplash.com/photo-1601931537483-87b3d1dc6a67?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHxvbiUyMGxhcHRvcCUyMGFsb25lJTIwaW4lMjBvZmZpY2V8ZW58MHx8fHwxNzIwODYwMzM5fDA&ixlib=rb-4.0.3&q=80&w=1080)\n\nWeb designers have experimented with various website header designs, each serving different purposes, from branding to usability. Here are some of the most common types of website headers you might consider when designing a website:\n\n### Static Website Header\n\nA static website header doesn’t move and disappears when visitors scroll, prioritizing space and simplicity over navigational ease.\n\n### Sticky Website Header\n\nA sticky website header stays pinned to every web page, ensuring uninterrupted access to essential information.\n\n### Full-Screen Website Header\n\nA full-screen website header hides behind a menu icon and spans a device screen's entire width and height when it opens, creating a bold and visually engaging impact.\n\n### Hidden Website Header\n\nA hidden website header is concealed and only becomes visible when a user clicks on a hamburger menu button, optimizing screen space and enhancing the navigation experience.\n\n### Vertical Website Header\n\nIn a vertical website header, the logo and other header elements are stacked vertically, creating a compact and streamlined presentation.\n\n### Transparent Website Header\n\nA transparent header has no solid background, integrating into the page and emphasizing the hero section.\n\n### Hero Website Header\n\nThe hero header occupies the entire section above the fold, engaging users from when they land on your web page.\n\n### Mega-Menu Website Header\n\nMega-menu headers provide extensive navigation options and subcategories through dropdown menus, which are suitable for websites requiring a broad range of navigation choices.\n\n### Free and Pro Solutions for Building Captivating Web Experiences\n\nMagicUI is a free and open-source UI library designed specifically for design engineers. It offers over 20 animated components that can be seamlessly integrated into web applications. With MagicUI Pro, you can save time and create a beautiful landing page using our [startup landing page template](https://magicui.design/).\n\n[MagicUI](https://magicui.design/) components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today!\n\n## Why Does Your Website Design Matter\n\n![Website Header Examples](https://images.unsplash.com/photo-1553877522-43269d4ea984?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw0fHx3ZWJzaXRlJTIwZGVzaWduJTIwd2l0aCUyMHVpfGVufDB8fHx8MTcyMDg2MDM1Nnww&ixlib=rb-4.0.3&q=80&w=1080)\n\nWhen designing a website, there are many factors to consider. However, the website header should be at the forefront of your mind. It's the initial point of contact for most visitors, and it should instantly convey your business's purpose and encourage them to engage.\n\n### First Impressions Matter Most for Websites\n\nStudies show that [94% of first impressions](https://www.linkedin.com/pulse/15-essential-web-design-statistics-every-business-owner#:~:text=First%20impressions%20matter%2C%20especially%20when,explore%20your%20products%20or%20services.) about a website are design-related, so it’s important to put enough effort into your design that you’ll be able to keep website visitors from heading to a competitor’s site.\n\n### Defining User Experience from the Start\n\nThe UX of this section defines how first-time visitors approach websites right from their arrival. A website's exploration ability largely depends on its header design and functionality.\n\n### Clear Communication, Positive Interaction\n\nEffective headers ensure visitors find what they’re looking for without confusion, [improving the site's overall usability](https://blog.hubspot.com/marketing/improve-your-websites-user-experience). The speed at which people form initial responses cannot be overstated. A well-crafted header immediately communicates the purpose of your site, encouraging participation at various levels and leading to a positive user experience.\n\n## Element of an Effective Website Header\n\n### Company Branding\n\nEnsure your logo and branding are consistent with your website's design. This makes your site recognizable and familiar to visitors.\n\n### Call-to-Action (CTA)\n\nInclude a brief and straightforward [call-to-action](https://www.masterclass.com/articles/how-to-write-an-effective-call-to-action) in your header to prompt visitors to take a specific action, such as signing up for a newsletter or a free trial.\n\n### Minimal Text\n\nKeep your text in the header concise to prevent overwhelming visitors with information. A short slogan or product blurb may suffice.\n\n### Navigation Tools\n\nIncorporate essential navigation links in the header to help users easily access critical pages on your website.\n\n### Search Bars\n\nInclude a search bar in your header to help visitors quickly find the information they need, keeping them engaged on your site.\n\n### Shopping Cart\n\nIf your site features an online store, consider adding a shopping cart icon to the header to simplify the checkout process for shoppers.\n\n### Login\n\nA membership website should provide a smooth login experience for users. Include a login link in the header to help members access exclusive content easily.\n\n### Social Media Links\n\nIf social media plays a significant role in your marketing strategy, consider adding [social media icons to the header](https://support.hostinger.com/en/articles/6474611-website-builder-how-to-add-social-media-icons). This makes it easy for visitors to connect with your brand on social platforms.\n\n### Languages\n\nFor a global audience, include a language menu in the header to accommodate visitors from diverse cultural backgrounds. This will enhance your website's accessibility and inclusivity.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 25 Creative Website Header Examples To Inspire You\n\n![Website Header Examples](https://images.unsplash.com/photo-1540655037529-dec987208707?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHwzfHx5b3V0dWJlfGVufDB8fHx8MTcyMDg2MDM3NXww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. The New York Times\n\nThe New York Times' fixed header is more complex than Tesla's or Nike's, but it still provides users with all the information they need to navigate the website.\n\n### 2\\. Google\n\nGoogle's sticky header is an excellent example of using a sticky header to improve the user experience. The logo is large and prominently displayed, making it easy for users to identify the website.\n\n### 3\\. Webflow\n\n[Webflow websites](https://www.numi.tech/post/webflow-websites) sticky header is similar to Google's, but it also includes a button that allows users to sign up for a free trial and contact the sales team.\n\n### 4\\. YouTube\n\nYouTube’s header is a great way to keep users engaged and encourage them to watch more videos.\n\n### 5\\. Netflix\n\nNetflix's header changes depending on your current activity. The header will show the movie's title and the remaining time if you are watching a movie. If you are browsing for movies, the header will show recommendations based on your viewing history.\n\n### 6\\. ESPN\n\nESPN's dynamic header changes depending on the current sporting event. If you watch a live game, the header will show the score, remaining time, and other relevant information. If you browse for highlights, the header lists the latest stories.\n\n### 7\\. Vogue\n\nVogue’s header is an excellent example of creating a minimal but functional and practical header.\n\n### 8\\. Reddit\n\nReddit's minimal header is even more stripped down than Vogue's. This is a great example of creating a minimal header that is still user-friendly.\n\n### 9\\. Slack\n\nSlack is an excellent example of how to add a bit of personality to a minimal header. The buttons are colorful and eye-catching, making it easy for users to act.\n\n### 10\\. Adobe\n\nAdobe's header is a great way to excite users about your products and services.\n\n### 11\\. Disney Plus\n\nDisney Plus's full-screen header is another excellent example of using a full-screen header to showcase your content.\n\n### 12\\. Wendy Ju\n\nAs a product designer, Wendy Ju uses her online portfolio to showcase her knack for creating a good user experience. With a short vertical menu on the right and her logo on the left, the site is well-balanced and easy to navigate. The menu and logo float out of view when viewers move past the above-the-fold section, but they reappear with an upward scroll.\n\n###  13. Generation She\n\nGeneration She fits a wider variety of elements in its header than normal without overwhelming visitors with a cluttered design. The header features the nonprofit’s modern logo, a well-structured navigation menu, and a compelling CTA. This thoughtful arrangement ensures easy access to critical information and encourages user engagement.\n\n### 14\\. Dopple Press\n\nAs Dopple Press demonstrates, a hero website header is a great way to make a strong visual impact. The header design cleverly incorporates the printer's natural paper stock as the background, instantly establishing a connection to the brand's core product. The printer's logo is front and center in the header, showing the brand’s personality. To the right, a colorful cartoon mascot adds a playful element to the overall design, capturing visitors' attention. On the left side of the header, a unique menu icon with a spinning hover effect stands out.\n\n#### Engaging Users with Interactive Design\n\nThis interactive element adds excitement and invites visitors to explore further. When clicked, the icon reveals a full-screen navigation menu incorporating three soy ink colors used by Dopple Press in its printing processes.\n\n### 15\\. Festela\n\nThe website header design prioritizes legibility without sacrificing aesthetics. The static bar makes navigation easy for visitors, regardless of where they are on the site. The designer uses an electric blue hue for the navigation buttons and the logo to give the header a clean, ideal appearance that prioritizes legibility.\n\n#### Language Options Reflect Global Reach and Local Pride\n\nThe Barcelona-based store has two language options in the right corner of the header: English and Catalan. This thoughtful inclusion caters to international customers while demonstrating the retailer’s pride in its Catalan roots.\n\n### 16\\. Aurelio de Anda\n\nAdding text to your website’s header is a great way to give your viewers a personal or professional message from the start. In this example, the message appears as a ticker banner at the very top. The designer’s name spans the page width in a large, monolinear font. To its right, a music player adds to the browsing experience, and the two most essential links appear as brightly colored buttons. Underlined anchors to different homepage parts appear beneath the designer’s name in a fine serif font.\n\n### 17\\. Canva\n\nThis full-screen header is a great way to introduce users to Canva and to encourage them to try it out.\n\n### 18\\. Tesla\n\nTesla's fixed header features the company's logo, a search bar, and a few navigation links.\n\n### 19\\. Nike\n\nNike's fixed header is similar to Tesla's, but it also includes CTA.\n\n### 20\\. The Believer\n\nTheir header features the magazine name in its font, surrounded by pastel colors. Instead of a standard navigation menu, icons appear on the left-hand side. A larger menu slides out when clicked.\n\n### 21\\. Di Rosa Center for Contemporary Art\n\nThis California-based art museum keeps its header simple, surrounded by white space. This makes the text easy to read and navigate. Further, the header design never clashes with the art displayed on the site. This is especially true when contrasted with the museum’s promo for its maximalism exhibit.\n\n### 22.  Katie Mai\n\nKatie Mai's website header features her logo, which is a circle with her name in vibrant colors. There are only six links below in the same font and consistent colors. When you hover over a link, the item changes color. Katie Mai has a concise header that ensures that visitors can quickly navigate her website.\n\n### 23\\. Conti di San Bonifacio\n\nThis transparent header only has a white logo in the left corner and a white hamburger menu icon in the right. At the top of every page is a video or image rich in color that contrasts well with the white. Since the site is so heavy in visuals, the header’s visibility is rarely compromised.\n\n### 24\\. Target\n\n[Target](https://www.target.com/c/college-storage-organization-back-to/-/N-5tf7e) is another website that uses animation to bring focus to its navigation. With this one, we get a smooth gliding animation as the second-level navigation slides open. We also get a fading effect. However, this one applies to the page and not to the navigation.\n\n### 25\\. Florida Aquarium \n\nWhen a visitor hovers over one of the main navigation links, the rest fade out. That’s the first animation effect that helps users focus on the available content. Then, when they hover over the secondary or tertiary level of links, the hovered page turns a different color than the rest. If you are interested in animations, you can easily use Magic UI's animated library for great animations.\n\n## 5 Best Practices For Designing A Website Header\n\nDesigning an effective website header requires thoughtful consideration and clever strategies to optimize the limited space available. Following these best practices can help you create a captivating, user-friendly header, and aligned with your brand identity.\n\n### 1\\. Use clear, readable fonts\n\nSince the header is the northern star of your site navigation, you must balance representing your brand identity and maximizing readability. After all, the purpose of the text in your header is to guide your audience. It can detract from the overall user experience if it's difficult to decipher. Therefore, opt for a font that is legible in a variety of sizes. Color can also hinder readability, so choose [high-contrast color schemes](https://www.sciencedirect.com/science/article/abs/pii/S0169814108000693) for the font and background.\n\n### 2\\. Assess the header’s design\n\nWhile there is no universal template for a perfect header design, it's essential to maintain a sense of fluidity throughout your webpage. While it should never go unnoticed, ensure your header’s size doesn’t interfere with the rest of your page’s content.\n\n### 3\\. Be Consistent\n\nConsistency is vital when it comes to visual elements within the header. Ensure that the color scheme, imagery, and font align with the overall design of your website. This cohesiveness enhances the user experience by providing a visually unified and familiar interface.\n\n### 4\\. Include a clear call to action\n\nIf it’s essential for your business’s success, you’d be missing out if you didn’t include an effective call-to-action button on your header for everyone to see. For example, an eCommerce website can have a call-to-action button that reads Shop Now in its header. Or, in the case of a nonprofit website, the header is an excellent place to encourage visitors with a Donate button. Ensure your message is enticing, straightforward, and can be summed up in one or two words.\n\n### 5\\. Add animation\n\nHover effects and trigger animations in website headers provide visual feedback, which is crucial for user experience. They can also help capture visitors' attention and encourage them to interact with the header.\n\nWhen implementing hover effects and trigger animations in your website headers, check that the effects are subtle, purposeful, and consistent with the overall design of your website. They should enhance the user experience without causing distractions or slowing down your website's performance. [Magic UI](https://pro.magicui.design/docs/templates/startup) helps you easily add these animations without disrupting UX.\n\n## 4 Common Mistakes To Avoid While Designing A Website Header\n\n![Website Header Examples](https://images.unsplash.com/photo-1522152302542-71a8e5172aa1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w1MTI2OTd8MHwxfHNlYXJjaHw1fHx3b3JraW5nJTIwYWxvbmUlMjBpbiUyMG9mZmNlfGVufDB8fHx8MTcyMDg2MDM5Mnww&ixlib=rb-4.0.3&q=80&w=1080)\n\n### 1\\. Overcrowding the Header\n\nOvercrowding the header with too many elements can overwhelm users, making it challenging for them to locate the information or navigation options they need. This can [increase bounce rates,](https://www.searchenginejournal.com/website-bounce-rate/332439/) as visitors may leave the site out of frustration.\n\n### 2\\. Using Hidden Navigation Menus\n\nHidden navigation menus, often represented by the hamburger icon, can create a cleaner look but hinder site usability. Less tech-savvy visitors might not immediately recognize this symbol as a menu, slowing down the navigation process as users take longer to find essential links.\n\n### 3\\. Failing to Optimize for Mobile Devices\n\nFailing to optimize the header for mobile devices is a critical oversight as a significant portion of web traffic comes from mobile users. A header that does not adjust to smaller screens can lead to poor layout display, unreadable text, and inaccessible navigation links, affecting user interaction and search engine rankings.\n\n### 4\\. Using High-Resolution Images and Complex Animations\n\nIncorporating too many high-resolution images or complex animations in the header can affect site performance by increasing [page load times](https://www.hostinger.ph/tutorials/website-speed-optimization#:~:text=Images%20can%20make%20your%20website,fast%20access%20to%20web%20content.). Longer loading times can lead to user impatience and site abandonment, reducing the site’s ability to retain visitors.\n\n### Related Reading\n\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a revolutionary free and open-source UI library specifically designed for design engineers. This innovative library provides a vast collection of over 20 animated components built using cutting-edge technologies like:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nMagicUI's primary aim is to offer visually appealing and interactive elements that can be effortlessly integrated into web applications, enabling the creation of stunning user interfaces with minimal effort.\n\n### Effortless Design Customization\n\nThe highly customizable nature of [MagicUI](https://magicui.design/) components makes it a preferred choice for developers worldwide. These components can be seamlessly adapted to match specific branding and design requirements, allowing for a cohesive and consistent visual identity across the web application.\n\nWith a strong focus on animation and a design-centric approach, MagicUI acts as a bridge between design and development, empowering users to craft captivating digital experiences that leave a lasting impression on visitors.\n\n### Boost Efficiency and Conversions\n\n[MagicUI Pro](https://pro.magicui.design/docs/templates/startup) takes the capabilities of the free component library to the next level, allowing users to save thousands of hours and create beautiful landing pages that can effectively convert visitors into customers. By leveraging the ready-to-use website templates available in MagicUI Pro, users can start their landing page design process and achieve remarkable results in a short time.\n\n### Captivate Your Audience\n\nAre you ready to transform your landing page design process and create a visually striking online presence that captivates your audience? Take the first step towards achieving your goals by using our startup landing page template today!\n"
  },
  {
    "path": "apps/www/content/blog/website-logo-examples.mdx",
    "content": "---\ntitle: \"50 Website Logo Examples (2024)\"\ndescription: \"Need a stunning website logo? Explore 50 website logo examples and create your brand identity. Start with our customizable template!\"\nimage: https://cdn.magicui.design/assets/dnkpxruzhom.jpg\nauthor: Dillion Verma\ntags:\n  - Landing Page Examples\npublishedOn: \"2024-08-13\"\nfeatured: false\n---\n\nYour website is like a book. What’s the first thing people notice when they open your book? The cover. Just like a book cover, your website's logo creates an immediate impression, telling visitors what to expect. In this case, it helps them identify your brand and understand whether or not they’ll find what they’re looking for. A website logo can make or break your landing page such as these [landing page examples](https://magicui.design/blog/landing-page-examples). This blog will help you avoid the pitfalls of logo design by showcasing 50 fresh website logo examples to inspire your own logo.\n\nBefore we jump into the examples, take a look at MagicUI’s [startup landing page template](https://pro.magicui.design/docs/templates/startup) solution to help you design a logo that fits your brand and looks great on your website. It features a demo with a logo that you can easily customize to fit your business.\n\n## Understanding the Role of a Logo in Website Branding\n\n![Website Logo Examples](https://cdn.magicui.design/assets/7lbnth0tj16.jpg)\n\nA logo is a visual representation of your brand. It’s often the first point of contact between a business and its potential customers. A logo plays a [critical role](https://www.tailorbrands.com/logo-maker/why-a-logo-is-important) in making a positive first impression.\n\nA visually appealing and professionally designed logo can capture attention and pique interest, encouraging consumers to engage further with the brand. This initial positive impression can set the stage for a favorable relationship between the brand and its audience.\n\n### Why Your Business Needs a Logo\n\nA logo is a [graphic symbol or emblem](https://www.wix.com/blog/what-is-a-logo#:~:text=A%20logo%20is%20a%20visual,for%20a%20company%20or%20brand.) representing a company, organization, or brand. It is often composed of text, images, or a combination of both and serves as the primary visual identifier for the brand. The logo is a critical component of a brand's identity and is designed to convey the essence, values, and personality of the organization it represents.\n\nIt is typically displayed prominently on:\n\n- Websites\n- Business cards\n- Marketing materials\n- Products\n\n#### Brand Identity Core\n\nThe importance of a logo lies in its ability to create a strong visual identity for a brand. It acts as a symbol that encapsulates the brand’s message and values, making it easier for consumers to recognize and remember the brand.\n\nA well-designed logo helps establish a brand’s presence and creates a cohesive image across various platforms. It serves as the cornerstone of the brand’s visual identity, influencing how the brand is perceived by its audience.\n\n### Related Reading\n\n- [FAQ Template](https://magicui.design/blog/faq-template)\n- [How To Create A Landing Page](https://magicui.design/blog/how-to-create-a-landing-page)\n- [Website Footer](https://magicui.design/blog/website-footer)\n- [Website Header Examples](https://magicui.design/blog/website-header-examples)\n- [How To Design A Landing Page](https://magicui.design/blog/how-to-design-a-landing-page)\n- [Creative Landing Page Design](https://magicui.design/blog/creative-landing-page-design)\n- [Pricing Page Examples](https://magicui.design/blog/pricing-page-examples)\n- [Tailwind Landing Page](https://magicui.design/blog/tailwind-landing-page)\n- [Landing Page UI](https://magicui.design/blog/landing-page-ui)\n- [Landing Page Copywriting](https://magicui.design/blog/landing-page-copywriting)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n\n## What Makes a Great Website Logo?\n\n![Website Logo Examples](https://cdn.magicui.design/assets/to5lcu7u92.jpg)\n\n### Simplicity: Less is More When it Comes to Logos\n\nEffective logos are simple and easily recognizable. They avoid complex designs and focus on conveying the brand’s message clearly and straightforwardly. This ensures the logo is versatile and can be effectively used across various mediums and sizes.\n\n### Memorability: Make it Stick\n\nAn [effective logo](https://www.tailorbrands.com/logo-maker/why-a-logo-is-important) is memorable and leaves a lasting impression. It should be unique and stand out from competitors, making it easy for consumers to recall and associate with the brand. Memorable logos often incorporate distinctive elements that make them easily identifiable.\n\n### Relevance: Stay in Your Lane\n\nThe logo should be relevant to the brand’s industry, values, and target audience. It must reflect the brand’s personality and purpose, ensuring that it resonates with the intended audience and accurately represents its identity.\n\n### Versatility: All-Around Goodness\n\nA versatile logo can be used across various [applications and formats](https://looka.com/blog/logo-file-formats/), including:\n\n- Digital\n- Print media\n\nIt should look equally effective in color and black-and-white and at different sizes. Versatility ensures that the logo maintains its impact and readability regardless of where it is displayed.\n\n### Timelessness: Avoid Trends Like the Plague\n\nA great logo has a timeless quality and avoids trends that may quickly become outdated. Its classic design should remain relevant and effective over the long term. Timeless logos avoid excessive changes and maintain their effectiveness as the brand evolves.\n\n### Scalability: Adapt to Any Situation\n\nA logo's scalability is essential for its clarity and impact at different sizes. A well-designed logo should be legible and visually appealing, whether displayed on a large billboard or a small mobile screen. Scalability ensures that the logo adapts well to various contexts.\n\n### Color Considerations: Choose Wisely\n\nThe choice of colors in a logo can influence brand perception and recognition. Compelling logos use colors that align with the brand’s identity and evoke the desired emotional response. Color choices should be deliberate and support the overall design and messaging of the logo.\n\n### Typography: Mind Your Fonts\n\nIf the logo includes text, the typography should be carefully selected to complement the design and reinforce the brand’s identity. The font choice should be legible and align with the brand’s personality, ensuring the text enhances the overall logo design.\n\n### Originality: Don’t Be Cliché\n\nOriginality is key to creating a logo that stands out from competitors. A great logo should avoid clichés and overused design elements, offering a fresh and innovative brand representation. Originality helps differentiate the brand and create a unique visual identity.\n\n### Alignment with Brand Values: Get on the Same Page\n\nThe logo should align with the brand’s core values and mission. It should communicate the brand’s essence and resonate with the target audience, reflecting its commitment to its values and purpose.\n\n### Visual Balance: Don’t Let your Logo be Ugly\n\nVisual balance ensures that the logo is aesthetically pleasing and well-proportioned. The elements of the logo should be harmoniously arranged, creating a balanced and cohesive design that:\n\n- Draws attention\n- Maintains visual appeal\n\n### Meaningful Symbolism: Make it Count\n\nEffective logos often use meaningful symbolism to convey the brand’s message or story. Symbolic elements can enhance the logo’s significance and create a deeper connection with the audience.\n\n### Adaptability: Make it Work Everywhere\n\nAn adaptable logo can be easily modified to fit various contexts and applications. This includes adjusting the logo for different backgrounds, formats, and promotional materials while maintaining its core identity.\n\n### Clear Messaging: Make Sure People Get It\n\nThe logo should convey a clear and coherent message about the brand. It should communicate the brand’s purpose and values effectively, providing a visual representation that aligns with its overall messaging strategy.\n\n### Professional Design: Don’t Skimp on Quality\n\nA professional design is crucial for creating a high-quality logo. The logo should be crafted with attention to detail and precision, reflecting the brand’s commitment to excellence and quality.\n\n### Related Reading\n\n- [Portfolio Landing Page](https://magicui.design/blog/portfolio-landing-page)\n- [React Portfolio Template](https://magicui.design/blog/react-portfolio-template)\n- [NextJS Portfolio Template](https://magicui.design/blog/nextjs-portfolio-template)\n- [React Landing Page](https://magicui.design/blog/react-landing-page)\n- [Startup Landing Page](https://magicui.design/blog/startup-landing-page)\n- [Tailwind Portfolio Template](https://magicui.design/blog/tailwind-portfolio-template)\n- [Best Saas Landing Pages](https://magicui.design/blog/best-saas-landing-pages)\n- [React Header](https://magicui.design/blog/react-header)\n- [CTA Design](https://magicui.design/blog/cta-design)\n- [App Landing Page](https://magicui.design/blog/app-landing-page)\n- [Social Proof On Website](https://magicui.design/blog/social-proof-on-website)\n- [Hero Section Design](https://magicui.design/blog/hero-section-design)\n- [Waitlist Landing Page](https://magicui.design/blog/waitlist-landing-page)\n- [Best Web Developer Portfolios](https://magicui.design/blog/best-web-developer-portfolios)\n- [Nextjs Landing Page](https://magicui.design/blog/nextjs-landing-page)\n\n## 50 Website Logo Examples for 2024\n\n![Website Logo Examples](https://cdn.magicui.design/assets/3fayzhcz5ru.jpg)\n\n### 1\\. Minimalist Design: Uncomplicated Logos for the Modern World\n\nMinimalist logos use clean lines and simple shapes to create an uncluttered design. This approach to [logo design](https://www.zarla.com/guides/50-famous-brand-logos-to-inspire-you) eliminates the distractions and complexities of more ornate logos, allowing the audience to grasp the brand’s identity quickly.\n\nTech startups like Xpand use minimalist logos to convey modernity and sophistication. For instance, Xpand’s logo features a simple geometric shape with no embellishments, immediately communicating the brand’s focus on digital growth and expansion.\n\n### 2\\. Abstract Symbols: Unique Logos that Spark Curiosity\n\nAbstract logos use unique, unexpected symbols to create unique, stand-out designs. Creative agencies like Tactile use these logos to grab attention and spark curiosity about their brands.\n\nTactile’s logo features an abstract shape that resembles a letter and a digital icon, reflecting the company’s expertise in design and technology. This logo invites onlookers to learn more about the business and its services, making it an effective branding tool.\n\n### 3\\. Negative Space: Creating Clever and Engaging Logos\n\nNegative space logos use the white space in and around a logo’s design to create hidden visuals that add depth and intrigue to the logo. The clever use of negative space can make logos:\n\n- More engaging\n- Thought-provoking\n\nFinancial services company BNB utilizes this technique in its logo to convey a sense of stability and trust. The logo features a traditional-looking bank icon created using negative space within the letters B and N. This subtle yet creative approach to logo design makes the logo more memorable and relevant to the industry it represents.\n\n### 4\\. Hand-Drawn Logos: Authenticity and Artistic Flair\n\nHand-drawn logos incorporate sketched elements or custom illustrations to create a personalized and artistic brand mark. Fashion brands like Free People use hand-drawn logos to convey a sense of:\n\n- Authenticity\n- Creativity\n\nFree People’s logo features a typography-focused design with delicate floral illustrations that reinforce the brand’s commitment to:\n\n- Bohemian style\n- Aesthetic\n\n### 5\\. Geometric Shapes: Structured and Professional Logos\n\nGeometric logos use structured, bold shapes to create organized and visually balanced designs. Software company Kittl uses a geometric logo to convey:\n\n- Stability\n- Professionalism\n\nTheir logo features a structured design with a grid-like appearance that suggests the brand’s expertise in organized digital solutions.\n\n### 6\\. Vintage Style: Nostalgic Logos that Evoke Timelessness\n\nVintage logos evoke nostalgia by incorporating design elements from the past. These logos appeal to consumers because they suggest a sense of history and reliability. Café Bicerin uses a vintage-inspired logo to connect with its audience on an emotional level.\n\nThe logo's antique design suggests that the café has been around for generations, even though it has only recently opened.\n\n### 7\\. Monogram Logos: Elegant and Sophisticated Lettermarks\n\nMonogram logos use the letters of a business’s name to create an elegant and sophisticated brand mark. Luxury brands like Louis Vuitton use monogram logos to convey a sense of:\n\n- Exclusivity\n- High-end appeal\n\nThe brand’s iconic logo features an interlocking design of the letters L and V that can be found on nearly all of the company’s products. Monogram logos are simple yet distinctive, making them ideal for sophisticated businesses.\n\n### 8\\. Wordmark Logos: Memorable Logos Driven By Typography\n\nWordmark logos create distinctive brand marks solely by using business names. Media company [Netflix](https://brand.netflix.com/en/assets/logos/) boasts one of the most recognizable wordmark logos in the world.\n\nThe logo’s custom font features unique details that make the design stand out and help create a memorable brand identity.\n\n### 9\\. Combination Logos: Flexible Logos for Various Branding Contexts\n\nCombination logos merge text and symbols to create comprehensive brand marks. E-commerce platform Etsy features a combination logo with a business name and an icon representing the brand’s focus on handmade goods.\n\nThese types of logos are flexible and can be used in various branding contexts. As a business grows, combination logos can be easily adapted for different applications, including:\n\n- Website design\n- Social media\n- Merchandise\n\n### 10\\. Gradient Logos: Dynamic Logos with Depth and Dimension\n\nGradient logos use color transitions to add depth and dimension to brand marks. Tech company Instagram features a vibrant gradient logo incorporating multiple colors to create a visually dynamic design.\n\nThis logo is more eye-catching than a traditional solid-color logo, suggesting that the brand is:\n\n- Modern\n- Innovative.\n\n### 11\\. 3D Logos: Realistic Logos with Visual Engagement\n\n3D logos use shading and perspective to create designs with depth and a sense of realism. Gaming company, Zeldal, features a 3D logo that instantly engages fans of the franchise.\n\nThe logo’s design includes intricate details and shading that make it appear as if it could exist in real life. 3D logos are visually striking and suggest a cutting-edge, modern brand.\n\n### 12\\. Flat Design Logos: Simple Logos That are Easy to Scale\n\nFlat logos eliminate three-dimensional effects for a simple and clean appearance. Startups like Ghost use flat logos because they are versatile. These logos are easy to scale and work in various applications, including:\n\n- Digital\n- Print\n\nFlat design logos' simplicity makes them easy to recognize and remember.\n\n### 13\\. Typography-Focused Logos: Creative Typography as the Logo\n\nTypography-focused logos emphasize custom or creative typography to create unique brand marks. Publishing house Jaded Books uses a typography-driven logo with a custom font designed specifically for the company. The logo’s eerie, horror-like details reflect the imprint’s focus on publishing dark fiction.\n\n### 14\\. Icon-Based Logos: Logos that Quickly Convey Brand Identity\n\nIcon-based logos use simple icons as the central element in logo design. Health and wellness brand, WellNest, features an icon-based logo that uses a bird’s nest as the focal point of the design.\n\nThe logo design quickly conveys the brand’s focus on nesting and creating a serene home environment for expectant mothers.\n\n### 15\\. Colorful Logos: Attention-Grabbing Logos that Evoke Emotions\n\nColorful logos use bold, vibrant colors to create eye-catching designs that grab attention. Children’s brand Melissa and Doug uses a colorful logo to appeal to its target audience of young kids. Bright colors evoke joy and happiness that align with the brand’s focus on imaginative play.\n\n### 16\\. Black and White Logos: Timeless Logos that Emphasize Design\n\nBlack and white logos are classic and never go out of style. The legal firm, Houlon, Berman, uses a monochromatic logo to convey a sense of professionalism and trust.\n\nThe simple color scheme allows the firm’s design elements to take center stage. As a result, this logo emphasizes the firm’s experience and reliability over flashy design.\n\n### 17\\. Circular Logos: Balanced Logos that Evoke Unity\n\nCircular logos use round shapes to create balanced and harmonious designs. The United Way, a non-profit organization, features a circular logo that symbolizes unity and inclusivity.\n\nThe logo design includes a variety of colors that represent different communities coming together to create a better life for everyone.\n\n### 18\\. Organic and Natural Logos: Designs that Evoke Sustainability\n\nOrganic logos incorporate earthy colors and shapes that mimic nature to create designs that convey a sense of sustainability. Eco-friendly brand, Naturally, dog uses a natural logo design that reflects its commitment to creating safe products for pets and their owners.\n\nThe logo’s earthy color palette and organic shapes suggest a:\n\n- Connection to the environment\n- Appeal to eco-conscious consumers\n\n### 19\\. Dynamic Logos: Adaptable Logos for Modern Businesses\n\nDynamic logos are designs that can change form while maintaining the brand’s identity. The tech company Google, features a dynamic logo that adapts to different contexts.\n\nWhen users search for a specific topic, the logo changes to reflect their search results. This flexibility signals to consumers that the brand is:\n\n- Modern\n- Adaptable\n\n### 20\\. Playful and Whimsical Logos: Fun Logos that Appeal to Children\n\nPlayful logos incorporate whimsical elements to create a fun and approachable brand image. Toy company [Melissa and Doug](https://www.prnewswire.com/news-releases/spin-master-completes-acquisition-of-melissa--doug-a-trusted-brand-in-early-childhood-play-302024756.html) features a whimsical logo that appeals to its target audience of young children.\n\nThe logo’s colorful design and playful font evoke feelings of joy and happiness that align with the brand’s focus on imaginative play.\n\n### 21\\. Transparent Logos: Logos That Use Transparency for Modern Appeal\n\nTransparent logos use transparency effects to create engaging designs that add layers of meaning to the logo. Digital marketing agency WebFX features a transparent logo that uses the effect to create a modern and sleek design.\n\nThe logo’s clean appearance reflects the firm’s expertise in helping businesses grow their online presence.\n\n### 22\\. Gradient and Metallic Effects: Luxurious Logos that Evoke Premium Appeal\n\nMetallic gradients use shiny effects to create a luxurious and high-end feel. Automotive brand Aston Martin features a metallic logo that evokes an elite appeal. The logo’s rich details signal to consumers that the brand’s products are premium and exclusive, attracting wealthier clientele.\n\n### 23\\. Cultural and Ethnic Logos: Logos that Represent Heritage and Identity\n\nCultural logos incorporate traditional motifs and symbols to create designs that represent specific communities. The African American History Museum uses an ethnic logo that honors the culture’s heritage.\n\nThe logo’s design features a traditional African symbol that connects the museum to its roots and reinforces its mission to educate the public about:\n\n- African American history\n- Culture\n\n### 24\\. Futuristic Logos: Designs that Signal Innovation and Forward-Thinking\n\nFuturistic logos use modern design elements to signal innovation and forward-thinking. Artificial intelligence company OpenAI features a futuristic logo that suggests the brand is a leader in technology.\n\nThe logo’s geometric design, coupled with its gradient color scheme, evokes a cutting-edge appeal that will attract consumers and businesses interested in the latest advancements in AI.\n\n### 25\\. Symbolic Logos: Logos with Deep Meaning\n\nSymbolic logos use imagery that carries deeper associations to communicate brand values and missions. Wellness brand SoulSpa uses a symbolic logo that features a lotus flower.\n\nThis imagery is commonly associated with tranquility and relaxation, perfectly representing the brand’s spa products.\n\n### 26\\. Dual-Tone Logos: Striking Logos with High Contrast\n\nDual-tone logos use two-color schemes to create visually striking designs. The fintech company Stash features a dual-tone logo that uses a:\n\n- Bright green\n- Dark navy color scheme\n\nThe high contrast of the colors makes the logo easily recognizable and memorable.\n\n### 27\\. Handwriting-Style Logos: Custom Fonts for a Personal Touch\n\nHandwriting-style logos use cursive or handwritten typography to create a personal and inviting brand mark. Sweet Lady Jane, an artisanal bakery, features a handwriting-style logo that evokes a sense of warmth and homemade quality. This charm appeals to consumers looking for authentic and delicious baked goods.\n\n### 28\\. Layered Logos: Complex Designs with Depth\n\nLayered logos use overlapping elements to create complex designs with depth. Creative studio, Dside features a layered logo design representing the brand’s multifaceted identity.\n\nThe logo incorporates a variety of shapes and colors that suggest the studio’s expertise in creative and digital projects.\n\n### 29\\. Textured Logos: Engaging Designs with Tactile Appeal\n\nTextured logos incorporate patterns into their designs to create rich and engaging visuals. Fashion brand Coach uses a textured logo that mimics the look of leather to evoke the quality of its products.\n\nThe logo’s intricate details suggest the brand’s commitment to craftsmanship and create an engaging design that draws in curious consumers.\n\n### 30\\. Hand-Crafted Logos: Logos that Evoke Artisanal Quality\n\nHand-crafted logos showcase the quality and craftsmanship of artisanal products. Boutique brand Lark features a hand-crafted logo with a custom font and delicate illustrations to convey the brand’s personalized and high-quality goods.\n\nThe logo’s design evokes a sense of warmth and charm that explains the products’ unique nature, appealing to the target audience of discerning consumers.\n\n### 31\\. symmetrical Logos: Unconventional Designs for Modern Brands\n\nAsymmetrical logos use an imbalanced structure to create dynamic and unconventional designs. Tech startup Droneseed features an asymmetrical logo that conveys a modern and edgy appeal.\n\nThe logo’s off-center design reflects the innovative nature of the company’s operations, which utilize drones to replant trees in deforested areas.\n\n### 32\\. Interactive Logos: Engaging Logos for Digital Platforms\n\nInteractive logos incorporate moving or changing elements to engage users on digital platforms. The Secret Door website features an interactive logo that changes when users click on it. This engagement:\n\n- Draws visitors into the site’s mysterious theme\n- Enhances user experience\n\n### 33\\. Gradient Mesh Logos: Smooth Transitions for Artistic Appeal\n\nGradient mesh logos use a digital art technique to create smooth color transitions and fluid forms. Digital Arts, a media company, features a gradient mesh logo that evokes a contemporary and artistic feel.\n\nIts colorful design is eye-catching and unique, helping the brand stand out and attract the right audience.\n\n### 34\\. Dual-Meaning Logos: Clever Logos that Tell a Story\n\nDual-meaning logos contain hidden or double images that reveal a brand’s more profound story. The Northumberland Theatre Company’s logo cleverly incorporates a bird and a theatrical mask to represent the organization’s commitment to:\n\n- Performing arts\n- The local community\n\nLogos like this engage viewers through discovery and interpretation, making them more memorable.\n\n### 35\\. Hybrid Logos: Unique Logos that Combine Styles\n\nHybrid logos blend different logo styles to create unique designs that stand out. The New Orleans Pelicans’ logo mixes geometric and organic elements to create a hybrid design that represents the team’s identity and the culture of New Orleans.\n\nThe logo’s sharp, structured details evoke a sense of professionalism and sports, while the ornate, shell-like exterior pays homage to the local culture and environment.\n\n### 36\\. Tech-Inspired Logos: Logos with Digital Motifs\n\nTech-inspired logos incorporate design elements referencing technology, such as circuits or digital grids. Norton, a cybersecurity firm, features a tech-inspired logo that evokes a sense of security and protection, reassuring customers that their data will be safe.\n\nThe logo’s design includes imagery that resembles a digital shield, creating a clear connection to the brand’s focus.\n\n### 37\\. Retro-Futuristic Logos: Nostalgic Yet Modern Designs \n\nRetro-futuristic logos blend vintage and futuristic design elements to create a nostalgic yet modern logo. Media brand Futurology features a retro-futuristic logo that appeals to both forward-looking audiences and those who appreciate the past.\n\nThe logo combines a classic sci-fi aesthetic with modern color gradients, creating a unique logo that tells a story.\n\n### 38\\. Environmental Logos: Eco-Conscious Designs That Appeal to Green Consumers\n\nEnvironmental logos use natural motifs and eco-friendly colors to represent sustainability. The World Wildlife Fund’s logo features a simple black-and-white design of a giant panda that connects to the organization’s mission to protect wildlife and their habitats.\n\nThis recognizable and straightforward logo evokes an emotional connection that resonates with eco-aware consumers and movements.\n\n### 39\\. Dynamic Typography Logos: Kinetic Typography Evokes Energy and Movement\n\nDynamic typography logos feature text with moving or kinetic elements. The logo for the digital agency Motioncue features typography that appears to be in motion. The design conveys the brand’s specialty in creating engaging and energetic video content.\n\n### 40\\. Digital Art Logos: Intricate Logos with a Modern Appeal\n\nDigital art logos utilize digital art techniques to create modern and intricate logos. Gaming company Braid features a digitally illustrated logo that evokes a sense of:\n\n- Creativity\n- Artistic flair\n\nThe detailed logo design reflects the company’s focus on unique storytelling and imaginative gameplay.\n\n### 41.  Line Art Logos: Elegant Minimalist Logos\n\nLine art logos use simple line art to create minimalist and elegant logos. Wellness brand Kin, features a line art logo that incorporates a smooth illustration of a mother and child to convey the brand’s focus on gentle products for families.\n\nThe logo’s clean design and use of white space create a calming aesthetic that reflects the brand’s values.\n\n### 42\\. Custom Illustration Logos: Unique Logos that Tell a Brand’s Story\n\nCustom illustration logos utilize unique graphics or illustrations to create distinct brand marks. The Dapper Dog, a dog grooming boutique, features a custom-illustrated logo that tells a story about the business.\n\nThe design incorporates a bowtie and top hat to convey the upscale nature of the grooming services, appealing to the target audience of affluent pet owners.\n\n### 43\\. Artistic Logos: Logos that Incorporate Creative Elements\n\nArtistic logos incorporate elements like brush strokes or abstract art to create visually appealing designs. G Creative, a creative agency, features an artistically inspired logo that evokes a sense of:\n\n- Creativity\n- Out-of-the-box thinking\n\nThe logo’s colorful design and unique shapes reflect the agency’s focus on helping clients stand out.\n\n### 44\\. Collage Logos: Diverse Logos that Represent Varied Brand Values\n\nCollage-style logos combine different elements to create a cohesive logo design. Lifestyle brand Kinfolk features a collage logo that incorporates a variety of images to represent the brand’s diverse values.\n\nThe logo’s intricate design conveys a sense of community and tells a story about the lifestyle the brand promotes.\n\n### 45\\. Iconic Shape Logos: Simple Shapes with Universal Appeal\n\nIconic shape logos use instantly recognizable shapes, such as hearts or stars, to create brand marks.\n\n**Charity:** Water uses a droplet logo to represent the organization’s mission to bring clean drinking water to developing nations. The logo’s simple design is universally understood and conveys the charity’s focus quickly and efficiently.\n\n### 46\\. Futuristic Typography Logos: Modern Fonts for Innovative Brands\n\nFuturistic typography logos use modern fonts to convey innovation and forward-thinking. Tech brand Kera features a logo with futuristic typography that suggests the company is a leader in innovation. The unique font of the logo stands out and creates a modern aesthetic that will attract the brand’s target audience.\n\n### 47\\. Brushstroke Logos: Logos that Evoke a Handcrafted Feel\n\nBrushstroke logos incorporate artistic brushstroke elements for a handcrafted and artistic feel. The art gallery, _Brush Creek_, features a logo with a brushstroke font that conveys the artistic nature of the business. The logo’s unique design adds texture and personality to the brand’s visual identity.\n\n### 48\\. Neon Effect Logos: Bright, Colorful Logos with Retro Appeal\n\nNeon effect logos use bright colors and glowing effects to create eye-catching designs. Entertainment brand _Stranger Things_ features a neon logo that captures the retro aesthetic of the popular Netflix series.\n\nThe logo’s design evokes the show's theme, which centers around the 1980s and appeals to both:\n\n- Nostalgic audiences\n- Modern viewers\n\n### 49\\. Responsive Logos: Adaptable Designs for a Digital World\n\nResponsive logos are designs that adapt to different screen sizes and devices. Tech company _Fuze_, features a responsive logo that reduces in size and complexity when viewed on smaller screens. This adaptability is crucial for modern logo design as more website traffic comes from mobile devices.\n\n### 50\\. Geometric Pattern Logos: Complex Logos for Structured Brands\n\nGeometric pattern logos use repeating shapes in logo design to create visually complex and structured brand marks. Architectural firm _ODA_ features a geometric pattern logo that reflects the firm’s innovative approach to design. The logo’s intricate pattern evokes a sense of organized structure and stability that aligns with the firm’s values.\n\n## How to Choose the Right Logo Style for Your Website\n\n![Website Logo Examples](https://cdn.magicui.design/assets/84i8jvp5g95.jpg)\n\n### Brand Identity: Reflecting Your Unique Brand Values\n\nYour logo is often the first thing people notice about your business. Therefore, choosing a logo style that aligns with your brand identity is essential. Consider how the logo style reflects your brand’s:\n\n- Identity\n- Values\n\nThe logo should align with your brand’s mission, personality, and target audience, accurately representing your brand’s essence.\n\n### Industry Trends: Find a Balance Between Unique and Familiar\n\nEvery industry has specific visual languages and logo design trends. While you want your logo to be unique, you also want to make sure it fits within the current design trends of your particular industry.\n\nResearch industry trends to understand your target market's visual language and preferences. Choosing a logo style that fits these trends can help your brand stay relevant and appealing to your audience.\n\n### Audience Preferences: Selecting a Logo Style Your Audience Will Appreciate\n\nYour logo shouldn’t be designed just for you. It should also appeal to your target audience. To achieve this, you must understand your audience's preferences and select a logo style that resonates with them.\n\nConsider demographics, interests, and cultural influences to ensure the logo appeals to your audience.\n\n### Design Versatility: Selecting a Flexible Logo Style\n\nYour logo will appear online and offline in various places and formats. Therefore, it’s crucial to choose a logo style that is versatile and adaptable to different applications.\n\nThe logo should work well across different digital and print mediums and remain effective at different sizes.\n\n### Brand Differentiation: Avoiding the Trap of a Generic Logo Style\n\nOne of the main purposes of your logo is to represent your brand visually and set it apart from the competition. Choosing a logo style that sets your brand apart from competitors is crucial.\n\nA unique and distinctive logo can help your brand stand out in a crowded marketplace and avoid confusion with similar brands.\n\n### Simplicity vs. Complexity: How Detailed Should Your Logo Be?\n\nOne of the first decisions you should make when selecting a logo style is whether you want a simple or complex design. Simple logos are often more memorable and versatile, while complex logos can convey more detailed messages but may need to be more adaptable.\n\nConsider your brand’s personality and the message you want your logo to communicate to determine whether a simple or complex logo style is best for you.\n\n### Color Palette: Understanding What Different Colors Mean\n\nEvery logo has a color palette, and your logo’s colors should align with your brand’s visual identity. Colors play a significant role in brand perception and can evoke:\n\n- Specific emotions\n- Associations\n\nFor this reason, it’s crucial to research different color meanings to determine which palettes are appropriate for your logo based on your brand and target audience.\n\n### Typography: Choosing Fonts That Reflect Your Brand’s Voice\n\nMany logos include text; if your logo has any wording, it’s essential to consider the typography that will be utilized carefully.\n\nThe [typography style](https://www.kittl.com/inspiration/logos/typography) should complement the overall logo design and reinforce your brand’s identity. The font should be legible and align with the brand’s personality.\n\n### Symbolism: Adding Meaning to Your Logo Design\n\nAnother important consideration when selecting a logo style is whether your logo should incorporate symbols or icons representing your brand’s values or industry.\n\nNot all logos need to have symbols, but including some imagery can add depth and meaning to your logo, enhancing its overall impact.\n\n### Brand Longevity: Choosing a Timeless Logo Style\n\nYour logo is not something you want to change frequently. Instead, you want your logo to remain relevant and effective over time. For this reason, avoid trends that may quickly become outdated and opt for a design that can evolve with your brand’s growth.\n\n### Competitive Analysis: Ensuring Your Logo Is Original\n\nPart of the logo design process involves analyzing your competitors' logos to ensure that your logo is distinctive and differentiates your brand.\n\nThis process helps you avoid mimicking competitors’ designs and instead focus on creating a unique visual identity.\n\n### Cultural Considerations: Being Mindful of Diversity and Inclusivity\n\nWhen selecting a logo style, be aware of cultural implications. Ensure the design is appropriate, respectful of different cultural contexts, and does not inadvertently offend or misrepresent.\n\n### Feedback and Testing: Getting Outside Opinions on Your Logo Design\n\nBefore settling on a final logo design, gather feedback from stakeholders and test the logo with your target audience.\n\nThis process can provide valuable insights into how the logo is perceived and whether it effectively communicates your brand’s message.\n\n### Professional Design: Working With an Experienced Logo Designer\n\nOnce you’ve selected a logo style that fits your business, it’s time to [create your logo](https://www.indeed.com/career-advice/career-development/how-to-make-website-graphics). Consider working with a professional designer to ensure your logo is well-crafted and aligns with your brand’s identity. An experienced design can enhance the quality and effectiveness of the logo.\n\n### Adaptability: Ensuring Your Logo Design Is Flexible\n\nIn addition to being versatile, your logo design should also be adaptable. This means that the design can be easily adapted to:\n\n- Different contexts\n- Applications\n\nYour logo should remain effective and recognizable in various formats and sizes.\n\n## Additional Elements\n\n![Website Logo Examples](https://cdn.magicui.design/assets/jsmjf3vwhi.jpg)\n\n### Consistency: The Key to a Cohesive Brand Identity\n\nConsistency in logo design ensures that the logo aligns with the [brand’s overall visual identity](https://www.brandedagency.com/blog/logo-branding). This includes using consistent colors, typography, and design elements across various platforms and materials.\n\n### Scalability: Is the Logo Design Versatile?\n\nScalability ensures that the logo maintains its quality and impact at different sizes. The design should be clear and legible, whether displayed on a small mobile screen or a large billboard.\n\n### Visual Impact: Does the Logo Make a Strong First Impression?\n\nThe logo should have a strong visual impact that captures attention and makes a memorable impression. Effective use of design elements such as color, shape, and typography contributes to the logo’s visual impact.\n\n### Emotional Appeal: What Feelings Does the Logo Evoke?\n\nA great logo should evoke the desired emotional response from the audience. Consider how the design elements and colors contribute to the logo’s emotional appeal and align with the brand’s message.\n\n### Market Positioning: Does the Logo Suit the Brand’s Target Audience?\n\nThe logo should reflect the brand’s market positioning and differentiate it from competitors. Consider how the design aligns with the brand’s positioning and conveys its unique value proposition.\n\n### Brand Message: Does the Logo Communicate the Right Values?\n\nThe logo should effectively communicate the brand’s message and values. Ensure the design elements reinforce the brand’s core message and resonate with the target audience.\n\n### Adaptability: Can the Logo Function in Different Contexts?\n\nThe logo should be adaptable to different contexts and applications. This includes being effective in various formats, such as digital and print, and maintaining its integrity across:\n\n- Different backgrounds\n- Sizes\n\n### Feedback Incorporation: Has the Logo Been Refined?\n\nGather feedback from stakeholders and incorporate their input into the logo design. This can help refine the design and ensure it aligns with the brand’s goals and audience expectations.\n\n### Professionalism: Does the Logo Look High Quality?\n\nEnsure that the logo design reflects a high level of [professionalism and quality](https://sproutsocial.com/insights/how-to-design-a-logo/). A well-crafted logo enhances its credibility and reinforces its commitment to excellence.\n\n### Future Growth: Will the Logo Be Relevant Over Time?\n\nConsider how the logo design will accommodate future growth and changes. The design should be flexible enough to evolve with the brand and remain relevant.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) is an open-source UI library built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\n### Developer's Arsenal\n\nThis library was designed specifically for engineers and developers. It includes over 20 animated components that can be integrated into web applications to create stunning user interfaces with minimal effort.\n\n[MagicUI](https://pro.magicui.design/docs/templates/startup) bridges the gap between design and development, allowing us to create beautiful digital experiences.\n\n### Why Use MagicUI?\n\n[MagicUI’s collection](https://pro.magicui.design/docs/templates/startup) of customizable, animated components allows developers to build interactive web applications that impress users. With a focus on design, MagicUI can help your project stand out, and the library’s free and open-source nature empowers you to use it however you want.\n\n### Related Reading\n\n- [Interactive Landing Page](https://magicui.design/blog/interactive-landing-page)\n- [How To Display Testimonials On Website](https://magicui.design/blog/how-to-display-testimonials-on-website)\n- [Animated Landing Page](https://magicui.design/blog/animated-landing-page)\n- [How To Make An Animated Website](https://magicui.design/blog/how-to-make-an-animated-website)\n- [Landing Page Call To Action](https://magicui.design/blog/landing-page-call-to-action)\n- [How To Add Animation To Website](https://magicui.design/blog/how-to-add-animation-to-website)\n- [Landing Page Sections](https://magicui.design/blog/landing-page-sections)\n- [Saas Landing Page Best Practices](https://magicui.design/blog/saas-landing-page-best-practices)\n- [Website Logo Examples](https://magicui.design/blog/website-logo-examples)\n- [React Hero Component](https://magicui.design/blog/react-hero-component)\n"
  },
  {
    "path": "apps/www/content/blog/websites-with-great-ui.mdx",
    "content": "---\ntitle: 7 Websites With Great UI to Inspire You in 2025\ndescription: >-\n  Discover 7 websites with great UI for design inspiration. We analyze top\n  examples from Awwwards, Mobbin, and more to give you actionable UI takeaways.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-a934c0bc-807c-40af-b154-fa62cd4699b0.jpg\nauthor: Dillion Verma\ntags:\n  - websites with great ui\n  - ui design examples\n  - web design inspiration\n  - ui patterns\n  - design resources\npublishedOn: \"2025-11-10T09:02:26.293015+00:00\"\nfeatured: true\n---\n\nA great user interface is more than just beautiful visuals; it's a seamless blend of art and science that guides users, solves problems, and feels intuitive. A truly effective UI is built upon a foundation of [core user experience (UX) design principles](https://aicofounder.co.uk/blog/user-experience-design-principles), ensuring that every interaction is both logical and delightful. But finding high-quality inspiration can be a challenge, often leading to endless scrolling through generic galleries.\n\nIn this guide, we'll move beyond surface-level showcases and dive deep into 7 essential **websites with great UI**, breaking down exactly what makes them work. We won’t just show you pretty designs; we’ll deconstruct them. Each example includes detailed analysis, direct links, and screenshots to illustrate key points.\n\nOur focus is on extracting actionable strategies and tactical insights from each one, helping you understand the 'why' behind their success. Whether you're a designer seeking fresh ideas, a startup founder validating a concept, or a developer aiming to build more intuitive products, this breakdown will equip you with practical patterns and principles to elevate your own projects. Get ready to analyze the best and learn how to replicate their success.\n\n## 1. Awwwards: The Gold Standard for Curated Excellence\n\nAwwwards is more than just a gallery of pretty websites; it’s a professionally curated and judged ecosystem that serves as the digital pulse for web design and development innovation. It’s an essential destination for anyone looking to discover **websites with great UI** because every featured project has passed a rigorous evaluation by a jury of international experts.\n\nThis platform stands out by dissecting excellence. Submissions are meticulously scored across four core pillars: **Design, Usability, Creativity, and Content**. This structured approach provides a transparent benchmark for what constitutes an award-winning digital experience, moving beyond subjective taste to objective quality assessment.\n\n### Why It Sets the Standard for UI Inspiration\n\nAwwwards' true value lies in its high-signal curation. Unlike algorithm-driven platforms like Pinterest, every site showcased has earned its place through merit. This makes it an incredibly reliable resource for designers, developers, and founders seeking validated examples of cutting-edge interaction patterns, animations, and layouts.\n\n> **Strategic Insight:** Awwwards isn't just for finding aesthetic inspiration. It's a competitive intelligence tool. Use it to deconstruct what top agencies are building, identify emerging UI trends before they become mainstream, and benchmark your own work against the global best.\n\n### How to Use Awwwards Effectively\n\nTo get the most out of Awwwards, go beyond simple browsing. Use its powerful filtering tools to find exactly what you need.\n\n- **Filter by Category & Tag:** Looking for a great UI in the e-commerce space? Or perhaps a site that excels in WebGL? The robust tagging system allows you to drill down into specific industries, technologies, and styles.\n- **Analyze the Scores:** Pay close attention to the breakdown of scores for Design, Usability, Creativity, and Content. A site might have a stellar creativity score but a lower usability score, offering critical lessons on balancing innovation with user-friendliness.\n- **Explore Collections:** Curated collections like \"Mobile Excellence\" or \"Sites of the Month\" offer a condensed view of top-tier work, saving you time while highlighting exemplary projects.\n\nAccess to view the sites is completely free. Awwwards also offers a Pro plan (starting around €150/year) for those who want to submit their own work, access exclusive content, and network with other professionals. It’s an indispensable resource for anyone serious about creating world-class digital interfaces.\n\n**Website:** [Awwwards.com](https://www.awwwards.com/)\n\n## 2. CSS Design Awards: A Celebration of UI/UX Craftsmanship\n\nCSS Design Awards (CSSDA) is a global web design and development awards platform that has been celebrating creative work for over a decade. It serves as a vital hub for discovering **websites with great ui**, honoring solo designers, studios, and agencies who push the boundaries of digital aesthetics, user experience, and technical innovation.\n\n![CSS Design Awards (CSSDA)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/e90cb74a-a6b0-4034-9e8c-deffedccf7f6.jpg)\n\nWhat makes CSSDA unique is its hybrid judging system, which combines the scores of an international judging panel with public votes. Each submission is evaluated on its **UI Design, UX Design, and Innovation**, with clear scores provided for each category. This dual-assessment model offers a well-rounded perspective, highlighting both professional polish and popular appeal.\n\n### Why It’s a Go-To for UI/UX Excellence\n\nCSSDA’s strength lies in its relentless focus on the craft of interface design and user experience. The platform is less about conceptual art and more about the tangible execution of beautiful, functional websites. This makes it an invaluable resource for designers and developers looking for practical, real-world examples of high-quality UI/UX implementation.\n\n> **Strategic Insight:** Use CSSDA to spot emerging UI patterns and animation trends with immediate practical application. Its fast-paced, daily showcase often features novel techniques, like advanced [CSS animations on scroll](https://magicui.design/blog/css-animation-on-scroll), before they become widely adopted. This is a platform for tactical, not just aesthetic, inspiration.\n\n### How to Use CSSDA Effectively\n\nTo maximize your time on CSSDA, leverage its organized structure and rich filtering capabilities.\n\n- **Study the Winners' Gallery:** The \"Website of the Day\" and \"Website of the Month\" galleries are treasure troves of vetted excellence. Analyze these sites to understand what top-tier UI looks and feels like right now.\n- **Filter by Color, Features, or Industry:** Need inspiration for a specific color palette or a particular industry like \"real estate\"? Use the filters in the main gallery to narrow down the thousands of submissions to a relevant, manageable list.\n- **Analyze the Judging Panel:** Explore the profiles of the judges. Following these industry leaders on other platforms can provide a continuous stream of high-quality design insights and inspiration beyond the CSSDA website itself.\n\nBrowsing the showcase is free. For those looking to gain recognition, submitting a website requires a fee, starting from around $49 for a Public Award nomination, with varying prices for other categories. The platform's commitment to showcasing top-tier UI and UX makes it a daily must-visit for digital creators.\n\n**Website:** [https://www.cssdesignawards.com](https://www.cssdesignawards.com)\n\n## 3. Land-book: The UI Pattern Library for Efficient Design\n\nLand-book is a highly curated and meticulously organized gallery that zeroes in on the building blocks of great digital products. Instead of just showcasing full websites, it deconstructs them into their core components, making it an indispensable resource for designers and developers looking for specific **websites with great UI** patterns. It’s built for speed and efficiency, helping you find the perfect hero section, pricing table, or footer in seconds.\n\nThe platform excels by focusing on practical application. With over 20,000 examples, its power lies in its deep categorization and filtering, allowing users to move beyond general inspiration and find tangible solutions for specific UI challenges. This component-level focus makes it a targeted tool for accelerating the design workflow.\n\n![Land-book](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/f8259532-8351-4926-a543-1a869989cdc1.jpg)\n\n### Why It Sets the Standard for UI Inspiration\n\nLand-book’s true strength is its granular approach. It saves designers countless hours by eliminating the need to hunt through entire websites for one specific element. Whether you need a navigation bar for a SaaS product or a testimonial section for a portfolio, Land-book delivers a library of high-quality, real-world examples that you can analyze and adapt.\n\n> **Strategic Insight:** Land-book is a workflow accelerator, not just an inspiration gallery. Integrate it directly into your process by using its \"Boards\" feature to collect specific UI patterns for a project. Its Figma integration allows you to copy designs directly, turning inspiration into a tangible starting point for your wireframes and mockups.\n\n### How to Use Land-book Effectively\n\nTo maximize Land-book’s potential, leverage its powerful organizational tools to streamline your design process.\n\n- **Filter by UI Section:** This is Land-book's killer feature. Skip browsing full sites and jump directly to curated galleries of **pricing, testimonial, hero, or footer sections** to solve a specific design problem quickly.\n- **Drill Down with Tags:** Combine section filters with tags for industry, style (e.g., minimalist, brutalist), and typography to find hyper-relevant examples that match your project’s exact requirements.\n- **Integrate with Your Workflow:** Use the boards to create project-specific mood boards. Pro users can take it a step further by downloading full-page screenshots or copying elements directly into Figma to deconstruct and rebuild.\n\nAccess to browse the site is free, though filters and boards are limited. The Pro plan (starting around $99/year) unlocks unlimited filters, boards, ad-free browsing, mobile previews, and the valuable Figma workflow integrations.\n\n**Website:** [land-book.com](https://land-book.com/)\n\n## 4. One Page Love: Mastering the Art of the Single Page\n\nOne Page Love is a highly specialized gallery dedicated exclusively to the art and science of single-page websites. It serves as a focused resource for designers and marketers looking to create high-impact landing pages, portfolios, and product showcases, making it an essential stop for finding **websites with great UI** in a conversion-focused context.\n\n![One Page Love](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/64137a38-cfed-4200-b50d-db8420bdfd6c.jpg)\n\nUnlike broader inspiration platforms, this website's strength lies in its singular focus. Every featured site is a masterclass in telling a complete story within a single scroll. This niche curation filters out the noise, providing a concentrated dose of inspiration for layouts, calls-to-action, and narrative flow designed to capture and convert visitor attention immediately.\n\n### Why It Sets the Standard for UI Inspiration\n\nThe platform's value is in its editorial curation of conversion-oriented design patterns. One Page Love doesn't just show you pretty websites; it deconstructs what makes them effective. By curating examples of specific components like pricing tables, testimonials, and hero sections, it provides a practical toolkit for building pages that not only look good but also perform.\n\n> **Strategic Insight:** One Page Love is a powerful tool for optimizing your sales funnel. Use it to study how different brands structure their value propositions, handle objections, and guide users toward a single, clear call-to-action. It's a goldmine for A/B testing ideas.\n\n### How to Use One Page Love Effectively\n\nTo maximize the platform's utility, leverage its specific organizational structure to solve design challenges.\n\n- **Explore Template Categories:** Dive into categories like \"Portfolio,\" \"Landing Page,\" or \"App\" to see how different single-page sites are tailored to their specific goals.\n- **Study UI Element Collections:** Need to design a better pricing table? Browse the dedicated \"Pricing Table\" collection to see dozens of real-world examples, helping you identify best practices quickly.\n- **Analyze the Curation:** Pay attention to the commentary and tags provided for each site. These insights from the curator often highlight the specific design choices that make the UI successful.\n\nAccess to view the gallery is completely free. For those who want to be featured, there is a submission process. If your site is accepted, there is a one-time fee (starting at $59) for an editorial review and lifetime listing, offering durable exposure for your work.\n\n**Website:** [https://onepagelove.com](https://onepagelove.com)\n\n## 5. Mobbin: The Ultimate Library of Proven UI Patterns\n\nMobbin is not a place for experimental concepts; it's a massive, searchable archive of real-world application interfaces. It provides an unparalleled library of user flows and screens from the world’s most successful apps, making it an essential tool for designers and developers looking to understand **websites with great UI** patterns that have already been validated in the market.\n\nThis platform's core strength is its focus on deconstructing what works. Instead of just showing final designs, Mobbin lets you explore entire user journeys, from onboarding sequences to complex settings menus. This practical approach demystifies how top-tier companies solve common UI challenges, providing a blueprint for effective design.\n\n![Mobbin](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/c6c3e589-8323-4145-9f59-b1c334cb41a6.jpg)\n\n### Why It's a Go-To for Practical UI Research\n\nMobbin excels by saving countless hours of research and guesswork. By providing direct access to tens of thousands of real user flows, it helps teams avoid reinventing the wheel. It is the definitive resource for anyone adopting a [mobile-first design approach](https://magicui.design/blog/what-is-mobile-first-design), offering a deep well of proven mobile patterns.\n\n> **Strategic Insight:** Use Mobbin not for imitation, but for pattern recognition. Identify how different leading apps handle the same problem (e.g., subscription paywalls) to understand the pros and cons of each approach. This informs your design decisions with data from millions of users, not just your own intuition.\n\n### How to Use Mobbin Effectively\n\nTo maximize Mobbin’s value, leverage its powerful organizational and filtering capabilities to accelerate your workflow.\n\n- **Explore Specific User Flows:** Don't just browse individual screens. Use the \"Flows\" feature to see the step-by-step journey for tasks like \"Signing Up\" or \"Adding to Cart\" to understand the full user experience.\n- **Filter by UI Element & App:** Need to design a new bottom navigation bar? Filter for that specific UI element across hundreds of apps to compare different styles, icons, and labeling conventions.\n- **Utilize Collections:** Create your own collections to group inspiration for a specific project. This helps you build a focused mood board and easily share references with your team or stakeholders.\n\nMobbin offers a free tier with limited access. For full functionality, including advanced filtering and unlimited screen views, a Pro plan is available (starting around $15/month). It’s an invaluable investment for product teams focused on building intuitive, user-friendly interfaces.\n\n**Website:** [mobbin.com](https://mobbin.com/)\n\n## 6. ThemeForest: The Ultimate Marketplace for Production-Ready UI\n\nThemeForest isn't a single website with great UI, but rather a colossal marketplace containing thousands of them. As part of the Envato Market ecosystem, it's the go-to platform for purchasing pre-built website themes and templates, making it a pragmatic resource for founders, developers, and agencies who need to launch a polished digital product quickly and affordably.\n\n![ThemeForest (Envato Market)](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/fc11ae0f-b571-4f60-9e49-a71330e26401.jpg)\n\nThis platform stands out by democratizing access to professional design. It provides production-ready UI kits for virtually every major platform, including WordPress, Shopify, Webflow, and raw HTML. This makes it an invaluable shortcut for projects where building a custom design system from scratch isn't feasible due to time or budget constraints.\n\n### Why It's a Go-To for Rapid UI Implementation\n\nThe core value of ThemeForest is its efficiency. Instead of just providing inspiration, it offers complete, functional solutions that can be deployed almost immediately. The inclusion of live demos, user reviews, and sales counts acts as a social proof mechanism, helping you gauge the quality and reliability of a theme before committing. This is crucial because, unlike curated galleries, the quality on ThemeForest can vary significantly between authors.\n\n> **Strategic Insight:** Use ThemeForest not just to buy themes, but to validate UI concepts. The top-selling themes in any category are a direct reflection of market demand and user preference. Analyze their layouts, component styles, and user flows to understand what resonates with a broad audience in a specific niche.\n\n### How to Use ThemeForest Effectively\n\nNavigating the vast library requires a strategic approach to find high-quality assets that fit your needs.\n\n- **Filter by Top Sellers & Ratings:** Start by sorting by \"Best sellers\" or \"Top rated\" to surface themes that have been vetted by thousands of customers. This is the quickest way to filter out low-quality or poorly supported items.\n- **Analyze the Live Demo Critically:** Don't just look at the aesthetics. Test the live preview for responsiveness, page load speed (using browser developer tools), and intuitive navigation. A beautiful UI is useless if it's slow and frustrating to use.\n- **Check Author History & Support:** Review the author's profile to see their portfolio, overall rating, and how recently their themes have been updated. A dedicated author with frequent updates is a strong indicator of a well-maintained product.\n\nThemes are purchased with a one-time fee for a license (typically starting around $20-$70) which usually includes 6 months of author support. For those looking to learn more about the latest trends, our guide on [landing page design templates](https://magicui.design/blog/landing-page-design-templates) offers further insights.\n\n**Website:** [ThemeForest.net](https://themeforest.net/)\n\n## 7. Creative Market: The UI Component Superstore\n\nCreative Market isn't a single website showcasing great UI, but rather a sprawling marketplace where the building blocks of exceptional user interfaces are sold. It’s an essential resource for designers, developers, and founders looking to accelerate their projects by leveraging pre-built, high-quality assets created by independent professionals.\n\n![Creative Market](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/screenshots/f07f0cec-bf47-4190-a1b8-49066e2b1f03.jpg)\n\nThe platform’s strength lies in its vast and diverse selection of **UI kits, design systems, icons, and web templates**. Instead of forcing users into a rigid subscription, Creative Market operates on a flexible, per-item licensing model, allowing you to purchase exactly what you need for a specific project. This makes it a perfect middle ground between overly restrictive themes and the time-consuming process of building a UI from scratch.\n\n### Why It's a Go-To for UI Components\n\nCreative Market's value proposition is speed and quality. It provides a direct pipeline to polished, ready-to-use components compatible with modern design tools like Figma, Sketch, and Adobe XD. This allows teams to bypass foundational design work and focus immediately on user experience and business logic, significantly reducing development timelines.\n\n> **Strategic Insight:** Use Creative Market not just for assets, but as a validation tool. The popularity and reviews of different UI kits can reveal current design trends and user preferences. Analyze the best-selling kits to understand what aesthetics and components are resonating in the market right now.\n\n### How to Use Creative Market Effectively\n\nTo find high-quality assets and avoid duds, you need to navigate the marketplace strategically.\n\n- **Vet the Creator:** Before purchasing, always check the seller’s profile. Look at their entire portfolio, read shop reviews, and see how long they have been active on the platform. Established creators are more likely to provide well-supported and frequently updated products.\n- **Scrutinize Previews and Licenses:** Don't just look at the hero images. Dive into all the preview slides to understand the full scope of the kit. Critically, always verify the license (Personal, Commercial, or Extended) to ensure it aligns with your project’s requirements.\n- **Check for Updates:** Look for assets that have a clear version history or notes about recent updates. A recently updated UI kit is a strong signal that the creator is actively maintaining it to keep up with software changes and design trends.\n\nPurchasing is done on a per-asset basis, with prices set by individual creators. This makes it a highly flexible and budget-friendly way to find **websites with great UI** components for your next project.\n\n**Website:** [Creative Market](https://creativemarket.com/)\n\n## Top 7 UI Showcase Comparison\n\n| Platform                  |                                                                       Focus & Key Advantages | Implementation Complexity                                                     | Resource Requirements                                                            | Expected Outcomes                                                        | Ideal Use Cases                                                                |\n| ------------------------- | -------------------------------------------------------------------------------------------: | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |\n| Awwwards                  |         Professionally judged website gallery; high‑signal curation and industry recognition | Low to browse; moderate to prepare a competitive submission                   | Paid submissions/membership optional; time to craft entry and assets             | Benchmarking, inspiration, possible traffic/leads if awarded             | Agencies/teams seeking recognition and client-facing case studies              |\n| CSS Design Awards (CSSDA) |           Curated awards emphasizing UI/UX craft and innovation; consistent quality curation | Low to browse; moderate submission workflow with categories                   | Paid submission per category; assets and judging-ready presentation              | Public recognition and visibility; design references                     | Teams entering awards or researching high‑quality UI execution                 |\n| Land-book                 | Large pattern library and section-level examples; fast pattern discovery and Figma workflows | Very low to browse; easy to collect and export examples                       | Free tier limited; Pro subscription unlocks full filters, previews, Figma export | Rapid access to UI patterns and sections for design work                 | Designers needing specific UI sections (heroes, pricing, footers)              |\n| One Page Love             |            Gallery for single‑page sites; focused conversion patterns and themed collections | Low to browse; submission and paid editorial review for listing               | Paid editorial review for accepted one‑page sites; must meet format              | Targeted exposure for landing/one‑page designs; conversion pattern ideas | Landing pages, product/portfolio one‑page sites and conversion-focused layouts |\n| Mobbin                    |       Searchable library of real app screens and flows; production‑proven patterns and flows | Low to browse; advanced filters for flow research                             | Free tier plus Pro/Team subscriptions for full access                            | Actionable UI patterns and flow examples; speeds research and alignment  | Mobile/app UX research — onboarding, paywalls, navigation, settings            |\n| ThemeForest (Envato)      |                           Large marketplace of themes/templates; fast path to production UIs | Low to integrate for standard themes; can be moderate if customization needed | Per‑item purchase; possible developer time for setup and updates                 | Quickly deploy polished sites and demos; variable long‑term maintenance  | Rapid launches, CMS/shop sites, project templates                              |\n| Creative Market           |               Marketplace for UI kits, icons, templates; reusable design assets for projects | Low to moderate (import and adapt assets into projects)                       | Per‑item purchases; licensing varies by seller                                   | Reusable UI components and assets; accelerates design work               | Prototyping, building UI kits, purchasing isolated assets (icons, templates)   |\n\n## From Inspiration to Implementation: Build Your Next Great UI\n\nThroughout this article, we've journeyed through a curated collection of resources, each offering a unique window into the world of exceptional user interface design. From the high-concept, award-winning showcases on Awwwards and CSSDA to the focused, practical libraries found on Land-book and Mobbin, a clear pattern emerges. The most compelling **websites with great ui** are not born from a single flash of brilliance but are meticulously crafted through study, iteration, and a deep understanding of user-centric principles.\n\nThese platforms are more than just digital galleries; they are strategic toolkits for designers and developers. The key is to shift from passive admiration to active analysis. Don't just bookmark a beautiful site; deconstruct its user flow, analyze its component hierarchy, and question the design choices that make it effective. This analytical approach transforms abstract inspiration into a concrete, replicable strategy for your own projects.\n\n### Turning Insights into Actionable Strategy\n\nThe core takeaway is that a great UI is a conversation between aesthetics and functionality. The examples we’ve seen masterfully balance visual delight with intuitive navigation, creating experiences that are both memorable and effortless. To translate these insights into your work, consider these actionable steps:\n\n- **Create Thematic Mood Boards:** Use platforms like One Page Love or Land-book to collect examples specific to your project's needs, whether it's a SaaS dashboard, a portfolio site, or an e-commerce platform. Group them by feature, such as navigation patterns, button styles, or animation usage.\n- **Deconstruct User Flows:** Pick a site from Mobbin and map out its primary user journey. Identify key screens, decision points, and interactive elements. This exercise reveals the underlying logic that makes a complex application feel simple.\n- **Analyze Component-Level Details:** Instead of looking at a whole page, zoom in on individual components. How does a site handle its forms? What makes its card layout so effective? Marketplaces like ThemeForest and Creative Market are excellent for this, as you can see how individual elements are designed to work within a larger system.\n\n### Choosing Your Tools and Implementing with Precision\n\nOnce you have a clear vision, selecting the right implementation tools is critical. Your choice will depend on your project’s complexity, your team's technical skills, and your timeline. For instance, a freelancer might use a Creative Market template to quickly launch a client's site, while a startup team might study Mobbin's patterns to inform the build of their custom React application.\n\nRemember, the goal is to implement sophisticated UI patterns without reinventing the wheel. Leveraging established design systems and component libraries can significantly accelerate your development process. This allows you to focus your energy on unique business logic and creating an exceptional user experience, rather than building common UI elements from scratch. To gather further inspiration for your own projects, you can also [explore their design portfolio](https://www.thirstysprout.com/portfolio) to see a range of practical implementations. Ultimately, the best **websites with great ui** are those that successfully merge inspirational design with pragmatic, efficient execution, creating a final product that truly resonates with its audience.\n\n---\n\nReady to stop just admiring great UI and start building it? **Magic UI** offers a library of over 100 free, open-source animated components built with React, Tailwind CSS, and Framer Motion. Accelerate your development and bring your vision to life with production-ready, beautifully designed elements by visiting [Magic UI](https://magicui.design) today.\n"
  },
  {
    "path": "apps/www/content/blog/what-are-ui-components.mdx",
    "content": "---\ntitle: \"What Are UI Components? Types, Benefits, Limitations & More\"\ndescription: \"What are UI components in user interface design. Learn about the different types, benefits, limitations, and more in this comprehensive guide.\"\nimage: https://cdn.magicui.design/assets/e86ec411-34d8-40dd-8cae-33e79e1ba8fd.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nAre you starting a new project and feeling overwhelmed by the various [UI Frameworks](https://magicui.design/blog/ui-frameworks) and components available? Understanding the basics of UI Components is crucial in navigating the plethora of options and making informed choices. In this article, you will discover what UI Components are, explore their types, benefits, limitations, and identify practical use cases, enabling you to streamline your development process effectively.\n\nMagic UI presents an innovative [React component library](https://magicui.design/) that will help you grasp the fundamentals of UI Components, their benefits, and limitations. It will guide you toward making well-informed decisions that align with your project goals. Whether you are a seasoned developer or new to the field, Magic UI provides a practical solution to discover UI Components and integrate them seamlessly into your projects.\n\n## **What Are UI Components?**\n\n![What Are UI Components](https://cdn.magicui.design/assets/pm4sd4ern59.jpg)\n\nA UI component is a standardized container used for quick and easy design. UI components usually fall into one of three categories (informational, navigational, or input controls) and can be composed of multiple or single elements representing specific functions.\n\n### Essential UI Design Components\n\nA navigation bar is an example of a UI design component. It uses various elements like icons, buttons, and text to demonstrate the structure and core pages of an app or website in a user-friendly way. A card is another example of a UI component that displays important content and can contain images, buttons, text, and more.\n\n### Using Pre-built and Customizable UI Components\n\n[UI components](https://developer.adobe.com/commerce/frontend-core/ui-components/) are often pre-built and customizable, making it easier for designers and developers to create consistent and cohesive user interfaces, reducing development time and costs. They also facilitate easier maintenance, updates, and keeping the design consistent across different pages of an application or website.\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **What Is The Difference Between UI Elements And UI Components**\n\n![What Are UI Components](https://cdn.magicui.design/assets/lgl1uu5y7rs.png)\n\nIt is essential to differentiate between UI components and UI elements in any design project. UI components are composite blocks, cards, or containers comprising one or more specific UI elements. These blocks are standardized for quick and easy design and represent particular actions. In contrast, UI elements are the basic building blocks of UI design and can be adapted for many different purposes. For example, an input field can be used in various applications apart from its use as part of a search box component in an app design.\n\nUI elements represent the smaller visual building blocks in a design project. UI components are larger, self-contained, reusable entities that frequently incorporate multiple UI elements to provide specific functionality or perform particular tasks. This distinction is crucial as it allows designers to structure their projects effectively and facilitates better communication and collaboration among team members.\n\n## **UI Component Libraries**\n\n![What Are UI Components](https://cdn.magicui.design/assets/moos86z8mco.png)\n\nA UI component library is a collection of pre-built, reusable UI components that can be easily added to a web or mobile application. These components are typically designed to be flexible, customizable, easy to use, and consistent in look and feel. A UI component library typically includes various components such as a navigation bar, a gallery, etc., and UI elements like buttons, forms, icons, typography, navigation, and other common UI elements.\n\n## **Let’s learn a bit more about the structure and importance of a UI component library!**\n\nUI component libraries are essential for developers and designers. They allow for high consistency throughout a web application or website. Maintaining consistency makes users feel more comfortable and competent as they navigate through the user interface. This consistency also helps to establish a visual hierarchy within a web application or website. Users can quickly identify the most important elements on a webpage, such as menus, buttons, and call to action.\n\nUI component libraries can save developers and designers a lot of time. Instead of building all UI components from scratch, developers and designers can use pre-built components from a UI component library. This allows developers and designers to focus on a web application or website's more complex and unique parts. It also helps to ensure that these components are accessible and responsive. [Components in a UI library](https://www.makeuseof.com/best-unstyled-component-libraries-react/) are tested on various screen sizes, browsers, and operating systems, ensuring that they work well for all users.\n\n## **A React Component Library for Design Engineers**\n\nAre you looking for a [React component library](https://magicui.design/) to include in your web development projects? Look no further. MagicUI is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion.\n\n### Seamless Integration and Customization with MagicUI Components\n\nOur visually appealing and interactive elements can be easily integrated into web applications, allowing you to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match your desired branding and design requirements.\n\n### Empowering Digital Experiences with MagicUI Pro: Animation and Design Focus\n\nWith our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering you to craft captivating digital experiences. Along with our free component library, MagicUI Pro can save you thousands of hours, create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our React component library for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- MUI Box\n- What Is NextJS\n\n## **What Are The Types Of UI Components?**\n\n![What Are UI Components](https://cdn.magicui.design/assets/l9j8voo7kx7.png)\n\nThree UI components cover most standardized blocks required when designing an app or website. Below, I discuss these component types in more detail and outline example elements commonly employed across all three.\n\n### 1\\. Informational\n\nInformational UI components communicate information with users. They are effectively used when you want to tell the user something. Examples of informational components include content cards and video components. The elements typically employed here are text, buttons, images, and videos.\n\n### 2\\. Navigational\n\nNavigational UI components assist users in moving around a design. These components excel in aiding users in finding their way through your design. Examples of navigational components include head navigation bars and call-to-action (CTA). The typical elements used in these components are buttons, icons, and text.\n\n### 3\\. Input Controls\n\nInput UI components enable users to input information directly into a design. These components are used when you need to let users enter or select data directly. Examples of input components include user input components such as onboarding or checkout. The elements typically included in this category are input fields, input dropdowns, input steppers, sliders, checkboxes, radio buttons, and toggles/switches.\n\n## **What Makes A Great User Interface?**\n\n![What Are UI Components](https://cdn.magicui.design/assets/c72w479c0ti.png)\n\n### Clarity\n\nThe first quality is clarity. This means the interface avoids obscurity by ensuring everything in the UI is clear. This could include visual elements, flow, or metaphors.\n\n### Concision\n\nThe next quality a great UI should have is concision or the reduction of redundancy (programmers may think of this as DRY—Don’t Repeat Yourself). Sometimes, developers or designers can accidentally overcomplicate things for the user by overexplaining certain processes. It’s best to avoid this by simultaneously including the necessary content on the screen.\n\n### Familiarity\n\nFamiliarity is also important when it comes to UIs. If someone is using your interface for the first time, some of the elements may still be familiar to them. Using real-life metaphors is helpful in this scenario.\n\n### Responsiveness\n\nGreat UIs will be responsive, one of the most common words a front-end developer or web designer will ever hear in their lifetime. Have you ever used a website or app and you want to request some information and you are not sure if your request was processed or not? That is not a very responsive interface. Responsive interfaces will provide good feedback to the user when a request is made. You might see something like “please wait while we process your request”.\n\n### Consistency\n\nAnother quality that is super important in developing a user interface is consistency. Keeping your UI consistent allows users to recognize patterns throughout your application, which will help them navigate.\n\n### Aesthetic\n\nAesthetic, or artistic taste is another essential aspect of a UI. If your app is aesthetic, users will find more joy in using it.\n\n### Efficient\n\nEfficiency is very important when developing a user interface. If your app is slow, users are going to find another solution very quickly.\n\n## **Benefits Of Using UI Component Libraries**\n\n![What Are UI Components](https://cdn.magicui.design/assets/24szt5boo6s.png)\n\n### 1\\. Accessibility\n\nUsing UI components offers quick access to developers and designers everywhere through a single repository. Accessibility improves collaboration and communication between developers and designers, helping them work more efficiently across teams.\n\n### 2\\. Reduced code duplication\n\nI believe a component library eliminates the need to copy code across varying designs and projects. Instead of converting every pixel to code, developers can leverage pre-coded components without any further development, saving time and resources.\n\n### 3\\. Consistency\n\nA component library facilitates consistency by promoting a single source of truth. This ensures a uniform UI and UX across entire projects, making it easier to achieve design consistency. Consistency makes work faster and more efficient.\n\n### 4\\. Speed\n\nTeams can save time by avoiding building from scratch using a component library. By utilizing ready-made components like calendars, teams can speed up their projects. Pre-set components help teams make faster decisions, reducing delays.\n\n### 5\\. Compatibility\n\nFrontend developers can struggle with ensuring cross-browser and cross-device compatibility. A component library aids in standardization, which helps avoid compatibility issues and provides a smooth user experience on different devices and browsers.\n\n## **Potential Drawbacks of UI Component Libraries**\n\n![What Are UI Components](https://cdn.magicui.design/assets/drqrtw43tej.png)\n\nWhile UI component libraries have some significant advantages, as with most things, there may also be [some challenges](https://www.diva-portal.org/smash/get/diva2:1565717/FULLTEXT01.pdf). Some of these challenges are:\n\n### 1\\. Library Size\n\nsome of the UI Component Libraries tend to be somewhat large. If you are building a small project or app, it may not be the best idea to use a library, instead, consider building your UI from scratch.\n\n### 2\\. Look\n\nAlthough UI component libraries make your design aesthetically pleasing, it can also be a drawback depending on the situation. Your application's look and feel will largely depend on the style defined in the UI library so this style must align with what you want your app to look like.\n\n### 3\\. Changes\n\nSuppose you decide you’re not necessarily a fan of some of the components offered and move to a more custom design but still decide to use some of the components provided by the library. In that case, knowing which components are custom and which are brought in by the library can be confusing. This is especially true when you add new team members.\n\nSpeaking of new team members, it can be a challenge to bring on new team members when it relates to the UI library you decide to use. If they are not familiar with the library, it may cause a bit of a delay when they need to implement or change the data housed in these components. While this is true for most things, it can be especially true here since there are so many different UI libraries.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/what-is-a-component-library.mdx",
    "content": "---\ntitle: \"What Is A Component Library? Why Use Them & Examples\"\ndescription: \"Discover the benefits of using a component library and why it's a must-have for developers or designers. Learn more about what is a component library.\"\nimage: https://cdn.magicui.design/assets/27255360-8e6b-4dd6-91af-b12496c95971.png\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-06-09\"\nfeatured: false\n---\n\nIn [UI Frameworks](https://magicui.design/blog/ui-frameworks), the concept of a component library can often be a lifesaver. Imagine having to create a user interface from scratch each time! Thankfully, component libraries exist to save you from this dreadful scenario. Today, we're diving into the world of component libraries to help you better understand them, know when and why to use them, and even discover some examples that might just end up being game-changers for your projects.\n\nMagic UI's [React component library](https://magicui.design/) is a fantastic resource we'll explore together. It's just the tool you need to understand component libraries, know when and why to use them, and discover a variety of examples that can help you on your way. Let's dive in and unlock the potential of component libraries together!\n\n## **What Is A Component Library?**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/obrpyxy8god.png)\n\nA UI component library is a collection of pre-designed and pre-built user interface elements used to create user interfaces for digital products, such as websites and applications with a unified look. These libraries include various pre-made UI elements, such as buttons, forms, navigation menus, icons, and more, each designed with a consistent look and feel. UI component libraries are particularly useful in collaborative design and development environments, as they help ensure that all team members are using the same source of truth and that the end product maintains a professional and polished appearance.\n\nComponent libraries can reduce the risk of product variations or different components in different places. They handle the source code for UI elements and usually leverage CSS and JavaScript. [React](https://learnreact.design/posts/what-is-react) is a prime example of a popular open-source framework. Facebook developed it as a component library, which has since grown into a large ecosystem for creating apps, static sites, and desktop applications.\n\n### Related Reading\n\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## **Why use A Component Library?**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/djab0yss3ym.png)\n\nA component library is a toolbox filled with versatile library components for designers and developers. Like how a carpenter would reach into their toolbox for the right tool, digital product teams access design components for their projects. What are the advantages that come with utilizing a component library?\n\n### Time-saving\n\nThe first major benefit is time-saving. Atlassian’s [design system](https://www.figma.com/blog/design-systems-101-what-is-a-design-system/), which includes an extensive component library, has been instrumental in helping their team build products faster by reusing code snippets rather than starting from scratch every time.\n\n### Consistency\n\nBut it’s not just about speed – consistency plays a huge role too. Using familiar elements across different projects ensures a consistent user experience. Imagine being able to familiarize your users as they navigate through various parts of your app or website because you’ve reused components – pretty neat, huh?\n\n### Team Collaboration\n\nIn addition to saving time and promoting consistency, component libraries can foster better team collaboration. Using the same building blocks (components) makes communication more effective and less prone to misunderstanding.\n\n### Scalability\n\nWith well-defined UI components, scaling up becomes much easier as new features can be built using existing elements without reinventing the wheel each time.\n\n## **Creating Stunning User Interfaces with MagicUI**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## **Difference Between A Component Library And A Design System**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/0srn0p0dusz.png)\n\nImagine you're working on designing an app. You have a lot of buttons, forms, icons, and other UI elements to put together. Here's where a component library and a design system come into play, and while they sound similar, they serve slightly different purposes.\n\n### Component Library\n\nA component library is like a well-organized toolbox filled with pre-built, reusable pieces. Think of it as a collection of LEGO bricks, where each brick is a UI component like a button, a card, a modal, etc. These components are standardized, following the same design guidelines and codebase, ensuring consistency across your app. When you need a button, just grab one from the component library and drop it into your design. This saves you time because you don’t have to build these elements from scratch every time.\n\nFor example, let’s say you’re designing a login page. Instead of designing and coding each button and input field from scratch, you pull these components from the library, knowing they’ll look and behave consistently with the rest of your app.\n\n### Design System\n\nOn the other hand, a design system is more like the entire blueprint of your project, complete with guidelines, principles, and best practices. It includes a component library but goes way beyond that. It’s the comprehensive documentation of how every aspect of your product should look and feel. This provides color palettes, typography, spacing, iconography, and even how specific user interactions should behave.\n\n### The Design System: A Detailed Recipe Book for Consistency\n\nThe design system is like a detailed recipe book that gives you the ingredients (the components) and instructions on how to use them (the guidelines). It provides the reasoning behind design decisions, ensuring everyone on the team, from designers to developers, is on the same page. This ensures that your app has a cohesive look and feel, no matter how many people are working on it.\n\n### Ensuring Cohesive Look and Feel with Design Guidelines\n\nFor instance, if you’re designing a new feature, the design system will guide you on which colors to use, how much spacing to apply between elements and the overall user experience. It’s the overarching strategy that maintains the integrity of your brand and user experience.\n\nCheck out [Audi's design system](https://www.audi.com/ci/en/guides/user-interface/introduction.html), which covers various use cases, from phones to smartwatches and car displays.\n\n## **Component Library vs. Design System: Building Blocks and Vision**\n\nA component library is a collection of reusable UI elements. It’s super handy for quickly assembling interfaces with consistent, pre-built pieces. A design system is a comprehensive framework that includes the component library and also provides the guidelines, principles, and best practices to ensure a cohesive and consistent design across the entire product.\n\nBoth are crucial for efficient and consistent design work. Still, while the component library is more about the practical building blocks, the design system is about the overall vision and rules governing how those blocks should be used.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Card](https://magicui.design/blog/mui-card)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- What Is NextJS\n\n## **How Does Using A Component Library Improve The UX/UI Design Quality Assurance?**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/vi1ldansvb.png)\n\nComponent libraries can be used for visual QA by visual designers once functionality is in development and before it is deployed into the application. Component libraries also enable UX quality assurance on how components function; this workflow can be collaborative. Edge cases typically can arise once real data is used in an application environment; by using a component library, your team can catch more of those edge cases before they appear in your production application and more effectively address the UX required for modern stateful interfaces.\n\n### Documentation in Component Libraries\n\nComponent libraries typically include documentation that describes each component’s purpose, usage, and behavior. This helps developers and quality assurance teams better understand the expected behavior of the components, making it easier to spot and address issues.\n\n### Accessibility Testing with Component Libraries\n\nUsing a component library can also help when testing for accessibility. Many component libraries prioritize accessibility by providing pre-built components that follow best practices. This means the quality assurance team can be more confident in the application’s accessibility and spend less time testing these aspects.\n\n## **How Atomic Design Fits With Component Libraries**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/t5yle6vq32.png)\n\nIn atomic design, design concepts comprise modular and reusable components created from individual atomic pieces.\n\n[Brad Frost](https://atomicdesign.bradfrost.com/chapter-2/) describes atomic design:\n\nAtomic design is a methodology composed of five distinct stages working together to create more deliberate and hierarchically interface design systems. The five stages of atomic design are:\n\n1.  Atoms\n2.  Molecules\n3.  Organisms\n4.  Templates\n5.  Pages\n\nAtomic design is not a linear process but rather a mental model that helps us think of our user interfaces as both a cohesive whole and a collection of parts. Each of the five stages plays a key role in the hierarchy of our interface design systems.\n\n### The Power of Atoms in Atomic Design\n\nAtomic design helps design systems scale more effectively by breaking down the UI into small, reusable pieces. This approach allows us to build well-organized, modular systems that can be easily maintained and updated over time. Each component is built on top of the previous one, creating a well-thought-out system of components.\n\n### Combining Elements for Functionality\n\nThe  Atoms stage is where the process starts, with the smallest and simplest elements of an interface. These elements are the building blocks of everything that comes next. They include things like labels, buttons, and input fields. The Molecules stage combines atoms into more complex organisms. Molecules include dropdowns, labels combined with input fields, and more complex interface elements.\n\n### The Cornerstones of User Interfaces\n\nThe Organisms stage combines molecules into complex structures. Organisms are the smallest standalone elements of an interface that can be used on our templates. In the Templates stage, we combine organisms to build layouts, wireframes, and mockups. The Pages stage is the final product, where templates are fully fleshed out and ready for implementation.\n\n### Bringing it All Together\n\nIn component libraries, these concepts are borrowed from atomic design and applied to a library of components. Component libraries are well-documented sets of reusable components that can be used to build products. They speed up the design and development process, making it easier for designers and developers to work together.\n\n### The Final Destination\n\nComponents are built from smaller, reusable pieces called atoms. These atoms can be combined into molecules, which can then be combined into organisms. Organisms are the smallest standalone elements of a user interface that can be used in templates.\n\n## **How To Choose The Best UI Component Libraries**\n\n![What Is A Component Library](https://cdn.magicui.design/assets/owpstlp3fr.png)\n\n### Community\n\nA dynamic community suggests that the UI components library has a lot of support and will probably change along with the sector's trends. Search for libraries with a committed community that regularly releases updates, bug fixes, and feature additions.\n\n### Easy To Use\n\nThe initial setup procedure may differ, even though most libraries function similarly once installed. Look for libraries with easy-to-understand documentation, thorough examples, and a gradual learning curve.\n\n### Extensibility + Licensing\n\nExtensibility enables the addition of new components to satisfy evolving requirements, allowing for future flexibility and growth. On the other hand, licensing is extremely important in ensuring that the selected library complies with the licensing specifications for your project and allows for the intended usage.\n\n### Popularity\n\nYou can get insights regarding the library's reputation, user adoption, and satisfaction by looking at the number of stars on GitHub, perusing live issue pages, and conducting web research. A well-liked library with a sizable user base and ongoing development suggests dependability, support from the community, and satisfying user experiences.\n\n## **5 Examples Of UI Component Libraries**\n\n### 1\\. Magic UI\n\n[Magic UI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. MagicUI components are highly customizable, enabling seamless adaptation to match desired branding and design requirements. MagicUI aims to bridge the gap between design and development with a focus on animation and a design-centric approach. MagicUI Pro also offers website templates to help create beautiful landing pages.\n\nUse our [React component library](https://magicui.design/) for free today at [MagicUI](https://magicui.design/docs).\n\n### 2\\. Material UI\n\nMaterial UI is a React component library that implements Google's Material Design. It provides a comprehensive collection of pre-built components that are ready for use in production right out of the box.\n\n### 3\\. Storybook\n\nStorybook is an open-source tool for building UI components in isolation for React and other platforms. It enables developers to work on a single component simultaneously, making the development process faster.\n\n### 4\\. React Bootstrap\n\nReact Bootstrap is one of the oldest React UI libraries, switching Bootstrap’s JavaScript with React. This change gives users more control over the function and form of every component, making every component accessible and important for building front-end frameworks.\n\n### 5\\. Blueprint\n\nBlueprint is a React-based UI toolkit focusing on simplicity, functionality, and a united design language. It includes meticulously designed components for building elegant and responsive web applications. Blueprint's components cover many UI elements, making it a valuable resource for developers aiming to create polished and professional web applications.\n\n## **Check Out Our React Component Library for Design Engineers**\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements.\n\nWith a focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours and create a beautiful landing page, and convert your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/blog/what-is-mobile-first-design.mdx",
    "content": "---\ntitle: What Is Mobile First Design A Practical Guide\ndescription: >-\n  Discover what is mobile first design and why it's essential for SEO and user\n  experience. Learn core principles and practical steps for a winning strategy.\nimage: >-\n  https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/featured-image-2f50ffdc-0175-47f6-b45d-aaa4412555d1.jpg\nauthor: Dillion Verma\ntags:\n  - mobile first design\n  - responsive web design\n  - user experience\n  - web development\n  - mobile SEO\npublishedOn: \"2025-10-03T07:36:37.837727+00:00\"\nfeatured: true\n---\n\nMobile-first design isn't just a buzzword; it's a fundamental shift in how we build for the web. The strategy is simple: design for the smallest screen first, then scale up. Think of it like building a house. You pour a solid, simple foundation—the mobile version—before you start adding the ornate bay windows and extra wings for the desktop mansion. This ensures the core experience is rock-solid for the vast majority of people browsing on their phones.\n\n## The Smartphone Revolution And The Need For Mobile-First\n\n![A smartphone displaying a website with other devices in in the background, illustrating the concept of mobile-first design.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/92ebbc81-5666-4f01-b7c5-90402d469483.jpg)\n\nBefore everyone had a supercomputer in their pocket, the internet was a desktop-only affair. Websites were sprawling digital estates built for big monitors, complete with complex layouts and navigation menus that had more options than a diner menu. Trying to view these sites on an early mobile phone was an exercise in pure frustration—a chaotic mess of pinching, zooming, and scrolling sideways just to read a sentence.\n\nThen, everything changed. While the idea of designing for mobile had been floating around since the mid-2000s, it was Apple's iPhone in **2007** that truly lit the fuse. Suddenly, a powerful, full-featured browser was in everyone's hands, and user expectations were transformed overnight. The explosion in mobile traffic threw a harsh spotlight on the fatal flaw in the old desktop-centric design philosophy.\n\n### A Necessary Shift In Thinking\n\nThe old way of doing things was called **\"graceful degradation.\"** Designers would build a massive, feature-rich desktop site and then try to chop bits and pieces off to make it _sort of_ work on a phone. The result was almost always a slow, broken, and barely usable mess. It became painfully clear that this subtractive approach just wasn't going to cut it.\n\nThis reality forced a massive shift towards minimalism and ruthless prioritization. By starting with the constraints of a small screen, design teams were forced to ask the most important question of all: _What does our user absolutely need to accomplish?_ This discipline naturally led to cleaner, more focused, and ultimately better user experiences for everyone. As smartphones took over, user patience for slow sites evaporated, making [website speed performance](https://giddsmedia.com/the-importance-of-speed-performance-for-your-website/) a make-or-break factor for keeping people engaged.\n\n> By starting with the mobile experience, you inherently focus on speed, clarity, and the core user journey. This isn't just about making things smaller; it's about making them smarter from the very beginning.\n\nThis new strategy, known as **progressive enhancement**, flipped the old model on its head. Instead of subtracting features from a bloated desktop site, you begin with the essential mobile experience and then _progressively enhance_ it. As more screen real estate becomes available, you can add richer layouts, more complex features, and secondary content. This ensures a solid, functional baseline for every single user, no matter their device. Getting hands-on with different [mobile templates](https://magicui.design/docs/templates/mobile) is a great way to see this principle in action. This user-first philosophy quickly became the undisputed standard for modern web development.\n\n## Understanding The Core Principles Of Mobile First\n\nSo, what’s really going on with mobile-first design? Let's try a simple analogy.\n\nImagine you're packing for a trip. You have two choices. You could pack a giant suitcase with everything you could possibly need and then try to cram it into a tiny backpack for a weekend hike. It’s a mess, right? Things get lost, crushed, and it's impossible to find what you actually need.\n\nOr, you could start with the backpack. You pack only the absolute essentials: a water bottle, a map, a first-aid kit. Once that’s perfectly organized, you can think about adding luxuries to a bigger bag for a longer stay. This second approach is the heart of mobile-first design.\n\nIt’s a philosophy called **progressive enhancement**. You begin with the most constrained environment—the small screen—and perfect the core experience. This forces you to be ruthless about what's truly important.\n\nThis shift in thinking isn't just a trend; it's a direct response to how we all use the internet now. The data is pretty clear on this.\n\n![Infographic about what is mobile first design](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/4fe7ae12-abfd-4eb0-bc63-e46bfd72d702.jpg)\n\nWith mobile devices driving more than half of all web traffic, starting with them isn't just smart—it's essential. You’re building the best possible experience for the biggest chunk of your audience, right from the get-go.\n\n### Key Pillars Of The Mobile First Philosophy\n\nThis design strategy is built on a few foundational ideas that shape every decision.\n\nFirst up is a strict **content hierarchy**. On a tiny screen, there's zero room for clutter. You have to figure out what information and actions are most critical and put them front and center. Everything else can be gracefully added in for larger screens.\n\nNext is a relentless focus on **touch-friendly interfaces**. We're not using precise mouse pointers here; we're using our thumbs.\n\n> Key interactive elements like buttons and links must be large enough to be easily tapped, with enough surrounding space to prevent frustrating accidental clicks. This focus on usability is central to the mobile-first mindset.\n\nFinally, simplicity is king. This means embracing lean, clean navigation—often using familiar patterns like a hamburger menu to tuck secondary options away neatly. To really get a handle on mobile-first, it's also helpful to understand the bigger picture of [responsive web design principles](https://www.contenttoolkit.co/blog/responsive-web-design-principles), which set the stage for making layouts work across any screen.\n\n### Mobile First vs Desktop First A Comparison\n\nTo make the difference crystal clear, let's look at a side-by-side comparison of the two dominant web design philosophies. This table really highlights why starting small often leads to a better, more focused end product.\n\n| Aspect              | Mobile First (Progressive Enhancement)                                               | Desktop First (Graceful Degradation)                                                      |\n| :------------------ | :----------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |\n| **Starting Point**  | Designs for the smallest screen (mobile) first.                                      | Designs for the largest screen (desktop) first.                                           |\n| **Core Philosophy** | Start with a solid foundation of essential features and add more for larger screens. | Start with a full-featured site and remove or hide elements for smaller screens.          |\n| **Content Focus**   | Forces prioritization of content and features from the beginning.                    | Can lead to \"feature bloat,\" making it hard to cut down for mobile.                       |\n| **Performance**     | Tends to be faster and more lightweight on mobile, as assets are added, not removed. | Can be slower on mobile due to loading hidden desktop assets.                             |\n| **User Experience** | Naturally creates a focused, clean, and uncluttered mobile experience.               | Mobile experience can feel like a stripped-down, compromised version of the desktop site. |\n| **Development**     | Often leads to cleaner, more efficient code.                                         | Can result in complex CSS and JavaScript to hide or alter elements.                       |\n\nUltimately, the table shows that **progressive enhancement** builds a robust, lean foundation, while **graceful degradation** often involves chipping away at a larger structure, which can sometimes feel like an afterthought for mobile users.\n\n## Why Mobile First Design Is A Game Changer For SEO\n\n![A person holding a smartphone showing a website's analytics with upward-trending graphs, representing SEO success from mobile first design.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/fe190aaf-e510-4b2c-8a91-f64949ef54b5.jpg)\n\nThinking about mobile-first as just a design trend is a huge mistake. It’s a core strategic decision that directly feeds into your website's visibility and, ultimately, its success. The real magic happens when you deliver a superior user experience. By forcing you to focus on the absolute essentials first, this approach naturally leads to a cleaner, more intuitive interface for mobile users.\n\nThis isn't just about making things look nice on a small screen. Search engines are obsessed with user experience, and since most people are searching on their phones, Google has completely rewired its ranking system to reflect that reality.\n\n### The Power Of Mobile-First Indexing\n\nHere’s the part you can’t ignore: Google now primarily uses the **mobile version** of your site for indexing and ranking. Let that sink in. Your desktop site could be a masterpiece, but if the mobile version is a slow, clunky mess, your search rankings are going to take a serious hit. A mobile-first design makes your site inherently optimized for the way Google actually sees and judges it.\n\nThis isn’t new, either. Google made it official back in 2019, announcing that **mobile-first indexing** would be the default for all new websites. That was the moment the industry officially shifted, making a top-notch mobile experience a non-negotiable for anyone serious about SEO. You can get more details about the mobile-first paradigm on appsflyer.com.\n\n> By aligning your design strategy with Google's indexing priorities, you're not just improving user experience—you're fundamentally boosting your site's potential to rank higher and attract more organic traffic.\n\n### Faster Performance And Higher Engagement\n\nAnother massive win is speed. Mobile-first sites are just naturally leaner. You start with the bare necessities—optimized images, essential scripts—and only add the heavier stuff for larger screens. This simple shift results in dramatically faster load times, which is absolutely critical for keeping impatient mobile users from bouncing.\n\nFaster loading isn't just a technical metric; it directly influences user behavior, sending powerful positive signals to search engines. Here’s how it all connects:\n\n- **Lower Bounce Rates:** People are far less likely to abandon a site that loads in a snap.\n- **Longer Session Durations:** A smooth, fast experience encourages users to stick around, click through more pages, and actually engage with your content.\n- **Improved Conversion Rates:** A frictionless mobile journey—whether you want a newsletter signup or a sale—removes the barriers that make people give up.\n\nIt all creates a powerful feedback loop. A better user experience leads to stronger engagement signals, which tells Google your site is a high-quality result worth showing to more people. That powerful synergy is what makes mobile-first design a true game-changer for modern SEO.\n\n## Your Blueprint For Implementing Mobile-First Design\n\n<iframe\n  width=\"100%\"\n  style={{ aspectRatio: \"16 / 9\" }}\n  src=\"https://www.youtube.com/embed/webzXg0_x4\"\n  frameBorder=\"0\"\n  allow=\"autoplay; encrypted-media\"\n  allowFullScreen\n></iframe>\n\nAlright, let's move from theory to action. This is where the real work of mobile-first design happens, and it’s about more than just shrinking things down. It's a disciplined approach that starts not with fancy design tools, but with your content.\n\nThe first step is a **content inventory**. You need to take stock of absolutely everything: every piece of information, every feature, every call-to-action on your site. Once you have a complete list, the tough part begins—ruthless prioritization.\n\nAsk yourself one critical question: what is the single most important thing a user _needs_ to do or see on this page? For an e-commerce site, it’s the product image, price, and the \"Add to Cart\" button. For a blog post, it's the headline and the article itself. Everything else is secondary.\n\n### Laying The Foundation With Wireframes\n\nWith your prioritized content list in hand, you can start building the structural skeleton of your mobile site. This is where **wireframing** comes in. We’re talking simple, low-fidelity layouts that focus purely on structure and hierarchy, not on flashy colors or fonts.\n\nYour mobile wireframe should be a single-column layout, presenting your prioritized content in a logical, top-to-bottom flow. This forces you to think about the user journey in its most essential form. For instance, a clean, intuitive navigation system is crucial on mobile. Our guide on building a great [navbar in React JS](https://magicui.design/blog/navbar-in-react-js) dives into practical tips for creating exactly that, a key component of any mobile-first project.\n\n> By perfecting the single-column mobile layout first, you ensure the core experience is solid. This foundational work makes expanding to larger screens a much more straightforward and logical process.\n\nOnce that mobile wireframe feels right, you can create versions for tablets and desktops. This is where you start adding back secondary elements into the newly available space. For example, a sidebar with related articles might appear next to a blog post on a desktop, but it stays tucked away at the bottom on mobile.\n\n### Building Up With CSS Media Queries\n\nWith a solid visual blueprint, it’s time to bring your design to life with code. The key technology that powers this whole implementation is **CSS media queries**. These are simple rules that apply different styles based on the characteristics of a device, most commonly its screen width.\n\nThe mobile-first approach means you write your default CSS for the smallest screen size _first_. These are your base styles—simple, clean, and universal. Then, you use `min-width` media queries to add more complex styles and layouts as the screen gets larger.\n\nHere’s what that looks like in practice:\n\n```css\n/* Default styles for mobile */\n.container {\n  width: 100%;\n  padding: 10px;\n}\n\n.sidebar {\n  display: none; /* Hide the sidebar on mobile */\n}\n\n/* Styles for tablets and up (768px and wider) */\n@media (min-width: 768px) {\n  .container {\n    display: flex;\n  }\n\n  .main-content {\n    flex: 3;\n  }\n\n  .sidebar {\n    display: block; /* Show the sidebar */\n    flex: 1;\n    margin-left: 20px;\n  }\n}\n\n/* Styles for desktops and up (1024px and wider) */\n@media (min-width: 1024px) {\n  .container {\n    max-width: 1200px;\n    margin: 0 auto;\n  }\n}\n```\n\nThis code starts with a basic, single-column layout for mobile devices. As the screen width increases past **768px**, it introduces a two-column layout by displaying the sidebar. This method, known as **progressive enhancement**, ensures a fast, functional experience on all devices by gracefully adding complexity instead of trying to subtract it.\n\n## How To Accelerate Development With Magic UI\n\n![A developer uses Magic UI's responsive components on a screen, with code snippets and visual elements showing a smooth transition from mobile to desktop layouts.](https://cdn.outrank.so/9baff5d7-bb14-4bc7-8399-349ad7704876/8a5c23cb-67e9-464d-9204-cc582658f41f.jpg)\n\nStarting a mobile-first project from the ground up is a serious commitment. It’s a disciplined process that involves tons of careful planning, painstaking media query coding, and then testing it all across a sea of devices. But what if you could skip most of that foundational grunt work and still get a pixel-perfect, mobile-optimized design?\n\nThat’s where a component library like Magic UI gives you a massive leg up. Instead of building every responsive button, grid, and card from scratch, you get a toolkit where mobile-first thinking is already baked into the DNA of every component.\n\nThink of it as building a house with high-quality, prefabricated modules instead of laying every single brick by hand. You get the speed and reliability of a proven system, but you don't lose the power to customize and make it your own.\n\n### Built-In Responsiveness For Faster Workflows\n\nA well-crafted UI library handles the tricky responsive logic for you. Its components are engineered from day one to adapt fluidly to any screen size, saving you countless hours of writing, testing, and debugging CSS. This frees you up to focus on what makes your app unique, not on reinventing the wheel for basic layouts.\n\nFor instance, a common headache is creating a grid that’s simple and clean on a phone but expands into something more sophisticated on a desktop. With Magic UI, you can drop in a component like `<BentoGrid>` with just a few lines of code.\n\n```jsx\nimport { BentoGrid, BentoGridItem } from \"@/components/magicui/bento-grid\"\n\nexport function BentoGridDemo() {\n  return (\n    <BentoGrid className=\"mx-auto max-w-4xl\">\n      {items.map((item, i) => (\n        <BentoGridItem\n          key={i}\n          title={item.title}\n          description={item.description}\n          header={item.header}\n          icon={item.icon}\n        />\n      ))}\n    </BentoGrid>\n  )\n}\n```\n\nThat’s it. On mobile, this code automatically renders a neat, single-column stack. As the screen gets wider, it elegantly transforms into a dynamic multi-column grid—all without you writing a single media query.\n\n### Ensuring A Polished User Experience\n\nMoving fast is great, but the quality of the user experience is what really matters. The real power of a good component library is its ability to deliver a polished, consistent, and accessible experience right out of the box. Elements like animated cards, navigation menus, and interactive grids are not only responsive but also designed with great usability in mind.\n\n> By using pre-built components, you're not just saving development time; you're leveraging a system that has been refined to meet modern user expectations for performance and interactivity on any device.\n\nThis approach dramatically cuts down on common responsive design mistakes, like elements wrapping awkwardly or touch targets being too tiny on a phone. Each component is a reliable building block for your mobile-first design, helping you get a high-quality result every time. For anyone wanting to see just how much is possible, the [Magic UI documentation](https://magicui.design/docs) is packed with examples.\n\nThis kind of acceleration is a game-changer. It frees up your resources so you can focus on the important stuff: crafting a killer user journey and delivering real value, all while knowing your UI is robust, scalable, and perfectly tuned for a mobile-first world.\n\n## Got Questions About Mobile-First Design? Let's Clear Things Up.\n\nEven when you get the big picture, a few practical questions always pop up when you're trying a new approach. I hear the same ones all the time from designers and developers just starting out.\n\nLet's tackle some of the most common mix-ups and worries about mobile-first design, so you can move forward with confidence.\n\n### Is Mobile-First the Same as Responsive Design?\n\nThis is easily the most common point of confusion. The short answer is no—they're related, but definitely not the same thing.\n\nThink of it like this: **responsive design** is your set of tools—the flexible grids and media queries that let a site physically adapt to different screens. **Mobile-first design**, on the other hand, is the _strategy_ or the blueprint. It’s the philosophy that says you start with the smallest screen and build your way up.\n\nA site built with a mobile-first approach will _always_ be responsive. But not all responsive sites are mobile-first. Many are built using \"graceful degradation,\" where you design for a big desktop screen and then start stripping things away for smaller devices. That often leads to a clunky, compromised mobile experience.\n\n> Mobile-first is the _strategy_: start small and expand. Responsive design is the _technique_ that makes the strategy work.\n\n### Will This Make My Desktop Site Look Too Simple?\n\nThat’s a big fear I hear, but it’s completely off the mark. Mobile-first isn't about permanent simplification; it's about **progressive enhancement**.\n\nYou start by building a lean, powerful, and focused core experience for mobile users. Then, as you get more screen space to play with, you strategically add more features, richer visuals, and more complex interactions.\n\nYour desktop site can be as complex and feature-rich as you want. The mobile-first method just ensures that all those bells and whistles don't break the experience or tank the performance for someone on their phone. You're not stuck with the basic version; you're just adding layers of awesome on top of a rock-solid foundation.\n\n### How Does Mobile-First Design Affect SEO?\n\nThe impact is massive—and overwhelmingly positive. Ever since Google switched to **mobile-first indexing**, it primarily looks at the mobile version of your site to figure out where to rank you.\n\nBy its very nature, a mobile-first website is perfectly aligned with how Google sees and judges the web today.\n\nThis alignment brings real, tangible SEO wins. Mobile-first sites tend to load faster, have lower bounce rates, and deliver a far better user experience on phones. Google sees all of these as strong positive ranking signals, telling them your site is a quality result for users on the go.\n\n### Can I Apply Mobile-First to an Existing Website?\n\nTechnically, yes, but it’s rarely a quick fix. It usually demands a significant redesign, not just a few tweaks.\n\nThe process involves a deep content audit to figure out what's absolutely essential for that core mobile experience. From there, you'd need to completely rethink your CSS, writing mobile styles as the default and then using media queries to layer on the desktop enhancements.\n\nFor most large, complex sites, a full redesign is often the cleanest and most effective way to do it right. The alternative is to tackle it piece by piece, refactoring key pages or sections over time to slowly shift your site toward a mobile-first approach without a massive, one-time overhaul.\n\n---\n\nReady to build stunning, responsive websites with a toolkit that has mobile-first principles baked in? **Magic UI** offers over **150** free and open-source animated components to accelerate your development. [Check out the full library](https://magicui.design) and see for yourself.\n"
  },
  {
    "path": "apps/www/content/blog/what-is-nextjs.mdx",
    "content": "---\ntitle: \"What Is NextJS? Best Features, Applications, Pros & Cons\"\ndescription: \"Looking to understand what is NextJS? Know the key features, common uses, and advantages and disadvantages of NextJS in this informative overview.\"\nimage: https://cdn.magicui.design/assets/esd2vdswfzn.jpg\nauthor: Dillion Verma\ntags:\n  - UI Frameworks\npublishedOn: \"2024-07-07\"\nfeatured: false\n---\n\nWhether you're a developer or just starting on your journey in the [UI frameworks](https://magicui.design/blog/ui-frameworks), understanding what is NextJS can be a transformative breakthrough. Imagine having a tool that streamlines your development process, offering a blend of efficiency and flexibility. You'll discover more about NextJS, including its features, applications, pros, and cons.\n\nLooking to learn about NextJS, its features, applications, pros, and cons? MagicUI's [React component library](https://magicui.design/) fits the bill, providing an intuitive solution that simplifies your development process.\n\n## What Is NextJS?\n\n![What Is NextJS](https://cdn.magicui.design/assets/4etadovede9.jpg)\n\nNext.js, a React-based web development framework, serves as both a front-end and a back-end. Its primary advantage is the ability to expedite the building of fully-fledged websites, thereby saving developers valuable time and effort.\n\nNext.js stands out with its unique feature of allowing developers to select a different page rendering method for each page. This flexibility empowers developers to cater to a wide range of website types, whether:\n\n- Server-side\n- Static\n- Client-side\n- Incremental static regeneration\n- On-demand revalidation\n\nNext.js provides an amazing developer experience with features like:\n\n- TypeScript and ESLing integrations\n- Fast refreshing when developing your website\n\nWhen deployed, Next.js does:\n\n- Automatic compiling\n- Bundling\n- Minifying\n\n### Related Reading\n\n- [React Frameworks](https://magicui.design/blog/react-frameworks)\n- [What Are UI Components](https://magicui.design/blog/what-are-ui-components)\n- [What Is A Component Library](https://magicui.design/blog/what-is-a-component-library)\n- [React Libraries](https://magicui.design/blog/react-libraries)\n- [React CSS Framework](https://magicui.design/blog/react-css-framework)\n- [React Design Patterns](https://magicui.design/blog/react-design-patterns)\n- [Component Libraries](https://magicui.design/blog/component-libraries)\n- [React Best Practices](https://magicui.design/blog/react-best-practices)\n\n## What Functionalities Does NextJS Offer?\n\n![What Is NextJS](https://cdn.magicui.design/assets/uvgvq8gh2v9.jpg)\n\n### Image optimizations\n\nNext.js provides automatic image optimizations with instant builds. Image optimization is a powerful feature prebuilt into Next.js because managing and optimizing images requires many configurations, and manually optimizing images can take a toll on your productive time.\n\n### Internationalization\n\nAnother great feature added to Next.js is internationalization. Creating an enterprise application can be easily translated into different languages worldwide. This feature is an addition to Next.js and makes Next.js internationally recognized because it takes less configuration to set up internalization.\n\n### Next.js analytics\n\nNext.js provides an analytical dashboard configured to show accurate visitor data and page insights from out of the box. With this feature, you can quickly build an analytical dashboard and gain valuable insights into your visitors and page insights without extra coding or configuration.\n\n### Zero config\n\nNext.js compiles and builds automatically with hot refresh without any extra configuration from you, and it automatically scales and optimizes your production application. Achieving hot or automatic refresh on a traditional frontend application has many problems. It requires choosing and installing the right libraries and carrying out the configurations for each library to work correctly. Next.js solves this problem by providing a hot refresh right out of the box with zero installation and configuration from you.\n\n### Prebuilt SSR, SSG, and CSR support\n\nWith Next.js, you can support server-side rendering, static generation, and client-side rendering in one application. You can decide the type of application you want to build and how you intend to compile it to best suit your use case. Server-side rendering makes Next.js suitable for [large-scale SEO-oriented production-ready applications](https://www.linkgraph.com/blog/corporate-seo/), and configuring it is a breeze.\n\n### Free and Customizable UI Library\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n## What Makes NextJS Unique?\n\n![What Is NextJS](https://cdn.magicui.design/assets/9pa72vllzzu.jpg)\n\nNext.js has gathered a lot of buzz around tech communities as it makes building highly customizable websites easy. Next.js cleverly abstracts the data loading methods into their own serverless or server functions, making loading data into your pages incredibly simple. This simplifies your website architecture significantly.\n\n### Simplified Data Fetching\n\nNext.js, unlike traditional React applications, Next.js allows you to query your CMS or a database directly on your pages. This eliminates the need for a proxy backend service, allowing developers to focus on integrating the front end with their preferred data source without the burden of backend web development.\n\nNext.js comes with a comprehensive set of utilities commonly used in web applications. These include:\n\n- Dynamic page routes\n- Redirects\n- Rewrites\n- Middleware\n- i18n\n\nThese features make Next.js a versatile and powerful solution for a wide range of web development needs right out of the box.\n\n- Developers can build features with these utilities to help businesses achieve their goals.\n- Marketers will love the A/B content split testing and autonomy to create pages through a CMS.\n- Search engine optimizers will love the fast page load speed and fully customizable metadata, such as Open Graph tags and structured data.\n- Developers love the freedom to create new features using all the tools in the React ecosystem.\n\n## What Can You Build With NextJS?\n\n![What Is NextJS](https://cdn.magicui.design/assets/ahf3erweoqt.jpg)\n\nNext.js is a versatile tool that allows you to build a wide range of applications, from dynamic websites to static sites and web applications. Some of the key applications of Next.js include:\n\n### Dynamic, user-friendly websites\n\nNext.js offers features like dynamic routes, client-side navigation, and server-side rendering, enabling the creation of truly dynamic and intuitive websites.\n\n### Minimum Viable Product (MVP)\n\nGetting started with Next.js is as easy as running two commands. This helps you quickly build MVPs for different use cases.\n\n- Run npx create-next-app@latest to create a new application.\n- Run npm run dev to start the app server on [localhost:3000](http://localhost:3000).\n\nYou can view your website by opening [http://localhost:3000](http://localhost:3000) on the browser. Edit the pages/index.js file and see your website change on the browser.\n\n### Web applications\n\nNext.js lets you build performant web applications for the cloud. Next.js is the way to go, whether you are:\n\n- Building a streaming platform like Hulu\n- Real estate website like Realtor\n- Food ordering application like Doordash\n\n### Static websites\n\nBy using the `next export` command, you can convert your Next.js application into static HTML, making it easy to run without a Node.js server. Incremental Static Regeneration (ISR) allows you to create or edit static pages after building your website without regenerating the entire site.\n\n### SaaS tools\n\nNext.js's ease of development, maintainability, and integration make it a top choice for building software as a service (SaaS) tools.\n\n### Big e-commerce websites\n\nNext.js can meet the high scalability, performance, and rendering demands of large e-commerce websites with millions of users.\n\n### Client-side rendered websites and single-page applications\n\nNext.js excels at building single-page applications that offer fast transitions, high performance, and an intuitive user experience without reloading the page.\n\n## When Should You Use NextJS For Development?\n\n![What Is NextJS](https://cdn.magicui.design/assets/85895d742vy.jpg)\n\nNext.js can help you in a variety of scenarios. If your application demands server-side rendering to enhance performance, SEO, or quicker initial page loads, Next.js is a perfect pick. It provides built-in support for server-side rendering and a static site generator, which can benefit:\n\n- Content-heavy websites\n- Blogs\n- E-commerce platforms\n\n### Pre-rendering and Faster Load Times\n\nIf you wish to boost your app's performance by pre-rendering pages at build time or server-side, Next.js can help reduce the amount of JavaScript that needs to be downloaded and executed by the client. This can lead to quicker load times and an improved user experience, especially on slower networks or devices.\n\n### Streamlined Development\n\nNext.js comes with a host of built-in features like:\n\n- Automatic code splitting\n- [CSS and Sass support](https://nextjs.org/docs/basic-features/built-in-css-support)\n- API routes\n\nThese features help you save time and effort, making your development process more efficient. So, if you need these features and prefer not to set them up manually, Next.js can be a valuable ally in your development journey.\n\n## NextJ And User Experience\n\n![What Is NextJS](https://cdn.magicui.design/assets/2ifv831xbhh.jpg)\n\nUser experience plays a pivotal role in the success of digital businesses. If ignored, it can lead to losing customers, abandoned carts, and a high bounce rate. The design also plays a significant role—utilizing themes or templates can limit the ability to create a unique customer experience in the long run. Next.js helps build a fully customized user experience, offering numerous benefits that significantly enhance the overall user experience.\n\n### UX Freedom\n\nNext.js provides the freedom to avoid restrictions typically imposed by CMS platforms, plugins, or templates. Flexible file-system routing and support for various CSS-in-JS libraries allow high degrees of front-end design customization. This results in a unique user experience that can be tailored precisely to the business's and its audience's needs.\n\n### Adaptability and Responsiveness\n\nNext.js facilitates the creation of adaptable web applications that adjust to any screen size or resolution.  User experience is seamless across different devices and platforms using features like:\n\n- Automatic image optimization\n- Responsive loading\n- Smooth integration with modern CSS frameworks\n\n### Short Page Load Time\n\nThe capability for static site generation (SSG) and incremental static regeneration (ISR) in Next.js significantly improves page load times. Pre-rendered pages are served to users, reducing the time to the first byte (TTFB) and enhancing overall site speed. This leads to a better user experience, as users can access content quickly without facing long loading times.\n\n### Data Security\n\nThe lack of a direct database connection improves data security for static websites built using Next.js. Minimizing exposure to sensitive data and dependencies makes these sites more secure against common web vulnerabilities, ensuring a safe and reliable user experience.\n\n## NextJS And SEO\n\n![What Is NextJS](https://cdn.magicui.design/assets/5petsnulacp.jpg)\n\n### Easily add a robots.txt file\n\nNext.js supports static file serving, allowing developers to create a robots.txt file in the public folder of the root directory. This file instructs search engine bots which parts of the website to crawl and index.\n\n### Generate dynamic sitemaps\n\nWith Next.js, you can dynamically generate an XML sitemap using the getServerSideProps function. This dynamic approach ensures that search engines can easily discover and index all pages on the website.\n\n### Add metadata to pages\n\nAdding metadata to pages is crucial for SEO, and in Next.js, you can achieve this with the head component. This component allows developers to essential SEO elements like setting:\n\n- Page titles\n- Meta descriptions and others\n\n### Robots and Googlebot tags\n\nNext.js allows you to control how search engines index and follow links on your website using the robots tag. Developers can also use the [Googlebot](https://ahrefs.com/blog/googlebot/) tag to issue specific instructions to Google's search bot.\n\n### Monitor core web vitals with Analytics\n\nWith Next.js, developers can monitor core web vitals through the Analytics dashboard. This feature helps measure a website's performance based on key user experience metrics. Developers can log web vitals in real time and send the data to custom services or application logs.\n\n### Related Reading\n\n- [Best React Native UI Library](https://magicui.design/blog/best-react-native-ui-library)\n- [React Component Best Practices](https://magicui.design/blog/react-component-best-practices)\n- [Tailwind Vs Bootstrap](https://magicui.design/blog/tailwind-vs-bootstrap)\n- [Material UI Alternatives](https://magicui.design/blog/material-ui-alternatives)\n- [Best React Component Library](https://magicui.design/blog/best-react-component-library)\n- [React Tips](https://magicui.design/blog/react-tips)\n- [Create React Component Library](https://magicui.design/blog/create-react-component-library)\n- [Cool React Components](https://magicui.design/blog/cool-react-components)\n- [Component Library Examples](https://magicui.design/blog/component-library-examples)\n- [Bootstrap Vs React](https://magicui.design/blog/bootstrap-vs-react)\n- [React Native Libraries](https://magicui.design/blog/react-native-libraries)\n- [Best React UI Framework](https://magicui.design/blog/best-react-ui-framework)\n- [NextJS](https://magicui.design/blog/nextjs)\n- [Next.JS](https://magicui.design/blog/next-js)\n- [Next JS](https://magicui.design/blog/next-js-app)\n- [React Bootstrap](https://magicui.design/blog/react-bootstrap)\n- [MUI Table](https://magicui.design/blog/mui-table)\n- [MUI Box](https://magicui.design/blog/mui-box)\n- [MUI Card](https://magicui.design/blog/mui-card)\n\n## Pros And Cons Of NextJS\n\n![What Is NextJS](https://cdn.magicui.design/assets/9eerbu4otfr.jpg)\n\nIn UI frameworks, you must stay current with the latest advancements in the field. Next.js is a popular UI framework offering various benefits and drawbacks.\n\n### Improved Search Engine Optimization\n\nOne of Next.js's standout benefits is that it optimizes your site for search engines, which is critical for your online visibility. By incorporating server-side rendering (SSR) into your web application, Next.js gives you a competitive edge in SEO. Search engines prioritize text-based websites over client-rendered JavaScript, making Next.js a valuable tool for enhancing search engine rankings.\n\n### Customized Open Graph\n\nNext.js allows you to programmatically customize your Open Graph meta titles for each page. This feature is essential for improving your site's appearance on social media platforms and boosting your SEO efforts. With Next.js, you can easily optimize your metadata for each URL, enhancing your site's visibility in search results.\n\n### Enhanced Performance\n\nNext.js significantly improves your website's performance by reducing the JavaScript code browsers need to download and execute. By leveraging SSR, Next.js enhances metrics like time first to draw (TTFD), making your site load faster and more user-friendly. A quick-loading website improves user experience, decreases bounce rates, and boosts your SEO.\n\n### Part of the React Ecosystem\n\nNext.js is an integral part of the React ecosystem, the most popular frontend framework among developers. Since Next.js was designed to address the SSR challenge for React applications, it seamlessly integrates with React, making it a convenient choice for developers who prefer using React as their front-end framework.\n\n### Learning Curve\n\nDespite its numerous advantages, Next.js has a learning curve, especially for beginners. Developers need a solid understanding of React and JavaScript to leverage Next.js effectively. While the API is intuitive, new developers may find it challenging to work with Next.js without prior knowledge of React and JavaScript.\n\n### Complex Routing\n\nNext.js offers a powerful routing system, but configuring and customizing it can be complex. Developers may need to invest additional time understanding and working with Next.js's routing features to achieve their desired outcomes.\n\n## 4 Alternatives To NextJS\n\n![What Is NextJS](https://cdn.magicui.design/assets/446jw7rds6s.jpg)\n\n### 1\\. Magic\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library that we designed specifically for design engineers. It offers a collection of over 20 animated components built with React, TypeScript, Tailwind CSS, and Framer Motion. We provide a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing us to create stunning user interfaces with minimal effort.\n\nMagicUI components are highly customizable, enabling seamless adaptation to match our desired branding and design requirements. With our focus on animation and a design-centric approach, MagicUI aims to bridge the gap between design and development, empowering us to craft captivating digital experiences. Along with our free component library, with MagicUI Pro, you can save thousands of hours creating a beautiful landing page and converting your visitors into customers with our website templates.\n\nUse our [React component library](https://magicui.design/) for free today at [https://magicui.design/docs](https://magicui.design/docs).\n\n### 2\\. Gatsby\n\nGatsby is a static site generator that leverages React to build fast, optimized, and highly customizable websites. It focuses on performance and supports content-driven sites, blogs, and e-commerce applications. Gatsby offers features like server-side rendering, image optimization, and data sourcing from various content management systems.\n\n### 3\\. Nuxt.js\n\nNuxt.js is a framework for building [server-side rendered (SSR)](https://www.educative.io/answers/what-is-server-side-rendering) and static-generated Vue.js applications. It provides an opinionated project structure and simplifies the development process by automatically handling routing, server-side rendering, and bundling. Nuxt.js is known for its simplicity and ease of use.\n\n### 4\\. Angular Universal\n\nAngular Universal is a server-side rendering solution for Angular applications. It allows developers to render Angular applications on the server and deliver fully rendered pages to the client. Angular Universal helps improve performance, SEO, and initial page load times by generating static HTML on the server.\n\n## Check Out Our React Component Library for Design Engineers\n\n[MagicUI](https://magicui.design/) is a free and open-source UI library designed specifically for design engineers. It offers a collection of over 20 animated components built with:\n\n- React\n- TypeScript\n- Tailwind CSS\n- Framer Motion\n\nThe library provides a range of visually appealing and interactive elements that can be easily integrated into web applications, allowing developers to create stunning user interfaces with minimal effort. MagicUI components are highly customizable, enabling seamless adaptation to match desired branding and design requirements. With a focus on animation and a design-centric approach, [MagicUI](https://magicui.design/) aims to bridge the gap between design and development, empowering users to craft captivating digital experiences.\n\n### Save Time with MagicUI Pro\n\nAlong with the free component library, MagicUI offers a Pro version that can save users thousands of hours. Through MagicUI Pro, users can create beautiful landing pages and convert visitors into customers using the provided website templates. The Pro version of MagicUI extends the library's capabilities, allowing for efficient and effective design and development processes. The seamless integration of MagicUI Pro into projects ensures that users can work more efficiently and deliver exceptional digital experiences to their audiences.\n\n### Get Started with MagicUI Today\n\nUse the MagicUI React component library for free today at [magicui.design/docs](http://magicui.design/docs)\n\n### Related Reading\n\n- [Chakra UI Vs Material UI](https://magicui.design/blog/chakra-ui-vs-material-ui)\n- [React Animation Libraries](https://magicui.design/blog/react-animation-libraries)\n- [Ant Design Vs Material UI](https://magicui.design/blog/ant-design-vs-material-ui)\n- [Mantine Vs Chakra](https://magicui.design/blog/mantine-vs-chakra)\n- [Free React Components](https://magicui.design/blog/free-react-components)\n- [Semantic UI Vs Material UI](https://magicui.design/blog/semantic-ui-vs-material-ui)\n- [React UX](https://magicui.design/blog/react-ux)\n- [Material UI Vs Joy UI](https://magicui.design/blog/material-ui-vs-joy-ui)\n- [Ant Design Alternatives](https://magicui.design/blog/ant-design-alternatives)\n- [Material UI React](https://magicui.design/blog/material-ui-react)\n- [MUI React](https://magicui.design/blog/mui-react)\n"
  },
  {
    "path": "apps/www/content/docs/components/android.mdx",
    "content": "---\ntitle: Android\ndate: 2024-12-20\ndescription: A mockup of an Android device.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"android-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/android\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"android\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### With Image\n\n<ComponentPreview name=\"android-demo-2\" />\n\n### With Video\n\n<ComponentPreview name=\"android-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Android } from \"@/components/ui/android\"\n```\n\n```tsx showLineNumbers\n<Android />\n```\n\n## Props\n\n| Prop       | Type     | Default | Description                        |\n| ---------- | -------- | ------- | ---------------------------------- |\n| `width`    | `number` | `433`   | The width of the Android window    |\n| `height`   | `number` | `882`   | The height of the Android window   |\n| `src`      | `string` | `-`     | The source of the image to display |\n| `videoSrc` | `string` | `-`     | The source of the video to display |\n\nThe `Android` component also accepts all properties of the `SVGElement` type.\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-beam.mdx",
    "content": "---\ntitle: Animated Beam\ndate: 2024-02-11\ndescription: An animated beam of light which travels along a path. Useful for showcasing the \"integration\" features of a website.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/animated-beam.mp4\n---\n\n<ComponentPreview name=\"animated-beam-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-beam\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-beam\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Animated Beam Uni-Directional\n\n<ComponentPreview name=\"animated-beam-unidirectional\" />\n\n### Animated Beam Bi-Directional\n\n<ComponentPreview name=\"animated-beam-bidirectional\" />\n\n### Animated Beam Multiple Inputs\n\n<ComponentPreview name=\"animated-beam-multiple-inputs\" />\n\n### Animated Beam Multiple Outputs\n\n<ComponentPreview name=\"animated-beam-multiple-outputs\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedBeam } from \"@/components/ui/animated-beam\"\n```\n\n```tsx showLineNumbers\n<AnimatedBeam containerRef={containerRef} fromRef={fromRef} toRef={toRef} />\n```\n\n## Props\n\n### Animated Beam\n\n| Prop                 | Type      | Default    | Description                                              |\n| -------------------- | --------- | ---------- | -------------------------------------------------------- |\n| `className`          | `string`  | `-`        | The class name for the component.                        |\n| `containerRef`       | `ref`     | `-`        | The container ref.                                       |\n| `fromRef`            | `ref`     | `-`        | The ref of the element from which the beam should start. |\n| `toRef`              | `ref`     | `-`        | The ref of the element to which the beam should end.     |\n| `curvature`          | `number`  | `0`        | The curvature of the beam.                               |\n| `reverse`            | `boolean` | `false`    | Whether the beam should be reversed.                     |\n| `duration`           | `number`  | `5`        | The duration of the beam.                                |\n| `delay`              | `number`  | `0`        | The delay of the beam.                                   |\n| `repeat`             | `number`  | `Infinity` | The number of times the beam animation should repeat.    |\n| `repeatDelay`        | `number`  | `0`        | The delay between repeated beam animation cycles.        |\n| `pathColor`          | `string`  | `gray`     | The color of the beam.                                   |\n| `pathWidth`          | `number`  | `2`        | The width of the beam.                                   |\n| `pathOpacity`        | `number`  | `0.2`      | The opacity of the beam.                                 |\n| `gradientStartColor` | `string`  | `#ffaa40`  | The start color of the gradient.                         |\n| `gradientStopColor`  | `string`  | `#9c40ff`  | The stop color of the gradient.                          |\n| `startXOffset`       | `number`  | `0`        | The start x offset of the beam.                          |\n| `startYOffset`       | `number`  | `0`        | The start y offset of the beam.                          |\n| `endXOffset`         | `number`  | `0`        | The end x offset of the beam.                            |\n| `endYOffset`         | `number`  | `0`        | The end y offset of the beam.                            |\n\n## Credits\n\n- Credit to [@itsarghyadas](https://twitter.com/itsarghyadas) for figuring out the foundation of this!\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-circular-progress-bar.mdx",
    "content": "---\ntitle: Animated Circular Progress Bar\ndate: 2024-05-28\ndescription: Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\nauthor: luis-codex\npublished: true\n---\n\n<ComponentPreview name=\"animated-circular-progress-bar-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-circular-progress-bar\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-circular-progress-bar\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedCircularProgressBar } from \"@/components/ui/animated-circular-progress-bar\"\n```\n\n```tsx showLineNumbers\n<AnimatedCircularProgressBar />\n```\n\n## Props\n\n| Prop                  | Type     | Default | Description                                   |\n| --------------------- | -------- | ------- | --------------------------------------------- |\n| `className`           | `string` | `-`     | The class name to be applied to the component |\n| `max`                 | `number` | `100`   | The maximum value of the gauge                |\n| `min`                 | `number` | `0`     | The minimum value of the gauge                |\n| `value`               | `number` | `0`     | The current value of the gauge                |\n| `gaugePrimaryColor`   | `string` | `-`     | The primary color of the gauge                |\n| `gaugeSecondaryColor` | `string` | `-`     | The secondary color of the gauge              |\n\n## Credits\n\n- Credit to [@luis-code](https://luis-code.vercel.app/)\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-gradient-text.mdx",
    "content": "---\ntitle: Animated Gradient Text\ndate: 2024-04-09\ndescription: An animated gradient background which transitions between colors for text.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/animated-gradient-text.mp4\n---\n\n<ComponentPreview name=\"animated-gradient-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-gradient-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-gradient-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-8}\n@theme inline {\n  --animate-gradient: gradient 8s linear infinite;\n\n  @keyframes gradient {\n    to {\n      background-position: var(--bg-size, 300%) 0;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Custom Speed\n\n<ComponentPreview name=\"animated-gradient-text-demo-2\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { AnimatedGradientText } from \"@/components/ui/animated-gradient-text\"\n```\n\n```tsx showLineNumbers\n<AnimatedGradientText>Animated Gradient Text</AnimatedGradientText>\n```\n\n## Props\n\n| Prop        | Type     | Default     | Description                            |\n| ----------- | -------- | ----------- | -------------------------------------- |\n| `children`  | `node`   | `-`         | The children passed into the component |\n| `className` | `string` | `-`         | The class name to be applied           |\n| `speed`     | `number` | `1`         | The speed of the gradient animation    |\n| `colorFrom` | `string` | `\"#ffaa40\"` | The starting color of the gradient     |\n| `colorTo`   | `string` | `\"#9c40ff\"` | The ending color of the gradient       |\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-grid-pattern.mdx",
    "content": "---\ntitle: Animated Grid Pattern\ndate: 2024-02-07\ndescription: A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"animated-grid-pattern-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-grid-pattern\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-grid-pattern\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedGridPattern } from \"@/components/ui/animated-grid-pattern\"\n```\n\n```tsx showLineNumbers\n<AnimatedGridPattern />\n```\n\n## Props\n\n### GridPattern\n\n| Prop              | Type     | Default | Description                                   |\n| ----------------- | -------- | ------- | --------------------------------------------- |\n| `className`       | `string` | `-`     | Additional classes to be added to the pattern |\n| `width`           | `number` | `40`    | Width of the pattern                          |\n| `height`          | `number` | `40`    | Height of the pattern                         |\n| `x`               | `number` | `-1`    | X offset of the pattern                       |\n| `y`               | `number` | `-1`    | Y offset of the pattern                       |\n| `strokeDasharray` | `number` | `0`     | Stroke dash array of the pattern              |\n| `numSquares`      | `number` | `200`   | Number of squares in the pattern              |\n| `maxOpacity`      | `number` | `0.5`   | Maximum opacity of the pattern                |\n| `duration`        | `number` | `1`     | Duration of the animation                     |\n| `repeatDelay`     | `number` | `0.5`   | Repeat delay of the animation                 |\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-list.mdx",
    "content": "---\ntitle: Animated List\ndate: 2023-12-12\ndescription: A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"animated-list-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-list\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-list\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedList } from \"@/components/ui/animated-list\"\n```\n\n```tsx showLineNumbers\n<AnimatedList>\n  <p>Item 1</p>\n  <p>Item 2</p>\n  <p>Item 3</p>\n</AnimatedList>\n```\n\n## Props\n\n### Animated List\n\n| Prop        | Type     | Default | Description                       |\n| ----------- | -------- | ------- | --------------------------------- |\n| `className` | `string` | `-`     | The class name for the component  |\n| `delay`     | `number` | `1000`  | The delay between each item in ms |\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-shiny-text.mdx",
    "content": "---\ntitle: Animated Shiny Text\ndate: 2024-01-16\ndescription: A light glare effect which pans across text making it appear as if it is shimmering.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/animated-shiny-text.mp4\n---\n\n<ComponentPreview name=\"animated-shiny-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-shiny-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-shiny-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-14}\n@theme inline {\n  --animate-shiny-text: shiny-text 8s infinite;\n\n  @keyframes shiny-text {\n    0%,\n    90%,\n    100% {\n      background-position: calc(-100% - var(--shiny-width)) 0;\n    }\n    30%,\n    60% {\n      background-position: calc(100% + var(--shiny-width)) 0;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedShinyText } from \"@/components/ui/animated-shiny-text\"\n```\n\n```tsx showLineNumbers\n<AnimatedShinyText>Hello</AnimatedShinyText>\n```\n\n## Props\n\n| Prop           | Type     | Default | Description                                  |\n| -------------- | -------- | ------- | -------------------------------------------- |\n| `children`     | `node`   | `-`     | The text to be shimmered.                    |\n| `className`    | `string` | `-`     | The class name to be applied to the shimmer. |\n| `shimmerWidth` | `number` | `100`   | The width of the shimmer in pixels.          |\n"
  },
  {
    "path": "apps/www/content/docs/components/animated-theme-toggler.mdx",
    "content": "---\ntitle: Theme Toggler\ndate: 2025-08-17\ndescription: An Animated theme toggler component, fully customizable using Tailwind CSS.\nauthor: Nazam Kalsi\npublished: true\n---\n\n<ComponentPreview name=\"animated-theme-toggler-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/animated-theme-toggler\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"animated-theme-toggler\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS into your global CSS file</Step>\n\n```css title=\"app/globals.css\" showLineNumbers\n::view-transition-old(root),\n::view-transition-new(root) {\n  animation: none;\n  mix-blend-mode: normal;\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AnimatedThemeToggler } from \"@/components/ui/animated-theme-toggler\"\n```\n\n```tsx showLineNumbers\n<AnimatedThemeToggler />\n```\n\n## Props\n\n| Prop        | Type     | Default | Description                                                |\n| ----------- | -------- | ------- | ---------------------------------------------------------- |\n| `className` | `String` | \" \"     | Additional classes to be added to the component            |\n| `duration`  | `Number` | `400`   | Duration of the theme transition animation in milliseconds |\n\n## Credits\n\n- Credit to [Nazam Kalsi](https://nazam-kalsi-portfolio.vercel.app)\n"
  },
  {
    "path": "apps/www/content/docs/components/aurora-text.mdx",
    "content": "---\ntitle: Aurora Text\ndate: 2025-01-12\ndescription: A beautiful aurora text effect\nauthor: Dillon\npublished: true\n---\n\n<ComponentPreview name=\"aurora-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/aurora-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"aurora-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-25}\n@theme inline {\n  --animate-aurora: aurora 8s ease-in-out infinite alternate;\n\n  @keyframes aurora {\n    0% {\n      background-position: 0% 50%;\n      transform: rotate(-5deg) scale(0.9);\n    }\n    25% {\n      background-position: 50% 100%;\n      transform: rotate(5deg) scale(1.1);\n    }\n    50% {\n      background-position: 100% 50%;\n      transform: rotate(-3deg) scale(0.95);\n    }\n    75% {\n      background-position: 50% 0%;\n      transform: rotate(3deg) scale(1.05);\n    }\n    100% {\n      background-position: 0% 50%;\n      transform: rotate(-5deg) scale(0.9);\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AuroraText } from \"@/components/ui/aurora-text\"\n```\n\n```tsx showLineNumbers\n<AuroraText>Aurora Text</AuroraText>\n```\n\n## Props\n\n| Prop        | Type        | Default                                         | Description                                                   |\n| ----------- | ----------- | ----------------------------------------------- | ------------------------------------------------------------- |\n| `className` | `string`    | `\"\"`                                            | The class name to be applied to the component                 |\n| `children`  | `ReactNode` | `-`                                             | Children elements                                             |\n| `colors`    | `string[]`  | ` [\"#FF0080\", \"#7928CA\", \"#0070F3\", \"#38bdf8\"]` | Array of colors used for the aurora effect                    |\n| `speed`     | `number`    | `1`                                             | Animation speed multiplier (1 is default, 2 is twice as fast) |\n"
  },
  {
    "path": "apps/www/content/docs/components/avatar-circles.mdx",
    "content": "---\ntitle: Avatar Circles\ndate: 2024-05-22\ndescription: Overlapping circles of avatars.\nauthor: tomonarifeehan\npublished: true\n---\n\n<ComponentPreview name=\"avatar-circles-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/avatar-circles\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"avatar-circles\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { AvatarCircles } from \"@/components/ui/avatar-circles\"\n```\n\n```tsx showLineNumbers\n<AvatarCircles\n  numPeople={99}\n  avatarUrls={[\n    {\n      imageUrl: \"https://avatars.githubusercontent.com/u/16860528\",\n      profileUrl: \"https://github.com/dillionverma\",\n    },\n  ]}\n/>\n```\n\n## Props\n\n| Prop        | Type     | Default | Description                                   |\n| ----------- | -------- | ------- | --------------------------------------------- |\n| `className` | `string` | `-`     | The class name to be applied to the component |\n| `numPeople` | `number` | `99`    | The number appearing in the last circle       |\n"
  },
  {
    "path": "apps/www/content/docs/components/bento-grid.mdx",
    "content": "---\ntitle: Bento Grid\ndate: 2023-11-09\ndescription: Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"bento-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/bento-grid\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"bento-grid\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n<ComponentPreview name=\"bento-demo-vertical\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { BentoCard, BentoGrid } from \"@/components/ui/bento-grid\"\n```\n\n```tsx showLineNumbers\n<BentoGrid>\n  <BentoCard />\n</BentoGrid>\n```\n"
  },
  {
    "path": "apps/www/content/docs/components/blur-fade.mdx",
    "content": "---\ntitle: Blur Fade\ndate: 2024-07-07\ndescription: Blur fade in and out animation. Used to smoothly fade in and out content.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"blur-fade-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/blur-fade\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"blur-fade\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n<ComponentPreview name=\"blur-fade-text-demo\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { BlurFade } from \"@/components/ui/blur-fade\"\n```\n\n```tsx showLineNumbers\n<BlurFade>\n  <img src=\"https://picsum.photos/300/200?random=1\" alt=\"Sample 1\" />\n  <img src=\"https://picsum.photos/300/200?random=2\" alt=\"Sample 2\" />\n  <img src=\"https://picsum.photos/300/200?random=3\" alt=\"Sample 3\" />\n</BlurFade>\n```\n\n## Props\n\n| Prop           | Type              | Default   | Description                                                 |\n| -------------- | ----------------- | --------- | ----------------------------------------------------------- |\n| `children`     | `React.ReactNode` | `-`       | The content to be animated                                  |\n| `className`    | `string`          | `-`       | The class name to be applied to the component               |\n| `variant`      | `object`          | `-`       | Custom animation variants for motion component              |\n| `duration`     | `number`          | `0.4`     | Duration (seconds) for the animation                        |\n| `delay`        | `number`          | `0`       | Delay (seconds) before the animation starts                 |\n| `offset`       | `number`          | `6`       | Offset for the animation                                    |\n| `direction`    | `string`          | `\"down\"`  | Direction for the animation (`up`, `down`, `left`, `right`) |\n| `inView`       | `boolean`         | `false`   | Whether to trigger animation when component is in view      |\n| `inViewMargin` | `MarginType`      | `\"-50px\"` | Margin for triggering the in-view animation                 |\n| `blur`         | `string`          | `\"6px\"`   | Amount of blur to apply during the animation                |\n"
  },
  {
    "path": "apps/www/content/docs/components/border-beam.mdx",
    "content": "---\ntitle: Border Beam\ndate: 2024-02-06\ndescription: An animated beam of light which travels along the border of its container.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/border-beam.mp4\n---\n\n<ComponentPreview name=\"border-beam-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/border-beam\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"border-beam\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### 2 Border Beams\n\n<ComponentPreview name=\"border-beam-demo-2\" />\n\n### Reverse\n\n<ComponentPreview name=\"border-beam-demo-3\" />\n\n### Spring Animation\n\n<ComponentPreview name=\"border-beam-demo-4\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { BorderBeam } from \"@/components/ui/border-beam\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <BorderBeam />\n</div>\n```\n\n## Props\n\n### Border Beam\n\n| Prop            | Type                  | Default   | Description                            |\n| --------------- | --------------------- | --------- | -------------------------------------- |\n| `className`     | `string`              | `-`       | Custom class to apply to the component |\n| `size`          | `number`              | `50`      | Size of the beam                       |\n| `duration`      | `number`              | `6`       | Duration of the animation in seconds   |\n| `delay`         | `number`              | `0`       | Delay before the animation starts      |\n| `colorFrom`     | `string`              | `#ffaa40` | Start color of the beam gradient       |\n| `colorTo`       | `string`              | `#9c40ff` | End color of the beam gradient         |\n| `transition`    | `Transition`          | `-`       | Custom motion transition configuration |\n| `style`         | `React.CSSProperties` | `-`       | Custom CSS styles to apply             |\n| `reverse`       | `boolean`             | `false`   | Whether to reverse animation direction |\n| `initialOffset` | `number`              | `0`       | Initial offset position (0-100)        |\n| `borderWidth`   | `number`              | `1`       | Border width of the beam               |\n"
  },
  {
    "path": "apps/www/content/docs/components/code-comparison.mdx",
    "content": "---\ntitle: Code Comparison\ndate: 2024-10-02\ndescription: A component which compares two code snippets.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"code-comparison-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/code-comparison\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"code-comparison\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { CodeComparison } from \"@/components/ui/code-comparison\"\n```\n\n```tsx showLineNumbers\n<CodeComparison beforeCode={beforeCode} afterCode={afterCode} />\n```\n\n## Props\n\n| Prop             | Type     | Default                     | Description                                            |\n| ---------------- | -------- | --------------------------- | ------------------------------------------------------ |\n| `className`      | `string` | `-`                         | The class name to be applied to the component          |\n| `beforeCode`     | `string` | `-`                         | The code snippet to display in the \"before\" section    |\n| `afterCode`      | `string` | `-`                         | The code snippet to display in the \"after\" section     |\n| `language`       | `string` | `-`                         | The language of the code snippets (e.g., \"typescript\") |\n| `filename`       | `string` | `-`                         | The filename to display for the code snippets          |\n| `lightTheme`     | `string` | `github-light`              | The theme to use for light mode                        |\n| `darkTheme`      | `string` | `github-dark`               | The theme to use for dark mode                         |\n| `highlightColor` | `string` | `rgba(101, 117, 133, 0.16)` | The color to use for highlighting the code snippets    |\n"
  },
  {
    "path": "apps/www/content/docs/components/comic-text.mdx",
    "content": "---\ntitle: Comic Text\ndate: 2025-07-15\ndescription: Comic text animation that looks like a comic book text\nauthor: iambharathpadhu\npublished: true\n---\n\n<ComponentPreview name=\"comic-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/comic-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"comic-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { ComicText } from \"@/components/ui/comic-text\"\n```\n\n```tsx showLineNumbers\n<ComicText>Comic Text</ComicText>\n```\n\n## Props\n\n| Prop        | Type            | Default   | Description                                   |\n| ----------- | --------------- | --------- | --------------------------------------------- |\n| `className` | `string`        | `-`       | The class name to be applied to the component |\n| `fontSize`  | `number`        | `4`       | The font size of the text                     |\n| `style`     | `CSSProperties` | `#ffffff` | The style of the text                         |\n| `children`  | `string`        | `-`       | The text to be displayed                      |\n\n## Credits\n\n- Credit to [@iambharathpadhu](https://github.com/iambharathpadhu)\n"
  },
  {
    "path": "apps/www/content/docs/components/confetti.mdx",
    "content": "---\ntitle: Confetti\ndate: 2024-05-26\ndescription: Confetti animations are best used to delight your users when something special happens\nauthor: Bankkroll\npublished: true\n---\n\n<ComponentPreview name=\"confetti-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/confetti\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the following dependencies:</Step>\n\n```bash\nnpm install canvas-confetti\n```\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"confetti\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Basic\n\n<ComponentPreview name=\"confetti-basic-cannon\" />\n\n### Random Direction\n\n<ComponentPreview name=\"confetti-random-direction\" />\n\n### Fireworks\n\n<ComponentPreview name=\"confetti-fireworks\" />\n\n### Side Cannons\n\n<ComponentPreview name=\"confetti-side-cannons\" />\n\n### Stars\n\n<ComponentPreview name=\"confetti-stars\" />\n\n### Custom Shapes\n\n<ComponentPreview name=\"confetti-custom-shapes\" />\n\n### Emoji\n\n<ComponentPreview name=\"confetti-emoji\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { Confetti } from \"@/components/ui/confetti\"\n```\n\n```tsx showLineNumbers\n<Confetti />\n```\n\n## Props\n\n### Confetti\n\n| Prop                      | Type                        | Default                                                                         | Description                                      |\n| ------------------------- | --------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------ |\n| `particleCount`           | `Integer`                   | `50`                                                                            | The number of confetti particles to launch       |\n| `angle`                   | `Number`                    | `90`                                                                            | The angle in degrees at which to launch confetti |\n| `spread`                  | `Number`                    | `45`                                                                            | The spread in degrees of the confetti            |\n| `startVelocity`           | `Number`                    | `45`                                                                            | The initial velocity of the confetti             |\n| `decay`                   | `Number`                    | `0.9`                                                                           | The rate at which confetti slows down            |\n| `gravity`                 | `Number`                    | `1`                                                                             | The gravity applied to confetti particles        |\n| `drift`                   | `Number`                    | `0`                                                                             | The horizontal drift applied to particles        |\n| `flat`                    | `Boolean`                   | `false`                                                                         | Whether confetti particles are flat              |\n| `ticks`                   | `Number`                    | `200`                                                                           | The number of frames confetti lasts              |\n| `origin`                  | `Object`                    | `{ x: 0.5, y: 0.5 }`                                                            | The origin point of the confetti                 |\n| `colors`                  | `Array of Strings`          | `['#26ccff', '#a25afd', '#ff5e7e', '#88ff5a', '#fcff42', '#ffa62d', '#ff36ff']` | Array of color strings in HEX format             |\n| `shapes`                  | `Array of Strings`          | `['square', 'circle', 'star']`                                                  | Array of shapes for the confetti                 |\n| `zIndex`                  | `Integer`                   | `100`                                                                           | The z-index of the confetti                      |\n| `disableForReducedMotion` | `Boolean`                   | `false`                                                                         | Disables confetti for users who prefer no motion |\n| `useWorker`               | `Boolean`                   | `true`                                                                          | Use Web Worker for better performance            |\n| `resize`                  | `Boolean`                   | `true`                                                                          | Whether to resize the canvas                     |\n| `canvas`                  | `HTMLCanvasElement or null` | `null`                                                                          | Custom canvas element to draw confetti           |\n| `scalar`                  | `Number`                    | `1`                                                                             | Scaling factor for confetti size                 |\n\n### ConfettiButton\n\n| Prop       | Type              | Default | Description                          |\n| ---------- | ----------------- | ------- | ------------------------------------ |\n| `options`  | `Object`          | `{}`    | Options for the confetti             |\n| `children` | `React.ReactNode` | `null`  | Children to render inside the button |\n\n## Credits\n\n- Credit to [Bankk](https://www.x.com/bankkroll_eth)\n- Inspired by [canvas-confetti](https://www.npmjs.com/package/canvas-confetti)\n"
  },
  {
    "path": "apps/www/content/docs/components/cool-mode.mdx",
    "content": "---\ntitle: Cool Mode\ndate: 2024-06-01\ndescription: Cool mode effect for buttons, links, and other DOMs\nauthor: Bankkroll\npublished: true\n---\n\n<ComponentPreview name=\"cool-mode-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/cool-mode\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"cool-mode\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Custom Particle\n\n<ComponentPreview name=\"cool-mode-custom\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { CoolMode } from \"@/components/ui/cool-mode\"\n```\n\n```tsx showLineNumbers\n<CoolMode>\n  <button>Click me</button>\n</CoolMode>\n```\n\n## Props\n\n| Prop            | Type     | Default    | Description                            |\n| --------------- | -------- | ---------- | -------------------------------------- |\n| `particle`      | `String` | `\"circle\"` | The particle URL for a custom particle |\n| `size`          | `Number` | `Varies`   | Size of the particle                   |\n| `particleCount` | `Number` | `Varies`   | The number of particles to generate    |\n| `speedHorz`     | `Number` | `Varies`   | Horizontal speed of the particles      |\n| `speedUp`       | `Number` | `Varies`   | Upward speed of the particles          |\n\n## Credits\n\n- Credit to [Bankk](https://www.x.com/bankkroll_eth)\n- Inspired by [ClickFusion](https://github.com/BankkRoll/ClickFusion)\n"
  },
  {
    "path": "apps/www/content/docs/components/dock.mdx",
    "content": "---\ntitle: Dock\ndate: 2024-04-25\ndescription: An implementation of the MacOS dock using react + tailwindcss + framer motion\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/dock.mp4\n---\n\n<ComponentPreview name=\"dock-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/dock\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"dock\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Custom Direction\n\n<ComponentPreview name=\"dock-demo-2\" />\n\n### Custom magnification\n\n<ComponentPreview name=\"dock-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Home, Search, Settings } from \"lucide-react\"\n\nimport { Dock, DockIcon } from \"@/components/ui/dock\"\n```\n\n```tsx showLineNumbers\n<Dock>\n  <DockIcon>\n    <Home />\n  </DockIcon>\n  <DockIcon>\n    <Settings />\n  </DockIcon>\n  <DockIcon>\n    <Search />\n  </DockIcon>\n</Dock>\n```\n\n## Props\n\n### Dock\n\n| Prop                   | Type        | Default    | Description                          |\n| ---------------------- | ----------- | ---------- | ------------------------------------ |\n| `className`            | `string`    | `-`        | Custom CSS class for styling         |\n| `children`             | `ReactNode` | `-`        | Children elements                    |\n| `iconSize`             | `number`    | `40`       | Size of the icon                     |\n| `iconMagnification`    | `number`    | `60`       | Level of icon magnification          |\n| `iconDistance`         | `number`    | `140`      | Distance from cursor to magnify icon |\n| `direction`            | `string`    | `\"middle\"` | Direction of the dock                |\n| `disableMagnification` | `boolean`   | `false`    | Disable Magnification on hover       |\n\n### DockIcon\n\n| Prop            | Type                | Default | Description                          |\n| --------------- | ------------------- | ------- | ------------------------------------ |\n| `size`          | `number`            | `40`    | Size of the icon                     |\n| `magnification` | `number`            | `60`    | Level of icon magnification          |\n| `distance`      | `number`            | `140`   | Distance from cursor to magnify icon |\n| `mouseX`        | `any`               | `-`     | Mouse X position for magnification   |\n| `className`     | `string`            | `-`     | Custom CSS class for styling         |\n| `children`      | `React.ReactNode`   | `-`     | Children elements                    |\n| `props`         | `PropsWithChildren` | `-`     | Additional props                     |\n\n## Credits\n\n- Credits to [Build UI](https://buildui.com/recipes/magnified-dock) for this fantastic component\n- Credits to [Ritesh Bucha](https://twitter.com/bucha_ritesh) for finding and improving it\n"
  },
  {
    "path": "apps/www/content/docs/components/dot-pattern.mdx",
    "content": "---\ntitle: Dot Pattern\ndate: 2023-07-20\ndescription: A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/dot-pattern.mp4\n---\n\n<ComponentPreview name=\"dot-pattern-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/dot-pattern\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"dot-pattern\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Linear Gradient\n\n<ComponentPreview name=\"dot-pattern-linear-gradient\" />\n\n### With Glow Effect\n\n<ComponentPreview name=\"dot-pattern-with-glow-effect\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { DotPattern } from \"@/components/ui/dot-pattern\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <DotPattern />\n</div>\n```\n\n## Props\n\n### Dot Pattern\n\n| Prop        | Type      | Default | Description                                  |\n| ----------- | --------- | ------- | -------------------------------------------- |\n| `width`     | `any`     | `16`    | Width of the dot pattern                     |\n| `height`    | `any`     | `16`    | Height of the dot pattern                    |\n| `x`         | `any`     | `0`     | X position of the dot                        |\n| `y`         | `any`     | `0`     | Y position of the dot                        |\n| `cx`        | `any`     | `1`     | X position of the circle                     |\n| `cy`        | `any`     | `1`     | Y position of the circle                     |\n| `cr`        | `any`     | `1`     | Radius of the circle                         |\n| `className` | `string`  | `-`     | Class name of the dot pattern                |\n| `glow`      | `boolean` | `false` | Activates the glow effect in the dot pattern |\n"
  },
  {
    "path": "apps/www/content/docs/components/dotted-map.mdx",
    "content": "---\ntitle: Dotted Map\ndate: 2025-12-31\ndescription: A component with a svg dotted map.\nauthor: dillionverma, Yeom-JinHo\npublished: true\n---\n\n<ComponentPreview name=\"dotted-map-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/dotted-map\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"dotted-map\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Smaller Dots\n\n<ComponentPreview name=\"dotted-map-demo-2\" />\n\n### PulseMarker\n\n<ComponentPreview name=\"dotted-map-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { DottedMap, type Marker } from \"@/components/ui/dotted-map\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[400px] w-full overflow-hidden rounded-xl border\">\n  <DottedMap />\n</div>\n```\n\n### With Custom Markers\n\n```tsx showLineNumbers\nimport { DottedMap, type Marker } from \"@/components/ui/dotted-map\"\nimport type { TCountryCode } from \"countries-list\"\n\ntype CountryCode = Lowercase<TCountryCode>\n\ntype MyMarker = Marker & {\n  overlay: {\n    countryCode: CountryCode\n    label: string\n  }\n}\n\nconst markers: MyMarker[] = [\n  {\n    lat: 37.5665,\n    lng: 126.978,\n    size: 2.8,\n    overlay: { countryCode: \"kr\", label: \"Seoul\" },\n  },\n]\n\n<DottedMap<MyMarker>\n  markers={markers}\n  renderMarkerOverlay={({ marker, x, y, r }) => {\n    // Custom overlay rendering\n    return <text x={x} y={y}>{marker.overlay.label}</text>\n  }}\n/>\n```\n\n## Props\n\n| Prop                  | Type                  | Default     | Description                                                    |\n| --------------------- | --------------------- | ----------- | -------------------------------------------------------------- |\n| `width`               | `number`              | `150`       | Width of the SVG map.                                          |\n| `height`              | `number`              | `75`        | Height of the SVG map.                                         |\n| `mapSamples`          | `number`              | `5000`      | Number of sample points for map generation.                    |\n| `markers`             | `Marker[]`            | `[]`        | Array of markers to display on the map.                        |\n| `dotColor`            | `string`              | `undefined` | Color of the map dots (uses currentColor if not set).          |\n| `markerColor`         | `string`              | `\"#FF6900\"` | Color of the markers.                                          |\n| `dotRadius`           | `number`              | `0.2`       | Radius of the map dots.                                        |\n| `stagger`             | `boolean`             | `true`      | Whether to stagger dots in alternating rows for visual effect. |\n| `pulse`               | `boolean`             | `false`     | Enables built-in pulse animation for markers.                  |\n| `renderMarkerOverlay` | `(args) => ReactNode` | `undefined` | Custom render function for marker overlays.                    |\n| `className`           | `string`              | `undefined` | Additional class names applied to the SVG.                     |\n| `style`               | `React.CSSProperties` | `undefined` | Inline styles merged into the SVG.                             |\n\n## Types\n\n### Marker\n\n```tsx\nexport interface Marker {\n  lat: number\n  lng: number\n  size?: number\n  pulse?: boolean\n}\n```\n\nSet `pulse` on `DottedMap` to animate all markers (and use `marker.pulse = false` to opt out per marker). Without the `pulse` prop, only markers with `marker.pulse = true` will pulse.\n\nThe `DottedMap` component supports generic types, allowing you to extend the `Marker` interface with custom properties:\n\n```tsx\nimport type { TCountryCode } from \"countries-list\"\n\ntype CountryCode = Lowercase<TCountryCode>\n\ntype MyMarker = Marker & {\n  overlay: {\n    countryCode: CountryCode\n    label: string\n  }\n}\n;<DottedMap<MyMarker> markers={markers} />\n```\n"
  },
  {
    "path": "apps/www/content/docs/components/file-tree.mdx",
    "content": "---\ntitle: File Tree\ndate: 2023-07-20\ndescription: A component used to showcase the folder and file structure of a directory.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"file-tree-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/file-tree\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"file-tree\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Tree } from \"@/components/ui/file-tree\"\nimport type { TreeViewElement } from \"@/components/ui/file-tree\"\n```\n\n```tsx showLineNumbers\nconst elements: TreeViewElement[] = [\n  {\n    id: \"src\",\n    type: \"folder\",\n    name: \"src\",\n    children: [\n      { id: \"components\", type: \"folder\", name: \"components\" },\n      { id: \"app\", type: \"folder\", name: \"app\" },\n      { id: \"page\", name: \"page.tsx\" },\n      { id: \"layout\", name: \"layout.tsx\" },\n    ],\n  },\n]\n\n<Tree elements={elements} />\n```\n\nWhen you pass `elements` and omit `children`, the tree is rendered from data and siblings are sorted automatically using a folders-first alphabetical order. Use `sort=\"none\"` to preserve the input order, or pass a custom comparator.\n\n## Props\n\n### Tree\n\n| Prop                   | Type                                        | Default     | Description                                                           |\n| ---------------------- | ------------------------------------------- | ----------- | --------------------------------------------------------------------- |\n| `initialSelectedId`    | `string`                                    | `-`         | The ID of the initially selected item.                                |\n| `indicator`            | `boolean`                                   | `true`      | Whether to show the tree indicator line.                              |\n| `elements`             | `TreeViewElement[]`                         | `-`         | An array of tree view elements to render when `children` are omitted. |\n| `initialExpandedItems` | `string[]`                                  | `-`         | An array of IDs for items that should be initially expanded.          |\n| `openIcon`             | `React.ReactNode`                           | `-`         | Custom icon for open folders.                                         |\n| `closeIcon`            | `React.ReactNode`                           | `-`         | Custom icon for closed folders.                                       |\n| `sort`                 | `\"default\" \\| \"none\" \\| ((a, b) => number)` | `\"default\"` | Sorting mode used for data-driven trees rendered from `elements`.     |\n| `dir`                  | `\"rtl\" \\| \"ltr\"`                            | `\"ltr\"`     | The text direction of the tree.                                       |\n\n### TreeViewElement\n\n| Prop           | Type                 | Default | Description                                           |\n| -------------- | -------------------- | ------- | ----------------------------------------------------- |\n| `id`           | `string`             | `-`     | A unique identifier for the node.                     |\n| `name`         | `string`             | `-`     | The label rendered for the node in data-driven mode.  |\n| `type`         | `\"file\" \\| \"folder\"` | `-`     | Explicit node type. Use `\"folder\"` for empty folders. |\n| `isSelectable` | `boolean`            | `true`  | Whether the node can be selected.                     |\n| `children`     | `TreeViewElement[]`  | `-`     | Child nodes for folders.                              |\n\n### Folder\n\n| Prop           | Type      | Default | Description                               |\n| -------------- | --------- | ------- | ----------------------------------------- |\n| `element`      | `string`  | `-`     | The name of the folder.                   |\n| `value`        | `string`  | `-`     | The unique identifier for the folder.     |\n| `isSelectable` | `boolean` | `true`  | Whether the folder can be selected.       |\n| `isSelect`     | `boolean` | `-`     | Whether the folder is currently selected. |\n\n### File\n\n| Prop           | Type              | Default | Description                             |\n| -------------- | ----------------- | ------- | --------------------------------------- |\n| `value`        | `string`          | `-`     | The unique identifier for the file.     |\n| `isSelectable` | `boolean`         | `true`  | Whether the file can be selected.       |\n| `isSelect`     | `boolean`         | `-`     | Whether the file is currently selected. |\n| `fileIcon`     | `React.ReactNode` | `-`     | Custom icon for the file.               |\n\n### CollapseButton\n\n| Prop        | Type                | Default | Description                                |\n| ----------- | ------------------- | ------- | ------------------------------------------ |\n| `elements`  | `TreeViewElement[]` | `-`     | An array of tree view elements to control. |\n| `expandAll` | `boolean`           | `false` | Whether to expand all elements initially.  |\n"
  },
  {
    "path": "apps/www/content/docs/components/flickering-grid.mdx",
    "content": "---\ntitle: Flickering Grid\ndate: 2024-08-15\ndescription: A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"flickering-grid-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/flickering-grid\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"flickering-grid\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Rounded\n\n<ComponentPreview name=\"flickering-grid-rounded-demo\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { FlickeringGrid } from \"@/components/ui/flickering-grid\"\n```\n\n```tsx showLineNumbers\n<FlickeringGrid />\n```\n\n## Props\n\n| Prop            | Type     | Default          | Description                           |\n| --------------- | -------- | ---------------- | ------------------------------------- |\n| `squareSize`    | `number` | `4`              | Size of each square in the grid       |\n| `gridGap`       | `number` | `6`              | Gap between squares in the grid       |\n| `flickerChance` | `number` | `0.3`            | Probability of a square flickering    |\n| `color`         | `string` | `\"rgb(0, 0, 0)\"` | Color of the squares                  |\n| `width`         | `number` | `-`              | Width of the canvas                   |\n| `height`        | `number` | `-`              | Height of the canvas                  |\n| `className`     | `string` | `-`              | Additional CSS classes for the canvas |\n| `maxOpacity`    | `number` | `0.2`            | Maximum opacity of the squares        |\n"
  },
  {
    "path": "apps/www/content/docs/components/globe.mdx",
    "content": "---\ntitle: Globe\ndate: 2023-08-02\ndescription: An autorotating, interactive, and highly performant globe made using WebGL.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/globe.mp4\n---\n\n<ComponentPreview name=\"globe-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/globe\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the following dependencies:</Step>\n\n```bash\nnpm install cobe motion\n```\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"globe\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Globe } from \"@/components/ui/globe\"\n```\n\n```tsx showLineNumbers\n<Globe />\n```\n\n## Props\n\n| Prop        | Type          | Default | Description                                                                                    |\n| ----------- | ------------- | ------- | ---------------------------------------------------------------------------------------------- |\n| `className` | `string`      | `-`     | The css classes for the component                                                              |\n| `config`    | `COBEOptions` | `{}`    | The configuration options for the globe. More details [here](https://cobe.vercel.app/docs/api) |\n\n## Credits\n\nThis component is built on top of [Cobe](https://cobe.vercel.app/docs/api).\n"
  },
  {
    "path": "apps/www/content/docs/components/grid-pattern.mdx",
    "content": "---\ntitle: Grid Pattern\ndate: 2023-07-18\ndescription: A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/grid-pattern.mp4\n---\n\n<ComponentPreview name=\"grid-pattern-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/grid-pattern\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"grid-pattern\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Linear Gradient\n\n<ComponentPreview name=\"grid-pattern-linear-gradient\" />\n\n### Dashed Stroke\n\n<ComponentPreview name=\"grid-pattern-dashed\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { GridPattern } from \"@/components/ui/grid-pattern\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <GridPattern />\n</div>\n```\n\n## Props\n\n### GridPattern\n\n| Prop              | Type     | Default | Description                                   |\n| ----------------- | -------- | ------- | --------------------------------------------- |\n| `width`           | `number` | `40`    | Width of the pattern                          |\n| `height`          | `number` | `40`    | Height of the pattern                         |\n| `x`               | `number` | `-1`    | X offset of the pattern                       |\n| `y`               | `number` | `-1`    | Y offset of the pattern                       |\n| `squares`         | `number` | `[]`    | X Y coordinates of filled squares as 2D array |\n| `strokeDasharray` | `string` | `0`     | Stroke dash array for the pattern             |\n"
  },
  {
    "path": "apps/www/content/docs/components/hero-video-dialog.mdx",
    "content": "---\ntitle: Hero Video Dialog\ndate: 2024-08-26\ndescription: A hero video dialog component.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"hero-video-dialog-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/hero-video-dialog\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"hero-video-dialog\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Top-in-bottom-out\n\n<ComponentPreview name=\"hero-video-dialog-demo-top-in-bottom-out\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { HeroVideoDialog } from \"@/components/ui/hero-video-dialog\"\n```\n\n```tsx showLineNumbers\n<HeroVideoDialog\n  className=\"block dark:hidden\"\n  animationStyle=\"from-center\"\n  videoSrc=\"https://www.example.com/dummy-video\"\n  thumbnailSrc=\"https://www.example.com/dummy-thumbnail.png\"\n  thumbnailAlt=\"Dummy Video Thumbnail\"\n/>\n```\n\n## Props\n\n| Prop             | Type     | Default             | Description                      |\n| ---------------- | -------- | ------------------- | -------------------------------- |\n| `animationStyle` | `string` | `\"from-center\"`     | Animation style for the dialog   |\n| `videoSrc`       | `string` | `-`                 | URL of the video to be played    |\n| `thumbnailSrc`   | `string` | `-`                 | URL of the thumbnail image       |\n| `thumbnailAlt`   | `string` | `\"Video thumbnail\"` | Alt text for the thumbnail image |\n\n## Animation Styles\n\nThe `animationStyle` prop accepts the following values:\n\n- `\"from-bottom\"`: Dialog enters from the bottom and exits to the bottom\n- `\"from-center\"`: Dialog scales up from the center and scales down to the center\n- `\"from-top\"`: Dialog enters from the top and exits to the top\n- `\"from-left\"`: Dialog enters from the left and exits to the left\n- `\"from-right\"`: Dialog enters from the right and exits to the right\n- `\"fade\"`: Dialog fades in and out\n- `\"top-in-bottom-out\"`: Dialog enters from the top and exits to the bottom\n- `\"left-in-right-out\"`: Dialog enters from the left and exits to the right\n\n## Note\n\n- If using a YouTube video, make sure to use the `embed` version of the video URL.\n"
  },
  {
    "path": "apps/www/content/docs/components/highlighter.mdx",
    "content": "---\ntitle: Text Highlighter\ndate: 2025-02-11\ndescription: A text highlighter that mimics the effect of a human-drawn marker stroke.\nauthor: pratiyank\npublished: true\n---\n\n<ComponentPreview name=\"highlighter-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/highlighter\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"highlighter\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Highlighter } from \"@/components/ui/highlighter\"\n```\n\n```tsx showLineNumbers\n<p>\n  The{\" \"}\n  <Highlighter action=\"underline\" color=\"#FF9800\">\n    Magic UI Highlighter\n  </Highlighter>{\" \"}\n  makes important{\" \"}\n  <Highlighter action=\"highlight\" color=\"#87CEFA\">\n    text stand out\n  </Highlighter>{\" \"}\n  effortlessly.\n</p>\n```\n\n## Props\n\nHere's the updated props table with units specified for the numerical values:\n\n| Prop                | Type                                                                                                | Default       | Description                                                                  |\n| ------------------- | --------------------------------------------------------------------------------------------------- | ------------- | ---------------------------------------------------------------------------- |\n| `children`          | `React.ReactNode`                                                                                   | Required      | The content to be highlighted/annotated.                                     |\n| `color`             | `string`                                                                                            | `\"#ffd1dc\"`   | The color of the highlight.                                                  |\n| `action`            | `\"highlight\" \\| \"circle\" \\| \"box\" \\| \"bracket\" \\| \"crossed-off\" \\| \"strike-through\" \\| \"underline\"` | `\"highlight\"` | The type of annotation effect to apply.                                      |\n| `strokeWidth`       | `number`                                                                                            | `1.5px`       | The width of the annotation stroke.                                          |\n| `animationDuration` | `number`                                                                                            | `500ms`       | Duration of the animation in milliseconds.                                   |\n| `iterations`        | `number`                                                                                            | `2`           | Number of times to draw the annotation (adds a sketchy effect when > 1).     |\n| `padding`           | `number`                                                                                            | `2px`         | Padding between the element and the annotation.                              |\n| `multiline`         | `boolean`                                                                                           | `true`        | Whether to annotate across multiple lines or treat content as a single line. |\n| `isView`            | `boolean`                                                                                           | `false`       | Controls whether the animation starts only when the element enters viewport. |\n\n## Credits\n\n- Credit to [@pratiyank](https://github.com/Pratiyankkumar) for this component!\n"
  },
  {
    "path": "apps/www/content/docs/components/hyper-text.mdx",
    "content": "---\ntitle: Hyper Text\ndate: 2024-08-03\ndescription: A text animation that scrambles letters before revealing the final text.\nauthor: SwayambhuPrasad\npublished: true\n---\n\n<ComponentPreview name=\"hyper-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/hyper-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the following dependencies:</Step>\n\n```bash\nnpm install motion\n```\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"hyper-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { HyperText } from \"@/components/ui/hyper-text\"\n```\n\n```tsx showLineNumbers\n<HyperText>Hover me</HyperText>\n```\n\n## Props\n\n| Prop             | Type                                                                                                       | Default | Description                                   |\n| ---------------- | ---------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------- |\n| `children`       | `string`                                                                                                   | `-`     | Text content to animate                       |\n| `className`      | `string`                                                                                                   | `-`     | The class name to be applied to the component |\n| `duration`       | `number`                                                                                                   | `800`   | Duration of the animation in milliseconds     |\n| `delay`          | `number`                                                                                                   | `0`     | Delay before animation starts (in ms)         |\n| `as`             | `\"article\" \\| \"div\" \\| \"h1\" \\| \"h2\" \\| \"h3\" \\| \"h4\" \\| \"h5\" \\| \"h6\" \\| \"li\" \\| \"p\" \\| \"section\" \\| \"span\"` | `\"div\"` | Component to render as                        |\n| `startOnView`    | `boolean`                                                                                                  | `false` | Start animation when component is in view     |\n| `animateOnHover` | `boolean`                                                                                                  | `true`  | Enable hover animation                        |\n| `characterSet`   | `string[]`                                                                                                 | `A-Z`   | Custom character set for scramble effect      |\n"
  },
  {
    "path": "apps/www/content/docs/components/icon-cloud.mdx",
    "content": "---\ntitle: Icon Cloud\ndate: 2024-05-24\ndescription: An interactive 3D tag cloud component\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"icon-cloud-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/icon-cloud\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"icon-cloud\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## With Images\n\n<ComponentPreview name=\"icon-cloud-demo-2\" />\n\n## With SVG Icons\n\n<ComponentPreview name=\"icon-cloud-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { IconCloud } from \"@/components/ui/icon-cloud\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative overflow-hidden\">\n  <IconCloud images={images} />\n</div>\n```\n\n## Props\n\n| Prop     | Type                | Default | Description                                |\n| -------- | ------------------- | ------- | ------------------------------------------ |\n| `icons`  | `React.ReactNode[]` | `[]`    | Array of icons to render in the cloud      |\n| `images` | `string[]`          | `[]`    | Array of image URLs to render in the cloud |\n"
  },
  {
    "path": "apps/www/content/docs/components/index.mdx",
    "content": "---\ntitle: Components\ndescription: Here you can find all the components available in the library.\n---\n\n<ComponentsList />\n"
  },
  {
    "path": "apps/www/content/docs/components/interactive-grid-pattern.mdx",
    "content": "---\ntitle: Interactive Grid Pattern\ndate: 2024-12-31\ndescription: A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\nauthor: h3rmel\npublished: true\n---\n\n<ComponentPreview name=\"interactive-grid-pattern-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/interactive-grid-pattern\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"interactive-grid-pattern\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Colorful\n\n<ComponentPreview name=\"interactive-grid-pattern-demo-2\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { InteractiveGridPattern } from \"@/components/ui/interactive-grid-pattern\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <InteractiveGridPattern />\n</div>\n```\n\n## Props\n\n| Prop               | Type               | Default   | Description                                                                                   |\n| ------------------ | ------------------ | --------- | --------------------------------------------------------------------------------------------- |\n| `width`            | `number`           | `40`      | Width of each square in the grid                                                              |\n| `height`           | `number`           | `40`      | Height of each square in the grid                                                             |\n| `squares`          | `[number, number]` | `[24,24]` | Number of squares in the grid. First number is horizontal squares, second is vertical squares |\n| `className`        | `string`           | `-`       | Class name applied to the grid container                                                      |\n| `squaresClassName` | `string`           | `-`       | Class name applied to individual squares in the grid                                          |\n"
  },
  {
    "path": "apps/www/content/docs/components/interactive-hover-button.mdx",
    "content": "---\ntitle: Interactive Hover Button\ndate: 2024-12-17\ndescription: A visually engaging button component that responds to hover with dynamic transitions, adapting smoothly between light and dark modes for enhanced user interactivity.\nauthor: aayushbharti\npublished: true\n---\n\n<ComponentPreview name=\"interactive-hover-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/interactive-hover-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"interactive-hover-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { InteractiveHoverButton } from \"@/components/ui/interactive-hover-button\"\n```\n\n```tsx showLineNumbers\n<InteractiveHoverButton>Interactive Hover Button</InteractiveHoverButton>\n```\n\n## Props\n\n| Prop        | Type     | Default  | Description                                   |\n| ----------- | -------- | -------- | --------------------------------------------- |\n| `text`      | `string` | `Button` | The text to be displayed inside the button    |\n| `className` | `string` | `-`      | Additional class names to style the component |\n\n## Credits\n\n- Credit to [@AayushBharti](https://github.com/AayushBharti)\n"
  },
  {
    "path": "apps/www/content/docs/components/iphone.mdx",
    "content": "---\ntitle: iPhone\ndate: 2024-09-01\ndescription: A mockup of the iPhone\nauthor: dillionverma, Yeom-JinHo\npublished: true\n---\n\n<ComponentPreview name=\"iphone-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/iphone\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"iphone\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### With Image\n\n<ComponentPreview name=\"iphone-demo-2\" />\n\n### With Video\n\n<ComponentPreview name=\"iphone-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Iphone } from \"@/components/ui/iphone\"\n```\n\n```tsx showLineNumbers\n<Iphone />\n```\n\n## Props\n\n| Prop        | Type                  | Default | Description                                       |\n| ----------- | --------------------- | ------- | ------------------------------------------------- |\n| `src`       | `string`              | `-`     | The source of the image to display                |\n| `videoSrc`  | `string`              | `-`     | The source of the video to display                |\n| `className` | `string`              | `-`     | Additional classes applied to the wrapper `<div>` |\n| `style`     | `React.CSSProperties` | `-`     | Inline styles applied to the wrapper `<div>`      |\n\n## Notes\n\n- Sizing: width and height props have been removed. The size is controlled by the wrapper `<div>`. The component enforces the aspect ratio 433/882.\n- Masking: The screen area is only masked when media (src or videoSrc) is provided. Without media, only the frame is rendered.\n- HTML Attributes: The Iphone component accepts all standard HTMLDivElement props.\n- iOS Compatibility: Video is rendered as a DOM overlay instead of foreignObject to avoid Safari/iOS masking issues.\n"
  },
  {
    "path": "apps/www/content/docs/components/lens.mdx",
    "content": "---\ntitle: Lens\ndate: 2025-01-13\ndescription: A interactive component that enables zooming into images, videos and other elements.\nauthor: h3rmel\npublished: true\n---\n\n<ComponentPreview name=\"lens-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/lens\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"lens\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Static Lens\n\n<ComponentPreview name=\"lens-demo-2\" />\n\n### Lens with a Default Position\n\n<ComponentPreview name=\"lens-demo-3\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Lens } from \"@/components/ui/lens\"\n```\n\n```tsx showLineNumbers\n<Lens>\n  <img src=\"/images/lens-demo.jpg\" alt=\"Lens Demo\" />\n</Lens>\n```\n\n## Props\n\n| Property          | Type              | Default | Description                                                |\n| ----------------- | ----------------- | ------- | ---------------------------------------------------------- |\n| `children`        | `React.ReactNode` | -       | The content that will be magnified by the lens             |\n| `zoomFactor`      | `number`          | 1.3     | The magnification factor of the lens                       |\n| `lensSize`        | `number`          | 170     | The size of the lens in pixels (works as a diameter)       |\n| `position`        | `Position`        | -       | The current position of the lens                           |\n| `defaultPosition` | `Position`        | -       | The initial position of the lens                           |\n| `isStatic`        | `boolean`         | false   | Determines if the lens will remain in a fixed position     |\n| `duration`        | `number`          | 0.1     | Duration of the animation when the lens moves (in seconds) |\n| `lensColor`       | `string`          | -       | The color of the lens (CSS color value)                    |\n| `ariaLabel`       | `string`          | -       | Accessibility label for the lens component                 |\n"
  },
  {
    "path": "apps/www/content/docs/components/light-rays.mdx",
    "content": "---\ntitle: Light Rays\ndate: 2025-09-25\ndescription: A component with animated light rays which shine down from above.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"light-rays-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/light-rays\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"light-rays\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { LightRays } from \"@/components/ui/light-rays\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[400px] w-full overflow-hidden rounded-xl border\">\n  <LightRays />\n</div>\n```\n\n## Props\n\n| Prop        | Type                  | Default                      | Description                                         |\n| ----------- | --------------------- | ---------------------------- | --------------------------------------------------- |\n| `count`     | `number`              | `7`                          | Total number of animated rays.                      |\n| `color`     | `string`              | `\"rgba(160, 210, 255, 0.2)\"` | Base colour used for the gradients.                 |\n| `blur`      | `number`              | `36`                         | Pixel radius applied to the blur filter.            |\n| `opacity`   | `number`              | `0.65`                       | Maximum opacity that rays reach (0 – 1).            |\n| `speed`     | `number`              | `14`                         | Average seconds each ray takes to complete a cycle. |\n| `length`    | `string \\| number`    | `\"70vh\"`                     | CSS length for the ray height.                      |\n| `className` | `string`              | `undefined`                  | Additional class names applied to the wrapper.      |\n| `style`     | `React.CSSProperties` | `undefined`                  | Inline styles merged into the wrapper.              |\n"
  },
  {
    "path": "apps/www/content/docs/components/line-shadow-text.mdx",
    "content": "---\ntitle: Line Shadow Text\ndate: 2025-01-11\ndescription: A text component with a moving line shadow.\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"line-shadow-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/line-shadow-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"line-shadow-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 5-12}\n@theme inline {\n  --animate-line-shadow: line-shadow 15s linear infinite;\n\n  @keyframes line-shadow {\n    0% {\n      background-position: 0 0;\n    }\n    100% {\n      background-position: 100% -100%;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { LineShadowText } from \"@/components/ui/line-shadow-text\"\n```\n\n```tsx showLineNumbers\n<LineShadowText>Magic UI</LineShadowText>\n```\n\n## Props\n\n| Prop          | Type                                                                                                       | Default   | Description                            |\n| ------------- | ---------------------------------------------------------------------------------------------------------- | --------- | -------------------------------------- |\n| `shadowColor` | `string`                                                                                                   | `\"black\"` | The color of the shadow effect         |\n| `children`    | `string`                                                                                                   | `-`       | The text to display with shadow effect |\n| `as`          | `\"article\" \\| \"div\" \\| \"h1\" \\| \"h2\" \\| \"h3\" \\| \"h4\" \\| \"h5\" \\| \"h6\" \\| \"li\" \\| \"p\" \\| \"section\" \\| \"span\"` | `\"span\"`  | The HTML element to render the text as |\n"
  },
  {
    "path": "apps/www/content/docs/components/magic-card.mdx",
    "content": "---\ntitle: Magic Card\ndate: 2024-07-07\ndescription: A spotlight effect that follows your mouse cursor and highlights borders on hover.\nauthor: dillionverma, Yeom-JinHo\npublished: true\n---\n\n<ComponentPreview name=\"magic-card-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/magic-card\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"magic-card\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Orb\n\n<ComponentPreview name=\"magic-card-demo-2\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { MagicCard } from \"@/components/ui/magic-card\"\n```\n\n```tsx showLineNumbers\n<MagicCard>\n  <div className=\"p-4\">\n    <p>Hello World</p>\n    <span>Hover me</span>\n  </div>\n</MagicCard>\n```\n\n## Props\n\n### MagicCard\n\n| Prop name         | Type                  | Default      | Description                                        |\n| ----------------- | --------------------- | ------------ | -------------------------------------------------- |\n| `children`        | `React.ReactNode`     | `-`          | The content to be rendered inside the card         |\n| `className`       | `string`              | `-`          | Additional CSS classes to apply to the card        |\n| `mode`            | `\"gradient\" \\| \"orb\"` | `\"gradient\"` | Display mode: gradient or orb effect               |\n| `gradientSize`    | `number`              | `200`        | Size of the gradient effect                        |\n| `gradientColor`   | `string`              | `#262626`    | Color of the gradient effect                       |\n| `gradientOpacity` | `number`              | `0.8`        | Opacity of the gradient effect                     |\n| `gradientFrom`    | `string`              | `#9E7AFF`    | Start color of the gradient border                 |\n| `gradientTo`      | `string`              | `#FE8BBB`    | End color of the gradient border                   |\n| `glowFrom`        | `string`              | `#ee4f27`    | Start color of the orb glow effect (orb mode only) |\n| `glowTo`          | `string`              | `#6b21ef`    | End color of the orb glow effect (orb mode only)   |\n| `glowAngle`       | `number`              | `90`         | Angle of the orb glow gradient (orb mode only)     |\n| `glowSize`        | `number`              | `420`        | Size of the orb glow effect (orb mode only)        |\n| `glowBlur`        | `number`              | `60`         | Blur amount of the orb glow effect (orb mode only) |\n| `glowOpacity`     | `number`              | `0.9`        | Opacity of the orb glow effect (orb mode only)     |\n"
  },
  {
    "path": "apps/www/content/docs/components/marquee.mdx",
    "content": "---\ntitle: Marquee\ndate: 2023-07-26\ndescription: An infinite scrolling component that can be used to display text, images, or videos.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/marquee.mp4\n---\n\n<ComponentPreview name=\"marquee-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/marquee\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"marquee\" title=\"components/ui/marquee.tsx\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2-3, 4-20}\n@theme inline {\n  --animate-marquee: marquee var(--duration) infinite linear;\n  --animate-marquee-vertical: marquee-vertical var(--duration) linear infinite;\n\n  @keyframes marquee {\n    from {\n      transform: translateX(0);\n    }\n    to {\n      transform: translateX(calc(-100% - var(--gap)));\n    }\n  }\n  @keyframes marquee-vertical {\n    from {\n      transform: translateY(0);\n    }\n    to {\n      transform: translateY(calc(-100% - var(--gap)));\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Vertical\n\n<ComponentPreview name=\"marquee-demo-vertical\" />\n\n### 3D\n\n<ComponentPreview name=\"marquee-3d\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Marquee } from \"@/components/ui/marquee\"\n```\n\n```tsx showLineNumbers\n<Marquee>\n  <span>Next.js</span>\n  <span>React</span>\n  <span>TypeScript</span>\n  <span>Tailwind CSS</span>\n</Marquee>\n```\n\n## Props\n\n| Prop           | Type      | Default | Description                                                                  |\n| -------------- | --------- | ------- | ---------------------------------------------------------------------------- |\n| `className`    | `string`  | `-`     | The class name to apply to the component.                                    |\n| `reverse`      | `boolean` | `false` | Whether or not to reverse the direction of the marquee.                      |\n| `pauseOnHover` | `boolean` | `false` | Whether or not to pause the marquee when the user hovers over the component. |\n| `vertical`     | `boolean` | `false` | Whether or not to display the marquee vertically.                            |\n| `children`     | `node`    | `-`     | The content to display in the marquee.                                       |\n| `repeat`       | `number`  | `4`     | The number of times to repeat the content.                                   |\n"
  },
  {
    "path": "apps/www/content/docs/components/meteors.mdx",
    "content": "---\ntitle: Meteors\ndate: 2023-07-13\ndescription: A meteor shower effect.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/meteors.mp4\n---\n\n<ComponentPreview name=\"meteors-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/meteors\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"meteors\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-15}\n@theme inline {\n  --animate-meteor: meteor 5s linear infinite;\n\n  @keyframes meteor {\n    0% {\n      transform: rotate(var(--angle)) translateX(0);\n      opacity: 1;\n    }\n    70% {\n      opacity: 1;\n    }\n    100% {\n      transform: rotate(var(--angle)) translateX(-500px);\n      opacity: 0;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Meteors } from \"@/components/ui/meteors\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <Meteors />\n</div>\n```\n\n## Props\n\n### Meteors\n\n| Prop          | Type     | Default | Description                                             |\n| ------------- | -------- | ------- | ------------------------------------------------------- |\n| `number`      | `number` | `20`    | Number of meteors                                       |\n| `minDelay`    | `number` | `0.2`   | Minimum delay in seconds before meteor animation starts |\n| `maxDelay`    | `number` | `1.2`   | Maximum delay in seconds before meteor animation starts |\n| `minDuration` | `number` | `2`     | Minimum duration in seconds for meteor animation        |\n| `maxDuration` | `number` | `10`    | Maximum duration in seconds for meteor animation        |\n| `angle`       | `number` | `215`   | Angle in degrees for meteor trajectory                  |\n| `className`   | `string` | -       | Optional additional CSS classes                         |\n"
  },
  {
    "path": "apps/www/content/docs/components/morphing-text.mdx",
    "content": "---\ntitle: Morphing Text\ndate: 2024-09-02\ndescription: A dynamic text morphing component for Magic UI.\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"morphing-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/morphing-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"morphing-text\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { MorphingText } from \"@/components/ui/morphing-text\"\n```\n\n```tsx showLineNumbers\n<MorphingText texts={[\"Hello\", \"World\"]} />\n```\n\n## Props\n\n| Prop        | Type       | Default | Description                          |\n| ----------- | ---------- | ------- | ------------------------------------ |\n| `texts`     | `string[]` | `[]`    | Array of texts to morph between      |\n| `className` | `string?`  | `\"\"`    | Additional classes for the container |\n\nThis `MorphingText` component dynamically transitions between an array of text strings, creating a smooth, engaging visual effect.\n\n## Credits\n\n- Credit to [@luis-code](https://luis-code.vercel.app/)\n"
  },
  {
    "path": "apps/www/content/docs/components/neon-gradient-card.mdx",
    "content": "---\ntitle: Neon Gradient Card\ndate: 2024-05-26\ndescription: A beautiful neon card effect\nauthor: Draxx0\npublished: true\n---\n\n<ComponentPreview name=\"neon-gradient-card-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/neon-gradient-card\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"neon-gradient-card\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file .\n\n```css title=\"app/globals.css\" showLineNumbers {2-3, 5-12}\n@theme inline {\n  --animate-background-position-spin: background-position-spin 3000ms infinite\n    alternate;\n\n  @keyframes background-position-spin {\n    0% {\n      background-position: top center;\n    }\n    100% {\n      background-position: bottom center;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { NeonGradientCard } from \"@/components/ui/neon-gradient-card\"\n```\n\n```tsx showLineNumbers\n<NeonGradientCard>\n  <div className=\"p-4\">\n    <p>Hello</p>\n    <span>Hover me</span>\n  </div>\n</NeonGradientCard>\n```\n\n## Props\n\n| Prop           | Type        | Default                                             | Description                                   |\n| -------------- | ----------- | --------------------------------------------------- | --------------------------------------------- |\n| `className`    | `string`    | `-`                                                 | The class name to be applied to the component |\n| `children`     | `ReactNode` | `-`                                                 | Children elements                             |\n| `borderSize`   | `number`    | `5`                                                 | The size of the border                        |\n| `borderRadius` | `number`    | `20`                                                | The size of the radius                        |\n| `neonColors`   | `object`    | `{ firstColor: \"#ff00aa\", secondColor: \"#00FFF1\" }` | The colors of the neon gradient               |\n\n## Credits\n\n- Credit to [@Unleashed-Design](https://unleashed-design.de/)\n"
  },
  {
    "path": "apps/www/content/docs/components/number-ticker.mdx",
    "content": "---\ntitle: Number Ticker\ndate: 2023-11-18\ndescription: Animate numbers to count up or down to a target number\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/number-ticker.mp4\n---\n\n<ComponentPreview name=\"number-ticker-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/number-ticker\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"number-ticker\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Example\n\n### Decimal\n\n<ComponentPreview name=\"number-ticker-decimal-demo\" />\n\n### Start Value\n\n<ComponentPreview name=\"number-ticker-demo-2\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { NumberTicker } from \"@/components/ui/number-ticker\"\n```\n\n```tsx showLineNumbers\n<NumberTicker value={100} />\n```\n\n## Props\n\n| Prop            | Type         | Default | Description                          |\n| --------------- | ------------ | ------- | ------------------------------------ |\n| `value`         | `int`        | `0`     | The value to count to                |\n| `direction`     | `up \\| down` | `\"up\"`  | The direction to count in            |\n| `delay`         | `number`     | `0`     | The delay before counting            |\n| `decimalPlaces` | `number`     | `0`     | The number of decimal places to show |\n| `startValue`    | `number`     | `0`     | The value to start counting from     |\n"
  },
  {
    "path": "apps/www/content/docs/components/orbiting-circles.mdx",
    "content": "---\ntitle: Orbiting Circles\ndate: 2024-04-24\ndescription: A collection of circles which move in orbit along a circular path\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/orbiting-circles.mp4\n---\n\n<ComponentPreview name=\"orbiting-circles-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/orbiting-circles\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"orbiting-circles\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-14}\n@theme inline {\n  --animate-orbit: orbit calc(var(--duration) * 1s) linear infinite;\n\n  @keyframes orbit {\n    0% {\n      transform: rotate(calc(var(--angle) * 1deg))\n        translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg));\n    }\n    100% {\n      transform: rotate(calc(var(--angle) * 1deg + 360deg))\n        translateY(calc(var(--radius) * 1px))\n        rotate(calc((var(--angle) * -1deg) - 360deg));\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { File, Search, Settings } from \"lucide-react\"\n\nimport { OrbitingCircles } from \"@/components/ui/orbiting-circles\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <OrbitingCircles>\n    <File />\n    <Settings />\n    <File />\n  </OrbitingCircles>\n  <OrbitingCircles radius={100} reverse>\n    <File />\n    <Settings />\n    <File />\n    <Search />\n  </OrbitingCircles>\n</div>\n```\n\n## Props\n\n| Prop        | Type              | Default | Description                                      |\n| ----------- | ----------------- | ------- | ------------------------------------------------ |\n| `className` | `string`          | `-`     | The class name for the component                 |\n| `children`  | `React.ReactNode` | `-`     | The children nodes of the component              |\n| `reverse`   | `boolean`         | `false` | If true, the animation plays in reverse          |\n| `duration`  | `number`          | `20`    | The duration of the animation in seconds         |\n| `delay`     | `number`          | `10`    | The delay before the animation starts in seconds |\n| `radius`    | `number`          | `160`   | The radius of the orbit in pixels                |\n| `path`      | `boolean`         | `true`  | If true, a path is displayed for the orbit       |\n| `iconSize`  | `number`          | `30`    | The size of the icon in pixels                   |\n| `speed`     | `number`          | `1`     | The speed of the animation                       |\n"
  },
  {
    "path": "apps/www/content/docs/components/particles.mdx",
    "content": "---\ntitle: Particles\ndate: 2024-06-04\ndescription: Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"particles-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/particles\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"particles\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Particles } from \"@/components/ui/particles\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <Particles />\n</div>\n```\n\n## Props\n\n| Prop        | Type      | Default   | Description                      |\n| ----------- | --------- | --------- | -------------------------------- |\n| `className` | `string`  | `-`       | The class name for the component |\n| `quantity`  | `number`  | `100`     | The number of particles          |\n| `staticity` | `number`  | `50`      | The staticity of the particles   |\n| `ease`      | `number`  | `50`      | The ease of the particles        |\n| `size`      | `number`  | `0.4`     | The size of the particles        |\n| `refresh`   | `boolean` | `false`   | Whether to refresh the particles |\n| `color`     | `string`  | `#ffffff` | The color of the particles       |\n| `vx`        | `number`  | `0`       | The x velocity of the particles  |\n| `vy`        | `number`  | `0`       | The y velocity of the particles  |\n"
  },
  {
    "path": "apps/www/content/docs/components/pixel-image.mdx",
    "content": "---\ntitle: Pixel Image\ndate: 2025-06-05\ndescription: A component that displays your image with a pixelated effect, enhancing the visual appeal of any image in your website.\nauthor: dharminnagar\npublished: true\n---\n\n<ComponentPreview name=\"pixel-image-demo\" />\n\n## Features\n\n- Pixelated image reveal animation\n- Customizable grid size and layout\n- Supports grayscale-to-color animation\n- Adjustable animation duration and delay\n- Lightweight and easy to use\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/pixel-image\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"pixel-image\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { PixelImage } from \"@/components/ui/pixel-image\"\n```\n\n```tsx showLineNumbers\n<PixelImage src=\"/pixel-image-demo.jpg\" grid=\"8x8\" />\n```\n\n## Props\n\n| Prop                  | Type                                        | Default | Description                                    |\n| --------------------- | ------------------------------------------- | ------- | ---------------------------------------------- |\n| `src`                 | `string`                                    | —       | The image source URL                           |\n| `grid`                | `\"6x4\" \\| \"8x8\" \\| \"8x3\" \\| \"4x6\" \\| \"3x8\"` | `\"8x8\"` | Predefined grid layout                         |\n| `customGrid`          | `{ rows: number; cols: number; }`           | —       | Custom grid layout (overrides `grid`)          |\n| `grayscaleAnimation`  | `boolean`                                   | `true`  | Whether to animate from grayscale to color     |\n| `pixelFadeInDuration` | `number`                                    | `1000`  | Duration (ms) for each pixel fade-in animation |\n| `maxAnimationDelay`   | `number`                                    | `1200`  | Maximum random delay (ms) for pixel animation  |\n| `colorRevealDelay`    | `number`                                    | `1500`  | Delay (ms) before revealing color              |\n\n### Grid Type\n\n```typescript\n// Predefined grid options\n\"6x4\" | \"8x8\" | \"8x3\" | \"4x6\" | \"3x8\"\n\n// Custom grid example\ncustomGrid={{ rows: 5, cols: 10 }}\n```\n\n## Note\n\n- Since the pixelation effect is purely decorative, make sure to provide text alternatives (like descriptions or labels) for any important content shown in the image. This ensures the content is accessible to screen reader users.\n\n## Credits\n\n- Credit to [@dharminnagar](https://x.com/dharminnagar) for implementation\n"
  },
  {
    "path": "apps/www/content/docs/components/pointer.mdx",
    "content": "---\ntitle: Pointer\ndate: 2025-02-17\ndescription: A component that displays a pointer when hovering over an element\nauthor: h3rmel\npublished: true\n---\n\n<ComponentPreview name=\"pointer-demo-1\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/pointer\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"pointer\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Pointer } from \"@/components/ui/pointer\"\n```\n\n```tsx showLineNumbers\n<Pointer />\n```\n"
  },
  {
    "path": "apps/www/content/docs/components/progressive-blur.mdx",
    "content": "---\ntitle: Progressive Blur\ndate: 2024-06-01\ndescription: Add a progressive blur effect to scrollable content\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"progressive-blur-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/progressive-blur\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"progressive-blur\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { ProgressiveBlur } from \"@/components/ui/progressive-blur\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[400px] w-full overflow-auto\">\n  {/* Your scrollable content */}\n  <div className=\"space-y-4 p-4\">{/* Content items */}</div>\n\n  <ProgressiveBlur height=\"50%\" position=\"bottom\" />\n</div>\n```\n\n## Props\n\n### ProgressiveBlur\n\n| Prop         | Type                          | Default                         | Description                                           |\n| ------------ | ----------------------------- | ------------------------------- | ----------------------------------------------------- |\n| `className`  | `string`                      | `-`                             | Additional classes to apply to the blur container.    |\n| `height`     | `string`                      | `\"30%\"`                         | Height of the blur effect container.                  |\n| `position`   | `\"top\" \\| \"bottom\" \\| \"both\"` | `\"bottom\"`                      | Position of the blur effect.                          |\n| `blurLevels` | `number[]`                    | `[0.5, 1, 2, 4, 8, 16, 32, 64]` | Array of blur values (in px) for progressive effect.  |\n| `children`   | `React.ReactNode`             | `-`                             | Optional content to render within the blur container. |\n"
  },
  {
    "path": "apps/www/content/docs/components/pulsating-button.mdx",
    "content": "---\ntitle: Pulsating Button\ndate: 2024-07-23\ndescription: An animated pulsating button useful for capturing attention of users.\nauthor: shikhap04\npublished: true\n---\n\n<ComponentPreview name=\"pulsating-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/pulsating-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"pulsating-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-12}\n@theme inline {\n  --animate-pulse: pulse var(--duration) ease-out infinite;\n\n  @keyframes pulse {\n    0%,\n    100% {\n      box-shadow: 0 0 0 0 var(--pulse-color);\n    }\n    50% {\n      box-shadow: 0 0 0 8px var(--pulse-color);\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { PulsatingButton } from \"@/components/ui/pulsating-button\"\n```\n\n```tsx showLineNumbers\n<PulsatingButton>Pulsating Button</PulsatingButton>\n```\n\n## Props\n\n| Prop         | Type              | Default | Description                                              |\n| ------------ | ----------------- | ------- | -------------------------------------------------------- |\n| `children`   | `React.ReactNode` | `-`     | The content of the button.                               |\n| `className`  | `string`          | `-`     | Additional class names for the button.                   |\n| `pulseColor` | `string`          | `-`     | The rbg numbers only for the color of the pulsing waves. |\n| `duration`   | `string`          | `-`     | The time span of one pulse.                              |\n\n## Credits\n\n- Credit to [@shikhap04](https://github.com/shikhap04)\n"
  },
  {
    "path": "apps/www/content/docs/components/rainbow-button.mdx",
    "content": "---\ntitle: Rainbow Button\ndate: 2024-09-19\ndescription: An animated button with a rainbow effect.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"rainbow-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/rainbow-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"rainbow-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Update `globals.css`</Step>\n\nAdd the following to your `globals.css` file:\n\n```css title=\"app/globals.css\" showLineNumbers {2-6}\n:root {\n  --color-1: 0 100% 63%;\n  --color-2: 270 100% 63%;\n  --color-3: 210 100% 63%;\n  --color-4: 195 100% 63%;\n  --color-5: 90 100% 63%;\n}\n```\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-11}\n@theme inline {\n  --animate-rainbow: rainbow var(--speed, 2s) infinite linear;\n\n  @keyframes rainbow {\n    0% {\n      background-position: 0%;\n    }\n    100% {\n      background-position: 200%;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Outline Variant\n\n<ComponentPreview name=\"rainbow-button-demo-2\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { RainbowButton } from \"@/components/ui/rainbow-button\"\n```\n\n```tsx showLineNumbers\n<RainbowButton>Rainbow Button</RainbowButton>\n```\n\n## Props\n\n| Prop        | Type                                  | Default     | Description                                         |\n| ----------- | ------------------------------------- | ----------- | --------------------------------------------------- |\n| `children`  | `React.ReactNode`                     | `-`         | The content to be displayed inside the button.      |\n| `className` | `string`                              | `-`         | Additional CSS classes to be applied to the button. |\n| `variant`   | `\"default\" \\| \"outline\"`              | `\"default\"` | The variant of the button.                          |\n| `size`      | `\"default\" \\| \"sm\" \\| \"lg\" \\| \"icon\"` | `\"default\"` | The size of the button.                             |\n"
  },
  {
    "path": "apps/www/content/docs/components/retro-grid.mdx",
    "content": "---\ntitle: Retro Grid\ndate: 2023-11-23\ndescription: An animated scrolling retro grid effect\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/retro-grid.mp4\n---\n\n<ComponentPreview name=\"retro-grid-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/retro-grid\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"retro-grid\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>No additional CSS is required.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { RetroGrid } from \"@/components/ui/retro-grid\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <RetroGrid />\n</div>\n```\n\n## Props\n\n| Prop             | Type     | Default  | Description                                   |\n| ---------------- | -------- | -------- | --------------------------------------------- |\n| `className`      | `string` | `-`      | Additional CSS classes for the grid container |\n| `angle`          | `number` | `65`     | Rotation angle of the grid in degrees         |\n| `cellSize`       | `number` | `60`     | Grid cell size in pixels                      |\n| `opacity`        | `number` | `0.5`    | Grid opacity value between 0 and 1            |\n| `lightLineColor` | `string` | `\"gray\"` | Grid line color in light mode                 |\n| `darkLineColor`  | `string` | `\"gray\"` | Grid line color in dark mode                  |\n"
  },
  {
    "path": "apps/www/content/docs/components/ripple-button.mdx",
    "content": "---\ntitle: Ripple Button\ndate: 2024-11-17\ndescription: An animated button with ripple useful for user engagement.\nauthor: Sidd5arth\npublished: true\n---\n\n<ComponentPreview name=\"ripple-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/ripple-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"ripple-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-12}\n@theme inline {\n  --animate-rippling: rippling var(--duration) ease-out;\n\n  @keyframes rippling {\n    0% {\n      opacity: 1;\n    }\n    100% {\n      transform: scale(2);\n      opacity: 0;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { RippleButton } from \"@/components/ui/ripple-button\"\n```\n\n```tsx showLineNumbers\n<RippleButton>Ripple Button</RippleButton>\n```\n\n## Props\n\n| Prop          | Type              | Default | Description                                               |\n| ------------- | ----------------- | ------- | --------------------------------------------------------- |\n| `children`    | `React.ReactNode` | `-`     | The content of the button.                                |\n| `className`   | `string`          | `-`     | Additional class names for the button.                    |\n| `rippleColor` | `string`          | `-`     | The rbg numbers only for the color of the rippling waves. |\n| `duration`    | `string`          | `-`     | The time span of one ripple.                              |\n\n## Credits\n\n- Credit to [@Sidd5arth](https://github.com/Sidd5arth)\n"
  },
  {
    "path": "apps/www/content/docs/components/ripple.mdx",
    "content": "---\ntitle: Ripple\ndate: 2023-11-18\ndescription: An animated ripple effect typically used behind elements to emphasize them.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/ripple.mp4\n---\n\n<ComponentPreview name=\"ripple-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/ripple\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"ripple\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2-3, 5-13}\n@theme inline {\n  --animate-ripple: ripple var(--duration, 2s) ease calc(var(--i, 0) * 0.2s)\n    infinite;\n\n  @keyframes ripple {\n    0%,\n    100% {\n      transform: translate(-50%, -50%) scale(1);\n    }\n    50% {\n      transform: translate(-50%, -50%) scale(0.9);\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { Ripple } from \"@/components/ui/ripple\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <Ripple />\n</div>\n```\n\n## Props\n\n| Prop                | Type     | Default | Description                            |\n| ------------------- | -------- | ------- | -------------------------------------- |\n| `mainCircleSize`    | `number` | `210`   | The size of the main circle in pixels  |\n| `mainCircleOpacity` | `number` | `0.24`  | The opacity of the main circle         |\n| `numCircles`        | `number` | `8`     | The number of ripple circles to render |\n"
  },
  {
    "path": "apps/www/content/docs/components/safari.mdx",
    "content": "---\ntitle: Safari\ndate: 2024-09-01\ndescription: A safari browser mockup to showcase your website.\nauthor: dillionverma, Yeom-JinHo\npublished: true\n---\n\n<ComponentPreview name=\"safari-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/safari\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"safari\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### With Image\n\n<ComponentPreview name=\"safari-demo-2\" />\n\n### With Video\n\n<ComponentPreview name=\"safari-demo-3\" />\n\n### Simple Mode\n\n<ComponentPreview name=\"safari-demo-4\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { Safari } from \"@/components/ui/safari\"\n```\n\n```tsx showLineNumbers\n<Safari url=\"https://magicui.design\" />\n```\n\n## Props\n\n| Prop        | Type                  | Default     | Description                                                 |\n| ----------- | --------------------- | ----------- | ----------------------------------------------------------- |\n| `url`       | `string`              | `-`         | The URL to display in the Safari address bar                |\n| `imageSrc`  | `string`              | `-`         | The source URL of the image to display in the Safari window |\n| `videoSrc`  | `string`              | `-`         | The source URL of the video to display in the Safari window |\n| `mode`      | `SafariMode`          | `\"default\"` | The display mode of the Safari window.                      |\n| `className` | `string`              | `-`         | Additional classes applied to the wrapper `<div>`           |\n| `style`     | `React.CSSProperties` | `-`         | Inline styles applied to the wrapper `<div>`                |\n\n## Notes\n\n- Sizing: width and height props have been removed. The size is controlled by the wrapper `<div>`. The component enforces the aspect ratio 1203/753.\n- Masking: The screen area is only masked when media (src or videoSrc) is provided. Without media, only the frame is rendered.\n- HTML Attributes: The Safari component accepts all standard HTMLDivElement props.\n- iOS Compatibility: Video is rendered as a DOM overlay instead of foreignObject to avoid Safari/iOS masking issues.\n"
  },
  {
    "path": "apps/www/content/docs/components/scroll-based-velocity.mdx",
    "content": "---\ntitle: Scroll Based Velocity\ndate: 2024-05-22\ndescription: Scrolling text whose speed changes based on scroll speed\nauthor: whyismynamerudy\npublished: true\n---\n\n<ComponentPreview name=\"scroll-based-velocity-demo\" />\n\n<ComponentPreview name=\"scroll-based-velocity-images-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/scroll-based-velocity\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the following dependencies:</Step>\n\n```bash\nnpm install motion\n```\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"scroll-based-velocity\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport {\n  ScrollVelocityContainer,\n  ScrollVelocityRow,\n} from \"@/components/ui/scroll-based-velocity\"\n```\n\n```tsx showLineNumbers\n<ScrollVelocityContainer className=\"text-4xl font-bold md:text-7xl\">\n  <ScrollVelocityRow baseVelocity={20} direction={1}>\n    Velocity Scroll\n  </ScrollVelocityRow>\n  <ScrollVelocityRow baseVelocity={20} direction={-1}>\n    Velocity Scroll\n  </ScrollVelocityRow>\n</ScrollVelocityContainer>\n```\n\n## Props\n\n### ScrollVelocityContainer\n\n| Prop        | Type        | Default | Description                                   |\n| ----------- | ----------- | ------- | --------------------------------------------- |\n| `className` | `string`    | `-`     | The class name to be applied to the component |\n| `children`  | `ReactNode` | `-`     | Content to be animated                        |\n\n### ScrollVelocityRow\n\n| Prop               | Type        | Default | Description                                        |\n| ------------------ | ----------- | ------- | -------------------------------------------------- |\n| `className`        | `string`    | `-`     | The class name to be applied to the row container  |\n| `children`         | `ReactNode` | `-`     | Content to be duplicated and scrolled              |\n| `baseVelocity`     | `number`    | `5`     | Base scroll velocity percentage of content width   |\n| `direction`        | `1 \\| -1`   | `1`     | Scroll direction (1 = left-to-right, -1 = reverse) |\n| `scrollReactivity` | `boolean`   | `true`  | Toggles scroll interactivity                       |\n\n## Performance\n\n- Pauses updates when offscreen and when the tab is hidden.\n- Respects user preference for reduced motion.\n"
  },
  {
    "path": "apps/www/content/docs/components/scroll-progress.mdx",
    "content": "---\ntitle: Scroll Progress\ndate: 2024-12-19\ndescription: Animated Scroll Progress for your pages\nauthor: dipesh_the_dev\npublished: true\n---\n\n<ComponentPreview name=\"scroll-progress-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n<TabsList>\n    <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/scroll-progress\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"scroll-progress\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { ScrollProgress } from \"@/components/ui/scroll-progress\"\n```\n\n```tsx showLineNumbers\n<ScrollProgress />\n```\n\n## Props\n\n| Prop        | Type     | Default | Description                                   |\n| ----------- | -------- | ------- | --------------------------------------------- |\n| `className` | `string` | `-`     | The class name to be applied to the component |\n\nThe `ScrollProgress` component also accepts all properties of the `HTMLDivElement` type.\n\n## Credits\n\n- Credit to [dipesh_the_dev](https://twitter.com/dipesh_the_dev)\n"
  },
  {
    "path": "apps/www/content/docs/components/shimmer-button.mdx",
    "content": "---\ntitle: Shimmer Button\ndate: 2023-08-10\ndescription: A button with a shimmering light which travels around the perimeter.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/shimmer-button.mp4\n---\n\n<ComponentPreview name=\"shimmer-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n  \n```bash\nnpx shadcn@latest add @magicui/shimmer-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"shimmer-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2-4, 6-26}\n@theme inline {\n  --animate-shimmer-slide: shimmer-slide var(--speed) ease-in-out infinite\n    alternate;\n  --animate-spin-around: spin-around calc(var(--speed) * 2) infinite linear;\n\n  @keyframes shimmer-slide {\n    to {\n      transform: translate(calc(100cqw - 100%), 0);\n    }\n  }\n  @keyframes spin-around {\n    0% {\n      transform: translateZ(0) rotate(0);\n    }\n    15%,\n    35% {\n      transform: translateZ(0) rotate(90deg);\n    }\n    65%,\n    85% {\n      transform: translateZ(0) rotate(270deg);\n    }\n    100% {\n      transform: translateZ(0) rotate(360deg);\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { ShimmerButton } from \"@/components/ui/shimmer-button\"\n```\n\n```tsx showLineNumbers\n<ShimmerButton>Shimmer Button</ShimmerButton>\n```\n\n## Props\n\n| Prop              | Type              | Default            | Description                         |\n| ----------------- | ----------------- | ------------------ | ----------------------------------- |\n| `shimmerColor`    | `string`          | `#ffffff`          | The color of the shimmer            |\n| `shimmerSize`     | `string`          | `0.05em`           | The size of the shimmer             |\n| `borderRadius`    | `string`          | `100px`            | The border radius of the button     |\n| `shimmerDuration` | `string`          | `3s`               | The duration of the spark animation |\n| `background`      | `string`          | `rgba(0, 0, 0, 1)` | The background of the button        |\n| `className`       | `string`          | `undefined`        | The class name of the button        |\n| `children`        | `React.ReactNode` | `undefined`        | The children of the button          |\n\n## Credits\n\nCredit to [@jh3yy](https://twitter.com/jh3yy/status/1656423856276488192) for the inspiration behind this component.\n"
  },
  {
    "path": "apps/www/content/docs/components/shine-border.mdx",
    "content": "---\ntitle: Shine Border\ndate: 2024-05-25\ndescription: Shine border is an animated background border effect.\nauthor: unnamed-lab\npublished: true\n---\n\n<ComponentPreview name=\"shine-border-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/shine-border\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"shine-border\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n<Step>Add the required CSS animations</Step>\n\nAdd the following animations to your global CSS file.\n\n```css title=\"app/globals.css\" showLineNumbers {2, 4-14}\n@theme inline {\n  --animate-shine: shine var(--duration) infinite linear;\n\n  @keyframes shine {\n    0% {\n      background-position: 0% 0%;\n    }\n    50% {\n      background-position: 100% 100%;\n    }\n    to {\n      background-position: 0% 0%;\n    }\n  }\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Monotone\n\n<ComponentPreview name=\"shine-border-demo-2\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { ShineBorder } from \"@/components/ui/shine-border\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <ShineBorder />\n</div>\n```\n\n## Props\n\n| Prop          | Type                  | Default     | Description                                                         |\n| ------------- | --------------------- | ----------- | ------------------------------------------------------------------- |\n| `className`   | `string`              | `-`         | The class name to be applied to the component.                      |\n| `duration`    | `number`              | `14`        | Defines the animation duration to be applied on the shining border. |\n| `shineColor`  | `string \\| string[]`  | `\"#000000\"` | Color of the border, can be a single color or an array of colors.   |\n| `borderWidth` | `number`              | `1`         | Width of the border in pixels.                                      |\n| `style`       | `React.CSSProperties` | `-`         | Additional styles to be applied to the component.                   |\n"
  },
  {
    "path": "apps/www/content/docs/components/shiny-button.mdx",
    "content": "---\ntitle: Shiny Button\ndate: 2024-05-24\ndescription: A shiny button component with dynamic styles in the dark mode or light mode.\nauthor: luis-codex\npublished: true\n---\n\n<ComponentPreview name=\"shiny-button-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/shiny-button\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"shiny-button\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { ShinyButton } from \"@/components/ui/shiny-button\"\n```\n\n```tsx showLineNumbers\n<ShinyButton>Shiny Button</ShinyButton>\n```\n\n## Props\n\n| Prop        | Type              | Default | Description                                   |\n| ----------- | ----------------- | ------- | --------------------------------------------- |\n| `className` | `string`          | `-`     | The class name to be applied to the component |\n| `children`  | `React.ReactNode` | `-`     | The content to be displayed inside the button |\n\n## Credits\n\n- Credit to [@luis-code](https://luis-code.vercel.app/)\n"
  },
  {
    "path": "apps/www/content/docs/components/smooth-cursor.mdx",
    "content": "---\ntitle: Smooth Cursor\ndate: 2024-04-17\ndescription: A customizable, physics-based smooth cursor animation component for React applications.\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"smooth-cursor-demo\" />\n\n## Features\n\n- 🎯 Smooth physics-based cursor animations\n- 🔄 Rotation effects based on movement direction\n- ⚡ Performance optimized with RAF\n- 🎨 Fully customizable cursor design\n- 📦 Lightweight and easy to implement\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/smooth-cursor\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"smooth-cursor\" />\n\n<Step>Add the component to your page or layout.</Step>\n\n```tsx showLineNumbers\nimport { SmoothCursor } from \"@/components/ui/smooth-cursor\"\n\nexport default function Page() {\n  return (\n    <>\n      <SmoothCursor />\n      {/* Your page content */}\n    </>\n  )\n}\n```\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { SmoothCursor } from \"@/components/ui/smooth-cursor\"\n```\n\n```tsx showLineNumbers\n<SmoothCursor />\n```\n\n## Hiding Default Browser Cursor\n\nTo prevent the default browser cursor from overlapping with the custom cursor, add the following CSS globally:\n\n```css showLineNumbers\n* {\n  cursor: none !important;\n}\n```\n\n### Optional: Keep text cursor for inputs\n\n```css showLineNumbers\ninput,\ntextarea,\nselect {\n  cursor: text !important;\n}\n```\n\n💡 If you're using Tailwind CSS, you can add cursor-none to your layout wrapper:\n\n```tsx showLineNumbers\n<div className=\"cursor-none\">\n  <SmoothCursor />\n  {/* your app */}\n</div>\n```\n\n## Props\n\n| Prop           | Type              | Default                | Description                                            |\n| -------------- | ----------------- | ---------------------- | ------------------------------------------------------ |\n| `cursor`       | `React.ReactNode` | `<DefaultCursorSVG />` | Custom cursor component to replace the default cursor  |\n| `springConfig` | `SpringConfig`    | See below              | Configuration object for the spring animation behavior |\n\n### SpringConfig Type\n\n```typescript showLineNumbers\ninterface SpringConfig {\n  damping: number // Controls how quickly the animation settles\n  stiffness: number // Controls the spring stiffness\n  mass: number // Controls the virtual mass of the animated object\n  restDelta: number // Controls the threshold at which animation is considered complete\n}\n```\n\n### Default Spring Configuration\n\n```typescript showLineNumbers\nconst defaultSpringConfig = {\n  damping: 45,\n  stiffness: 400,\n  mass: 1,\n  restDelta: 0.001,\n}\n```\n\n## Browser Support\n\nCompatible with all modern browsers that support:\n\n- `requestAnimationFrame`\n- CSS transforms\n- Pointer events\n- Hover-capable fine pointers (mouse or trackpad)\n\nTouch-first devices are ignored automatically to prevent the custom cursor from appearing after taps.\n\n## Accessibility\n\nWhen using this component, consider that:\n\n- Users navigating via keyboard will not see the custom cursor\n- You may want to provide alternative visual cues for interactive elements\n- Some users may have motion sensitivity, so consider providing a way to disable the animation\n\n## Credits\n\n- Credit to [@Code_Parth](https://twitter.com/Code_Parth) for the original concept and implementation\n"
  },
  {
    "path": "apps/www/content/docs/components/sparkles-text.mdx",
    "content": "---\ntitle: Sparkles Text\ndate: 2024-05-30\ndescription: A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\nauthor: Draxx0\npublished: true\n---\n\n<ComponentPreview name=\"sparkles-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/sparkles-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"sparkles-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { SparklesText } from \"@/components/ui/sparkles-text\"\n```\n\n```tsx showLineNumbers\n<SparklesText>Sparkles Text</SparklesText>\n```\n\n## Props\n\n| Prop            | Type     | Default                                 | Description                                        |\n| --------------- | -------- | --------------------------------------- | -------------------------------------------------- |\n| `children`      | `string` | `-`                                     | The content to display                             |\n| `className`     | `string` | `-`                                     | The class name to be applied to the sparkles text. |\n| `sparklesCount` | `number` | `10`                                    | sparkles count that appears on the text            |\n| `colors`        | `object` | `{first: '#A07CFE', second: '#FE8FB5'}` | the sparkles colors                                |\n\n## Credits\n\n- Credit to [@simonlejeune](https://www.simlej.dev/)\n"
  },
  {
    "path": "apps/www/content/docs/components/spinning-text.mdx",
    "content": "---\ntitle: Spinning Text\ndate: 2025-02-09\ndescription: The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\nauthor: aayushbharti\npublished: true\n---\n\n<ComponentPreview name=\"spinning-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/spinning-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"spinning-text\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Reverse\n\n<ComponentPreview name=\"spinning-text-demo-2\" />\n\n### Usage\n\n```tsx showLineNumbers\nimport { SpinningText } from \"@/components/ui/spinning-text\"\n```\n\n```tsx showLineNumbers\n<SpinningText>learn more • earn more • grow more •</SpinningText>\n```\n\n## Props\n\n| Prop         | Type                                         | Default | Description                                             |\n| ------------ | -------------------------------------------- | ------- | ------------------------------------------------------- |\n| `children`   | `ReactElement`                               |         | The text content to be animated in a circular motion.   |\n| `style`      | `CSSProperties`                              | `{}`    | Custom styles for the text container.                   |\n| `duration`   | `number`                                     | `10`    | The duration of the full circular rotation animation.   |\n| `className`  | `string`                                     |         | A custom class name for the text container.             |\n| `reverse`    | `boolean`                                    | `false` | Determines if the animation should rotate in reverse.   |\n| `radius`     | `number`                                     | `5`     | The radius of the circular path for the text animation. |\n| `transition` | `Transition`                                 |         | Custom transition effects for the animation.            |\n| `variants`   | `{ container?: Variants; item?: Variants; }` |         | Variants for container and item animations.             |\n\n## Credits\n\n- Credit to [@AayushBharti](https://github.com/AayushBharti)\n"
  },
  {
    "path": "apps/www/content/docs/components/striped-pattern.mdx",
    "content": "---\ntitle: Striped Pattern\ndate: 2025-09-01\ndescription: A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\nauthor: matheusfigueiredo\npublished: true\n---\n\n<ComponentPreview name=\"striped-pattern-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/striped-pattern\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"striped-pattern\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Striped Pattern with a dashed stroke\n\n<ComponentPreview name=\"striped-pattern-dashed\" />\n\n### Striped Pattern To Right\n\n<ComponentPreview name=\"striped-pattern-right\" />\n\n### Usage\n\n```tsx\nimport { StripedPattern } from \"@/components/ui/striped-pattern\"\n```\n\n```tsx\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <StripedPattern />\n</div>\n```\n\n## Props\n\n### StripedPattern\n\n| Prop        | Type                  | Default  | Description             |\n| ----------- | --------------------- | -------- | ----------------------- |\n| `width`     | `number`              | `40`     | Width of the pattern    |\n| `height`    | `number`              | `40`     | Height of the pattern   |\n| `x`         | `number`              | `-1`     | X offset of the pattern |\n| `y`         | `number`              | `-1`     | Y offset of the pattern |\n| `direction` | `\"left\"` \\| `\"right\"` | `\"left\"` | Line direction          |\n"
  },
  {
    "path": "apps/www/content/docs/components/terminal.mdx",
    "content": "---\ntitle: Terminal\ndate: 2025-01-16\ndescription: An implementation of the MacOS terminal. Useful for showcasing a command line interface.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"terminal-demo\" />\n\n## Examples\n\n### Custom Delays\n\n<ComponentPreview name=\"terminal-demo-2\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/terminal\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"terminal\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport {\n  AnimatedSpan,\n  Terminal,\n  TypingAnimation,\n} from \"@/components/ui/terminal\"\n```\n\n```tsx showLineNumbers\n<Terminal>\n  <TypingAnimation>pnpm dlx shadcn@latest init</TypingAnimation>\n  <AnimatedSpan>✔ Preflight checks.</AnimatedSpan>\n  <AnimatedSpan>✔ Validating Tailwind CSS.</AnimatedSpan>\n  <TypingAnimation>Success! Project initialization completed.</TypingAnimation>\n</Terminal>\n```\n\nThe terminal sequences its children automatically. Each `TypingAnimation` or `AnimatedSpan` starts when the previous finishes. Manual `delay` props are optional and typically unnecessary.\n\n## Props\n\n### Terminal\n\n| Prop          | Type        | Default | Description                                                    |\n| ------------- | ----------- | ------- | -------------------------------------------------------------- |\n| `children`    | `ReactNode` | `-`     | Terminal content: a list of `TypingAnimation`/`AnimatedSpan`.  |\n| `className`   | `string`    | `-`     | Custom CSS class for styling.                                  |\n| `sequence`    | `boolean`   | `true`  | Enable auto sequencing so each line starts after the previous. |\n| `startOnView` | `boolean`   | `true`  | Start sequencing when the terminal enters the viewport.        |\n\n### AnimatedSpan\n\n| Prop          | Type        | Default | Description                                                                 |\n| ------------- | ----------- | ------- | --------------------------------------------------------------------------- |\n| `children`    | `ReactNode` | `-`     | Content to be faded in.                                                     |\n| `className`   | `string`    | `-`     | Custom CSS class for styling.                                               |\n| `delay`       | `number`    | `0`     | Delay in ms before animation starts (used when `sequence` is `false`).      |\n| `startOnView` | `boolean`   | `false` | If `true`, waits for viewport visibility before animating when unsequenced. |\n\n### TypingAnimation\n\n| Prop          | Type                                                                                                       | Default  | Description                                                              |\n| ------------- | ---------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------ |\n| `children`    | `string`                                                                                                   | `-`      | Text to be typed.                                                        |\n| `className`   | `string`                                                                                                   | `-`      | Custom CSS class for styling.                                            |\n| `duration`    | `number`                                                                                                   | `60`     | Milliseconds per character.                                              |\n| `delay`       | `number`                                                                                                   | `0`      | Delay in ms before typing starts (used when `sequence` is `false`).      |\n| `as`          | `\"article\" \\| \"div\" \\| \"h1\" \\| \"h2\" \\| \"h3\" \\| \"h4\" \\| \"h5\" \\| \"h6\" \\| \"li\" \\| \"p\" \\| \"section\" \\| \"span\"` | `\"span\"` | The component type to render.                                            |\n| `startOnView` | `boolean`                                                                                                  | `true`   | If `true`, waits for viewport visibility before typing when unsequenced. |\n"
  },
  {
    "path": "apps/www/content/docs/components/text-animate.mdx",
    "content": "---\ntitle: Text Animate\ndate: 2025-01-01\ndescription: A text animation component that animates text using a variety of different animations.\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"text-animate-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/text-animate\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"text-animate\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Blur In by Text\n\n<ComponentPreview name=\"text-animate-demo-2\" />\n\n### Slide Up by Word\n\n<ComponentPreview name=\"text-animate-demo-3\" />\n\n### Scale Up by Text\n\n<ComponentPreview name=\"text-animate-demo-4\" />\n\n### Fade In by Line\n\n<ComponentPreview name=\"text-animate-demo-5\" />\n\n### Slide Left by Character\n\n<ComponentPreview name=\"text-animate-demo-6\" />\n\n### With Delay\n\n<ComponentPreview name=\"text-animate-demo-7\" />\n\n### With Duration\n\n<ComponentPreview name=\"text-animate-demo-8\" />\n\n### With Custom Motion Variants\n\n<ComponentPreview name=\"text-animate-demo-9\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { TextAnimate } from \"@/components/ui/text-animate\"\n```\n\n```tsx showLineNumbers\n<TextAnimate animation=\"blurInUp\" by=\"word\">\n  Blur in by word\n</TextAnimate>\n```\n\n## Props\n\n| Prop               | Type                                                                                                       | Default    | Description                                               |\n| ------------------ | ---------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------- |\n| `children`         | `string`                                                                                                   | `-`        | The text content to animate                               |\n| `className`        | `string`                                                                                                   | `-`        | The class name to be applied to the component             |\n| `segmentClassName` | `string`                                                                                                   | `-`        | The class name to be applied to each segment              |\n| `delay`            | `number`                                                                                                   | `0`        | Delay before animation starts                             |\n| `duration`         | `number`                                                                                                   | `0.3`      | Duration of the animation                                 |\n| `variants`         | `Variants`                                                                                                 | `-`        | Custom motion variants for the animation                  |\n| `as`               | `\"article\" \\| \"div\" \\| \"h1\" \\| \"h2\" \\| \"h3\" \\| \"h4\" \\| \"h5\" \\| \"h6\" \\| \"li\" \\| \"p\" \\| \"section\" \\| \"span\"` | `\"p\"`      | The element type to render                                |\n| `by`               | `\"text\" \\| \"word\" \\| \"character\" \\| \"line\"`                                                                | `\"word\"`   | How to split the text (\"text\", \"word\", \"character\")       |\n| `startOnView`      | `boolean`                                                                                                  | `true`     | Whether to start animation when component enters viewport |\n| `once`             | `boolean`                                                                                                  | `false`    | Whether to animate only once                              |\n| `animation`        | `AnimationVariant`                                                                                         | `\"fadeIn\"` | The animation preset to use                               |\n| `accessible`       | `boolean`                                                                                                  | `true`     | Whether to render an accessible screen-reader label       |\n"
  },
  {
    "path": "apps/www/content/docs/components/text-reveal.mdx",
    "content": "---\ntitle: Text Reveal\ndate: 2024-04-08\ndescription: Fade in text as you scroll down the page.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/text-reveal.mp4\n---\n\n<ComponentPreview name=\"text-reveal-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/text-reveal\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"text-reveal\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { TextReveal } from \"@/components/ui/text-reveal\"\n```\n\n```tsx showLineNumbers\n<TextReveal>Magic UI will change the way you design.</TextReveal>\n```\n"
  },
  {
    "path": "apps/www/content/docs/components/tweet-card.mdx",
    "content": "---\ntitle: Tweet Card\ndate: 2023-10-15\ndescription: A card that displays a tweet with the author's name, handle, and profile picture.\nauthor: dillionverma\npublished: true\nvideo: https://cdn.magicui.design/tweet-card.mp4\n---\n\n<ComponentPreview name=\"tweet-card-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/tweet-card\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the dependencies.</Step>\n\n```bash\nnpm install react-tweet\n```\n\n### Installation React Server Component (Next.js 13+):\n\nCopy and paste the following code into your project.\n\n<ComponentSource name=\"tweet-card\" />\n\n### Installation Client Side\n\nCopy and paste the following code into your project.\n\n<ComponentSource name=\"client-tweet-card\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\nTo render on server side using RSC (Next.js 13):\n\n```tsx showLineNumbers\nimport { TweetCard } from \"@/components/ui/tweet-card\"\n\nexport default async function App() {\n  return <TweetCard id=\"1441032681968212480\" />\n}\n```\n\nTo render on client side:\n\n```tsx showLineNumbers\n\"use client\"\n\nimport { ClientTweetCard } from \"@/components/ui/client-tweet-card\"\n\nexport default function App() {\n  return <ClientTweetCard id=\"1441032681968212480\" />\n}\n```\n\n## Examples\n\n### Tweet Card With Image Carousel\n\n<ComponentPreview name=\"tweet-card-images\" />\n\n### Tweet Card With Meta URL Preview\n\n<ComponentPreview name=\"tweet-card-meta-preview\" />\n\n## Props\n\n### ClientTweetCard\n\n| Prop | Type     | Default | Description                     |\n| ---- | -------- | ------- | ------------------------------- |\n| `id` | `string` | `-`     | The id of the tweet to display. |\n\n### TweetCard\n\n| Prop | Type     | Default | Description                     |\n| ---- | -------- | ------- | ------------------------------- |\n| `id` | `string` | `-`     | The id of the tweet to display. |\n\n## Credits\n\nThis component is built on top of [React Tweet](https://react-tweet.vercel.app/).\n"
  },
  {
    "path": "apps/www/content/docs/components/typing-animation.mdx",
    "content": "---\ntitle: Typing Animation\ndate: 2024-05-22\ndescription: Characters appearing in typed animation\nauthor: imanubhardwaj\npublished: true\n---\n\n<ComponentPreview name=\"typing-animation-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/typing-animation\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"typing-animation\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Examples\n\n### Basic Usage\n\n<ComponentPreview name=\"typing-animation-demo\" />\n\n### Multiple Words with Loop\n\n<ComponentPreview name=\"typing-animation-demo-2\" />\n\n### Custom Speed\n\n<ComponentPreview name=\"typing-animation-demo-3\" />\n\n### Start on View\n\n<ComponentPreview name=\"typing-animation-demo-4\" />\n\n### Without Cursor\n\n<ComponentPreview name=\"typing-animation-demo-5\" />\n\n### Single Play (No Loop)\n\n<ComponentPreview name=\"typing-animation-demo-6\" />\n\n### Cursor Blinking\n\n<ComponentPreview name=\"typing-animation-demo-7\" />\n\n### Cursor Styles\n\n<ComponentPreview name=\"typing-animation-demo-8\" />\n\n## Usage\n\n```tsx showLineNumbers\nimport { TypingAnimation } from \"@/components/ui/typing-animation\"\n```\n\n```tsx showLineNumbers\n<TypingAnimation>Hello World! 👋</TypingAnimation>\n```\n\n## Props\n\n| Prop          | Type                                                                                                       | Default  | Description                                     |\n| ------------- | ---------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------- |\n| `children`    | `string`                                                                                                   | `-`      | Single string to animate                        |\n| `words`       | `string[]`                                                                                                 | `-`      | Array of strings to type and delete in sequence |\n| `className`   | `string`                                                                                                   | `-`      | The class name to be applied to the component   |\n| `duration`    | `number`                                                                                                   | `100`    | Duration for each character                     |\n| `typeSpeed`   | `number`                                                                                                   | `100`    | Speed of typing animation (ms per character)    |\n| `deleteSpeed` | `number`                                                                                                   | `50`     | Speed of deleting animation (ms per character)  |\n| `delay`       | `number`                                                                                                   | `0`      | Delay before animation starts (in ms)           |\n| `pauseDelay`  | `number`                                                                                                   | `1000`   | Pause duration between words (in ms)            |\n| `loop`        | `boolean`                                                                                                  | `false`  | Whether to loop the animation                   |\n| `as`          | `\"article\" \\| \"div\" \\| \"h1\" \\| \"h2\" \\| \"h3\" \\| \"h4\" \\| \"h5\" \\| \"h6\" \\| \"li\" \\| \"p\" \\| \"section\" \\| \"span\"` | `\"span\"` | Component to render as                          |\n| `startOnView` | `boolean`                                                                                                  | `true`   | Start animation when component is in view       |\n| `showCursor`  | `boolean`                                                                                                  | `true`   | Whether to show the typing cursor               |\n| `blinkCursor` | `boolean`                                                                                                  | `true`   | Whether the cursor should blink                 |\n| `cursorStyle` | `\"line\" \\| \"block\" \\| \"underscore\"`                                                                        | `\"line\"` | Style of the cursor (like VSCode)               |\n"
  },
  {
    "path": "apps/www/content/docs/components/video-text.mdx",
    "content": "---\ntitle: Video Text\ndate: 2025-04-16\ndescription: A text component with a video background.\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"video-text-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/video-text\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"video-text\" />\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { VideoText } from \"@/components/ui/video-text\"\n```\n\n```tsx showLineNumbers\n<div className=\"relative h-[500px] w-full overflow-hidden\">\n  <VideoText src=\"https://cdn.magicui.design/ocean-small.webm\">OCEAN</VideoText>\n</div>\n```\n\n## Props\n\n| Prop               | Type                             | Default        | Description                                              |\n| ------------------ | -------------------------------- | -------------- | -------------------------------------------------------- |\n| `src`              | `string`                         | Required       | The video source URL                                     |\n| `as`               | `ElementType`                    | `\"div\"`        | The element type to render for the text                  |\n| `children`         | `ReactNode`                      | Required       | The content to display (will have the video \"inside\" it) |\n| `className`        | `string`                         | `\"\"`           | Additional className for the container                   |\n| `autoPlay`         | `boolean`                        | `true`         | Whether to autoplay the video                            |\n| `muted`            | `boolean`                        | `true`         | Whether to mute the video                                |\n| `loop`             | `boolean`                        | `true`         | Whether to loop the video                                |\n| `preload`          | `\"auto\" \\| \"metadata\" \\| \"none\"` | `\"auto\"`       | Whether to preload the video                             |\n| `fontSize`         | `string \\| number`               | `\"120\"`        | Font size for the text mask                              |\n| `fontWeight`       | `string \\| number`               | `\"bold\"`       | Font weight for the text mask                            |\n| `textAnchor`       | `string`                         | `\"middle\"`     | Text anchor for the text mask                            |\n| `dominantBaseline` | `string`                         | `\"middle\"`     | Dominant baseline for the text mask                      |\n| `fontFamily`       | `string`                         | `\"sans-serif\"` | Font family for the text mask                            |\n"
  },
  {
    "path": "apps/www/content/docs/components/warp-background.mdx",
    "content": "---\ntitle: Warp Background\ndate: 2024-12-24\ndescription: A card with a time warping background effect.\nauthor: magicui\npublished: true\n---\n\n<ComponentPreview name=\"warp-background-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/warp-background\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"warp-background\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { WarpBackground } from \"@/components/ui/warp-background\"\n```\n\n```tsx showLineNumbers\n<WarpBackground>\n  <div className=\"w-80\">\n    <p>Warp Background</p>\n    <p>This is a component that creates a warp background effect.</p>\n  </div>\n</WarpBackground>\n```\n\n## Props\n\n| Prop           | Type              | Default           | Description                                     |\n| -------------- | ----------------- | ----------------- | ----------------------------------------------- |\n| `children`     | `React.ReactNode` | `-`               | The content to be put inside the warp animation |\n| `perspective`  | `number`          | `100`             | The perspective of the warp animation           |\n| `beamsPerSide` | `number`          | `3`               | The number of beams per side                    |\n| `beamSize`     | `number`          | `5`               | The size of the beams                           |\n| `beamDelayMax` | `number`          | `3`               | The maximum delay of the beams                  |\n| `beamDelayMin` | `number`          | `0`               | The minimum delay of the beams                  |\n| `beamDuration` | `number`          | `3`               | The duration of the beams                       |\n| `gridColor`    | `string`          | `\"var(--border)\"` | The color of the grid lines                     |\n"
  },
  {
    "path": "apps/www/content/docs/components/word-rotate.mdx",
    "content": "---\ntitle: Word Rotate\ndate: 2024-05-21\ndescription: A vertical rotation of words\nauthor: dillionverma\npublished: true\n---\n\n<ComponentPreview name=\"word-rotate-demo\" />\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n<TabsContent value=\"cli\">\n\n```bash\nnpx shadcn@latest add @magicui/word-rotate\n```\n\n</TabsContent>\n\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Install the following dependencies:</Step>\n\n```bash\nnpm install motion\n```\n\n<Step>Copy and paste the following code into your project.</Step>\n\n<ComponentSource name=\"word-rotate\" />\n\n<Step>Update the import paths to match your project setup.</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\n```tsx showLineNumbers\nimport { WordRotate } from \"@/components/ui/word-rotate\"\n```\n\n```tsx showLineNumbers\n<WordRotate words={[\"Word\", \"Rotate\"]} />\n```\n\n## Props\n\n| Prop          | Type              | Default | Description                                   |\n| ------------- | ----------------- | ------- | --------------------------------------------- |\n| `className`   | `string`          | `-`     | The class name to be applied to the component |\n| `duration`    | `number`          | `2500`  | Duration of the animation                     |\n| `words`       | `string[]`        | `\"\"`    | An array of words to rotate through           |\n| `motionProps` | `HTMLMotionProps` | `{}`    | An object containing motion animation props   |\n"
  },
  {
    "path": "apps/www/content/docs/index.mdx",
    "content": "---\ntitle: Introduction\ndescription: Create magical landing pages with components that you can copy and paste into your apps.\n---\n\nMagic UI is a collection of re-usable components that you can copy and paste into your web apps.\n\nIt primarily features components, blocks, and templates geared towards creating landing pages and user-facing marketing materials.\n\n## Philosophy\n\n**I personally believe that good design contributes significant value to software. It's one of the main methods of establishing trust between you and an internet stranger**. Trust is important for internet businesses because it is the first thing a visitor evaluates before pulling out their credit card and becoming a customer.\n\nSome questions visitors might ask themselves are:\n\n- \"Is this company legit?\"\n- \"Who else is using it?\"\n- \"Can I trust them with my personal data?\"\n\n**Poor design reflects poorly on your team.** It comes off as lazy, unfinished, and unstable. It shows that the team doesn't care about user experience.\n\n**Good design indicates that the team behind has their shit together.** I can probably expect good things from them in the future.\n\nIt makes me think \"if they care so much about these tiny details, they must care a lot about other things in the company, including their customers!\".\n\nA great example of this in play is https://linear.app landing page which I first came across in 2020. I didn't even need to try the product but I already knew that it _must_ be good.\n\nThis library is heavily inspired by [https://ui.shadcn.com](https://ui.shadcn.com).\n"
  },
  {
    "path": "apps/www/content/docs/installation/index.mdx",
    "content": "---\ntitle: Installation\ndescription: How to install dependencies and structure your app.\ndate: 2024-09-16\n---\n\n<Callout>\n\n**Note:** We have the exact same installation process as [shadcn/ui](https://ui.shadcn.com/docs/installation/).\n\n</Callout>\n\n<Steps>\n\n### Create project\n\nRun the `init` command to create a new Next.js project or to setup an existing one:\n\n```bash\nnpx shadcn@latest init\n```\n\n### Add components\n\nYou can now start adding components to your project.\n\n```bash\nnpx shadcn@latest add @magicui/globe\n```\n\n### Import component\n\nThe command above will add the `Globe` component to your project. You can then import it like this:\n\n```tsx {1,6} showLineNumbers\nimport { Globe } from \"@/components/ui/globe\"\n\nexport default function Home() {\n  return <Globe />\n}\n```\n\n</Steps>\n"
  },
  {
    "path": "apps/www/content/docs/legacy.mdx",
    "content": "---\ntitle: Legacy Versions\ndescription: Documentation for older versions of Magic UI.\ndate: 2025-04-08\n---\n\n## Legacy Version (Tailwind v3)\n\nFor older Magic UI components using Tailwind CSS v3, visit: [v3.magicui.design](https://v3.magicui.design)\n\n## Upgrading\n\nTo upgrade from legacy to current version, follow the migration guide: [https://ui.shadcn.com/docs/tailwind-v4](https://ui.shadcn.com/docs/tailwind-v4)\n"
  },
  {
    "path": "apps/www/content/docs/mcp.mdx",
    "content": "---\ntitle: Magic UI MCP Server\ndescription: Learn how to use the Model Context Protocol with Magic UI.\ndate: 2025-04-16\n---\n\nMagic UI now has an official MCP server 🎉.\n\n[MCP](https://modelcontextprotocol.com/) is an open protocol that standardizes how applications provide context to LLMs.\n\nThis is useful for Magic UI because you can now give your AI-assisted IDE direct access to all Magic UI components so that it can generate code with minimal errors.\n\n<Tabs defaultValue=\"cli\">\n\n<TabsList>\n  <TabsTrigger value=\"cli\">CLI</TabsTrigger>\n  <TabsTrigger value=\"manual\">Manual</TabsTrigger>\n</TabsList>\n\n<TabsContent value=\"cli\">\n\n<Steps>\n\n<Step>Installation</Step>\n\n<Tabs defaultValue=\"cursor\">\n  <TabsList>\n    <TabsTrigger value=\"cursor\">Cursor</TabsTrigger>\n    <TabsTrigger value=\"windsurf\">Windsurf</TabsTrigger>\n    <TabsTrigger value=\"claude\">Claude</TabsTrigger>\n    <TabsTrigger value=\"cline\">Cline</TabsTrigger>\n    <TabsTrigger value=\"roo-cline\">Roo-Cline</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cursor\">\n\n    ```bash\n    npx @magicuidesign/cli@latest install cursor\n    ```\n\n  </TabsContent>\n  <TabsContent value=\"windsurf\">\n  \n    ```bash\n    npx @magicuidesign/cli@latest install windsurf\n    ```\n\n  </TabsContent>\n  <TabsContent value=\"claude\">\n\n    ```bash\n    npx @magicuidesign/cli@latest install claude\n    ```\n\n  </TabsContent>\n  <TabsContent value=\"cline\">\n\n    ```bash\n    npx @magicuidesign/cli@latest install cline\n    ```\n\n  </TabsContent>\n  <TabsContent value=\"roo-cline\">\n  \n    ```bash\n    npx @magicuidesign/cli@latest install roo-cline\n    ```\n\n  </TabsContent>\n</Tabs>\n\n<Step>Restart your IDE</Step>\n\n</Steps>\n\n</TabsContent>\n<TabsContent value=\"manual\">\n\n<Steps>\n\n<Step>Add the following to your MCP config file:</Step>\n\n```json\n{\n  \"mcpServers\": {\n    \"magicuidesign-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@magicuidesign/mcp@latest\"]\n    }\n  }\n}\n```\n\n<Step>Restart your IDE</Step>\n\n</Steps>\n\n</TabsContent>\n\n</Tabs>\n\n## Usage\n\nYou can now ask your IDE to use any Magic UI component. Here are some examples:\n\n- \"Add a blur fade text animation\"\n- \"Add a grid background\"\n- \"Add a vertical marquee of logos\"\n"
  },
  {
    "path": "apps/www/content/docs/story.mdx",
    "content": "---\ntitle: Story\ndescription: Learn about how Magic UI started\npublished: true\ndate: 2023-06-26\n---\n\nMagic UI started because of an annoying problem I faced in the summer of 2023.\n\nI built my [first SaaS app](https://automatic.chat) a few months earlier and was trying to redesign the landing page for it. However, none of the code I wrote matched my expectations in my head for how it would turn out. I was irritated by the process and I especially didn't like having to deal with responsiveness, and animations in particular. Both were really time consuming for me and I felt like I wasn't making progress on actually delivering value to my SaaS users.\n\nI was trying to make landing pages like https://linear.app, https://wope.com and https://reflect.app but they were instead turning out like websites designed in 1995.\n\n**I tried to search the web for good tutorials, code examples, or guides on how to make a landing page like https://linear.app but I found nothing.**\n\nThat same week I tweeted that I would just build it myself.\n\n<Tweet id=\"1668408059125702661\" className=\"mt-4\" />\n\nThis tweet immediately went viral and it seemed like there were others like me who resonated!\n\nI started building the foundations of this site as well as a few components and within 10 days, Magic UI was in the hands of users.\n\nPeople seem to love it and we're just getting started.\n\n<div className=\"mt-4 columns-3 gap-4 [&>*]:mb-4\">\n  <Tweet id=\"1722659583464968612\" />\n  <Tweet id=\"1668442365625790465\" />\n  <Tweet id=\"1684613797984800768\" />\n  <Tweet id=\"1722690049374830639\" />\n  <Tweet id=\"1684676668445622272\" />\n  <Tweet id=\"1668640878225764354\" />\n  <Tweet id=\"1668506160620769280\" />\n  <Tweet id=\"1681477151042797568\" />\n</div>\n"
  },
  {
    "path": "apps/www/content/docs/templates/agent.mdx",
    "content": "---\ntitle: AI Agent Template\ndate: 2025-03-25\ndescription: The ultimate landing page template for your AI agent startup.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/agent-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://agent-magicui.vercel.app/\">\n      Live Preview\n    </TemplatePreview>\n  </div>\n</div>\n\n### What is this?\n\nThis is a landing page template for an AI agent startup. The template is built with Next.js, TailwindCSS, and Motion, optimized for showcasing AI agent services.\n\n### Who is this for?\n\nYou are launching a new AI agent startup and need a professional, eye-catching landing page to showcase your product's features.\n\n### Why should I use this?\n\n- ✅ Save 500+ hours of work\n- ✅ No need to learn advanced animations\n- ✅ Easy to configure and change\n- ✅ 1-click download and setup\n- ✅ 5 minutes to update the text and images\n- ✅ Deploy live to Vercel\n\n### Features\n\n- 1x Landing Page with 9 sections\n  - Header Section\n  - Hero Section\n  - Logos Section\n  - Features Bento Grid Section\n  - Testimonials Section\n  - Pricing Section\n  - FAQ Section\n  - CTA Section\n  - Footer Section\n- Dark mode support\n- 100% Mobile responsive\n- Full SEO coverage\n- Dynamic OpenGraph images for every page\n- Tons of animations / micro-interactions\n- Clean and maintainable code\n- Global constants and variables for color, text, and more\n\n### Dependencies\n\n- Next.js 15.2.2\n- React 19\n- TypeScript 5\n- TailwindCSS 4\n- Motion 12.5\n- next-themes 0.4.6\n- radix-ui\n- shadcn/ui\n"
  },
  {
    "path": "apps/www/content/docs/templates/blog.mdx",
    "content": "---\ntitle: Blog Template\ndate: 2025-09-16\ndescription: A minimal blog template built using Next.js.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/blog-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen url=\"https://github.com/magicuidesign/blog-template\" free />\n    <TemplatePreview href=\"https://blog-magicui.vercel.app/\">\n      Live Preview{\" \"}\n    </TemplatePreview>\n  </div>\n</div>\n\nA minimal changelog template to showcase your product updates, releases, and improvements in a beautiful timeline format. Built with Next.js, TailwindCSS, and Fumadocs for easy content management.\n\n### Dependencies\n\n- Next.js 15\n- React 19\n- TypeScript 5\n- TailwindCSS 4\n- Fumadocs UI\n- next-themes\n- radix-ui\n- shadcn/ui\n\n### Tech Stack\n\n<TechStack\n  technologies={[\"nextjs\", \"react\", \"typescript\", \"tailwindcss\", \"shadcn\"]}\n/>\n"
  },
  {
    "path": "apps/www/content/docs/templates/changelog.mdx",
    "content": "---\ntitle: Changelog Template\ndate: 2025-07-16\ndescription: A minimal changelog template built using Next.js.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/changelog-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen\n      url=\"https://github.com/magicuidesign/changelog-template\"\n      free\n    />\n    <TemplatePreview href=\"https://changelog-magicui.vercel.app/\">\n      Live Preview{\" \"}\n    </TemplatePreview>\n  </div>\n</div>\n\nA minimal changelog template to showcase your product updates, releases, and improvements in a beautiful timeline format. Built with Next.js, TailwindCSS, and Fumadocs for easy content management.\n\n### Dependencies\n\n- Next.js 15\n- React 19\n- TypeScript 5\n- TailwindCSS 4\n- Fumadocs UI\n- next-themes\n- radix-ui\n- shadcn/ui\n\n### Tech Stack\n\n<TechStack\n  technologies={[\"nextjs\", \"react\", \"typescript\", \"tailwindcss\", \"shadcn\"]}\n/>\n"
  },
  {
    "path": "apps/www/content/docs/templates/codeforge.mdx",
    "content": "---\ntitle: Codeforge Template\ndate: 2025-12-23\ndescription: A professional landing page template designed for developer tools and workflow automation platforms. Showcase your product's capabilities with interactive demos, workflow visualizations, and compelling features.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/codeforge-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://codeforge-magicui.vercel.app/\">\n      Live Preview\n    </TemplatePreview>\n  </div>\n</div>\n\n### What is this?\n\nThis is a landing page template for an AI agent startup. The template is built with Next.js, TailwindCSS, and Motion, optimized for showcasing AI agent services.\n\n### Who is this for?\n\nYou are launching a new AI agent startup and need a professional, eye-catching landing page to showcase your product's features.\n\n### Why should I use this?\n\n- ✅ Save 500+ hours of work\n- ✅ Landing Page with 9 sections\n- ✅ Dark mode support\n- ✅ 100% Mobile responsive\n- ✅ SEO optimized\n- ✅ Interactive animations\n- ✅ Workflow visualization components\n- ✅ Clean and maintainable code\n- ✅ Global config for easy updates\n- ✅ Easy customization\n- ✅ 1-click download and setup\n- ✅ Deploy live to Vercel\n\n### Features\n\n- Landing Page with 9 sections\n  - Header Section\n  - Hero Section\n  - Logos Section\n  - Features Bento Grid Section\n  - Testimonials Section\n  - Pricing Section\n  - FAQ Section\n  - CTA Section\n  - Footer Section\n- Dark mode support\n- 100% Mobile responsive\n- Full SEO coverage\n- Dynamic OpenGraph images for every page\n- Tons of animations / micro-interactions\n- Clean and maintainable code\n- Global constants and variables for color, text, and more\n\n### Dependencies\n\n- Next.js 15\n- React 18.3\n- TypeScript 5\n- TailwindCSS 3.4\n- Framer Motion 11.3\n- next-themes 0.3.0\n- radix-ui\n- shadcn/ui\n"
  },
  {
    "path": "apps/www/content/docs/templates/devtool.mdx",
    "content": "---\ntitle: Dev Tool\ndate: 2024-11-18\ndescription: The ultimate landing page template for your developer tool.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/devtool-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://devtool-magicui.vercel.app/\">\n      Live Preview\n    </TemplatePreview>\n  </div>\n</div>\n### What is this?\n\nThis is a landing page template for a developer tool. The template is built with Next.js, TailwindCSS, and Framer Motion, optimized for showcasing developer tools and services.\n\n### Who is this for?\n\nYou are launching a new developer tool or service and need a professional, eye-catching landing page to showcase your product's features and attract developers.\n\n### Why should I use this?\n\n- ✅ Save 500+ hours of work\n- ✅ No need to learn advanced animations\n- ✅ Easy to configure and change\n- ✅ 1-click download and setup\n- ✅ 5 minutes to update the text and images\n- ✅ Deploy live to Vercel\n\n### Features\n\n- 1x Landing Page with 13 sections\n  - Header Section\n  - Hero Section\n  - Logos Section\n  - Examples Section\n  - Use Cases Section\n  - Features Section\n  - Statistics Section\n  - Testimonials Section\n  - Pricing Section\n  - Community Section\n  - Blog Section\n  - CTA Section\n  - Footer Section\n- 1x Blog using MDX\n- Dark mode support\n- 100% Mobile responsive\n- Full SEO coverage\n- Dynamic OpenGraph images for every page\n- Tons of animations / micro-interactions\n- Clean and maintainable code\n- Global constants and variables for color, text, and more\n\n### Dependencies\n\n- Next.js 15\n- React 18.3\n- TypeScript 5\n- TailwindCSS 3.4\n- Framer Motion 11.3\n- next-themes 0.3.0\n- radix-ui\n- shadcn/ui\n"
  },
  {
    "path": "apps/www/content/docs/templates/mobile.mdx",
    "content": "---\ntitle: Mobile\ndate: 2024-10-18\ndescription: The ultimate landing page template for your mobile app.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/mobile-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://mobile-magicui.vercel.app/\">\n      Live Preview\n    </TemplatePreview>\n  </div>\n</div>\n### What is this?\n\nThis is a landing page template for a mobile app. The template is built with Next.js, TailwindCSS, and Framer Motion, optimized for showcasing mobile applications.\n\n### Who is this for?\n\nYou are launching a new mobile app and need a professional, eye-catching landing page to showcase your app's features and drive downloads.\n\n### Why should I use this?\n\n- ✅ Save 500+ hours of work\n- ✅ No need to learn advanced animations\n- ✅ Easy to configure and change\n- ✅ 1-click download and setup.\n- ✅ 5 minutes to update the text and images.\n- ✅ Deploy live to vercel\n\n### Features\n\n- 1x Landing Page with 12 sections\n  - Header Section\n  - Hero Section\n  - Feature Scroll Section\n  - Bento Grid Section\n  - Feature Highlight Section\n  - Benefits Section\n  - Features Section\n  - Testimonials Section\n  - Pricing Section\n  - FAQ Section\n  - CTA Section\n  - Footer Section\n- Dark mode support\n- 100% Mobile responsive\n- Full SEO coverage\n- Dynamic OpenGraph images for every page\n- Tons of animations / micro-interactions\n- Clean and maintainable code\n- Global constants and variables for color, text, and more\n\n### Dependencies\n\n- Next.js 14\n- React 18.3\n- TypeScript 5\n- TailwindCSS 3.4\n- Framer Motion 11.3\n- next-themes 0.3\n- radix-ui\n- shadcn/ui\n"
  },
  {
    "path": "apps/www/content/docs/templates/portfolio.mdx",
    "content": "---\ntitle: Portfolio Template\ndate: 2024-06-18\ndescription: A minimal portfolio template to showcase your work and experience.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/portfolio-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen url=\"https://github.com/dillionverma/portfolio\" free />\n    <TemplatePreview href=\"https://portfolio-magicui.vercel.app/\">\n      Live Preview{\" \"}\n    </TemplatePreview>\n  </div>\n</div>\n\nA portfolio template used to showcase your skills, work experience, and projects as a developer.\n\n### Features\n\n- Hero Section\n- About Section\n- Work Section\n- Education Section\n- Projects Section\n- Hackathon Section\n- Contact Section\n- Blog\n\n### Tech Stack\n\n<TechStack\n  technologies={[\n    \"nextjs\",\n    \"react\",\n    \"typescript\",\n    \"tailwindcss\",\n    \"motion\",\n    \"shadcn\",\n  ]}\n/>\n"
  },
  {
    "path": "apps/www/content/docs/templates/saas.mdx",
    "content": "---\ntitle: SaaS Template\ndate: 2024-09-05\ndescription: The ultimate landing page template for your SaaS product.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/saas-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://saas-magicui.vercel.app/\">\n      Live Preview\n    </TemplatePreview>\n  </div>\n</div>\n\n### What is this?\n\nThis is a landing page template for a SaaS product. The template is built with Next.js, TailwindCSS, and Framer Motion.\n\n### Who is this for?\n\nYou are looking to launch a new SaaS product but don't want to spend time on learning frontend or figuring out how to design.\n\n### Why should I use this?\n\n- ✅ Save 500+ hours of work\n- ✅ No need to learn advanced animations\n- ✅ Easy to configure and change\n- ✅ 1-click download and setup.\n- ✅ 5 minutes to update the text and images.\n- ✅ Deploy live to vercel\n\n### Features\n\n- 1x Landing Page with 14 sections\n  - Header Section\n  - Hero Section\n  - Logos Section\n  - Problem Section\n  - Solution Section\n  - How It Works Section\n  - Testimonial Highlight Section\n  - Features Section\n  - Testimonials Section\n  - Pricing Section\n  - FAQ Section\n  - Blog Section\n  - CTA Section\n  - Footer Section\n- 1x Blog using MDX\n- Dark mode support\n- 100% Mobile responsive\n- Full SEO coverage\n- Dynamic OpenGraph images for every page\n- Tons of animations / micro-interactions\n- Clean and maintainable code\n- Global constants and variables for color, text, and more\n\n### Dependencies\n\n- Next.js 14\n- React 18.3\n- TypeScript 5\n- TailwindCSS 3.4\n- Framer Motion 11.3\n- next-themes 0.3\n- radix-ui\n- shadcn/ui\n"
  },
  {
    "path": "apps/www/content/docs/templates/startup.mdx",
    "content": "---\ntitle: Startup Template\ndate: 2024-04-12\ndescription: The best landing page template for launching new ideas. Perfect for bootstrappers and pre-PMF VC backed startups.\nauthor: dillionverma\npublished: true\n---\n\n<div className=\"flex max-w-[800px] flex-col gap-4\">\n  <video\n    autoPlay\n    loop\n    muted\n    playsInline\n    src=\"https://cdn.magicui.design/startup-template-demo.mp4\"\n    className=\"w-full rounded-xl border\"\n  />\n  <div className=\"flex w-full flex-col gap-2 sm:flex-row\">\n    <TemplateOpen />\n    <TemplatePreview href=\"https://startup-template-sage.vercel.app/\">\n      Live Preview{\" \"}\n    </TemplatePreview>\n  </div>\n</div>\n\n### What is this?\n\nA complete landing page template to launch a new project or idea (frontend only). Uses the latest frontend technologies and best practices to unblock you and delight your customers.\n\n### Who is this for?\n\nYou are an indiehacker, bootstrapper, YC startup, solopreneur, VC-backed startup, developer, or student. You are thinking about launching a new idea or already have a prototype. Maybe it's an AI SaaS, a crazy drone robot company, or just a simple digital product. But... you dread the idea of learning react or anything frontend 😩\n\n**This template is exactly what you're looking for.**\n\n### Why should I use this?\n\n- ✅ Save 100+ hours of work\n- ✅ No need to learn advanced animations\n- ✅ Easy to configure and change\n- ✅ 1-click download and setup.\n- ✅ 5 minutes to update the text and images.\n- ✅ Deploy live to vercel\n\n### Features\n\n- Header Section\n- Hero Section\n- Social Proof Section\n- Pricing Section\n- Call To Action Section\n- Footer Section\n- Mobile Reponsive Navbar\n\n### Tech Stack\n\n<TechStack\n  technologies={[\n    \"nextjs\",\n    \"react\",\n    \"typescript\",\n    \"tailwindcss\",\n    \"motion\",\n    \"shadcn\",\n  ]}\n/>\n"
  },
  {
    "path": "apps/www/content/showcase/anara.mdx",
    "content": "---\ntitle: anara.com\ndescription: Anara is part of buildspace sf1, pioneer, and YC S24\nimage: https://cdn.magicui.design/showcase/anara.png\nhref: https://anara.com\nfeatured: true\naffiliation: YC S24\n---\n"
  },
  {
    "path": "apps/www/content/showcase/anisvsc.mdx",
    "content": "---\ntitle: anishfn.space\ndescription: Anish's Portfolio site\nimage: https://cdn.magicui.design/showcase/anisvsc.png\nhref: https://anishfn.space\nfeatured: false\naffiliation: Portfolio Site\n---\n"
  },
  {
    "path": "apps/www/content/showcase/aomni.mdx",
    "content": "---\ntitle: aomni.com\ndescription: Get instant, AI-generated insights on your prospects to close deals faster and smarter.\nimage: https://cdn.magicui.design/showcase/aomni.png\nhref: https://aomni.com\nfeatured: true\naffiliation: Raised seed round from notable investors.\n---\n"
  },
  {
    "path": "apps/www/content/showcase/aryankarma.mdx",
    "content": "---\ntitle: Aryan Karma\ndescription: Personal portfolio website\nimage: /showcase/aryankarma.png\nhref: https://aryankarma.com\nfeatured: true\naffiliation: Personal Portfolio\n---\n"
  },
  {
    "path": "apps/www/content/showcase/cognosys.mdx",
    "content": "---\ntitle: cognosys.ai\ndescription: Cognosys is a platform for building and deploying AI agents\nimage: https://cdn.magicui.design/showcase/cognosys.png\nhref: https://cognosys.ai\nfeatured: true\nauthor: \"@cognosysai\"\naffiliation: Backed by Google Ventures, raised $2M\n---\n"
  },
  {
    "path": "apps/www/content/showcase/elhussary.mdx",
    "content": "---\ntitle: elhussary\ndescription: Elhussary's Portfolio Website.\nimage: https://cdn.magicui.design/showcase/elhussary.png\nhref: https://elhussary.vercel.app/\nfeatured: true\naffiliation: Personal Portfolio\n---\n"
  },
  {
    "path": "apps/www/content/showcase/gitme.mdx",
    "content": "---\ntitle: gitme.live\ndescription: open-source platform to learn Git and GitHub. It is designed to be simple and easy to understand for beginners.\nimage: https://cdn.magicui.design/showcase/gitme.png\nhref: https://www.gitme.live/\nfeatured: false\naffiliation: Open Source Community\n---\n"
  },
  {
    "path": "apps/www/content/showcase/guarahooks.mdx",
    "content": "---\ntitle: guarahooks.com\ndescription: Set of reusable and customizable hooks that you can copy-and-paste into your apps. Free. Open Source and Open Code.\nimage: https://cdn.magicui.design/showcase/guarahooks.png\nhref: https://guarahooks.com\nfeatured: true\naffiliation: Open Source Project\n---\n"
  },
  {
    "path": "apps/www/content/showcase/infisical.mdx",
    "content": "---\ntitle: infisical.com\ndescription: Infisical is a platform for managing secrets.\nimage: https://cdn.magicui.design/showcase/infisical.png\nhref: https://infisical.com\nfeatured: true\naffiliation: YC W23, raised $2.8M\n---\n"
  },
  {
    "path": "apps/www/content/showcase/langfuse.mdx",
    "content": "---\ntitle: langfuse.com\ndescription: Open Source LLM Engineering Platform\nimage: https://cdn.magicui.design/showcase/langfuse.png\nhref: https://langfuse.com\nfeatured: true\naffiliation: YC W23, raised $4M\n---\n"
  },
  {
    "path": "apps/www/content/showcase/llmreport.mdx",
    "content": "---\ntitle: llm.report\ndescription: LLM Report is an LLM observability platform\nimage: https://cdn.magicui.design/showcase/llmreport.png\nhref: https://llm.report\nfeatured: true\naffiliation: Vercel AI Accelerator 2023, won $120k\n---\n"
  },
  {
    "path": "apps/www/content/showcase/lyra.mdx",
    "content": "---\ntitle: lyra.marqraft.com\ndescription: Lyra is an AI-powered Markdown editor\nimage: https://cdn.magicui.design/showcase/lyra.png\nhref: https://lyra.marqraft.com/?ref=magicui\nfeatured: true\naffiliation: Bootstrapped\n---\n"
  },
  {
    "path": "apps/www/content/showcase/million.mdx",
    "content": "---\ntitle: million.dev\ndescription: Million.dev makes websites fast.\nimage: https://cdn.magicui.design/showcase/million.png\nhref: https://million.dev\nfeatured: true\naffiliation: YC W24\n---\n"
  },
  {
    "path": "apps/www/content/showcase/nativeexpress.mdx",
    "content": "---\ntitle: native.express\ndescription: NativeExpress is the ultimate React Native starting kit.\nimage: https://cdn.magicui.design/showcase/nativeexpress.png\nhref: https://native.express\nfeatured: false\naffiliation: Bootstrapped\n---\n"
  },
  {
    "path": "apps/www/content/showcase/pulpsense.mdx",
    "content": "---\ntitle: PulpSense.com\ndescription: Grow your business, not your payroll — AI automation for sales, marketing, and operations\nimage: /showcase/pulpsense.png\nhref: https://pulpsense.com\nfeatured: true\naffiliation: n8n Expert Partner\n---\n"
  },
  {
    "path": "apps/www/content/showcase/querylab.mdx",
    "content": "---\ntitle: querylab.ai\ndescription: One Click AI Powered Database Sandboxes\nimage: https://cdn.magicui.design/showcase/querylab.png\nhref: https://querylab.ai\nfeatured: true\naffiliation: Bootstrapped\n---\n"
  },
  {
    "path": "apps/www/content/showcase/roammoon.mdx",
    "content": "---\ntitle: roammoon.com\ndescription: A website of a gaming startup company\nimage: https://cdn.magicui.design/showcase/roammoon.png\nhref: https://roammoon.com\nfeatured: false\naffiliation: Gaming startup\n---\n"
  },
  {
    "path": "apps/www/content/showcase/sherpa.mdx",
    "content": "---\ntitle: trysherpa.bot\ndescription: Supercharge your coding task management\nimage: https://cdn.magicui.design/showcase/sherpa.jpeg\nhref: https://trysherpa.bot/\nfeatured: true\naffiliation: \"Bootstrapped\"\n---\n"
  },
  {
    "path": "apps/www/content/showcase/undrstnd.mdx",
    "content": "---\ntitle: undrstnd.dev\ndescription: Build Fast AI-Powered Project\nimage: https://cdn.magicui.design/showcase/undrstnd.png\nhref: https://undrstnd.dev\nfeatured: true\naffiliation: StartUp Act Tunisia\n---\n"
  },
  {
    "path": "apps/www/content/showcase/writora.mdx",
    "content": "---\ntitle: writora.xyz\ndescription: Create AI-powered blogs with videos, customize content, and export in Markdown—effortless and efficient!\nimage: https://cdn.magicui.design/showcase/writora.png\nhref: https://writora.xyz\nfeatured: true\naffiliation: Open Source Project\n---\n"
  },
  {
    "path": "apps/www/content/showcase/zen-browser.mdx",
    "content": "---\ntitle: zen-browser.app\ndescription: Zen Browser is a new open source browser based on the firefox engine.\nimage: https://cdn.magicui.design/showcase/zen-browser.png\nhref: https://zen-browser.app\nfeatured: false\naffiliation: Mentioned by Theo (t3.gg) on Youtube as having a \"Beautiful home page\"\n---\n"
  },
  {
    "path": "apps/www/content/showcase/zzzzshawn.mdx",
    "content": "---\ntitle: shawn\ndescription: Shawn's portfolio website.\nimage: https://cdn.magicui.design/showcase/shawn.png\nhref: https://www.zzzzshawn.cloud/\nfeatured: true\naffiliation: Portfolio site\n---\n"
  },
  {
    "path": "apps/www/eslint.config.mjs",
    "content": "import { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport { FlatCompat } from \"@eslint/eslintrc\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nconst compat = new FlatCompat({\n  baseDirectory: __dirname,\n})\n\nconst eslintConfig = [\n  {\n    ignores: [\n      \"node_modules/**\",\n      \".next/**\",\n      \"out/**\",\n      \"build/**\",\n      \"next-env.d.ts\",\n      \".source/**\",\n    ],\n  },\n  ...compat.config({\n    extends: [\"next/core-web-vitals\", \"next/typescript\"],\n    rules: {\n      \"@next/next/no-duplicate-head\": \"off\",\n    },\n  }),\n  {\n    files: [\"registry/**/*.tsx\"],\n    rules: {\n      \"@next/next/no-img-element\": \"off\",\n    },\n  },\n]\n\nexport default eslintConfig\n"
  },
  {
    "path": "apps/www/hooks/use-config.ts",
    "content": "import { useAtom } from \"jotai\"\nimport { atomWithStorage } from \"jotai/utils\"\n\ntype Config = {\n  packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\"\n  installationType: \"cli\" | \"manual\"\n}\n\nconst configAtom = atomWithStorage<Config>(\"config\", {\n  packageManager: \"pnpm\",\n  installationType: \"cli\",\n})\n\nexport function useConfig() {\n  return useAtom(configAtom)\n}\n"
  },
  {
    "path": "apps/www/hooks/use-copy-to-clipboard.ts",
    "content": "\"use client\"\n\nimport * as React from \"react\"\n\nexport function useCopyToClipboard({\n  timeout = 2000,\n  onCopy,\n}: {\n  timeout?: number\n  onCopy?: () => void\n} = {}) {\n  const [isCopied, setIsCopied] = React.useState(false)\n\n  const copyToClipboard = (value: string) => {\n    if (typeof window === \"undefined\" || !navigator.clipboard.writeText) {\n      return\n    }\n\n    if (!value) return\n\n    navigator.clipboard.writeText(value).then(() => {\n      setIsCopied(true)\n\n      if (onCopy) {\n        onCopy()\n      }\n\n      if (timeout !== 0) {\n        setTimeout(() => {\n          setIsCopied(false)\n        }, timeout)\n      }\n    }, console.error)\n  }\n\n  return { isCopied, copyToClipboard }\n}\n"
  },
  {
    "path": "apps/www/hooks/use-is-mac.ts",
    "content": "import { useEffect, useState } from \"react\"\n\nexport function useIsMac() {\n  const [isMac, setIsMac] = useState(true)\n\n  useEffect(() => {\n    setIsMac(navigator.platform.toUpperCase().includes(\"MAC\"))\n  }, [])\n\n  return isMac\n}\n"
  },
  {
    "path": "apps/www/hooks/use-meta-color.ts",
    "content": "import * as React from \"react\"\nimport { useTheme } from \"next-themes\"\n\nexport const META_THEME_COLORS = {\n  light: \"#ffffff\",\n  dark: \"#0a0a0a\",\n}\n\nexport function useMetaColor() {\n  const { resolvedTheme } = useTheme()\n\n  const metaColor = React.useMemo(() => {\n    return resolvedTheme !== \"dark\"\n      ? META_THEME_COLORS.light\n      : META_THEME_COLORS.dark\n  }, [resolvedTheme])\n\n  const setMetaColor = React.useCallback((color: string) => {\n    document\n      .querySelector('meta[name=\"theme-color\"]')\n      ?.setAttribute(\"content\", color)\n  }, [])\n\n  return {\n    metaColor,\n    setMetaColor,\n  }\n}\n"
  },
  {
    "path": "apps/www/hooks/use-mobile.ts",
    "content": "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"
  },
  {
    "path": "apps/www/hooks/use-mounted.ts",
    "content": "import * as React from \"react\"\n\nexport function useMounted() {\n  const [mounted, setMounted] = React.useState(false)\n\n  React.useEffect(() => {\n    setMounted(true)\n  }, [])\n\n  return mounted\n}\n"
  },
  {
    "path": "apps/www/hooks/use-mutation-observer.ts",
    "content": "import * as React from \"react\"\n\nexport const useMutationObserver = (\n  ref: React.RefObject<HTMLElement | null>,\n  callback: MutationCallback,\n  options: MutationObserverInit = {\n    attributes: true,\n    characterData: true,\n    childList: true,\n    subtree: true,\n  }\n) => {\n  React.useEffect(() => {\n    if (ref.current) {\n      const observer = new MutationObserver(callback)\n      observer.observe(ref.current, options)\n      return () => observer.disconnect()\n    }\n  }, [ref, callback, options])\n}\n"
  },
  {
    "path": "apps/www/lib/docs.ts",
    "content": "import { getRegistryItem } from \"@/lib/registry\"\n\n/**\n * Replaces ComponentSource tags in content with actual source code from the registry.\n *\n * This function searches for `<ComponentSource name=\"XXXXX\" ... >` tags in the provided\n * content and replaces them with formatted code blocks containing the actual source code\n * from the component registry.\n *\n * @param content - The content string containing ComponentSource tags to be replaced\n * @returns A promise that resolves to the content with ComponentSource tags replaced by actual source code\n *\n * @example\n * ```typescript\n * const content = '<ComponentSource name=\"button\" />';\n * const result = await replaceComponentSource(content);\n * // Returns: ```tsx\\n[actual button component source code]\\n```\n * ```\n */\n\nexport const replaceComponentSource = async (content: string) => {\n  // Replace <ComponentSource name=\"XXXXX\" ... > with actual source code\n  const componentSourceMatches = [\n    ...content.matchAll(/<ComponentSource\\s+name=\"([^\"]+)\"[^>]*>/g),\n  ]\n  for (const [fullMatch, name] of componentSourceMatches) {\n    const component = await getRegistryItem(name)\n    if (component?.files?.[0]?.content) {\n      const sourceCode = component.files[0].content\n      const replacement = `\\`\\`\\`tsx\\n${sourceCode}\\n\\`\\`\\``\n      content = content.replace(fullMatch, replacement)\n    } else {\n      content = content.replace(fullMatch, fullMatch)\n    }\n  }\n\n  return content\n}\n"
  },
  {
    "path": "apps/www/lib/events.ts",
    "content": "import { z } from \"zod\"\n\nimport { capturePostHogEvent } from \"@/lib/posthog\"\n\nconst eventSchema = z.object({\n  name: z.enum([\n    \"copy_npm_command\",\n    \"copy_usage_code\",\n    \"copy_source_code\",\n    \"set_layout\",\n    \"template_agent_clicked\",\n    \"template_devtool_clicked\",\n    \"template_mobile_clicked\",\n    \"template_saas_clicked\",\n    \"template_startup_clicked\",\n    \"template_portfolio_clicked\",\n    \"template_marketing_clicked\",\n    \"template_changelog_clicked\",\n    \"template_blog_clicked\",\n\n    \"sidebar_cta_clicked\",\n    \"header_cta_clicked\",\n    \"banner_cta_clicked\",\n    \"product_hunt_banner_clicked\",\n    \"product_hunt_sidebar_cta_clicked\",\n  ]),\n  properties: z\n    .record(\n      z.string(),\n      z.union([z.string(), z.number(), z.boolean(), z.null()])\n    )\n    .optional(),\n})\n\nexport type Event = z.infer<typeof eventSchema>\n\nexport function trackEvent(input: Event): void {\n  const event = eventSchema.parse(input)\n  if (event) {\n    capturePostHogEvent(event.name, event.properties)\n  }\n}\n"
  },
  {
    "path": "apps/www/lib/fonts.ts",
    "content": "import {\n  Geist_Mono as FontMono,\n  Geist as FontSans,\n  Inter,\n} from \"next/font/google\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst fontSans = FontSans({\n  subsets: [\"latin\"],\n  variable: \"--font-sans\",\n})\n\nconst fontMono = FontMono({\n  subsets: [\"latin\"],\n  variable: \"--font-mono\",\n  weight: [\"400\"],\n})\n\nconst fontInter = Inter({\n  subsets: [\"latin\"],\n  variable: \"--font-inter\",\n})\n\nexport const fontVariables = cn(\n  fontSans.variable,\n  fontMono.variable,\n  fontInter.variable\n)\n"
  },
  {
    "path": "apps/www/lib/github.ts",
    "content": "interface GitHubIssueUrlParams {\n  owner: string\n  repo: string\n  title?: string\n  body?: string\n  labels?: string[]\n  template?: string\n  projects?: string[]\n  assignees?: string[]\n  milestone?: string\n}\n\n/**\n * Generates a GitHub issue URL with the provided parameters.\n * https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue#creating-an-issue-from-a-url-query\n *\n * @param params - Parameters for the GitHub issue URL.\n * @param params.owner - The GitHub repository owner's username.\n * @param params.repo - The name of the GitHub repository.\n * @param params.title - Optional title of the issue.\n * @param params.body - Optional body content of the issue.\n * @param params.labels - Optional array of labels for the issue.\n * @param params.template - Optional template file name for the issue.\n * @param params.projects - Optional array of project names to associate with the issue.\n * @param params.assignees - Optional array of usernames to assign the issue to.\n * @param params.milestone - Optional milestone to associate with the issue.\n * @returns A string containing the generated GitHub issue URL.\n */\nexport function getGitHubIssueUrl(params: GitHubIssueUrlParams): string {\n  const { owner, repo, ...issueParams } = params\n  const baseUrl = `https://github.com/${owner}/${repo}/issues/new`\n  const urlParams = new URLSearchParams()\n\n  Object.entries(issueParams).forEach(([key, value]) => {\n    if (Array.isArray(value)) {\n      value.forEach((item) => urlParams.append(key, item))\n    } else if (value !== undefined) {\n      urlParams.append(key, value.toString())\n    }\n  })\n\n  return `${baseUrl}?${urlParams.toString()}`\n}\n\ninterface GithubFileUrlParams {\n  owner: string\n  repo: string\n  slug: string\n}\n\nexport function getGithubFileUrl(params: GithubFileUrlParams) {\n  const { owner, repo, slug } = params\n  return `https://github.com/${owner}/${repo}/edit/main/apps/www/content${\n    slug === \"/docs\" ? \"/docs/index\" : slug\n  }.mdx`\n}\n"
  },
  {
    "path": "apps/www/lib/highlight-code.ts",
    "content": "import { codeToHtml } from \"shiki\"\nimport type { ShikiTransformer } from \"shiki\"\n\nexport const transformers = [\n  {\n    code(node) {\n      if (node.tagName === \"code\") {\n        const raw = this.source\n        node.properties[\"__raw__\"] = raw\n\n        if (raw.startsWith(\"npm install\")) {\n          node.properties[\"__npm__\"] = raw\n          node.properties[\"__yarn__\"] = raw.replace(\"npm install\", \"yarn add\")\n          node.properties[\"__pnpm__\"] = raw.replace(\"npm install\", \"pnpm add\")\n          node.properties[\"__bun__\"] = raw.replace(\"npm install\", \"bun add\")\n        }\n\n        if (raw.startsWith(\"npx create-\")) {\n          node.properties[\"__npm__\"] = raw\n          node.properties[\"__yarn__\"] = raw.replace(\n            \"npx create-\",\n            \"yarn create \"\n          )\n          node.properties[\"__pnpm__\"] = raw.replace(\n            \"npx create-\",\n            \"pnpm create \"\n          )\n          node.properties[\"__bun__\"] = raw.replace(\"npx\", \"bunx --bun\")\n        }\n\n        // npm create.\n        if (raw.startsWith(\"npm create\")) {\n          node.properties[\"__npm__\"] = raw\n          node.properties[\"__yarn__\"] = raw.replace(\"npm create\", \"yarn create\")\n          node.properties[\"__pnpm__\"] = raw.replace(\"npm create\", \"pnpm create\")\n          node.properties[\"__bun__\"] = raw.replace(\"npm create\", \"bun create\")\n        }\n\n        // npx.\n        if (raw.startsWith(\"npx\")) {\n          node.properties[\"__npm__\"] = raw\n          node.properties[\"__yarn__\"] = raw.replace(\"npx\", \"yarn\")\n          node.properties[\"__pnpm__\"] = raw.replace(\"npx\", \"pnpm dlx\")\n          node.properties[\"__bun__\"] = raw.replace(\"npx\", \"bunx --bun\")\n        }\n\n        // npm run.\n        if (raw.startsWith(\"npm run\")) {\n          node.properties[\"__npm__\"] = raw\n          node.properties[\"__yarn__\"] = raw.replace(\"npm run\", \"yarn\")\n          node.properties[\"__pnpm__\"] = raw.replace(\"npm run\", \"pnpm\")\n          node.properties[\"__bun__\"] = raw.replace(\"npm run\", \"bun\")\n        }\n      }\n    },\n  },\n] as ShikiTransformer[]\n\nexport async function highlightCode(code: string, language: string = \"tsx\") {\n  const html = await codeToHtml(code, {\n    lang: language,\n    themes: {\n      dark: \"github-dark\",\n      light: \"github-light\",\n    },\n    transformers: [\n      {\n        pre(node) {\n          node.properties[\"class\"] =\n            \"no-scrollbar min-w-0 overflow-x-auto px-4 py-3.5 outline-none has-[[data-highlighted-line]]:px-0 has-[[data-line-numbers]]:px-0 has-[[data-slot=tabs]]:p-0 !bg-transparent\"\n        },\n        code(node) {\n          node.properties[\"data-line-numbers\"] = \"\"\n        },\n        line(node) {\n          node.properties[\"data-line\"] = \"\"\n        },\n      },\n    ],\n  })\n\n  return html\n}\n"
  },
  {
    "path": "apps/www/lib/posthog.ts",
    "content": "import posthog from \"posthog-js\"\n\ntype PostHogPropertyValue = string | number | boolean | null\n\nexport type PostHogEventProperties = Record<string, PostHogPropertyValue>\n\nconst posthogApiKey = process.env.NEXT_PUBLIC_POSTHOG_API_KEY?.trim() ?? \"\"\n\nexport const isPostHogEnabled = posthogApiKey.length > 0\n\nlet hasInitializedPostHog = false\n\nexport function initPostHog(): void {\n  if (\n    typeof window === \"undefined\" ||\n    !isPostHogEnabled ||\n    hasInitializedPostHog\n  ) {\n    return\n  }\n\n  hasInitializedPostHog = true\n\n  posthog.init(posthogApiKey, {\n    api_host: \"https://app.posthog.com\",\n    capture_pageview: true,\n    session_recording: {\n      maskAllInputs: false,\n    },\n    loaded: (client) => {\n      if (process.env.NODE_ENV === \"development\") {\n        client.debug()\n      }\n    },\n  })\n}\n\nexport function capturePostHogEvent(\n  name: string,\n  properties?: PostHogEventProperties\n): void {\n  if (!isPostHogEnabled) {\n    return\n  }\n\n  initPostHog()\n  posthog.capture(name, properties)\n}\n"
  },
  {
    "path": "apps/www/lib/registry.ts",
    "content": "import fs from \"node:fs/promises\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { RegistryItem, registryItemSchema } from \"shadcn/schema\"\nimport { Project, ScriptKind } from \"ts-morph\"\n\nimport { Index } from \"@/registry/__index__\"\n\n// Fumadocs zod v4 compat type fix. Temporary.\ninterface RegistryItemFile {\n  path: string\n  content: string\n  type: RegistryItem[\"type\"]\n  target: string\n}\n\nexport function getRegistryComponent(name: string) {\n  return Index[name]?.component\n}\n\nexport async function getRegistryItem(name: string) {\n  const item = Index[name]\n\n  if (!item) {\n    return null\n  }\n\n  // Convert all file paths to object.\n  // TODO: remove when we migrate to new registry.\n  item.files = item.files.map((file: unknown) =>\n    typeof file === \"string\" ? { path: file } : file\n  )\n\n  // Fail early before doing expensive file operations.\n  const result = registryItemSchema.safeParse(item)\n  if (!result.success) {\n    return null\n  }\n\n  let files: typeof result.data.files = []\n  for (const file of item.files) {\n    const content = await getFileContent(file)\n    const relativePath = path.relative(process.cwd(), file.path)\n\n    files.push({\n      ...file,\n      path: relativePath,\n      content,\n    })\n  }\n\n  // Fix file paths.\n  files = fixFilePaths(files as RegistryItemFile[])\n\n  const parsed = registryItemSchema.safeParse({\n    ...result.data,\n    files,\n  })\n\n  if (!parsed.success) {\n    console.error(parsed.error.message)\n    return null\n  }\n\n  return parsed.data\n}\n\nasync function getFileContent(file: RegistryItemFile) {\n  const raw = await fs.readFile(file.path, \"utf-8\")\n\n  const project = new Project({\n    compilerOptions: {},\n  })\n\n  const tempFile = await createTempSourceFile(file.path)\n  const sourceFile = project.createSourceFile(tempFile, raw, {\n    scriptKind: ScriptKind.TSX,\n  })\n\n  // Remove meta variables.\n  // removeVariable(sourceFile, \"iframeHeight\")\n  // removeVariable(sourceFile, \"containerClassName\")\n  // removeVariable(sourceFile, \"description\")\n\n  let code = sourceFile.getFullText()\n\n  // Some registry items uses default export.\n  // We want to use named export instead.\n  // TODO: do we really need this? - @shadcn.\n  if (file.type !== \"registry:page\") {\n    code = code.replaceAll(\"export default\", \"export\")\n  }\n\n  // Fix imports.\n  code = fixImport(code)\n\n  return code\n}\n\nfunction getFileTarget(file: RegistryItemFile) {\n  let target = file.target\n\n  if (!target || target === \"\") {\n    const fileName = file.path.split(\"/\").pop()\n    if (\n      file.type === \"registry:block\" ||\n      file.type === \"registry:component\" ||\n      file.type === \"registry:example\"\n    ) {\n      target = `components/${fileName}`\n    }\n\n    if (file.type === \"registry:ui\") {\n      target = `components/ui/${fileName}`\n    }\n\n    if (file.type === \"registry:hook\") {\n      target = `hooks/${fileName}`\n    }\n\n    if (file.type === \"registry:lib\") {\n      target = `lib/${fileName}`\n    }\n  }\n\n  return target ?? \"\"\n}\n\nasync function createTempSourceFile(filename: string) {\n  const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n  return path.join(dir, filename)\n}\n\nfunction fixFilePaths(files: RegistryItemFile[]) {\n  if (!files) {\n    return []\n  }\n\n  // Resolve all paths relative to the first file's directory.\n  const firstFilePath = files[0].path\n  const firstFilePathDir = path.dirname(firstFilePath)\n\n  return files.map((file) => {\n    return {\n      ...file,\n      path: path.relative(firstFilePathDir, file.path),\n      target: getFileTarget(file),\n    }\n  })\n}\n\nexport function fixImport(content: string) {\n  const regex = /@\\/(.+?)\\/((?:.*?\\/)?(?:components|ui|hooks|lib))\\/([\\w-]+)/g\n\n  const replacement = (\n    match: string,\n    path: string,\n    type: string,\n    component: string\n  ) => {\n    if (type.endsWith(\"components\")) {\n      return `@/components/${component}`\n    } else if (type.endsWith(\"ui\")) {\n      return `@/components/ui/${component}`\n    } else if (type.endsWith(\"hooks\")) {\n      return `@/hooks/${component}`\n    } else if (type.endsWith(\"lib\")) {\n      return `@/lib/${component}`\n    }\n\n    return match\n  }\n\n  return content.replace(regex, replacement)\n}\n\nexport type FileTree = {\n  name: string\n  path?: string\n  children?: FileTree[]\n}\n\nexport function createFileTreeForRegistryItemFiles(\n  files: Array<{ path: string; target?: string }>\n) {\n  const root: FileTree[] = []\n\n  for (const file of files) {\n    const path = file.target ?? file.path\n    const parts = path.split(\"/\")\n    let currentLevel = root\n\n    for (let i = 0; i < parts.length; i++) {\n      const part = parts[i]\n      const isFile = i === parts.length - 1\n      const existingNode = currentLevel.find((node) => node.name === part)\n\n      if (existingNode) {\n        if (isFile) {\n          // Update existing file node with full path\n          existingNode.path = path\n        } else {\n          // Move to next level in the tree\n          currentLevel = existingNode.children!\n        }\n      } else {\n        const newNode: FileTree = isFile\n          ? { name: part, path }\n          : { name: part, children: [] }\n\n        currentLevel.push(newNode)\n\n        if (!isFile) {\n          currentLevel = newNode.children!\n        }\n      }\n    }\n  }\n\n  return root\n}\n"
  },
  {
    "path": "apps/www/lib/rehype-component.ts",
    "content": "import fs from \"fs\"\nimport path from \"path\"\nimport { UnistNode, UnistTree } from \"types/unist\"\nimport { u } from \"unist-builder\"\nimport { visit } from \"unist-util-visit\"\n\nimport { Index } from \"@/registry/__index__\"\n\nexport function rehypeComponent() {\n  return async (tree: UnistTree) => {\n    visit(tree, (node: UnistNode) => {\n      // src prop overrides both name and fileName.\n      const { value: srcPath } =\n        (getNodeAttributeByName(node, \"src\") as {\n          name: string\n          value?: string\n          type?: string\n        }) ?? {}\n\n      if (node.name === \"ComponentSource\") {\n        const name = getNodeAttributeByName(node, \"name\")?.value as string\n        const fileName = getNodeAttributeByName(node, \"fileName\")?.value as\n          | string\n          | undefined\n\n        if (!name && !srcPath) {\n          return null\n        }\n\n        try {\n          let src: string\n\n          if (srcPath) {\n            src = path.join(process.cwd(), srcPath)\n          } else {\n            const component = Index[name]\n            src = fileName\n              ? (component.files.find((file: unknown) => {\n                  if (typeof file === \"string\") {\n                    return (\n                      file.endsWith(`${fileName}.tsx`) ||\n                      file.endsWith(`${fileName}.ts`)\n                    )\n                  }\n                  return false\n                }) ?? component.files[0]?.path)\n              : component.files[0]?.path\n          }\n\n          // Read the source file.\n          const filePath = src\n          let source = fs.readFileSync(filePath, \"utf8\")\n\n          // Replace imports.\n          // TODO: Use @swc/core and a visitor to replace this.\n          // For now a simple regex should do.\n          source = source.replaceAll(`@/registry/${name}/`, \"@/components/\")\n          source = source.replaceAll(\"export default\", \"export\")\n\n          // Add code as children so that rehype can take over at build time.\n          node.children?.push(\n            u(\"element\", {\n              tagName: \"pre\",\n              properties: {\n                __src__: src,\n                __style__: name,\n              },\n              attributes: [\n                {\n                  name: \"styleName\",\n                  type: \"mdxJsxAttribute\",\n                  value: name,\n                },\n              ],\n              children: [\n                u(\"element\", {\n                  tagName: \"code\",\n                  properties: {\n                    className: [\"language-tsx\"],\n                  },\n                  children: [\n                    {\n                      type: \"text\",\n                      value: source,\n                    },\n                  ],\n                }),\n              ],\n            })\n          )\n        } catch (error) {\n          console.error(error)\n        }\n      }\n\n      if (node.name === \"ComponentPreview\") {\n        const name = getNodeAttributeByName(node, \"name\")?.value as string\n\n        if (!name) {\n          return null\n        }\n\n        try {\n          const component = Index[name]\n          const src = component.files[0]?.path\n\n          // Read the source file.\n          const filePath = src\n          let source = fs.readFileSync(filePath, \"utf8\")\n\n          // Replace imports.\n          // TODO: Use @swc/core and a visitor to replace this.\n          // For now a simple regex should do.\n          source = source.replaceAll(`@/registry/${name}/`, \"@/components/\")\n          source = source.replaceAll(\"export default\", \"export\")\n\n          // Add code as children so that rehype can take over at build time.\n          node.children?.push(\n            u(\"element\", {\n              tagName: \"pre\",\n              properties: {\n                __src__: src,\n              },\n              children: [\n                u(\"element\", {\n                  tagName: \"code\",\n                  properties: {\n                    className: [\"language-tsx\"],\n                  },\n                  children: [\n                    {\n                      type: \"text\",\n                      value: source,\n                    },\n                  ],\n                }),\n              ],\n            })\n          )\n        } catch (error) {\n          console.error(error)\n        }\n      }\n    })\n  }\n}\n\nfunction getNodeAttributeByName(node: UnistNode, name: string) {\n  return node.attributes?.find((attribute) => attribute.name === name)\n}\n"
  },
  {
    "path": "apps/www/lib/rehype-npm-command.ts",
    "content": "import { UnistNode, UnistTree } from \"types/unist\"\nimport { visit } from \"unist-util-visit\"\n\nexport function rehypeNpmCommand() {\n  return (tree: UnistTree) => {\n    visit(tree, (node: UnistNode) => {\n      if (node.type !== \"element\" || node?.tagName !== \"pre\") {\n        return\n      }\n\n      // npm install.\n      if (node.properties?.[\"__rawString__\"]?.startsWith(\"npm install\")) {\n        const npmCommand = node.properties?.[\"__rawString__\"]\n        node.properties[\"__npmCommand__\"] = npmCommand\n        node.properties[\"__yarnCommand__\"] = npmCommand.replace(\n          \"npm install\",\n          \"yarn add\"\n        )\n        node.properties[\"__pnpmCommand__\"] = npmCommand.replace(\n          \"npm install\",\n          \"pnpm add\"\n        )\n        node.properties[\"__bunCommand__\"] = npmCommand.replace(\n          \"npm install\",\n          \"bun add\"\n        )\n      }\n\n      // npx create-.\n      if (node.properties?.[\"__rawString__\"]?.startsWith(\"npx create-\")) {\n        const npmCommand = node.properties?.[\"__rawString__\"]\n        node.properties[\"__npmCommand__\"] = npmCommand\n        node.properties[\"__yarnCommand__\"] = npmCommand.replace(\n          \"npx create-\",\n          \"yarn create \"\n        )\n        node.properties[\"__pnpmCommand__\"] = npmCommand.replace(\n          \"npx create-\",\n          \"pnpm create \"\n        )\n        node.properties[\"__bunCommand__\"] = npmCommand.replace(\n          \"npx\",\n          \"bun x --bun\"\n        )\n      }\n\n      // npm create.\n      if (node.properties?.[\"__rawString__\"]?.startsWith(\"npm create\")) {\n        const npmCommand = node.properties?.[\"__rawString__\"]\n        node.properties[\"__npmCommand__\"] = npmCommand\n        node.properties[\"__yarnCommand__\"] = npmCommand.replace(\n          \"npm create\",\n          \"yarn create\"\n        )\n        node.properties[\"__pnpmCommand__\"] = npmCommand.replace(\n          \"npm create\",\n          \"pnpm create\"\n        )\n        node.properties[\"__bunCommand__\"] = npmCommand.replace(\n          \"npm create\",\n          \"bun create\"\n        )\n      }\n\n      // npx.\n      if (\n        node.properties?.[\"__rawString__\"]?.startsWith(\"npx\") &&\n        !node.properties?.[\"__rawString__\"]?.startsWith(\"npx create-\")\n      ) {\n        const npmCommand = node.properties?.[\"__rawString__\"]\n        node.properties[\"__npmCommand__\"] = npmCommand\n        node.properties[\"__yarnCommand__\"] = npmCommand\n        node.properties[\"__pnpmCommand__\"] = npmCommand.replace(\n          \"npx\",\n          \"pnpm dlx\"\n        )\n        node.properties[\"__bunCommand__\"] = npmCommand.replace(\n          \"npx\",\n          \"bun x --bun\"\n        )\n      }\n\n      // npm run.\n      if (node.properties?.[\"__rawString__\"]?.startsWith(\"npm run\")) {\n        const npmCommand = node.properties?.[\"__rawString__\"]\n        node.properties[\"__npmCommand__\"] = npmCommand\n        node.properties[\"__yarnCommand__\"] = npmCommand.replace(\n          \"npm run\",\n          \"yarn\"\n        )\n        node.properties[\"__pnpmCommand__\"] = npmCommand.replace(\n          \"npm run\",\n          \"pnpm\"\n        )\n        node.properties[\"__bunCommand__\"] = npmCommand.replace(\"npm run\", \"bun\")\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "apps/www/lib/source.ts",
    "content": "import { blog, docs, showcase } from \"@/.source\"\nimport { loader } from \"fumadocs-core/source\"\n\nexport const source = loader({\n  baseUrl: \"/docs\",\n  source: docs.toFumadocsSource(),\n})\n\nexport const blogSource = loader({\n  baseUrl: \"/blog\",\n  source: blog.toFumadocsSource(),\n})\n\nexport const showcaseSource = loader({\n  baseUrl: \"/showcase\",\n  source: showcase.toFumadocsSource(),\n})\n"
  },
  {
    "path": "apps/www/lib/types.ts",
    "content": "export type SiteConfig = {\n  avatar?: string\n  siteUrl: string\n  siteName: string\n  siteDescription: string\n  siteThumbnail: string\n  nav: Array<{ label: string; href: string }>\n  social?: {\n    github?: string\n    twitter?: string\n    linkedin?: string\n    instagram?: string\n  }\n}\n\nexport type MDXFrontMatter = {\n  slug: string\n  title: string\n  description?: string\n  date: string\n  tags?: Array<string>\n}\n"
  },
  {
    "path": "apps/www/lib/utils.ts",
    "content": "import process from \"process\"\nimport type { Metadata } from \"next\"\nimport clsx, { ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nimport { siteConfig } from \"@/config/site\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n\nexport const pluralize = (count: number, word: string) =>\n  `${count} ${word}${count === 1 ? \"\" : \"s\"}`\n\nexport function humanize(name: string): string {\n  return name\n    .replace(/-/g, \" \")\n    .replace(/([A-Z])/g, \" $1\")\n    .trim()\n    .split(/\\s+/)\n    .map((word) => word[0].toUpperCase() + word.substring(1).toLowerCase())\n    .join(\" \")\n}\n\nexport const truncate = (str: string | null, length: number) => {\n  if (!str || str.length <= length) return str\n  return `${str.slice(0, length - 3)}...`\n}\n\nexport const fetcher = (...args: Parameters<typeof fetch>) =>\n  fetch(...args).then((res) => res.json())\n\n/**\n * Capitalizes first letters of words in string.\n * @param {string} str String to be modified\n * @param {boolean=false} lower Whether all other letters should be lowercased\n * @return {string}\n * @see https://stackoverflow.com/questions/2332811/capitalize-words-in-string/7592235#7592235\n * @usage\n *   capitalize('fix this string');     // -> 'Fix This String'\n *   capitalize('javaSCrIPT');          // -> 'JavaSCrIPT'\n *   capitalize('javaSCrIPT', true);    // -> 'Javascript'\n */\nexport const capitalize = (str: string, lower = false) =>\n  (lower ? str.toLowerCase() : str).replace(/(?:^|\\s|[\"'([{])+\\S/g, (match) =>\n    match.toUpperCase()\n  )\n\nexport function formatDate(input: string | number): string {\n  const date = new Date(input)\n  return date.toLocaleDateString(\"en-US\", {\n    month: \"long\",\n    day: \"numeric\",\n    year: \"numeric\",\n  })\n}\n\nexport const calculateReadingTime = (content: string): number => {\n  const words = content?.trim().split(/\\s+/).filter(Boolean).length\n  return Math.max(1, Math.ceil(words / 200))\n}\n\nexport const normalizeTag = (tag: unknown): string[] => {\n  if (!tag) return []\n  return Array.isArray(tag)\n    ? tag.filter((t): t is string => typeof t === \"string\")\n    : [String(tag)]\n}\n\nconst getBaseUrl = (): string => {\n  const configuredUrl = process.env.NEXT_PUBLIC_APP_URL?.trim()\n  if (!configuredUrl) {\n    return siteConfig.url\n  }\n\n  let url = configuredUrl.replace(/\\/$/, \"\")\n  if (!/^https?:\\/\\//i.test(url)) {\n    url = `https://${url}`\n  }\n\n  try {\n    new URL(url)\n    return url\n  } catch {\n    return siteConfig.url\n  }\n}\n\nexport function absoluteUrl(path: string) {\n  const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`\n  return new URL(normalizedPath, `${getBaseUrl()}/`).toString()\n}\n\nexport function constructMetadata({\n  title = \"Magic UI - Modern React + Tailwind CSS components & Templates\",\n  description = \"Magic UI is a curated collection of the best landing page components built using React + Tailwind CSS + Motion\",\n  image = absoluteUrl(\"/og\"),\n  ...props\n}: {\n  title?: string\n  description?: string\n  image?: string\n  [key: string]: Metadata[keyof Metadata]\n}): Metadata {\n  return {\n    title,\n    description,\n    keywords: [\n      \"React\",\n      \"Tailwind CSS\",\n      \"Motion\",\n      \"Landing Page\",\n      \"Components\",\n      \"Next.js\",\n    ],\n    openGraph: {\n      title,\n      description,\n      type: \"website\",\n      images: [\n        {\n          url: image,\n          width: 1200,\n          height: 630,\n        },\n      ],\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title,\n      description,\n      images: [image],\n      creator: \"@dillionverma\",\n    },\n    icons: \"/favicon.ico\",\n    metadataBase: new URL(\"https://magicui.design\"),\n    authors: [\n      {\n        name: \"dillionverma\",\n        url: \"https://twitter.com/dillionverma\",\n      },\n    ],\n    creator: \"dillionverma\",\n    ...props,\n  }\n}\n"
  },
  {
    "path": "apps/www/mdx-components.tsx",
    "content": "import * as React from \"react\"\nimport dynamic from \"next/dynamic\"\nimport Image from \"next/image\"\nimport Link from \"next/link\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\"\nimport { Button } from \"@/components/ui/button\"\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport { Callout } from \"@/components/callout\"\nimport { CodeBlockCommand } from \"@/components/code-block-command\"\nimport { CodeCollapsibleWrapper } from \"@/components/code-collapsible-wrapper\"\nimport { CodeTabs } from \"@/components/code-tabs\"\nimport { ComponentPreview } from \"@/components/component-preview\"\nimport { ComponentSource } from \"@/components/component-source\"\nimport { ComponentsList } from \"@/components/components-list\"\nimport { CopyButton } from \"@/components/copy-button\"\nimport { getIconForLanguageExtension } from \"@/components/icons\"\nimport { TechStack } from \"@/components/tech-stack\"\nimport { TemplateOpen } from \"@/components/template-open\"\nimport { TemplatePreview } from \"@/components/template-preview\"\n\nconst TweetCard = dynamic(() =>\n  import(\"@/registry/magicui/tweet-card\").then((module) => module.TweetCard)\n)\n\nexport const mdxComponents = {\n  h1: ({ className, ...props }: React.ComponentProps<\"h1\">) => (\n    <h1\n      className={cn(\n        \"font-heading mt-2 scroll-m-28 text-3xl font-bold tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  h2: ({ className, ...props }: React.ComponentProps<\"h2\">) => {\n    return (\n      <h2\n        id={props.children\n          ?.toString()\n          .replace(/ /g, \"-\")\n          .replace(/'/g, \"\")\n          .replace(/\\?/g, \"\")\n          .toLowerCase()}\n        className={cn(\n          \"font-heading mt-8 scroll-m-28 text-xl font-medium tracking-tight first:mt-0 lg:mt-8 [&+p]:mt-4! *:[code]:text-xl\",\n          className\n        )}\n        {...props}\n      />\n    )\n  },\n  h3: ({ className, ...props }: React.ComponentProps<\"h3\">) => (\n    <h3\n      className={cn(\n        \"font-heading mt-8 scroll-m-28 text-lg font-medium tracking-tight *:[code]:text-xl\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  h4: ({ className, ...props }: React.ComponentProps<\"h4\">) => (\n    <h4\n      className={cn(\n        \"font-heading mt-8 scroll-m-28 text-base font-medium tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  h5: ({ className, ...props }: React.ComponentProps<\"h5\">) => (\n    <h5\n      className={cn(\n        \"mt-8 scroll-m-28 text-base font-medium tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  h6: ({ className, ...props }: React.ComponentProps<\"h6\">) => (\n    <h6\n      className={cn(\n        \"mt-8 scroll-m-28 text-base font-medium tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  a: ({ className, ...props }: React.ComponentProps<\"a\">) => (\n    <a\n      className={cn(\"font-medium underline underline-offset-4\", className)}\n      {...props}\n    />\n  ),\n  p: ({ className, ...props }: React.ComponentProps<\"p\">) => (\n    <p className={cn(\"leading-relaxed not-first:mt-6\", className)} {...props} />\n  ),\n  strong: ({ className, ...props }: React.HTMLAttributes<HTMLElement>) => (\n    <strong className={cn(\"font-medium\", className)} {...props} />\n  ),\n  ul: ({ className, ...props }: React.ComponentProps<\"ul\">) => (\n    <ul className={cn(\"my-6 ml-6 list-disc\", className)} {...props} />\n  ),\n  ol: ({ className, ...props }: React.ComponentProps<\"ol\">) => (\n    <ol className={cn(\"my-6 ml-6 list-decimal\", className)} {...props} />\n  ),\n  li: ({ className, ...props }: React.ComponentProps<\"li\">) => (\n    <li className={cn(\"mt-2\", className)} {...props} />\n  ),\n  blockquote: ({ className, ...props }: React.ComponentProps<\"blockquote\">) => (\n    <blockquote\n      className={cn(\n        \"bg-muted/50 mt-6 rounded-r-md border-l-2 py-4 pr-4 pl-6 italic\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  img: ({ className, alt, ...props }: React.ComponentProps<\"img\">) => (\n    // eslint-disable-next-line @next/next/no-img-element\n    <img className={cn(\"rounded-md\", className)} alt={alt} {...props} />\n  ),\n  iframe: ({ className, ...props }: React.ComponentProps<\"iframe\">) => (\n    <iframe className={cn(\"mt-6 w-full rounded-md\", className)} {...props} />\n  ),\n  hr: ({ className, ...props }: React.ComponentProps<\"hr\">) => (\n    <div\n      className={cn(\"my-4 flex items-center justify-center md:my-8\", className)}\n    >\n      <hr\n        className=\"via-border mx-4 h-px w-full border-0 bg-linear-to-r from-transparent to-transparent\"\n        {...props}\n      />\n    </div>\n  ),\n  table: ({ className, ...props }: React.ComponentProps<\"table\">) => (\n    <div className=\"my-6 w-full overflow-x-auto rounded-lg border\">\n      <table className={cn(\"relative w-full text-sm\", className)} {...props} />\n    </div>\n  ),\n  thead: ({ className, ...props }: React.ComponentProps<\"thead\">) => (\n    <thead className={cn(\"bg-muted border-b\", className)} {...props} />\n  ),\n  tr: ({ className, ...props }: React.ComponentProps<\"tr\">) => (\n    <tr\n      className={cn(\n        \"hover:bg-muted/50 m-0 border-b transition-colors last:border-b-0\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  th: ({ className, ...props }: React.ComponentProps<\"th\">) => (\n    <th\n      className={cn(\n        \"min-w-[120px] px-4 py-3 text-left font-semibold [[align=center]]:text-center [[align=right]]:text-right\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  td: ({ className, ...props }: React.ComponentProps<\"td\">) => (\n    <td\n      className={cn(\n        \"min-w-[120px] px-4 py-3 text-left [[align=center]]:text-center [[align=right]]:text-right\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  pre: ({ className, children, ...props }: React.ComponentProps<\"pre\">) => {\n    return (\n      <pre\n        className={cn(\n          \"no-scrollbar min-w-0 overflow-x-auto px-4 py-3.5 outline-none has-data-highlighted-line:px-0 has-data-line-numbers:px-0 has-data-[slot=tabs]:p-0\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n      </pre>\n    )\n  },\n  figure: ({ className, ...props }: React.ComponentProps<\"figure\">) => {\n    return <figure className={cn(className)} {...props} />\n  },\n  figcaption: ({\n    className,\n    children,\n    ...props\n  }: React.ComponentProps<\"figcaption\">) => {\n    const iconExtension =\n      \"data-language\" in props && typeof props[\"data-language\"] === \"string\"\n        ? getIconForLanguageExtension(props[\"data-language\"])\n        : null\n\n    return (\n      <figcaption\n        className={cn(\n          \"text-code-foreground [&_svg]:text-code-foreground flex items-center gap-2 [&_svg]:size-4 [&_svg]:opacity-70\",\n          className\n        )}\n        {...props}\n      >\n        {iconExtension}\n        {children}\n      </figcaption>\n    )\n  },\n  code: ({\n    className,\n    __raw__,\n    __src__,\n    __npm__,\n    __yarn__,\n    __pnpm__,\n    __bun__,\n    ...props\n  }: React.ComponentProps<\"code\"> & {\n    __raw__?: string\n    __src__?: string\n    __npm__?: string\n    __yarn__?: string\n    __pnpm__?: string\n    __bun__?: string\n  }) => {\n    // Inline Code.\n    if (typeof props.children === \"string\") {\n      return (\n        <code\n          className={cn(\n            \"bg-muted relative rounded-md px-[0.3rem] py-[0.2rem] font-mono text-[0.8rem] wrap-break-word outline-none\",\n            className\n          )}\n          {...props}\n        />\n      )\n    }\n\n    // npm command.\n    const isNpmCommand = __npm__ && __yarn__ && __pnpm__ && __bun__\n    if (isNpmCommand) {\n      return (\n        <CodeBlockCommand\n          __npm__={__npm__}\n          __yarn__={__yarn__}\n          __pnpm__={__pnpm__}\n          __bun__={__bun__}\n        />\n      )\n    }\n\n    // Default codeblock.\n    return (\n      <>\n        {__raw__ && <CopyButton value={__raw__} src={__src__} />}\n        <code {...props} />\n      </>\n    )\n  },\n  Step: ({ className, ...props }: React.ComponentProps<\"h3\">) => (\n    <h3\n      className={cn(\n        \"font-heading mt-8 scroll-m-32 text-xl font-medium tracking-tight\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  Steps: ({ ...props }) => (\n    <div className=\"[&>h3]:step steps mb-12 [counter-reset:step]\" {...props} />\n  ),\n  Image: ({\n    src,\n    className,\n    width,\n    height,\n    alt,\n    ...props\n  }: React.ComponentProps<\"img\">) => (\n    <Image\n      className={cn(\"mt-6 rounded-md border\", className)}\n      src={(src as string) ?? \"\"}\n      width={Number(width)}\n      height={Number(height)}\n      alt={alt ?? \"\"}\n      {...props}\n    />\n  ),\n  Tabs: ({ className, ...props }: React.ComponentProps<typeof Tabs>) => {\n    return <Tabs className={cn(\"relative mt-6 w-full\", className)} {...props} />\n  },\n  TabsList: ({\n    className,\n    ...props\n  }: React.ComponentProps<typeof TabsList>) => (\n    <TabsList\n      className={cn(\n        \"justify-start gap-4 rounded-none bg-transparent px-0\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  TabsTrigger: ({\n    className,\n    ...props\n  }: React.ComponentProps<typeof TabsTrigger>) => (\n    <TabsTrigger\n      className={cn(\n        \"text-muted-foreground data-[state=active]:text-foreground data-[state=active]:border-primary dark:data-[state=active]:border-primary hover:text-primary rounded-none border-0 border-b-2 border-transparent bg-transparent px-0 pb-3 text-base data-[state=active]:bg-transparent data-[state=active]:shadow-none dark:data-[state=active]:bg-transparent\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  TabsContent: ({\n    className,\n    ...props\n  }: React.ComponentProps<typeof TabsContent>) => (\n    <TabsContent\n      className={cn(\n        \"relative [&_h3.font-heading]:text-base [&_h3.font-heading]:font-medium *:[figure]:first:mt-0 [&>.steps]:mt-6\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  Tab: ({ className, ...props }: React.ComponentProps<\"div\">) => (\n    <div className={cn(className)} {...props} />\n  ),\n  Button,\n  Callout,\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n  Alert,\n  AlertTitle,\n  AlertDescription,\n  CodeTabs,\n  ComponentPreview,\n  ComponentSource,\n  CodeCollapsibleWrapper,\n  ComponentsList,\n  Link: ({ className, ...props }: React.ComponentProps<typeof Link>) => (\n    <Link\n      className={cn(\"font-medium underline underline-offset-4\", className)}\n      {...props}\n    />\n  ),\n  LinkedCard: ({ className, ...props }: React.ComponentProps<typeof Link>) => (\n    <Link\n      className={cn(\n        \"bg-surface text-surface-foreground hover:bg-surface/80 flex w-full flex-col items-center rounded-xl p-6 transition-colors sm:p-10\",\n        className\n      )}\n      {...props}\n    />\n  ),\n  TemplateOpen,\n  TemplatePreview,\n  TechStack,\n  Tweet: ({ id, className }: { id: string; className?: string }) => (\n    <TweetCard id={id} className={cn(\"mx-auto\", className)} />\n  ),\n}\n"
  },
  {
    "path": "apps/www/middleware.ts",
    "content": "export const config = {\n  matcher: [\"/((?!_next|api|[\\\\w-]+\\\\.\\\\w+).*)\"],\n}\n\nexport default async function middleware() {}\n"
  },
  {
    "path": "apps/www/next.config.mjs",
    "content": "import { createMDX } from \"fumadocs-mdx/next\"\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n  outputFileTracingIncludes: {\n    \"/*\": [\"./registry/**/*\", \"./content/**/*\"],\n  },\n  reactStrictMode: true,\n  experimental: {\n    inlineCss: true,\n  },\n  images: {\n    domains: [\n      \"localhost\",\n      \"cdn.magicui.design\",\n      \"images.unsplash.com\",\n      \"img.youtube.com\",\n      \"pbs.twimg.com\",\n    ],\n  },\n  async redirects() {\n    return [\n      {\n        source: \"/discord\",\n        destination: \"https://discord.gg/X4BBMBjHNf\",\n        permanent: true,\n      },\n      {\n        source: \"/components\",\n        destination: \"/docs/components\",\n        permanent: true,\n      },\n      {\n        source: \"/showcase/:path*.mdx\",\n        destination: \"/showcase/:path*.md\",\n        permanent: true,\n      },\n      {\n        source: \"/blog/:path*.mdx\",\n        destination: \"/blog/:path*.md\",\n        permanent: true,\n      },\n      {\n        source: \"/docs/:path*.mdx\",\n        destination: \"/docs/:path*.md\",\n        permanent: true,\n      },\n      {\n        source: \"/r/:path([^.]*)\",\n        destination: \"/r/:path.json\",\n        permanent: true,\n      },\n    ]\n  },\n  rewrites() {\n    return [\n      {\n        source: \"/docs/:path*.md\",\n        destination: \"/llm/:path*\",\n      },\n    ]\n  },\n}\n\nconst withMDX = createMDX({})\n\nexport default withMDX(nextConfig)\n"
  },
  {
    "path": "apps/www/package.json",
    "content": "{\n  \"name\": \"www\",\n  \"version\": \"0.1.1\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"postinstall\": \"fumadocs-mdx\",\n    \"dev\": \"next dev\",\n    \"registry-deps:check\": \"npx tsx ./scripts/sync-example-registry-dependencies.mts --check\",\n    \"registry-deps:fix\": \"npx tsx ./scripts/sync-example-registry-dependencies.mts --fix\",\n    \"prebuild\": \"pnpm build:registry\",\n    \"build\": \"next build\",\n    \"build:registry\": \"npx tsx ./scripts/build-registry.mts && prettier --log-level silent --write \\\"registry/**/*.{ts,tsx,mdx}\\\" --cache\",\n    \"shadcn:build\": \"npx shadcn build registry.json --output ../www/public/r\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"start\": \"next start\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint --fix .\",\n    \"format:fix\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n    \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n    \"check\": \"pnpm lint && pnpm typecheck && pnpm format:check && pnpm registry-deps:check\"\n  },\n  \"dependencies\": {\n    \"@hookform/resolvers\": \"^5.2.2\",\n    \"@radix-ui/react-accordion\": \"^1.2.12\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.15\",\n    \"@radix-ui/react-avatar\": \"^1.1.10\",\n    \"@radix-ui/react-collapsible\": \"^1.1.12\",\n    \"@radix-ui/react-context-menu\": \"^2.2.16\",\n    \"@radix-ui/react-dialog\": \"^1.1.15\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n    \"@radix-ui/react-icons\": \"^1.3.2\",\n    \"@radix-ui/react-label\": \"^2.1.7\",\n    \"@radix-ui/react-popover\": \"^1.1.15\",\n    \"@radix-ui/react-scroll-area\": \"^1.2.10\",\n    \"@radix-ui/react-select\": \"^2.2.6\",\n    \"@radix-ui/react-separator\": \"^1.1.7\",\n    \"@radix-ui/react-slot\": \"^1.2.3\",\n    \"@radix-ui/react-switch\": \"^1.2.6\",\n    \"@radix-ui/react-tabs\": \"^1.1.13\",\n    \"@radix-ui/react-toast\": \"^1.2.15\",\n    \"@radix-ui/react-tooltip\": \"^1.2.8\",\n    \"@tabler/icons-react\": \"^3.34.1\",\n    \"@tailwindcss/postcss\": \"^4.1.13\",\n    \"canvas-confetti\": \"^1.9.3\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"cmdk\": \"^1.1.1\",\n    \"cobe\": \"^0.6.4\",\n    \"countries-list\": \"^3.2.2\",\n    \"fumadocs-core\": \"^15.8.2\",\n    \"fumadocs-mdx\": \"^12.0.1\",\n    \"fumadocs-ui\": \"^15.7.12\",\n    \"geist\": \"^1.5.1\",\n    \"jotai\": \"^2.14.0\",\n    \"lucide-react\": \"^0.544.0\",\n    \"masonic\": \"^4.1.0\",\n    \"motion\": \"^12.23.12\",\n    \"next\": \"^15.5.4\",\n    \"next-themes\": \"^0.4.6\",\n    \"postcss\": \"8.5.6\",\n    \"posthog-js\": \"^1.268.9\",\n    \"react\": \"19.1.1\",\n    \"react-day-picker\": \"^9.11.0\",\n    \"react-dom\": \"19.1.1\",\n    \"react-hook-form\": \"^7.62.0\",\n    \"react-tweet\": \"^3.2.2\",\n    \"rough-notation\": \"^0.5.1\",\n    \"schema-dts\": \"^1.1.5\",\n    \"sonner\": \"^1.7.4\",\n    \"svg-dotted-map\": \"^2.0.1\",\n    \"tailwind-merge\": \"^3.3.1\",\n    \"tailwindcss\": \"^4.1.13\",\n    \"ts-morph\": \"^23.0.0\",\n    \"tw-animate-css\": \"^1.3.8\",\n    \"zod\": \"^4.1.11\"\n  },\n  \"devDependencies\": {\n    \"@eslint/eslintrc\": \"^3.3.1\",\n    \"@ianvs/prettier-plugin-sort-imports\": \"^4.7.0\",\n    \"@shikijs/transformers\": \"^2.5.0\",\n    \"@tailwindcss/typography\": \"^0.5.16\",\n    \"@types/canvas-confetti\": \"^1.9.0\",\n    \"@types/mdx\": \"^2.0.13\",\n    \"@types/node\": \"^20.19.14\",\n    \"@types/react\": \"^19.1.1\",\n    \"@types/react-dom\": \"^19.1.1\",\n    \"@types/unist\": \"^3.0.3\",\n    \"eslint\": \"^9.36.0\",\n    \"eslint-config-next\": \"15.5.4\",\n    \"eslint-config-prettier\": \"^10.1.8\",\n    \"eslint-plugin-react\": \"^7.37.5\",\n    \"lint-staged\": \"^16.1.6\",\n    \"mdast-util-toc\": \"^7.1.0\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"prettier\": \"^3.6.2\",\n    \"prettier-plugin-tailwindcss\": \"^0.6.14\",\n    \"rehype\": \"^13.0.2\",\n    \"rehype-autolink-headings\": \"^7.1.0\",\n    \"rehype-pretty-code\": \"^0.14.1\",\n    \"rehype-slug\": \"6.0.0\",\n    \"remark\": \"^15.0.1\",\n    \"remark-code-import\": \"^1.2.0\",\n    \"remark-gfm\": \"^4.0.1\",\n    \"rimraf\": \"^6.0.1\",\n    \"shadcn\": \"3.3.1\",\n    \"shiki\": \"^2.5.0\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"tsx\": \"^4.20.5\",\n    \"typescript\": \"^5.9.2\",\n    \"unist-builder\": \"4.0.0\",\n    \"unist-util-visit\": \"^5.0.0\"\n  },\n  \"engines\": {\n    \"node\": \">=22.14.0\",\n    \"pnpm\": \">=9\"\n  },\n  \"prettier\": {\n    \"endOfLine\": \"lf\",\n    \"semi\": false,\n    \"singleQuote\": false,\n    \"tabWidth\": 2,\n    \"trailingComma\": \"es5\",\n    \"importOrder\": [\n      \"^(react/(.*)$)|^(react$)\",\n      \"^(next/(.*)$)|^(next$)\",\n      \"<THIRD_PARTY_MODULES>\",\n      \"\",\n      \"^@workspace/(.*)$\",\n      \"\",\n      \"^types$\",\n      \"^@/types/(.*)$\",\n      \"^@/config/(.*)$\",\n      \"^@/lib/(.*)$\",\n      \"^@/hooks/(.*)$\",\n      \"^@/components/ui/(.*)$\",\n      \"^@/components/(.*)$\",\n      \"^@/registry/(.*)$\",\n      \"^@/styles/(.*)$\",\n      \"^@/app/(.*)$\",\n      \"^@/www/(.*)$\",\n      \"\",\n      \"^[./]\"\n    ],\n    \"importOrderParserPlugins\": [\n      \"typescript\",\n      \"jsx\",\n      \"decorators-legacy\"\n    ],\n    \"plugins\": [\n      \"@ianvs/prettier-plugin-sort-imports\",\n      \"prettier-plugin-tailwindcss\"\n    ]\n  }\n}\n"
  },
  {
    "path": "apps/www/postcss.config.mjs",
    "content": "const config = {\n  plugins: {\n    \"@tailwindcss/postcss\": {},\n  },\n};\nexport default config;\n"
  },
  {
    "path": "apps/www/public/llms-full.txt",
    "content": "===== COMPONENT: android =====\nTitle: Android\nDescription: A mockup of an Android device.\n\n--- file: magicui/android.tsx ---\nimport { SVGProps } from \"react\"\n\nexport interface AndroidProps extends SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  src?: string\n  videoSrc?: string\n}\n\nexport function Android({\n  width = 433,\n  height = 882,\n  src,\n  videoSrc,\n  ...props\n}: AndroidProps) {\n  return (\n    <svg\n      width={width}\n      height={height}\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M376 153H378C379.105 153 380 153.895 380 155V249C380 250.105 379.105 251 378 251H376V153Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M376 301H378C379.105 301 380 301.895 380 303V351C380 352.105 379.105 353 378 353H376V301Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M0 42C0 18.8041 18.804 0 42 0H336C359.196 0 378 18.804 378 42V788C378 811.196 359.196 830 336 830H42C18.804 830 0 811.196 0 788V42Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M2 43C2 22.0132 19.0132 5 40 5H338C358.987 5 376 22.0132 376 43V787C376 807.987 358.987 825 338 825H40C19.0132 825 2 807.987 2 787V43Z\"\n        className=\"fill-white dark:fill-[#262626]\"\n      />\n\n      <g clipPath=\"url(#clip0_514_20855)\">\n        <path\n          d=\"M9.25 48C9.25 29.3604 24.3604 14.25 43 14.25H335C353.64 14.25 368.75 29.3604 368.75 48V780C368.75 798.64 353.64 813.75 335 813.75H43C24.3604 813.75 9.25 798.64 9.25 780V48Z\"\n          className=\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\"\n        />\n      </g>\n      <circle\n        cx=\"189\"\n        cy=\"28\"\n        r=\"9\"\n        className=\"fill-white dark:fill-[#262626]\"\n      />\n      <circle\n        cx=\"189\"\n        cy=\"28\"\n        r=\"4\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      {src && (\n        <image\n          href={src}\n          width=\"360\"\n          height=\"800\"\n          className=\"size-full object-cover\"\n          preserveAspectRatio=\"xMidYMid slice\"\n          clipPath=\"url(#clip0_514_20855)\"\n        />\n      )}\n      {videoSrc && (\n        <foreignObject\n          width=\"380\"\n          height=\"820\"\n          clipPath=\"url(#clip0_514_20855)\"\n          preserveAspectRatio=\"xMidYMid slice\"\n        >\n          <video\n            className=\"size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n          />\n        </foreignObject>\n      )}\n      <defs>\n        <clipPath id=\"clip0_514_20855\">\n          <rect\n            width=\"360\"\n            height=\"800\"\n            rx=\"33\"\n            ry=\"25\"\n            className=\"fill-white dark:fill-[#262626]\"\n            transform=\"translate(9 14)\"\n          />\n        </clipPath>\n      </defs>\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: android-demo =====\nTitle: Android Demo\n\n--- file: example/android-demo.tsx ---\nimport { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android className=\"size-full\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: android-demo-2 =====\nTitle: Android Demo 2\n\n--- file: example/android-demo-2.tsx ---\nimport { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android\n        className=\"size-full\"\n        src=\"https://images.unsplash.com/photo-1730326405863-c6fa7e499a6e?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: android-demo-3 =====\nTitle: Android Demo 3\n\n--- file: example/android-demo-3.tsx ---\nimport { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android\n        className=\"size-full\"\n        videoSrc=\"https://videos.pexels.com/video-files/14993748/14993748-uhd_1296_2304_30fps.mp4\"\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: animated-beam =====\nTitle: Animated Beam\nDescription: An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\n\n--- file: magicui/animated-beam.tsx ---\n\"use client\"\n\nimport { useEffect, useId, useState, type RefObject } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedBeamProps {\n  className?: string\n  containerRef: RefObject<HTMLElement | null> // Container ref\n  fromRef: RefObject<HTMLElement | null>\n  toRef: RefObject<HTMLElement | null>\n  curvature?: number\n  reverse?: boolean\n  pathColor?: string\n  pathWidth?: number\n  pathOpacity?: number\n  gradientStartColor?: string\n  gradientStopColor?: string\n  delay?: number\n  duration?: number\n  repeat?: number\n  repeatDelay?: number\n  startXOffset?: number\n  startYOffset?: number\n  endXOffset?: number\n  endYOffset?: number\n}\n\nexport const AnimatedBeam: React.FC<AnimatedBeamProps> = ({\n  className,\n  containerRef,\n  fromRef,\n  toRef,\n  curvature = 0,\n  reverse = false, // Include the reverse prop\n  duration = 5,\n  delay = 0,\n  pathColor = \"gray\",\n  pathWidth = 2,\n  pathOpacity = 0.2,\n  gradientStartColor = \"#ffaa40\",\n  gradientStopColor = \"#9c40ff\",\n  repeat = Infinity,\n  repeatDelay = 0,\n  startXOffset = 0,\n  startYOffset = 0,\n  endXOffset = 0,\n  endYOffset = 0,\n}) => {\n  const id = useId()\n  const [pathD, setPathD] = useState(\"\")\n  const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 })\n\n  // Calculate the gradient coordinates based on the reverse prop\n  const gradientCoordinates = reverse\n    ? {\n        x1: [\"90%\", \"-10%\"],\n        x2: [\"100%\", \"0%\"],\n        y1: [\"0%\", \"0%\"],\n        y2: [\"0%\", \"0%\"],\n      }\n    : {\n        x1: [\"10%\", \"110%\"],\n        x2: [\"0%\", \"100%\"],\n        y1: [\"0%\", \"0%\"],\n        y2: [\"0%\", \"0%\"],\n      }\n\n  useEffect(() => {\n    const updatePath = () => {\n      if (containerRef.current && fromRef.current && toRef.current) {\n        const containerRect = containerRef.current.getBoundingClientRect()\n        const rectA = fromRef.current.getBoundingClientRect()\n        const rectB = toRef.current.getBoundingClientRect()\n\n        const svgWidth = containerRect.width\n        const svgHeight = containerRect.height\n        setSvgDimensions({ width: svgWidth, height: svgHeight })\n\n        const startX =\n          rectA.left - containerRect.left + rectA.width / 2 + startXOffset\n        const startY =\n          rectA.top - containerRect.top + rectA.height / 2 + startYOffset\n        const endX =\n          rectB.left - containerRect.left + rectB.width / 2 + endXOffset\n        const endY =\n          rectB.top - containerRect.top + rectB.height / 2 + endYOffset\n\n        const controlY = startY - curvature\n        const d = `M ${startX},${startY} Q ${\n          (startX + endX) / 2\n        },${controlY} ${endX},${endY}`\n        setPathD(d)\n      }\n    }\n\n    // Initialize ResizeObserver\n    const resizeObserver = new ResizeObserver(() => {\n      updatePath()\n    })\n\n    // Observe the container element\n    if (containerRef.current) {\n      resizeObserver.observe(containerRef.current)\n    }\n\n    // Call the updatePath initially to set the initial path\n    updatePath()\n\n    // Clean up the observer on component unmount\n    return () => {\n      resizeObserver.disconnect()\n    }\n  }, [\n    containerRef,\n    fromRef,\n    toRef,\n    curvature,\n    startXOffset,\n    startYOffset,\n    endXOffset,\n    endYOffset,\n  ])\n\n  return (\n    <svg\n      fill=\"none\"\n      width={svgDimensions.width}\n      height={svgDimensions.height}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={cn(\n        \"pointer-events-none absolute top-0 left-0 transform-gpu stroke-2\",\n        className\n      )}\n      viewBox={`0 0 ${svgDimensions.width} ${svgDimensions.height}`}\n    >\n      <path\n        d={pathD}\n        stroke={pathColor}\n        strokeWidth={pathWidth}\n        strokeOpacity={pathOpacity}\n        strokeLinecap=\"round\"\n      />\n      <path\n        d={pathD}\n        strokeWidth={pathWidth}\n        stroke={`url(#${id})`}\n        strokeOpacity=\"1\"\n        strokeLinecap=\"round\"\n      />\n      <defs>\n        <motion.linearGradient\n          className=\"transform-gpu\"\n          id={id}\n          gradientUnits={\"userSpaceOnUse\"}\n          initial={{\n            x1: \"0%\",\n            x2: \"0%\",\n            y1: \"0%\",\n            y2: \"0%\",\n          }}\n          animate={{\n            x1: gradientCoordinates.x1,\n            x2: gradientCoordinates.x2,\n            y1: gradientCoordinates.y1,\n            y2: gradientCoordinates.y2,\n          }}\n          transition={{\n            delay,\n            duration,\n            ease: [0.16, 1, 0.3, 1], // https://easings.net/#easeOutExpo\n            repeat,\n            repeatDelay,\n          }}\n        >\n          <stop stopColor={gradientStartColor} stopOpacity=\"0\"></stop>\n          <stop stopColor={gradientStartColor}></stop>\n          <stop offset=\"32.5%\" stopColor={gradientStopColor}></stop>\n          <stop\n            offset=\"100%\"\n            stopColor={gradientStopColor}\n            stopOpacity=\"0\"\n          ></stop>\n        </motion.linearGradient>\n      </defs>\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: bento-demo =====\nTitle: Bento Demo\n\n--- file: example/bento-demo.tsx ---\nimport { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\"\nimport { BellIcon, Share2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\"\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\"\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst files = [\n  {\n    name: \"bitcoin.pdf\",\n    body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n  },\n  {\n    name: \"finances.xlsx\",\n    body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n  },\n  {\n    name: \"logo.svg\",\n    body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n  },\n  {\n    name: \"keys.gpg\",\n    body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n  },\n  {\n    name: \"seed.txt\",\n    body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n  },\n]\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-1\",\n    background: (\n      <Marquee\n        pauseOnHover\n        className=\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\"\n      >\n        {files.map((f, idx) => (\n          <figure\n            key={idx}\n            className={cn(\n              \"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\",\n              \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n              \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\",\n              \"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\"\n            )}\n          >\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"flex flex-col\">\n                <figcaption className=\"text-sm font-medium dark:text-white\">\n                  {f.name}\n                </figcaption>\n              </div>\n            </div>\n            <blockquote className=\"mt-2 text-xs\">{f.body}</blockquote>\n          </figure>\n        ))}\n      </Marquee>\n    ),\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description: \"Get notified when something happens.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedListDemo className=\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\" />\n    ),\n  },\n  {\n    Icon: Share2Icon,\n    name: \"Integrations\",\n    description: \"Supports 100+ integrations and counting.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedBeamMultipleOutputDemo className=\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\" />\n    ),\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    className: \"col-span-3 lg:col-span-1\",\n    href: \"#\",\n    cta: \"Learn more\",\n    background: (\n      <Calendar\n        mode=\"single\"\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\n        className=\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\"\n      />\n    ),\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid>\n      {features.map((feature, idx) => (\n        <BentoCard key={idx} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n\n\n===== EXAMPLE: animated-beam-demo =====\nTitle: Animated Beam Demo\n\n--- file: example/animated-beam-demo.tsx ---\n\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex h-[300px] w-full items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-h-[200px] max-w-lg flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.googleDocs />\n          </Circle>\n        </div>\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div2Ref}>\n            <Icons.notion />\n          </Circle>\n          <Circle ref={div4Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n          <Circle ref={div6Ref}>\n            <Icons.zapier />\n          </Circle>\n        </div>\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div7Ref}>\n            <Icons.messenger />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div4Ref}\n        curvature={-75}\n        endYOffset={-10}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div4Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div4Ref}\n        curvature={75}\n        endYOffset={10}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div4Ref}\n        curvature={-75}\n        endYOffset={-10}\n        reverse\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div4Ref}\n        reverse\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div7Ref}\n        toRef={div4Ref}\n        curvature={75}\n        endYOffset={10}\n        reverse\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n}\n\n\n===== EXAMPLE: animated-beam-unidirectional =====\nTitle: Animated Beam Unidirectional\n\n--- file: example/animated-beam-unidirectional.tsx ---\n\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.user />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.openai />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        duration={3}\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  openai: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n\n\n===== EXAMPLE: animated-beam-bidirectional =====\nTitle: Animated Beam Bidirectional\n\n--- file: example/animated-beam-bidirectional.tsx ---\n\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.user />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.openai />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n        startYOffset={10}\n        endYOffset={10}\n        curvature={-20}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n        startYOffset={-10}\n        endYOffset={-10}\n        curvature={20}\n        reverse\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  openai: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n\n\n===== EXAMPLE: animated-beam-multiple-inputs =====\nTitle: Animated Beam Multiple Inputs\n\n--- file: example/animated-beam-multiple-inputs.tsx ---\n\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"border-border z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamMultipleOutputDemo({\n  className,\n}: {\n  className?: string\n}) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\",\n        className\n      )}\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\">\n        <div className=\"flex flex-col justify-center gap-2\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.googleDocs />\n          </Circle>\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div4Ref}>\n            <Icons.messenger />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.notion />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div6Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div7Ref}>\n            <Icons.user />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div4Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div7Ref}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n\n\n===== EXAMPLE: animated-beam-multiple-outputs =====\nTitle: Animated Beam Multiple Outputs\n\n--- file: example/animated-beam-multiple-outputs.tsx ---\n\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamMultipleOutputDemo({\n  className,\n}: {\n  className?: string\n}) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\",\n        className\n      )}\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\">\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div7Ref}>\n            <Icons.user />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div6Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center gap-2\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.googleDocs />\n          </Circle>\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div4Ref}>\n            <Icons.messenger />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.notion />\n          </Circle>\n        </div>\n      </div>\n\n      {/* AnimatedBeams */}\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div4Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div7Ref}\n        duration={3}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n\n\n\n===== COMPONENT: animated-circular-progress-bar =====\nTitle: Animated Circular Progress Bar\nDescription: Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\n\n--- file: magicui/animated-circular-progress-bar.tsx ---\nimport { cn } from \"@/lib/utils\"\n\ninterface AnimatedCircularProgressBarProps {\n  max?: number\n  min?: number\n  value: number\n  gaugePrimaryColor: string\n  gaugeSecondaryColor: string\n  className?: string\n}\n\nexport function AnimatedCircularProgressBar({\n  max = 100,\n  min = 0,\n  value = 0,\n  gaugePrimaryColor,\n  gaugeSecondaryColor,\n  className,\n}: AnimatedCircularProgressBarProps) {\n  const circumference = 2 * Math.PI * 45\n  const percentPx = circumference / 100\n  const currentPercent = Math.round(((value - min) / (max - min)) * 100)\n\n  return (\n    <div\n      className={cn(\"relative size-40 text-2xl font-semibold\", className)}\n      style={\n        {\n          \"--circle-size\": \"100px\",\n          \"--circumference\": circumference,\n          \"--percent-to-px\": `${percentPx}px`,\n          \"--gap-percent\": \"5\",\n          \"--offset-factor\": \"0\",\n          \"--transition-length\": \"1s\",\n          \"--transition-step\": \"200ms\",\n          \"--delay\": \"0s\",\n          \"--percent-to-deg\": \"3.6deg\",\n          transform: \"translateZ(0)\",\n        } as React.CSSProperties\n      }\n    >\n      <svg\n        fill=\"none\"\n        className=\"size-full\"\n        strokeWidth=\"2\"\n        viewBox=\"0 0 100 100\"\n      >\n        {currentPercent <= 90 && currentPercent >= 0 && (\n          <circle\n            cx=\"50\"\n            cy=\"50\"\n            r=\"45\"\n            strokeWidth=\"10\"\n            strokeDashoffset=\"0\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            className=\"opacity-100\"\n            style={\n              {\n                stroke: gaugeSecondaryColor,\n                \"--stroke-percent\": 90 - currentPercent,\n                \"--offset-factor-secondary\": \"calc(1 - var(--offset-factor))\",\n                strokeDasharray:\n                  \"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\",\n                transform:\n                  \"rotate(calc(1turn - 90deg - (var(--gap-percent) * var(--percent-to-deg) * var(--offset-factor-secondary)))) scaleY(-1)\",\n                transition: \"all var(--transition-length) ease var(--delay)\",\n                transformOrigin:\n                  \"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\",\n              } as React.CSSProperties\n            }\n          />\n        )}\n        <circle\n          cx=\"50\"\n          cy=\"50\"\n          r=\"45\"\n          strokeWidth=\"10\"\n          strokeDashoffset=\"0\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"opacity-100\"\n          style={\n            {\n              stroke: gaugePrimaryColor,\n              \"--stroke-percent\": currentPercent,\n              strokeDasharray:\n                \"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\",\n              transition:\n                \"var(--transition-length) ease var(--delay),stroke var(--transition-length) ease var(--delay)\",\n              transitionProperty: \"stroke-dasharray,transform\",\n              transform:\n                \"rotate(calc(-90deg + var(--gap-percent) * var(--offset-factor) * var(--percent-to-deg)))\",\n              transformOrigin:\n                \"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\",\n            } as React.CSSProperties\n          }\n        />\n      </svg>\n      <span\n        data-current-value={currentPercent}\n        className=\"animate-in fade-in absolute inset-0 m-auto size-fit delay-(--delay) duration-(--transition-length) ease-linear\"\n      >\n        {currentPercent}\n      </span>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: animated-circular-progress-bar-demo =====\nTitle: Animated Circular Progress Bar Demo\n\n--- file: example/animated-circular-progress-bar-demo.tsx ---\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\nimport { AnimatedCircularProgressBar } from \"@/registry/magicui/animated-circular-progress-bar\"\n\nexport default function AnimatedCircularProgressBarDemo() {\n  const [value, setValue] = useState(0)\n\n  useEffect(() => {\n    const handleIncrement = (prev: number) => {\n      if (prev === 100) {\n        return 0\n      }\n      return prev + 10\n    }\n    setValue(handleIncrement)\n    const interval = setInterval(() => setValue(handleIncrement), 2000)\n    return () => clearInterval(interval)\n  }, [])\n\n  return (\n    <AnimatedCircularProgressBar\n      value={value}\n      gaugePrimaryColor=\"rgb(79 70 229)\"\n      gaugeSecondaryColor=\"rgba(0, 0, 0, 0.1)\"\n    />\n  )\n}\n\n\n\n===== COMPONENT: animated-gradient-text =====\nTitle: Animated Gradient Text\nDescription: An animated gradient background which transitions between colors for text.\n\n--- file: magicui/animated-gradient-text.tsx ---\nimport { type ComponentPropsWithoutRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedGradientTextProps extends ComponentPropsWithoutRef<\"div\"> {\n  speed?: number\n  colorFrom?: string\n  colorTo?: string\n}\n\nexport function AnimatedGradientText({\n  children,\n  className,\n  speed = 1,\n  colorFrom = \"#ffaa40\",\n  colorTo = \"#9c40ff\",\n  ...props\n}: AnimatedGradientTextProps) {\n  return (\n    <span\n      style={\n        {\n          \"--bg-size\": `${speed * 300}%`,\n          \"--color-from\": colorFrom,\n          \"--color-to\": colorTo,\n        } as React.CSSProperties\n      }\n      className={cn(\n        `animate-gradient inline bg-linear-to-r from-(--color-from) via-(--color-to) to-(--color-from) bg-size-[var(--bg-size)_100%] bg-clip-text text-transparent`,\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </span>\n  )\n}\n\n\n===== EXAMPLE: animated-gradient-text-demo =====\nTitle: Animated Gradient Text Demo\n\n--- file: example/animated-gradient-text-demo.tsx ---\nimport { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedGradientText } from \"@/registry/magicui/animated-gradient-text\"\n\nexport default function AnimatedGradientTextDemo() {\n  return (\n    <div className=\"group relative mx-auto flex items-center justify-center rounded-full px-4 py-1.5 shadow-[inset_0_-8px_10px_#8fdfff1f] transition-shadow duration-500 ease-out hover:shadow-[inset_0_-5px_10px_#8fdfff3f]\">\n      <span\n        className={cn(\n          \"animate-gradient absolute inset-0 block h-full w-full rounded-[inherit] bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:300%_100%] p-[1px]\"\n        )}\n        style={{\n          WebkitMask:\n            \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n          WebkitMaskComposite: \"destination-out\",\n          mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n          maskComposite: \"subtract\",\n          WebkitClipPath: \"padding-box\",\n        }}\n      />\n      🎉 <hr className=\"mx-2 h-4 w-px shrink-0 bg-neutral-500\" />\n      <AnimatedGradientText className=\"text-sm font-medium\">\n        Introducing Magic UI\n      </AnimatedGradientText>\n      <ChevronRight className=\"ml-1 size-4 stroke-neutral-500 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: animated-gradient-text-demo-2 =====\nTitle: Animated Gradient Text Demo 2\n\n--- file: example/animated-gradient-text-demo-2.tsx ---\nimport { AnimatedGradientText } from \"@/registry/magicui/animated-gradient-text\"\n\nexport default function AnimatedGradientTextDemo() {\n  return (\n    <AnimatedGradientText\n      speed={2}\n      colorFrom=\"#4ade80\"\n      colorTo=\"#06b6d4\"\n      className=\"text-4xl font-semibold tracking-tight\"\n    >\n      Fast Gradient\n    </AnimatedGradientText>\n  )\n}\n\n\n\n===== COMPONENT: animated-grid-pattern =====\nTitle: Animated Grid Pattern\nDescription: A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/animated-grid-pattern.tsx ---\n\"use client\"\n\nimport {\n  useCallback,\n  useEffect,\n  useId,\n  useRef,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedGridPatternProps extends ComponentPropsWithoutRef<\"svg\"> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  strokeDasharray?: number\n  numSquares?: number\n  maxOpacity?: number\n  duration?: number\n  repeatDelay?: number\n}\n\ntype Square = {\n  id: number\n  pos: [number, number]\n  iteration: number\n}\n\nexport function AnimatedGridPattern({\n  width = 40,\n  height = 40,\n  x = -1,\n  y = -1,\n  strokeDasharray = 0,\n  numSquares = 50,\n  className,\n  maxOpacity = 0.5,\n  duration = 4,\n  repeatDelay = 0.5,\n  ...props\n}: AnimatedGridPatternProps) {\n  const id = useId()\n  const containerRef = useRef<SVGSVGElement | null>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n  const [squares, setSquares] = useState<Array<Square>>([])\n\n  const getPos = useCallback((): [number, number] => {\n    return [\n      Math.floor((Math.random() * dimensions.width) / width),\n      Math.floor((Math.random() * dimensions.height) / height),\n    ]\n  }, [dimensions.height, dimensions.width, height, width])\n\n  const generateSquares = useCallback(\n    (count: number) => {\n      return Array.from({ length: count }, (_, i) => ({\n        id: i,\n        pos: getPos(),\n        iteration: 0,\n      }))\n    },\n    [getPos]\n  )\n\n  const updateSquarePosition = useCallback(\n    (squareId: number) => {\n      setSquares((currentSquares) => {\n        const current = currentSquares[squareId]\n        if (!current || current.id !== squareId) return currentSquares\n\n        const nextSquares = currentSquares.slice()\n        nextSquares[squareId] = {\n          ...current,\n          pos: getPos(),\n          iteration: current.iteration + 1,\n        }\n\n        return nextSquares\n      })\n    },\n    [getPos]\n  )\n\n  useEffect(() => {\n    if (dimensions.width && dimensions.height) {\n      setSquares(generateSquares(numSquares))\n    }\n  }, [dimensions.width, dimensions.height, generateSquares, numSquares])\n\n  useEffect(() => {\n    const element = containerRef.current\n    let resizeObserver: ResizeObserver | null = null\n\n    if (element) {\n      resizeObserver = new ResizeObserver((entries) => {\n        for (const entry of entries) {\n          setDimensions((currentDimensions) => {\n            const nextWidth = entry.contentRect.width\n            const nextHeight = entry.contentRect.height\n            if (\n              currentDimensions.width === nextWidth &&\n              currentDimensions.height === nextHeight\n            ) {\n              return currentDimensions\n            }\n            return { width: nextWidth, height: nextHeight }\n          })\n        }\n      })\n\n      resizeObserver.observe(element)\n    }\n\n    return () => {\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n    }\n  }, [])\n\n  return (\n    <svg\n      ref={containerRef}\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <pattern\n          id={id}\n          width={width}\n          height={height}\n          patternUnits=\"userSpaceOnUse\"\n          x={x}\n          y={y}\n        >\n          <path\n            d={`M.5 ${height}V.5H${width}`}\n            fill=\"none\"\n            strokeDasharray={strokeDasharray}\n          />\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n      <svg x={x} y={y} className=\"overflow-visible\">\n        {squares.map(({ pos: [squareX, squareY], id, iteration }, index) => (\n          <motion.rect\n            initial={{ opacity: 0 }}\n            animate={{ opacity: maxOpacity }}\n            transition={{\n              duration,\n              repeat: 1,\n              delay: index * 0.1,\n              repeatType: \"reverse\",\n              repeatDelay,\n            }}\n            onAnimationComplete={() => updateSquarePosition(id)}\n            key={`${id}-${iteration}`}\n            width={width - 1}\n            height={height - 1}\n            x={squareX * width + 1}\n            y={squareY * height + 1}\n            fill=\"currentColor\"\n            strokeWidth=\"0\"\n          />\n        ))}\n      </svg>\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: animated-grid-pattern-demo =====\nTitle: Animated Grid Pattern Demo\n\n--- file: example/animated-grid-pattern-demo.tsx ---\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedGridPattern } from \"@/registry/magicui/animated-grid-pattern\"\n\nexport default function AnimatedGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <AnimatedGridPattern\n        numSquares={30}\n        maxOpacity={0.1}\n        duration={3}\n        repeatDelay={1}\n        className={cn(\n          \"mask-[radial-gradient(500px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: animated-list =====\nTitle: Animated List\nDescription: A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\n\n--- file: magicui/animated-list.tsx ---\n\"use client\"\n\nimport React, {\n  useEffect,\n  useMemo,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\nimport { AnimatePresence, motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport function AnimatedListItem({ children }: { children: React.ReactNode }) {\n  const animations: MotionProps = {\n    initial: { scale: 0, opacity: 0 },\n    animate: { scale: 1, opacity: 1, originY: 0 },\n    exit: { scale: 0, opacity: 0 },\n    transition: { type: \"spring\", stiffness: 350, damping: 40 },\n  }\n\n  return (\n    <motion.div {...animations} layout className=\"mx-auto w-full\">\n      {children}\n    </motion.div>\n  )\n}\n\nexport interface AnimatedListProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: React.ReactNode\n  delay?: number\n}\n\nexport const AnimatedList = React.memo(\n  ({ children, className, delay = 1000, ...props }: AnimatedListProps) => {\n    const [index, setIndex] = useState(0)\n    const childrenArray = useMemo(\n      () => React.Children.toArray(children),\n      [children]\n    )\n\n    useEffect(() => {\n      let timeout: ReturnType<typeof setTimeout> | null = null\n\n      if (index < childrenArray.length - 1) {\n        timeout = setTimeout(() => {\n          setIndex((prevIndex) => (prevIndex + 1) % childrenArray.length)\n        }, delay)\n      }\n\n      return () => {\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n      }\n    }, [index, delay, childrenArray.length])\n\n    const itemsToShow = useMemo(() => {\n      const result = childrenArray.slice(0, index + 1).reverse()\n      return result\n    }, [index, childrenArray])\n\n    return (\n      <div\n        className={cn(`flex flex-col items-center gap-4`, className)}\n        {...props}\n      >\n        <AnimatePresence>\n          {itemsToShow.map((item) => (\n            <AnimatedListItem key={(item as React.ReactElement).key}>\n              {item}\n            </AnimatedListItem>\n          ))}\n        </AnimatePresence>\n      </div>\n    )\n  }\n)\n\nAnimatedList.displayName = \"AnimatedList\"\n\n\n===== EXAMPLE: bento-demo =====\nTitle: Bento Demo\n\n--- file: example/bento-demo.tsx ---\nimport { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\"\nimport { BellIcon, Share2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\"\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\"\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst files = [\n  {\n    name: \"bitcoin.pdf\",\n    body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n  },\n  {\n    name: \"finances.xlsx\",\n    body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n  },\n  {\n    name: \"logo.svg\",\n    body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n  },\n  {\n    name: \"keys.gpg\",\n    body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n  },\n  {\n    name: \"seed.txt\",\n    body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n  },\n]\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-1\",\n    background: (\n      <Marquee\n        pauseOnHover\n        className=\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\"\n      >\n        {files.map((f, idx) => (\n          <figure\n            key={idx}\n            className={cn(\n              \"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\",\n              \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n              \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\",\n              \"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\"\n            )}\n          >\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"flex flex-col\">\n                <figcaption className=\"text-sm font-medium dark:text-white\">\n                  {f.name}\n                </figcaption>\n              </div>\n            </div>\n            <blockquote className=\"mt-2 text-xs\">{f.body}</blockquote>\n          </figure>\n        ))}\n      </Marquee>\n    ),\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description: \"Get notified when something happens.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedListDemo className=\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\" />\n    ),\n  },\n  {\n    Icon: Share2Icon,\n    name: \"Integrations\",\n    description: \"Supports 100+ integrations and counting.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedBeamMultipleOutputDemo className=\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\" />\n    ),\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    className: \"col-span-3 lg:col-span-1\",\n    href: \"#\",\n    cta: \"Learn more\",\n    background: (\n      <Calendar\n        mode=\"single\"\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\n        className=\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\"\n      />\n    ),\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid>\n      {features.map((feature, idx) => (\n        <BentoCard key={idx} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n\n\n===== EXAMPLE: animated-list-demo =====\nTitle: Animated List Demo\n\n--- file: example/animated-list-demo.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedList } from \"@/registry/magicui/animated-list\"\n\ninterface Item {\n  name: string\n  description: string\n  icon: string\n  color: string\n  time: string\n}\n\nlet notifications = [\n  {\n    name: \"Payment received\",\n    description: \"Magic UI\",\n    time: \"15m ago\",\n\n    icon: \"💸\",\n    color: \"#00C9A7\",\n  },\n  {\n    name: \"User signed up\",\n    description: \"Magic UI\",\n    time: \"10m ago\",\n    icon: \"👤\",\n    color: \"#FFB800\",\n  },\n  {\n    name: \"New message\",\n    description: \"Magic UI\",\n    time: \"5m ago\",\n    icon: \"💬\",\n    color: \"#FF3D71\",\n  },\n  {\n    name: \"New event\",\n    description: \"Magic UI\",\n    time: \"2m ago\",\n    icon: \"🗞️\",\n    color: \"#1E86FF\",\n  },\n]\n\nnotifications = Array.from({ length: 10 }, () => notifications).flat()\n\nconst Notification = ({ name, description, icon, color, time }: Item) => {\n  return (\n    <figure\n      className={cn(\n        \"relative mx-auto min-h-fit w-full max-w-[400px] cursor-pointer overflow-hidden rounded-2xl p-4\",\n        // animation styles\n        \"transition-all duration-200 ease-in-out hover:scale-[103%]\",\n        // light styles\n        \"bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\n        // dark styles\n        \"transform-gpu dark:bg-transparent dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:backdrop-blur-md dark:[border:1px_solid_rgba(255,255,255,.1)]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-3\">\n        <div\n          className=\"flex size-10 items-center justify-center rounded-2xl\"\n          style={{\n            backgroundColor: color,\n          }}\n        >\n          <span className=\"text-lg\">{icon}</span>\n        </div>\n        <div className=\"flex flex-col overflow-hidden\">\n          <figcaption className=\"flex flex-row items-center text-lg font-medium whitespace-pre dark:text-white\">\n            <span className=\"text-sm sm:text-lg\">{name}</span>\n            <span className=\"mx-1\">·</span>\n            <span className=\"text-xs text-gray-500\">{time}</span>\n          </figcaption>\n          <p className=\"text-sm font-normal dark:text-white/60\">\n            {description}\n          </p>\n        </div>\n      </div>\n    </figure>\n  )\n}\n\nexport default function AnimatedListDemo({\n  className,\n}: {\n  className?: string\n}) {\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full flex-col overflow-hidden p-2\",\n        className\n      )}\n    >\n      <AnimatedList>\n        {notifications.map((item, idx) => (\n          <Notification {...item} key={idx} />\n        ))}\n      </AnimatedList>\n\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: animated-shiny-text =====\nTitle: Animated Shiny Text\nDescription: A light glare effect which pans across text making it appear as if it is shimmering.\n\n--- file: magicui/animated-shiny-text.tsx ---\nimport {\n  type ComponentPropsWithoutRef,\n  type CSSProperties,\n  type FC,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedShinyTextProps extends ComponentPropsWithoutRef<\"span\"> {\n  shimmerWidth?: number\n}\n\nexport const AnimatedShinyText: FC<AnimatedShinyTextProps> = ({\n  children,\n  className,\n  shimmerWidth = 100,\n  ...props\n}) => {\n  return (\n    <span\n      style={\n        {\n          \"--shiny-width\": `${shimmerWidth}px`,\n        } as CSSProperties\n      }\n      className={cn(\n        \"mx-auto max-w-md text-neutral-600/70 dark:text-neutral-400/70\",\n\n        // Shine effect\n        \"animate-shiny-text bg-size-[var(--shiny-width)_100%] bg-clip-text bg-position-[0_0] bg-no-repeat [transition:background-position_1s_cubic-bezier(.6,.6,0,1)_infinite]\",\n\n        // Shine gradient\n        \"bg-linear-to-r from-transparent via-black/80 via-50% to-transparent dark:via-white/80\",\n\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </span>\n  )\n}\n\n\n===== EXAMPLE: animated-shiny-text-demo =====\nTitle: Animated Shiny Text Demo\n\n--- file: example/animated-shiny-text-demo.tsx ---\nimport { ArrowRightIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedShinyText } from \"@/registry/magicui/animated-shiny-text\"\n\nexport default function AnimatedShinyTextDemo() {\n  return (\n    <div className=\"z-10 flex min-h-64 items-center justify-center\">\n      <div\n        className={cn(\n          \"group rounded-full border border-black/5 bg-neutral-100 text-base text-white transition-all ease-in hover:cursor-pointer hover:bg-neutral-200 dark:border-white/5 dark:bg-neutral-900 dark:hover:bg-neutral-800\"\n        )}\n      >\n        <AnimatedShinyText className=\"inline-flex items-center justify-center px-4 py-1 transition ease-out hover:text-neutral-600 hover:duration-300 hover:dark:text-neutral-400\">\n          <span>✨ Introducing Magic UI</span>\n          <ArrowRightIcon className=\"ml-1 size-3 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\" />\n        </AnimatedShinyText>\n      </div>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: animated-theme-toggler =====\nTitle: Theme Toggler\nDescription: A component for theme changing animation.\n\n--- file: magicui/animated-theme-toggler.tsx ---\n\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { Moon, Sun } from \"lucide-react\"\nimport { flushSync } from \"react-dom\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutRef<\"button\"> {\n  duration?: number\n}\n\nexport const AnimatedThemeToggler = ({\n  className,\n  duration = 400,\n  ...props\n}: AnimatedThemeTogglerProps) => {\n  const [isDark, setIsDark] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n\n  useEffect(() => {\n    const updateTheme = () => {\n      setIsDark(document.documentElement.classList.contains(\"dark\"))\n    }\n\n    updateTheme()\n\n    const observer = new MutationObserver(updateTheme)\n    observer.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: [\"class\"],\n    })\n\n    return () => observer.disconnect()\n  }, [])\n\n  const toggleTheme = useCallback(() => {\n    const button = buttonRef.current\n    if (!button) return\n\n    const { top, left, width, height } = button.getBoundingClientRect()\n    const x = left + width / 2\n    const y = top + height / 2\n    const viewportWidth = window.visualViewport?.width ?? window.innerWidth\n    const viewportHeight = window.visualViewport?.height ?? window.innerHeight\n    const maxRadius = Math.hypot(\n      Math.max(x, viewportWidth - x),\n      Math.max(y, viewportHeight - y)\n    )\n\n    const applyTheme = () => {\n      const newTheme = !isDark\n      setIsDark(newTheme)\n      document.documentElement.classList.toggle(\"dark\")\n      localStorage.setItem(\"theme\", newTheme ? \"dark\" : \"light\")\n    }\n\n    if (typeof document.startViewTransition !== \"function\") {\n      applyTheme()\n      return\n    }\n\n    const transition = document.startViewTransition(() => {\n      flushSync(applyTheme)\n    })\n\n    const ready = transition?.ready\n    if (ready && typeof ready.then === \"function\") {\n      ready.then(() => {\n        document.documentElement.animate(\n          {\n            clipPath: [\n              `circle(0px at ${x}px ${y}px)`,\n              `circle(${maxRadius}px at ${x}px ${y}px)`,\n            ],\n          },\n          {\n            duration,\n            easing: \"ease-in-out\",\n            pseudoElement: \"::view-transition-new(root)\",\n          }\n        )\n      })\n    }\n  }, [isDark, duration])\n\n  return (\n    <button\n      type=\"button\"\n      ref={buttonRef}\n      onClick={toggleTheme}\n      className={cn(className)}\n      {...props}\n    >\n      {isDark ? <Sun /> : <Moon />}\n      <span className=\"sr-only\">Toggle theme</span>\n    </button>\n  )\n}\n\n\n===== EXAMPLE: animated-theme-toggler-demo =====\nTitle: Animated Theme Toggler Demo\n\n--- file: example/animated-theme-toggler-demo.tsx ---\nimport { AnimatedThemeToggler } from \"@/registry/magicui/animated-theme-toggler\"\n\nexport default function AnimatedThemeTogglerDemo() {\n  return <AnimatedThemeToggler />\n}\n\n\n\n===== COMPONENT: aurora-text =====\nTitle: Aurora Text\nDescription: A beautiful aurora text effect\n\n--- file: magicui/aurora-text.tsx ---\n\"use client\"\n\nimport React, { memo } from \"react\"\n\ninterface AuroraTextProps {\n  children: React.ReactNode\n  className?: string\n  colors?: string[]\n  speed?: number\n}\n\nexport const AuroraText = memo(\n  ({\n    children,\n    className = \"\",\n    colors = [\"#FF0080\", \"#7928CA\", \"#0070F3\", \"#38bdf8\"],\n    speed = 1,\n  }: AuroraTextProps) => {\n    const gradientStyle = {\n      backgroundImage: `linear-gradient(135deg, ${colors.join(\", \")}, ${\n        colors[0]\n      })`,\n      WebkitBackgroundClip: \"text\",\n      WebkitTextFillColor: \"transparent\",\n      animationDuration: `${10 / speed}s`,\n    }\n\n    return (\n      <span className={`relative inline-block ${className}`}>\n        <span className=\"sr-only\">{children}</span>\n        <span\n          className=\"animate-aurora relative bg-size-[200%_auto] bg-clip-text text-transparent\"\n          style={gradientStyle}\n          aria-hidden=\"true\"\n        >\n          {children}\n        </span>\n      </span>\n    )\n  }\n)\n\nAuroraText.displayName = \"AuroraText\"\n\n\n===== EXAMPLE: aurora-text-demo =====\nTitle: Aurora Text Demo\n\n--- file: example/aurora-text-demo.tsx ---\nimport { AuroraText } from \"@/registry/magicui/aurora-text\"\n\nexport default function AuroraTextDemo() {\n  return (\n    <h1 className=\"text-4xl font-bold tracking-tighter md:text-5xl lg:text-7xl\">\n      Ship <AuroraText>beautiful</AuroraText>\n    </h1>\n  )\n}\n\n\n\n===== COMPONENT: avatar-circles =====\nTitle: Avatar Circles\nDescription: Overlapping circles of avatars.\n\n--- file: magicui/avatar-circles.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Avatar {\n  imageUrl: string\n  profileUrl: string\n}\ninterface AvatarCirclesProps {\n  className?: string\n  numPeople?: number\n  avatarUrls: Avatar[]\n}\n\nexport const AvatarCircles = ({\n  numPeople,\n  className,\n  avatarUrls,\n}: AvatarCirclesProps) => {\n  return (\n    <div className={cn(\"z-10 flex -space-x-4 rtl:space-x-reverse\", className)}>\n      {avatarUrls.map((url, index) => (\n        <a\n          key={index}\n          href={url.profileUrl}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          <img\n            key={index}\n            className=\"h-10 w-10 rounded-full border-2 border-white dark:border-gray-800\"\n            src={url.imageUrl}\n            width={40}\n            height={40}\n            alt={`Avatar ${index + 1}`}\n          />\n        </a>\n      ))}\n      {(numPeople ?? 0) > 0 && (\n        <a\n          className=\"flex h-10 w-10 items-center justify-center rounded-full border-2 border-white bg-black text-center text-xs font-medium text-white hover:bg-gray-600 dark:border-gray-800 dark:bg-white dark:text-black\"\n          href=\"\"\n        >\n          +{numPeople}\n        </a>\n      )}\n    </div>\n  )\n}\n\n\n===== EXAMPLE: magic-card-demo-2 =====\nTitle: Magic Card Demo 2\n\n--- file: example/magic-card-demo2.tsx ---\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Link from \"next/link\"\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { AvatarCircles } from \"@/registry/magicui/avatar-circles\"\nimport { MagicCard } from \"@/registry/magicui/magic-card\"\n\nexport default function MagicCardDemo() {\n  const { theme, systemTheme } = useTheme()\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => {\n    setMounted(true)\n  }, [])\n\n  const isDark = mounted\n    ? (theme === \"system\" ? systemTheme : theme) === \"dark\"\n    : true\n\n  return (\n    <Card className=\"w-full max-w-sm border-none p-0 shadow-none\">\n      <MagicCard\n        mode=\"orb\"\n        glowFrom={isDark ? \"#ee4f27\" : \"#E9D5FF\"}\n        glowTo={isDark ? \"#6b21ef\" : \"#FBCFE8\"}\n        className=\"p-0\"\n      >\n        <CardHeader className=\"border-border border-b p-4 [.border-b]:pb-4\">\n          <div className=\"flex items-center gap-3\">\n            <AvatarCircles\n              avatarUrls={[\n                {\n                  imageUrl: \"https://avatars.githubusercontent.com/u/81306489\",\n                  profileUrl: \"https://github.com/Yeom-JinHo\",\n                },\n              ]}\n            />\n            <div className=\"flex-1\">\n              <CardTitle>Yeom JinHo</CardTitle>\n              <CardDescription className=\"mt-1\">\n                Frontend Developer\n              </CardDescription>\n            </div>\n          </div>\n        </CardHeader>\n        <CardContent className=\"space-y-2 p-4\">\n          <p className=\"text-sm font-medium\">\n            Frontend Developer focused on Interactive UI &amp; Performance\n          </p>\n          <p className=\"text-muted-foreground text-sm leading-relaxed\">\n            I&apos;m passionate about visual presentation and currently focusing\n            on interactive UI.\n          </p>\n        </CardContent>\n        <CardFooter className=\"border-border border-t p-4 [.border-t]:pt-4\">\n          <Button asChild className=\"w-full\">\n            <Link\n              href=\"https://github.com/Yeom-JinHo\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"flex items-center justify-center gap-2\"\n            >\n              <svg viewBox=\"0 0 438.549 438.549\" className=\"size-4\">\n                <path\n                  fill=\"currentColor\"\n                  d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n                ></path>\n              </svg>\n              View on GitHub\n            </Link>\n          </Button>\n        </CardFooter>\n      </MagicCard>\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: avatar-circles-demo =====\nTitle: Avatar Circles Demo\n\n--- file: example/avatar-circles-demo.tsx ---\nimport { AvatarCircles } from \"@/registry/magicui/avatar-circles\"\n\nconst avatars = [\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/16860528\",\n    profileUrl: \"https://github.com/dillionverma\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/20110627\",\n    profileUrl: \"https://github.com/tomonarifeehan\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/106103625\",\n    profileUrl: \"https://github.com/BankkRoll\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/59228569\",\n    profileUrl: \"https://github.com/safethecode\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/59442788\",\n    profileUrl: \"https://github.com/sanjay-mali\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/89768406\",\n    profileUrl: \"https://github.com/itsarghyadas\",\n  },\n]\n\nexport default function AvatarCirclesDemo() {\n  return <AvatarCircles numPeople={99} avatarUrls={avatars} />\n}\n\n\n\n===== COMPONENT: bento-grid =====\nTitle: Bento Grid\nDescription: Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\n\n--- file: magicui/bento-grid.tsx ---\nimport { type ComponentPropsWithoutRef, type ReactNode } from \"react\"\nimport { ArrowRightIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\ninterface BentoGridProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: ReactNode\n  className?: string\n}\n\ninterface BentoCardProps extends ComponentPropsWithoutRef<\"div\"> {\n  name: string\n  className: string\n  background: ReactNode\n  Icon: React.ElementType\n  description: string\n  href: string\n  cta: string\n}\n\nconst BentoGrid = ({ children, className, ...props }: BentoGridProps) => {\n  return (\n    <div\n      className={cn(\n        \"grid w-full auto-rows-[22rem] grid-cols-3 gap-4\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </div>\n  )\n}\n\nconst BentoCard = ({\n  name,\n  className,\n  background,\n  Icon,\n  description,\n  href,\n  cta,\n  ...props\n}: BentoCardProps) => (\n  <div\n    key={name}\n    className={cn(\n      \"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl\",\n      // light styles\n      \"bg-background [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\n      // dark styles\n      \"dark:bg-background transform-gpu dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:[border:1px_solid_rgba(255,255,255,.1)]\",\n      className\n    )}\n    {...props}\n  >\n    <div>{background}</div>\n    <div className=\"p-4\">\n      <div className=\"pointer-events-none z-10 flex transform-gpu flex-col gap-1 transition-all duration-300 lg:group-hover:-translate-y-10\">\n        <Icon className=\"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75\" />\n        <h3 className=\"text-xl font-semibold text-neutral-700 dark:text-neutral-300\">\n          {name}\n        </h3>\n        <p className=\"max-w-lg text-neutral-400\">{description}</p>\n      </div>\n\n      <div\n        className={cn(\n          \"pointer-events-none flex w-full translate-y-0 transform-gpu flex-row items-center transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:hidden\"\n        )}\n      >\n        <Button\n          variant=\"link\"\n          asChild\n          size=\"sm\"\n          className=\"pointer-events-auto p-0\"\n        >\n          <a href={href}>\n            {cta}\n            <ArrowRightIcon className=\"ms-2 h-4 w-4 rtl:rotate-180\" />\n          </a>\n        </Button>\n      </div>\n    </div>\n\n    <div\n      className={cn(\n        \"pointer-events-none absolute bottom-0 hidden w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:flex\"\n      )}\n    >\n      <Button\n        variant=\"link\"\n        asChild\n        size=\"sm\"\n        className=\"pointer-events-auto p-0\"\n      >\n        <a href={href}>\n          {cta}\n          <ArrowRightIcon className=\"ms-2 h-4 w-4 rtl:rotate-180\" />\n        </a>\n      </Button>\n    </div>\n\n    <div className=\"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/3 group-hover:dark:bg-neutral-800/10\" />\n  </div>\n)\n\nexport { BentoCard, BentoGrid }\n\n\n===== EXAMPLE: bento-demo =====\nTitle: Bento Demo\n\n--- file: example/bento-demo.tsx ---\nimport { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\"\nimport { BellIcon, Share2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\"\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\"\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst files = [\n  {\n    name: \"bitcoin.pdf\",\n    body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n  },\n  {\n    name: \"finances.xlsx\",\n    body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n  },\n  {\n    name: \"logo.svg\",\n    body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n  },\n  {\n    name: \"keys.gpg\",\n    body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n  },\n  {\n    name: \"seed.txt\",\n    body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n  },\n]\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-1\",\n    background: (\n      <Marquee\n        pauseOnHover\n        className=\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\"\n      >\n        {files.map((f, idx) => (\n          <figure\n            key={idx}\n            className={cn(\n              \"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\",\n              \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n              \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\",\n              \"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\"\n            )}\n          >\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"flex flex-col\">\n                <figcaption className=\"text-sm font-medium dark:text-white\">\n                  {f.name}\n                </figcaption>\n              </div>\n            </div>\n            <blockquote className=\"mt-2 text-xs\">{f.body}</blockquote>\n          </figure>\n        ))}\n      </Marquee>\n    ),\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description: \"Get notified when something happens.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedListDemo className=\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\" />\n    ),\n  },\n  {\n    Icon: Share2Icon,\n    name: \"Integrations\",\n    description: \"Supports 100+ integrations and counting.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedBeamMultipleOutputDemo className=\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\" />\n    ),\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    className: \"col-span-3 lg:col-span-1\",\n    href: \"#\",\n    cta: \"Learn more\",\n    background: (\n      <Calendar\n        mode=\"single\"\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\n        className=\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\"\n      />\n    ),\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid>\n      {features.map((feature, idx) => (\n        <BentoCard key={idx} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n\n\n===== EXAMPLE: bento-demo-vertical =====\nTitle: Bento Vertical Demo\n\n--- file: example/bento-demo-vertical.tsx ---\nimport {\n  BellIcon,\n  CalendarIcon,\n  FileTextIcon,\n  GlobeIcon,\n  InputIcon,\n} from \"@radix-ui/react-icons\"\n\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:row-start-1 lg:row-end-4 lg:col-start-2 lg:col-end-3\",\n  },\n  {\n    Icon: InputIcon,\n    name: \"Full text search\",\n    description: \"Search through all your files in one place.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-3\",\n  },\n  {\n    Icon: GlobeIcon,\n    name: \"Multilingual\",\n    description: \"Supports 100+ languages and counting.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-1 lg:col-end-2 lg:row-start-3 lg:row-end-4\",\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-3 lg:col-end-3 lg:row-start-1 lg:row-end-2\",\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description:\n      \"Get notified when someone shares a file or mentions you in a comment.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-3 lg:col-end-3 lg:row-start-2 lg:row-end-4\",\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid className=\"lg:grid-rows-3\">\n      {features.map((feature) => (\n        <BentoCard key={feature.name} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n\n\n\n===== COMPONENT: blur-fade =====\nTitle: Blur Fade\nDescription: Blur fade in and out animation. Used to smoothly fade in and out content.\n\n--- file: magicui/blur-fade.tsx ---\n\"use client\"\n\nimport { useRef } from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  useInView,\n  type MotionProps,\n  type UseInViewOptions,\n  type Variants,\n} from \"motion/react\"\n\ntype MarginType = UseInViewOptions[\"margin\"]\n\ninterface BlurFadeProps extends MotionProps {\n  children: React.ReactNode\n  className?: string\n  variant?: {\n    hidden: { y: number }\n    visible: { y: number }\n  }\n  duration?: number\n  delay?: number\n  offset?: number\n  direction?: \"up\" | \"down\" | \"left\" | \"right\"\n  inView?: boolean\n  inViewMargin?: MarginType\n  blur?: string\n}\n\nconst getFilter = (v: Variants[string]) =>\n  typeof v === \"function\" ? undefined : v.filter\n\nexport function BlurFade({\n  children,\n  className,\n  variant,\n  duration = 0.4,\n  delay = 0,\n  offset = 6,\n  direction = \"down\",\n  inView = false,\n  inViewMargin = \"-50px\",\n  blur = \"6px\",\n  ...props\n}: BlurFadeProps) {\n  const ref = useRef(null)\n  const inViewResult = useInView(ref, { once: true, margin: inViewMargin })\n  const isInView = !inView || inViewResult\n  const defaultVariants: Variants = {\n    hidden: {\n      [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]:\n        direction === \"right\" || direction === \"down\" ? -offset : offset,\n      opacity: 0,\n      filter: `blur(${blur})`,\n    },\n    visible: {\n      [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]: 0,\n      opacity: 1,\n      filter: `blur(0px)`,\n    },\n  }\n  const combinedVariants = variant ?? defaultVariants\n\n  const hiddenFilter = getFilter(combinedVariants.hidden)\n  const visibleFilter = getFilter(combinedVariants.visible)\n\n  const shouldTransitionFilter =\n    hiddenFilter != null &&\n    visibleFilter != null &&\n    hiddenFilter !== visibleFilter\n\n  return (\n    <AnimatePresence>\n      <motion.div\n        ref={ref}\n        initial=\"hidden\"\n        animate={isInView ? \"visible\" : \"hidden\"}\n        exit=\"hidden\"\n        variants={combinedVariants}\n        transition={{\n          delay: 0.04 + delay,\n          duration,\n          ease: \"easeOut\",\n          ...(shouldTransitionFilter ? { filter: { duration } } : {}),\n        }}\n        className={className}\n        {...props}\n      >\n        {children}\n      </motion.div>\n    </AnimatePresence>\n  )\n}\n\n\n===== EXAMPLE: blur-fade-demo =====\nTitle: Blur Fade Demo\n\n--- file: example/blur-fade-demo.tsx ---\nimport { BlurFade } from \"@/registry/magicui/blur-fade\"\n\nconst images = Array.from({ length: 9 }, (_, i) => {\n  const isLandscape = i % 2 === 0\n  const width = isLandscape ? 800 : 600\n  const height = isLandscape ? 600 : 800\n  return `https://picsum.photos/seed/${i + 1}/${width}/${height}`\n})\n\nexport default function BlurFadeDemo() {\n  return (\n    <section id=\"photos\">\n      <div className=\"columns-2 gap-4 sm:columns-3\">\n        {images.map((imageUrl, idx) => (\n          <BlurFade key={imageUrl} delay={0.25 + idx * 0.05} inView>\n            <img\n              className=\"mb-4 size-full rounded-lg object-contain\"\n              src={imageUrl}\n              alt={`Random stock image ${idx + 1}`}\n            />\n          </BlurFade>\n        ))}\n      </div>\n    </section>\n  )\n}\n\n\n===== EXAMPLE: blur-fade-text-demo =====\nTitle: Blur Fade Text Demo\n\n--- file: example/blur-fade-text-demo.tsx ---\nimport { BlurFade } from \"@/registry/magicui/blur-fade\"\n\nexport default function BlurFadeTextDemo() {\n  return (\n    <section id=\"header\">\n      <BlurFade delay={0.25} inView>\n        <h2 className=\"text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none\">\n          Hello World 👋\n        </h2>\n      </BlurFade>\n      <BlurFade delay={0.25 * 2} inView>\n        <span className=\"text-xl tracking-tighter text-pretty sm:text-3xl xl:text-4xl/none\">\n          Nice to meet you\n        </span>\n      </BlurFade>\n    </section>\n  )\n}\n\n\n\n===== COMPONENT: border-beam =====\nTitle: Border Beam\nDescription: An animated beam of light which travels along the border of its container.\n\n--- file: magicui/border-beam.tsx ---\n\"use client\"\n\nimport { motion, MotionStyle, Transition } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface BorderBeamProps {\n  /**\n   * The size of the border beam.\n   */\n  size?: number\n  /**\n   * The duration of the border beam.\n   */\n  duration?: number\n  /**\n   * The delay of the border beam.\n   */\n  delay?: number\n  /**\n   * The color of the border beam from.\n   */\n  colorFrom?: string\n  /**\n   * The color of the border beam to.\n   */\n  colorTo?: string\n  /**\n   * The motion transition of the border beam.\n   */\n  transition?: Transition\n  /**\n   * The class name of the border beam.\n   */\n  className?: string\n  /**\n   * The style of the border beam.\n   */\n  style?: React.CSSProperties\n  /**\n   * Whether to reverse the animation direction.\n   */\n  reverse?: boolean\n  /**\n   * The initial offset position (0-100).\n   */\n  initialOffset?: number\n  /**\n   * The border width of the beam.\n   */\n  borderWidth?: number\n}\n\nexport const BorderBeam = ({\n  className,\n  size = 50,\n  delay = 0,\n  duration = 6,\n  colorFrom = \"#ffaa40\",\n  colorTo = \"#9c40ff\",\n  transition,\n  style,\n  reverse = false,\n  initialOffset = 0,\n  borderWidth = 1,\n}: BorderBeamProps) => {\n  return (\n    <div\n      className=\"pointer-events-none absolute inset-0 rounded-[inherit] border-(length:--border-beam-width) border-transparent mask-[linear-gradient(transparent,transparent),linear-gradient(#000,#000)] mask-intersect [mask-clip:padding-box,border-box]\"\n      style={\n        {\n          \"--border-beam-width\": `${borderWidth}px`,\n        } as React.CSSProperties\n      }\n    >\n      <motion.div\n        className={cn(\n          \"absolute aspect-square\",\n          \"bg-linear-to-l from-(--color-from) via-(--color-to) to-transparent\",\n          className\n        )}\n        style={\n          {\n            width: size,\n            offsetPath: `rect(0 auto auto 0 round ${size}px)`,\n            \"--color-from\": colorFrom,\n            \"--color-to\": colorTo,\n            ...style,\n          } as MotionStyle\n        }\n        initial={{ offsetDistance: `${initialOffset}%` }}\n        animate={{\n          offsetDistance: reverse\n            ? [`${100 - initialOffset}%`, `${-initialOffset}%`]\n            : [`${initialOffset}%`, `${100 + initialOffset}%`],\n        }}\n        transition={{\n          repeat: Infinity,\n          ease: \"linear\",\n          duration,\n          delay: -delay,\n          ...transition,\n        }}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: border-beam-demo =====\nTitle: Border Beam Demo\n\n--- file: example/border-beam-demo.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function Component() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account.\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid w-full items-center gap-4\">\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"Enter your email\" />\n            </div>\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input\n                id=\"password\"\n                type=\"password\"\n                placeholder=\"Enter your password\"\n              />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter className=\"flex justify-between\">\n        <Button variant=\"outline\">Register</Button>\n        <Button>Login</Button>\n      </CardFooter>\n      <BorderBeam duration={8} size={100} />\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: border-beam-demo-2 =====\nTitle: Border Beam Demo\n\n--- file: example/border-beam-demo-2.tsx ---\nimport { Play, SkipBack, SkipForward } from \"lucide-react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function MusicPlayer() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Now Playing</CardTitle>\n        <CardDescription>Stairway to Heaven - Led Zeppelin</CardDescription>\n      </CardHeader>\n      <CardContent>\n        <div className=\"flex flex-col items-center gap-4\">\n          <div className=\"h-48 w-48 rounded-lg bg-linear-to-br from-purple-500 to-pink-500\" />\n          <div className=\"bg-secondary h-1 w-full rounded-full\">\n            <div className=\"bg-primary h-full w-1/3 rounded-full\" />\n          </div>\n          <div className=\"text-muted-foreground flex w-full justify-between text-sm\">\n            <span>2:45</span>\n            <span>8:02</span>\n          </div>\n        </div>\n      </CardContent>\n      <CardFooter className=\"flex justify-center gap-4\">\n        <Button variant=\"outline\" size=\"icon\" className=\"rounded-full\">\n          <SkipBack className=\"size-4\" />\n        </Button>\n        <Button size=\"icon\" className=\"rounded-full\">\n          <Play className=\"size-4\" />\n        </Button>\n        <Button variant=\"outline\" size=\"icon\" className=\"rounded-full\">\n          <SkipForward className=\"size-4\" />\n        </Button>\n      </CardFooter>\n      <BorderBeam\n        duration={6}\n        size={400}\n        className=\"from-transparent via-red-500 to-transparent\"\n      />\n      <BorderBeam\n        duration={6}\n        delay={3}\n        size={400}\n        borderWidth={2}\n        className=\"from-transparent via-blue-500 to-transparent\"\n      />\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: border-beam-demo-3 =====\nTitle: Border Beam Demo 3\n\n--- file: example/border-beam-demo-3.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function LoginForm() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account.\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid w-full items-center gap-4\">\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"Enter your email\" />\n            </div>\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input\n                id=\"password\"\n                type=\"password\"\n                placeholder=\"Enter your password\"\n              />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter className=\"flex justify-between\">\n        <Button variant=\"outline\">Register</Button>\n        <Button>Login</Button>\n      </CardFooter>\n      <BorderBeam\n        duration={4}\n        size={300}\n        reverse\n        className=\"from-transparent via-green-500 to-transparent\"\n      />\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: border-beam-demo-4 =====\nTitle: Border Beam Demo 4\n\n--- file: example/border-beam-demo-4.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function Component() {\n  return (\n    <Button className=\"relative overflow-hidden\" size=\"lg\" variant=\"outline\">\n      Buy Now\n      <BorderBeam\n        size={40}\n        initialOffset={20}\n        className=\"from-transparent via-yellow-500 to-transparent\"\n        transition={{\n          type: \"spring\",\n          stiffness: 60,\n          damping: 20,\n        }}\n      />\n    </Button>\n  )\n}\n\n\n\n===== COMPONENT: client-tweet-card =====\nTitle: Client Tweet Card\nDescription: A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\n\n--- file: magicui/client-tweet-card.tsx ---\n\"use client\"\n\nimport { TweetProps, useTweet } from \"react-tweet\"\n\nimport {\n  MagicTweet,\n  TweetNotFound,\n  TweetSkeleton,\n} from \"@/registry/magicui/tweet-card\"\n\nexport const ClientTweetCard = ({\n  id,\n  apiUrl,\n  fallback = <TweetSkeleton />,\n  components,\n  fetchOptions,\n  onError,\n  ...props\n}: TweetProps & { className?: string }) => {\n  const { data, error, isLoading } = useTweet(id, apiUrl, fetchOptions)\n\n  if (isLoading) return fallback\n  if (error || !data) {\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\n    return <NotFound error={onError ? onError(error) : error} />\n  }\n\n  return <MagicTweet tweet={data} {...props} />\n}\n\n\n===== EXAMPLE: tweet-card-demo =====\nTitle: Tweet Card Demo\n\n--- file: example/tweet-card-demo.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\n/**\n * <TweetCard /> (Server Side Only)\n * <ClientTweetCard /> (Client Side Only)\n */\nexport default function TweetDemo() {\n  return <ClientTweetCard id=\"1668408059125702661\" />\n}\n\n\n===== EXAMPLE: tweet-card-images =====\nTitle: Tweet Card Images\n\n--- file: example/tweet-card-images.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetImages() {\n  return <ClientTweetCard id=\"1678577280489234432\" className=\"shadow-2xl\" />\n}\n\n\n===== EXAMPLE: tweet-card-meta-preview =====\nTitle: Tweet Card Meta Preview\n\n--- file: example/tweet-card-meta-preview.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetMetaPreview() {\n  return <ClientTweetCard id=\"1675849118445436929\" className=\"shadow-2xl\" />\n}\n\n\n\n===== COMPONENT: code-comparison =====\nTitle: Code Comparison\nDescription: A component which compares two code snippets.\n\n--- file: magicui/code-comparison.tsx ---\n\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport {\n  transformerNotationDiff,\n  transformerNotationFocus,\n} from \"@shikijs/transformers\"\nimport { FileIcon } from \"lucide-react\"\nimport { useTheme } from \"next-themes\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface CodeComparisonProps {\n  beforeCode: string\n  afterCode: string\n  language: string\n  filename: string\n  lightTheme: string\n  darkTheme: string\n  highlightColor?: string\n}\n\nexport function CodeComparison({\n  beforeCode,\n  afterCode,\n  language,\n  filename,\n  lightTheme,\n  darkTheme,\n  highlightColor = \"#ff3333\",\n}: CodeComparisonProps) {\n  const { theme, systemTheme } = useTheme()\n  const [highlightedBefore, setHighlightedBefore] = useState(\"\")\n  const [highlightedAfter, setHighlightedAfter] = useState(\"\")\n  const [hasLeftFocus, setHasLeftFocus] = useState(false)\n  const [hasRightFocus, setHasRightFocus] = useState(false)\n\n  const selectedTheme = useMemo(() => {\n    const currentTheme = theme === \"system\" ? systemTheme : theme\n    return currentTheme === \"dark\" ? darkTheme : lightTheme\n  }, [theme, systemTheme, darkTheme, lightTheme])\n\n  useEffect(() => {\n    if (highlightedBefore || highlightedAfter) {\n      setHasLeftFocus(highlightedBefore.includes('class=\"line focused\"'))\n      setHasRightFocus(highlightedAfter.includes('class=\"line focused\"'))\n    }\n  }, [highlightedBefore, highlightedAfter])\n\n  useEffect(() => {\n    async function highlightCode() {\n      try {\n        const { codeToHtml } = await import(\"shiki\")\n        const { transformerNotationHighlight } =\n          await import(\"@shikijs/transformers\")\n\n        const before = await codeToHtml(beforeCode, {\n          lang: language,\n          theme: selectedTheme,\n          transformers: [\n            transformerNotationHighlight({ matchAlgorithm: \"v3\" }),\n            transformerNotationDiff({ matchAlgorithm: \"v3\" }),\n            transformerNotationFocus({ matchAlgorithm: \"v3\" }),\n          ],\n        })\n        const after = await codeToHtml(afterCode, {\n          lang: language,\n          theme: selectedTheme,\n          transformers: [\n            transformerNotationHighlight({ matchAlgorithm: \"v3\" }),\n            transformerNotationDiff({ matchAlgorithm: \"v3\" }),\n            transformerNotationFocus({ matchAlgorithm: \"v3\" }),\n          ],\n        })\n        setHighlightedBefore(before)\n        setHighlightedAfter(after)\n      } catch (error) {\n        console.error(\"Error highlighting code:\", error)\n        setHighlightedBefore(`<pre>${beforeCode}</pre>`)\n        setHighlightedAfter(`<pre>${afterCode}</pre>`)\n      }\n    }\n    highlightCode()\n  }, [beforeCode, afterCode, language, selectedTheme])\n\n  const renderCode = (code: string, highlighted: string) => {\n    if (highlighted) {\n      return (\n        <div\n          style={{ \"--highlight-color\": highlightColor } as React.CSSProperties}\n          className={cn(\n            \"bg-background h-full w-full overflow-auto font-mono text-xs\",\n            \"[&>pre]:h-full [&>pre]:w-screen! [&>pre]:py-2\",\n            \"[&>pre>code]:inline-block! [&>pre>code]:w-full!\",\n            \"[&>pre>code>span]:inline-block! [&>pre>code>span]:w-full [&>pre>code>span]:px-4 [&>pre>code>span]:py-0.5\",\n            \"[&>pre>code>.highlighted]:inline-block [&>pre>code>.highlighted]:w-full [&>pre>code>.highlighted]:bg-(--highlight-color)!\",\n            \"group-hover/left:[&>pre>code>:not(.focused)]:opacity-100! group-hover/left:[&>pre>code>:not(.focused)]:blur-none!\",\n            \"group-hover/right:[&>pre>code>:not(.focused)]:opacity-100! group-hover/right:[&>pre>code>:not(.focused)]:blur-none!\",\n            \"[&>pre>code>.add]:bg-[rgba(16,185,129,.16)] [&>pre>code>.remove]:bg-[rgba(244,63,94,.16)]\",\n            \"group-hover/left:[&>pre>code>:not(.focused)]:transition-all group-hover/left:[&>pre>code>:not(.focused)]:duration-300\",\n            \"group-hover/right:[&>pre>code>:not(.focused)]:transition-all group-hover/right:[&>pre>code>:not(.focused)]:duration-300\"\n          )}\n          dangerouslySetInnerHTML={{ __html: highlighted }}\n        />\n      )\n    } else {\n      return (\n        <pre className=\"bg-background text-foreground h-full overflow-auto p-4 font-mono text-xs break-all\">\n          {code}\n        </pre>\n      )\n    }\n  }\n\n  return (\n    <div className=\"mx-auto w-full max-w-5xl\">\n      <div className=\"group border-border relative w-full overflow-hidden rounded-md border\">\n        <div className=\"relative grid md:grid-cols-2\">\n          <div\n            className={cn(\n              \"leftside group/left border-primary/20 md:border-r\",\n              hasLeftFocus &&\n                \"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\",\n              \"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\"\n            )}\n          >\n            <div className=\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\">\n              <FileIcon className=\"mr-2 h-4 w-4\" />\n              {filename}\n              <span className=\"ml-auto hidden md:block\">before</span>\n            </div>\n            {renderCode(beforeCode, highlightedBefore)}\n          </div>\n          <div\n            className={cn(\n              \"rightside group/right border-primary/20 border-t md:border-t-0\",\n              hasRightFocus &&\n                \"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\",\n              \"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\"\n            )}\n          >\n            <div className=\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\">\n              <FileIcon className=\"mr-2 h-4 w-4\" />\n              {filename}\n              <span className=\"ml-auto hidden md:block\">after</span>\n            </div>\n            {renderCode(afterCode, highlightedAfter)}\n          </div>\n        </div>\n        <div className=\"border-primary/20 bg-accent text-foreground absolute top-1/2 left-1/2 hidden h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-md border text-xs md:flex\">\n          VS\n        </div>\n      </div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: code-comparison-demo =====\nTitle: Code Comparison Demo\n\n--- file: example/code-comparison-demo.tsx ---\nimport { CodeComparison } from \"@/registry/magicui/code-comparison\"\n\nconst beforeCode = `import { NextRequest } from 'next/server';\n\nexport const middleware = async (req: NextRequest) => {\n  let user = undefined;\n  let team = undefined;\n  const token = req.headers.get('token'); \n\n  if(req.nextUrl.pathname.startsWith('/auth')) {\n    user = await getUserByToken(token);\n\n    if(!user) {\n      return NextResponse.redirect('/login');\n    }\n  }\n\n  if(req.nextUrl.pathname.startsWith('/team')) {\n    user = await getUserByToken(token);\n\n    if(!user) {\n      return NextResponse.redirect('/login');\n    }\n\n    const slug = req.nextUrl.query.slug;\n    team = await getTeamBySlug(slug); // [!code highlight]\n\n    if(!team) { // [!code highlight]\n      return NextResponse.redirect('/'); // [!code highlight]\n    } // [!code highlight]\n  } // [!code highlight]\n\n  return NextResponse.next(); // [!code highlight]\n}\n\nexport const config = {\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'], // [!code highlight]\n};`\n\nconst afterCode = `import { createMiddleware, type MiddlewareFunctionProps } from '@app/(auth)/auth/_middleware';\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code --]\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code ++]\nimport { team } from '@/app/(team)/team/_middleware';\n\nconst middlewares = {\n  '/auth{/:path?}': auth,\n  '/team{/:slug?}': [ auth, team ],\n};\n\nexport const middleware = createMiddleware(middlewares); // [!code focus]\n\nexport const config = {\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'],\n};`\n\nexport default function CodeComparisonDemo() {\n  return (\n    <CodeComparison\n      beforeCode={beforeCode}\n      afterCode={afterCode}\n      language=\"typescript\"\n      filename=\"middleware.ts\"\n      lightTheme=\"github-light\"\n      darkTheme=\"github-dark\"\n      highlightColor=\"rgba(101, 117, 133, 0.16)\"\n    />\n  )\n}\n\n\n\n===== COMPONENT: comic-text =====\nTitle: Comic Text\nDescription: Comic text animation\n\n--- file: magicui/comic-text.tsx ---\n\"use client\"\n\nimport { CSSProperties } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype ComicTextProps = {\n  children: string\n  className?: string\n  style?: CSSProperties\n  fontSize?: number\n}\n\nexport function ComicText({\n  children,\n  className,\n  style,\n  fontSize = 5,\n}: ComicTextProps) {\n  if (typeof children !== \"string\") {\n    throw new Error(\"children must be a string\")\n  }\n\n  const dotColor = \"#EF4444\"\n  const backgroundColor = \"#FACC15\"\n\n  return (\n    <motion.div\n      className={cn(\"text-center select-none\", className)}\n      style={{\n        fontSize: `${fontSize}rem`,\n        fontFamily: \"'Bangers', 'Comic Sans MS', 'Impact', sans-serif\",\n        fontWeight: \"900\",\n        WebkitTextStroke: `${fontSize * 0.35}px #000000`, // Thick black outline\n        transform: \"skewX(-10deg)\",\n        textTransform: \"uppercase\",\n        filter: `\n          drop-shadow(5px 5px 0px #000000) \n          drop-shadow(3px 3px 0px ${dotColor})\n        `,\n        backgroundColor: backgroundColor,\n        backgroundImage: `radial-gradient(circle at 1px 1px, ${dotColor} 1px, transparent 0)`,\n        backgroundSize: \"8px 8px\",\n        backgroundClip: \"text\",\n        WebkitBackgroundClip: \"text\",\n        WebkitTextFillColor: \"transparent\",\n        ...style,\n      }}\n      initial={{ opacity: 0, scale: 0.8, rotate: -2 }}\n      animate={{ opacity: 1, scale: 1, rotate: 0 }}\n      transition={{\n        duration: 0.6,\n        ease: [0.175, 0.885, 0.32, 1.275],\n        type: \"spring\",\n      }}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\n\n===== EXAMPLE: comic-text-demo =====\nTitle: Comic Text Demo\n\n--- file: example/comic-text-demo.tsx ---\nimport { ComicText } from \"@/registry/magicui/comic-text\"\n\nexport default function ComicTextDemo() {\n  return (\n    <div className=\"space-y-8 text-center\">\n      <ComicText fontSize={5}>BOOM!</ComicText>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: confetti =====\nTitle: Confetti\nDescription: Confetti animations are best used to delight your users when something special happens\n\n--- file: magicui/confetti.tsx ---\n\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport React, {\n  createContext,\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n} from \"react\"\nimport type {\n  GlobalOptions as ConfettiGlobalOptions,\n  CreateTypes as ConfettiInstance,\n  Options as ConfettiOptions,\n} from \"canvas-confetti\"\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\ntype Api = {\n  fire: (options?: ConfettiOptions) => void\n}\n\ntype Props = React.ComponentPropsWithRef<\"canvas\"> & {\n  options?: ConfettiOptions\n  globalOptions?: ConfettiGlobalOptions\n  manualstart?: boolean\n  children?: ReactNode\n}\n\nexport type ConfettiRef = Api | null\n\nconst ConfettiContext = createContext<Api>({} as Api)\n\n// Define component first\nconst ConfettiComponent = forwardRef<ConfettiRef, Props>((props, ref) => {\n  const {\n    options,\n    globalOptions = { resize: true, useWorker: true },\n    manualstart = false,\n    children,\n    ...rest\n  } = props\n  const instanceRef = useRef<ConfettiInstance | null>(null)\n\n  const canvasRef = useCallback(\n    (node: HTMLCanvasElement) => {\n      if (node !== null) {\n        if (instanceRef.current) return\n        instanceRef.current = confetti.create(node, {\n          ...globalOptions,\n          resize: true,\n        })\n      } else {\n        if (instanceRef.current) {\n          instanceRef.current.reset()\n          instanceRef.current = null\n        }\n      }\n    },\n    [globalOptions]\n  )\n\n  const fire = useCallback(\n    async (opts = {}) => {\n      try {\n        await instanceRef.current?.({ ...options, ...opts })\n      } catch (error) {\n        console.error(\"Confetti error:\", error)\n      }\n    },\n    [options]\n  )\n\n  const api = useMemo(\n    () => ({\n      fire,\n    }),\n    [fire]\n  )\n\n  useImperativeHandle(ref, () => api, [api])\n\n  useEffect(() => {\n    if (!manualstart) {\n      ;(async () => {\n        try {\n          await fire()\n        } catch (error) {\n          console.error(\"Confetti effect error:\", error)\n        }\n      })()\n    }\n  }, [manualstart, fire])\n\n  return (\n    <ConfettiContext.Provider value={api}>\n      <canvas ref={canvasRef} {...rest} />\n      {children}\n    </ConfettiContext.Provider>\n  )\n})\n\n// Set display name immediately\nConfettiComponent.displayName = \"Confetti\"\n\n// Export as Confetti\nexport const Confetti = ConfettiComponent\n\ninterface ConfettiButtonProps extends React.ComponentProps<\"button\"> {\n  options?: ConfettiOptions &\n    ConfettiGlobalOptions & { canvas?: HTMLCanvasElement }\n}\n\nconst ConfettiButtonComponent = ({\n  options,\n  children,\n  ...props\n}: ConfettiButtonProps) => {\n  const handleClick = async (event: React.MouseEvent<HTMLButtonElement>) => {\n    try {\n      const rect = event.currentTarget.getBoundingClientRect()\n      const x = rect.left + rect.width / 2\n      const y = rect.top + rect.height / 2\n      await confetti({\n        ...options,\n        origin: {\n          x: x / window.innerWidth,\n          y: y / window.innerHeight,\n        },\n      })\n    } catch (error) {\n      console.error(\"Confetti button error:\", error)\n    }\n  }\n\n  return (\n    <Button onClick={handleClick} {...props}>\n      {children}\n    </Button>\n  )\n}\n\nConfettiButtonComponent.displayName = \"ConfettiButton\"\n\nexport const ConfettiButton = ConfettiButtonComponent\n\n\n===== EXAMPLE: confetti-demo =====\nTitle: Confetti Demo\n\n--- file: example/confetti-demo.tsx ---\n\"use client\"\n\nimport { useRef } from \"react\"\n\nimport { Confetti, type ConfettiRef } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiDemo() {\n  const confettiRef = useRef<ConfettiRef>(null)\n\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Confetti\n      </span>\n\n      <Confetti\n        ref={confettiRef}\n        className=\"absolute top-0 left-0 z-0 size-full\"\n        onMouseEnter={() => {\n          confettiRef.current?.fire({})\n        }}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-basic-cannon =====\nTitle: Confetti Basic Cannon\n\n--- file: example/confetti-basic-cannon.tsx ---\nimport { ConfettiButton } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiButtonDemo() {\n  return (\n    <div className=\"relative\">\n      <ConfettiButton>Confetti 🎉</ConfettiButton>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-random-direction =====\nTitle: Confetti Random Direction\n\n--- file: example/confetti-random-direction.tsx ---\nimport { ConfettiButton } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiButtonDemo() {\n  return (\n    <div className=\"relative\">\n      <ConfettiButton\n        options={{\n          get angle() {\n            return Math.random() * 360\n          },\n        }}\n      >\n        Random Confetti 🎉\n      </ConfettiButton>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-fireworks =====\nTitle: Confetti Fireworks\n\n--- file: example/confetti-fireworks.tsx ---\n\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiFireworks() {\n  const handleClick = () => {\n    const duration = 5 * 1000\n    const animationEnd = Date.now() + duration\n    const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 }\n\n    const randomInRange = (min: number, max: number) =>\n      Math.random() * (max - min) + min\n\n    const interval = window.setInterval(() => {\n      const timeLeft = animationEnd - Date.now()\n\n      if (timeLeft <= 0) {\n        return clearInterval(interval)\n      }\n\n      const particleCount = 50 * (timeLeft / duration)\n      confetti({\n        ...defaults,\n        particleCount,\n        origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n      })\n      confetti({\n        ...defaults,\n        particleCount,\n        origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n      })\n    }, 250)\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Fireworks</Button>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-stars =====\nTitle: Confetti Stars\n\n--- file: example/confetti-stars.tsx ---\n\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiStars() {\n  const handleClick = () => {\n    const defaults = {\n      spread: 360,\n      ticks: 50,\n      gravity: 0,\n      decay: 0.94,\n      startVelocity: 30,\n      colors: [\"#FFE400\", \"#FFBD00\", \"#E89400\", \"#FFCA6C\", \"#FDFFB8\"],\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 40,\n        scalar: 1.2,\n        shapes: [\"star\"],\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 10,\n        scalar: 0.75,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Stars</Button>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-side-cannons =====\nTitle: Confetti Side Cannons\n\n--- file: example/confetti-side-cannons.tsx ---\n\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiSideCannons() {\n  const handleClick = () => {\n    const end = Date.now() + 3 * 1000 // 3 seconds\n    const colors = [\"#a786ff\", \"#fd8bbc\", \"#eca184\", \"#f8deb1\"]\n\n    const frame = () => {\n      if (Date.now() > end) return\n\n      confetti({\n        particleCount: 2,\n        angle: 60,\n        spread: 55,\n        startVelocity: 60,\n        origin: { x: 0, y: 0.5 },\n        colors: colors,\n      })\n      confetti({\n        particleCount: 2,\n        angle: 120,\n        spread: 55,\n        startVelocity: 60,\n        origin: { x: 1, y: 0.5 },\n        colors: colors,\n      })\n\n      requestAnimationFrame(frame)\n    }\n\n    frame()\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Side Cannons</Button>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-custom-shapes =====\nTitle: Confetti Custom Shapes\n\n--- file: example/confetti-custom-shapes.tsx ---\n\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiCustomShapes() {\n  const handleClick = () => {\n    const scalar = 2\n    const triangle = confetti.shapeFromPath({\n      path: \"M0 10 L5 0 L10 10z\",\n    })\n    const square = confetti.shapeFromPath({\n      path: \"M0 0 L10 0 L10 10 L0 10 Z\",\n    })\n    const coin = confetti.shapeFromPath({\n      path: \"M5 0 A5 5 0 1 0 5 10 A5 5 0 1 0 5 0 Z\",\n    })\n    const tree = confetti.shapeFromPath({\n      path: \"M5 0 L10 10 L0 10 Z\",\n    })\n\n    const defaults = {\n      spread: 360,\n      ticks: 60,\n      gravity: 0,\n      decay: 0.96,\n      startVelocity: 20,\n      shapes: [triangle, square, coin, tree],\n      scalar,\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 30,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 5,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 15,\n        scalar: scalar / 2,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative flex items-center justify-center\">\n      <Button onClick={handleClick}>Trigger Shapes</Button>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: confetti-emoji =====\nTitle: Confetti Emoji\n\n--- file: example/confetti-emoji.tsx ---\n\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiEmoji() {\n  const handleClick = () => {\n    const scalar = 2\n    const unicorn = confetti.shapeFromText({ text: \"🦄\", scalar })\n\n    const defaults = {\n      spread: 360,\n      ticks: 60,\n      gravity: 0,\n      decay: 0.96,\n      startVelocity: 20,\n      shapes: [unicorn],\n      scalar,\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 30,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 5,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 15,\n        scalar: scalar / 2,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative justify-center\">\n      <Button onClick={handleClick}>Trigger Emoji</Button>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: cool-mode =====\nTitle: Cool Mode\nDescription: Cool mode effect for buttons, links, and other DOMs\n\n--- file: magicui/cool-mode.tsx ---\n\"use client\"\n\nimport React, { ReactNode, useEffect, useRef } from \"react\"\n\nexport interface BaseParticle {\n  element: HTMLElement | SVGSVGElement\n  left: number\n  size: number\n  top: number\n}\n\nexport interface BaseParticleOptions {\n  particle?: string\n  size?: number\n}\n\nexport interface CoolParticle extends BaseParticle {\n  direction: number\n  speedHorz: number\n  speedUp: number\n  spinSpeed: number\n  spinVal: number\n}\n\nexport interface CoolParticleOptions extends BaseParticleOptions {\n  particleCount?: number\n  speedHorz?: number\n  speedUp?: number\n}\n\nconst getContainer = () => {\n  const id = \"_coolMode_effect\"\n  const existingContainer = document.getElementById(id)\n\n  if (existingContainer) {\n    return existingContainer\n  }\n\n  const container = document.createElement(\"div\")\n  container.setAttribute(\"id\", id)\n  container.setAttribute(\n    \"style\",\n    \"overflow:hidden; position:fixed; height:100%; top:0; left:0; right:0; bottom:0; pointer-events:none; z-index:2147483647\"\n  )\n\n  document.body.appendChild(container)\n\n  return container\n}\n\nlet instanceCounter = 0\n\nconst applyParticleEffect = (\n  element: HTMLElement,\n  options?: CoolParticleOptions\n): (() => void) => {\n  instanceCounter++\n\n  const defaultParticle = \"circle\"\n  const particleType = options?.particle || defaultParticle\n  const sizes = [15, 20, 25, 35, 45]\n  const limit = 45\n\n  let particles: CoolParticle[] = []\n  let autoAddParticle = false\n  let mouseX = 0\n  let mouseY = 0\n\n  const container = getContainer()\n\n  function generateParticle() {\n    const size =\n      options?.size || sizes[Math.floor(Math.random() * sizes.length)]\n    const speedHorz = options?.speedHorz || Math.random() * 10\n    const speedUp = options?.speedUp || Math.random() * 25\n    const spinVal = Math.random() * 360\n    const spinSpeed = Math.random() * 35 * (Math.random() <= 0.5 ? -1 : 1)\n    const top = mouseY - size / 2\n    const left = mouseX - size / 2\n    const direction = Math.random() <= 0.5 ? -1 : 1\n\n    const particle = document.createElement(\"div\")\n\n    if (particleType === \"circle\") {\n      const svgNS = \"http://www.w3.org/2000/svg\"\n      const circleSVG = document.createElementNS(svgNS, \"svg\")\n      const circle = document.createElementNS(svgNS, \"circle\")\n      circle.setAttributeNS(null, \"cx\", (size / 2).toString())\n      circle.setAttributeNS(null, \"cy\", (size / 2).toString())\n      circle.setAttributeNS(null, \"r\", (size / 2).toString())\n      circle.setAttributeNS(\n        null,\n        \"fill\",\n        `hsl(${Math.random() * 360}, 70%, 50%)`\n      )\n\n      circleSVG.appendChild(circle)\n      circleSVG.setAttribute(\"width\", size.toString())\n      circleSVG.setAttribute(\"height\", size.toString())\n\n      particle.appendChild(circleSVG)\n    } else if (\n      particleType.startsWith(\"http\") ||\n      particleType.startsWith(\"/\")\n    ) {\n      // Handle URL-based images\n      particle.innerHTML = `<img src=\"${particleType}\" width=\"${size}\" height=\"${size}\" style=\"border-radius: 50%\">`\n    } else {\n      // Handle emoji or text characters\n      const fontSizeMultiplier = 3 // Make emojis 3x bigger\n      const emojiSize = size * fontSizeMultiplier\n      particle.innerHTML = `<div style=\"font-size: ${emojiSize}px; line-height: 1; text-align: center; width: ${size}px; height: ${size}px; display: flex; align-items: center; justify-content: center; transform: scale(${fontSizeMultiplier}); transform-origin: center;\">${particleType}</div>`\n    }\n\n    particle.style.position = \"absolute\"\n    particle.style.transform = `translate3d(${left}px, ${top}px, 0px) rotate(${spinVal}deg)`\n\n    container.appendChild(particle)\n\n    particles.push({\n      direction,\n      element: particle,\n      left,\n      size,\n      speedHorz,\n      speedUp,\n      spinSpeed,\n      spinVal,\n      top,\n    })\n  }\n\n  function refreshParticles() {\n    particles.forEach((p) => {\n      p.left = p.left - p.speedHorz * p.direction\n      p.top = p.top - p.speedUp\n      p.speedUp = Math.min(p.size, p.speedUp - 1)\n      p.spinVal = p.spinVal + p.spinSpeed\n\n      if (\n        p.top >=\n        Math.max(window.innerHeight, document.body.clientHeight) + p.size\n      ) {\n        particles = particles.filter((o) => o !== p)\n        p.element.remove()\n      }\n\n      p.element.setAttribute(\n        \"style\",\n        [\n          \"position:absolute\",\n          \"will-change:transform\",\n          `top:${p.top}px`,\n          `left:${p.left}px`,\n          `transform:rotate(${p.spinVal}deg)`,\n        ].join(\";\")\n      )\n    })\n  }\n\n  let animationFrame: number | undefined\n\n  let lastParticleTimestamp = 0\n  const particleGenerationDelay = 30\n\n  function loop() {\n    const currentTime = performance.now()\n    if (\n      autoAddParticle &&\n      particles.length < limit &&\n      currentTime - lastParticleTimestamp > particleGenerationDelay\n    ) {\n      generateParticle()\n      lastParticleTimestamp = currentTime\n    }\n\n    refreshParticles()\n    animationFrame = requestAnimationFrame(loop)\n  }\n\n  loop()\n\n  const isTouchInteraction = \"ontouchstart\" in window\n\n  const tap = isTouchInteraction ? \"touchstart\" : \"mousedown\"\n  const tapEnd = isTouchInteraction ? \"touchend\" : \"mouseup\"\n  const move = isTouchInteraction ? \"touchmove\" : \"mousemove\"\n\n  const updateMousePosition = (e: MouseEvent | TouchEvent) => {\n    if (\"touches\" in e) {\n      mouseX = e.touches?.[0].clientX\n      mouseY = e.touches?.[0].clientY\n    } else {\n      mouseX = e.clientX\n      mouseY = e.clientY\n    }\n  }\n\n  const tapHandler = (e: MouseEvent | TouchEvent) => {\n    updateMousePosition(e)\n    autoAddParticle = true\n  }\n\n  const disableAutoAddParticle = () => {\n    autoAddParticle = false\n  }\n\n  element.addEventListener(move, updateMousePosition, { passive: true })\n  element.addEventListener(tap, tapHandler, { passive: true })\n  element.addEventListener(tapEnd, disableAutoAddParticle, { passive: true })\n  element.addEventListener(\"mouseleave\", disableAutoAddParticle, {\n    passive: true,\n  })\n\n  return () => {\n    element.removeEventListener(move, updateMousePosition)\n    element.removeEventListener(tap, tapHandler)\n    element.removeEventListener(tapEnd, disableAutoAddParticle)\n    element.removeEventListener(\"mouseleave\", disableAutoAddParticle)\n\n    const interval = setInterval(() => {\n      if (animationFrame && particles.length === 0) {\n        cancelAnimationFrame(animationFrame)\n        clearInterval(interval)\n\n        if (--instanceCounter === 0) {\n          container.remove()\n        }\n      }\n    }, 500)\n  }\n}\n\ninterface CoolModeProps {\n  children: ReactNode\n  options?: CoolParticleOptions\n}\n\nexport const CoolMode: React.FC<CoolModeProps> = ({ children, options }) => {\n  const ref = useRef<HTMLSpanElement>(null)\n\n  useEffect(() => {\n    const element = ref.current\n    let cleanup: (() => void) | null = null\n\n    if (element) {\n      cleanup = applyParticleEffect(element, options)\n    }\n\n    return () => {\n      if (cleanup) {\n        cleanup()\n      }\n    }\n  }, [options])\n\n  return <span ref={ref}>{children}</span>\n}\n\n\n===== EXAMPLE: cool-mode-demo =====\nTitle: Cool Mode Demo\n\n--- file: example/cool-mode-demo.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport { CoolMode } from \"@/registry/magicui/cool-mode\"\n\nexport default function CoolModeDemo() {\n  return (\n    <div className=\"relative justify-center\">\n      <CoolMode>\n        <Button>Click Me!</Button>\n      </CoolMode>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: cool-mode-custom =====\nTitle: Cool Mode Custom\n\n--- file: example/cool-mode-custom.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport { CoolMode } from \"@/registry/magicui/cool-mode\"\n\nexport default function CoolModeCustom() {\n  return (\n    <div className=\"relative justify-center\">\n      <CoolMode\n        options={{\n          particle:\n            \"https://pbs.twimg.com/profile_images/1782811051504885763/YR5-kWOI_400x400.jpg\",\n        }}\n      >\n        <Button>Click Me!</Button>\n      </CoolMode>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: dock =====\nTitle: Dock\nDescription: An implementation of the MacOS dock using react + tailwindcss + motion\n\n--- file: magicui/dock.tsx ---\n\"use client\"\n\nimport React, { PropsWithChildren, useRef } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport {\n  motion,\n  MotionValue,\n  useMotionValue,\n  useSpring,\n  useTransform,\n} from \"motion/react\"\nimport type { MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface DockProps extends VariantProps<typeof dockVariants> {\n  className?: string\n  iconSize?: number\n  iconMagnification?: number\n  disableMagnification?: boolean\n  iconDistance?: number\n  direction?: \"top\" | \"middle\" | \"bottom\"\n  children: React.ReactNode\n}\n\nconst DEFAULT_SIZE = 40\nconst DEFAULT_MAGNIFICATION = 60\nconst DEFAULT_DISTANCE = 140\nconst DEFAULT_DISABLEMAGNIFICATION = false\n\nconst dockVariants = cva(\n  \"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 mx-auto mt-8 flex h-[58px] w-max items-center justify-center gap-2 rounded-2xl border p-2 backdrop-blur-md\"\n)\n\nconst Dock = React.forwardRef<HTMLDivElement, DockProps>(\n  (\n    {\n      className,\n      children,\n      iconSize = DEFAULT_SIZE,\n      iconMagnification = DEFAULT_MAGNIFICATION,\n      disableMagnification = DEFAULT_DISABLEMAGNIFICATION,\n      iconDistance = DEFAULT_DISTANCE,\n      direction = \"middle\",\n      ...props\n    },\n    ref\n  ) => {\n    const mouseX = useMotionValue(Infinity)\n\n    const renderChildren = () => {\n      return React.Children.map(children, (child) => {\n        if (\n          React.isValidElement<DockIconProps>(child) &&\n          child.type === DockIcon\n        ) {\n          return React.cloneElement(child, {\n            ...child.props,\n            mouseX: mouseX,\n            size: iconSize,\n            magnification: iconMagnification,\n            disableMagnification: disableMagnification,\n            distance: iconDistance,\n          })\n        }\n        return child\n      })\n    }\n\n    return (\n      <motion.div\n        ref={ref}\n        onMouseMove={(e) => mouseX.set(e.pageX)}\n        onMouseLeave={() => mouseX.set(Infinity)}\n        {...props}\n        className={cn(dockVariants({ className }), {\n          \"items-start\": direction === \"top\",\n          \"items-center\": direction === \"middle\",\n          \"items-end\": direction === \"bottom\",\n        })}\n      >\n        {renderChildren()}\n      </motion.div>\n    )\n  }\n)\n\nDock.displayName = \"Dock\"\n\nexport interface DockIconProps extends Omit<\n  MotionProps & React.HTMLAttributes<HTMLDivElement>,\n  \"children\"\n> {\n  size?: number\n  magnification?: number\n  disableMagnification?: boolean\n  distance?: number\n  mouseX?: MotionValue<number>\n  className?: string\n  children?: React.ReactNode\n  props?: PropsWithChildren\n}\n\nconst DockIcon = ({\n  size = DEFAULT_SIZE,\n  magnification = DEFAULT_MAGNIFICATION,\n  disableMagnification,\n  distance = DEFAULT_DISTANCE,\n  mouseX,\n  className,\n  children,\n  ...props\n}: DockIconProps) => {\n  const ref = useRef<HTMLDivElement>(null)\n  const padding = Math.max(6, size * 0.2)\n  const defaultMouseX = useMotionValue(Infinity)\n\n  const distanceCalc = useTransform(mouseX ?? defaultMouseX, (val: number) => {\n    const bounds = ref.current?.getBoundingClientRect() ?? { x: 0, width: 0 }\n    return val - bounds.x - bounds.width / 2\n  })\n\n  const targetSize = disableMagnification ? size : magnification\n\n  const sizeTransform = useTransform(\n    distanceCalc,\n    [-distance, 0, distance],\n    [size, targetSize, size]\n  )\n\n  const scaleSize = useSpring(sizeTransform, {\n    mass: 0.1,\n    stiffness: 150,\n    damping: 12,\n  })\n\n  return (\n    <motion.div\n      ref={ref}\n      style={{ width: scaleSize, height: scaleSize, padding }}\n      className={cn(\n        \"flex aspect-square cursor-pointer items-center justify-center rounded-full\",\n        disableMagnification && \"hover:bg-muted-foreground transition-colors\",\n        className\n      )}\n      {...props}\n    >\n      <div>{children}</div>\n    </motion.div>\n  )\n}\n\nDockIcon.displayName = \"DockIcon\"\n\nexport { Dock, DockIcon, dockVariants }\n\n\n===== EXAMPLE: dock-demo =====\nTitle: Dock Demo\n\n--- file: example/dock-demo.tsx ---\n\"use client\"\n\nimport React from \"react\"\nimport Link from \"next/link\"\nimport { CalendarIcon, HomeIcon, MailIcon, PencilIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nconst Icons = {\n  calendar: (props: IconProps) => <CalendarIcon {...props} />,\n  email: (props: IconProps) => <MailIcon {...props} />,\n  linkedin: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <title>LinkedIn</title>\n      <path\n        fill=\"currentColor\"\n        d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"\n      />\n    </svg>\n  ),\n  x: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <title>X</title>\n      <path\n        fill=\"currentColor\"\n        d=\"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\"\n      />\n    </svg>\n  ),\n  youtube: (props: IconProps) => (\n    <svg\n      width=\"32px\"\n      height=\"32px\"\n      viewBox=\"0 0 32 32\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <title>youtube</title>\n      <path d=\"M29.41,9.26a3.5,3.5,0,0,0-2.47-2.47C24.76,6.2,16,6.2,16,6.2s-8.76,0-10.94.59A3.5,3.5,0,0,0,2.59,9.26,36.13,36.13,0,0,0,2,16a36.13,36.13,0,0,0,.59,6.74,3.5,3.5,0,0,0,2.47,2.47C7.24,25.8,16,25.8,16,25.8s8.76,0,10.94-.59a3.5,3.5,0,0,0,2.47-2.47A36.13,36.13,0,0,0,30,16,36.13,36.13,0,0,0,29.41,9.26ZM13.2,20.2V11.8L20.47,16Z\" />\n    </svg>\n  ),\n  github: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n}\n\nconst DATA = {\n  navbar: [\n    { href: \"#\", icon: HomeIcon, label: \"Home\" },\n    { href: \"#\", icon: PencilIcon, label: \"Blog\" },\n  ],\n  contact: {\n    social: {\n      GitHub: {\n        name: \"GitHub\",\n        url: \"#\",\n        icon: Icons.github,\n      },\n      LinkedIn: {\n        name: \"LinkedIn\",\n        url: \"#\",\n        icon: Icons.linkedin,\n      },\n      X: {\n        name: \"X\",\n        url: \"#\",\n        icon: Icons.x,\n      },\n      email: {\n        name: \"Send Email\",\n        url: \"#\",\n        icon: Icons.email,\n      },\n    },\n  },\n}\n\nexport default function DockDemo() {\n  return (\n    <div className=\"flex flex-col items-center justify-center\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Dock\n      </span>\n      <TooltipProvider>\n        <Dock direction=\"middle\">\n          {DATA.navbar.map((item) => (\n            <DockIcon key={item.label}>\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Link\n                    href={item.href}\n                    aria-label={item.label}\n                    className={cn(\n                      buttonVariants({ variant: \"ghost\", size: \"icon\" }),\n                      \"size-12 rounded-full\"\n                    )}\n                  >\n                    <item.icon className=\"size-4\" />\n                  </Link>\n                </TooltipTrigger>\n                <TooltipContent>\n                  <p>{item.label}</p>\n                </TooltipContent>\n              </Tooltip>\n            </DockIcon>\n          ))}\n          <Separator orientation=\"vertical\" className=\"h-full\" />\n          {Object.entries(DATA.contact.social).map(([name, social]) => (\n            <DockIcon key={name}>\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Link\n                    href={social.url}\n                    aria-label={social.name}\n                    className={cn(\n                      buttonVariants({ variant: \"ghost\", size: \"icon\" }),\n                      \"size-12 rounded-full\"\n                    )}\n                  >\n                    <social.icon className=\"size-4\" />\n                  </Link>\n                </TooltipTrigger>\n                <TooltipContent>\n                  <p>{name}</p>\n                </TooltipContent>\n              </Tooltip>\n            </DockIcon>\n          ))}\n        </Dock>\n      </TooltipProvider>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: dock-demo-2 =====\nTitle: Dock Demo 2\n\n--- file: example/dock-demo-2.tsx ---\n\"use client\"\n\nimport React from \"react\"\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nexport default function DockDemo() {\n  return (\n    <div className=\"relative\">\n      <Dock direction=\"middle\">\n        <DockIcon>\n          <Icons.gitHub className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.googleDrive className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.notion className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.whatsapp className=\"size-6\" />\n        </DockIcon>\n      </Dock>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n  notion: (props: IconProps) => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#fff\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000\"\n      />\n    </svg>\n  ),\n  googleDrive: (props: IconProps) => (\n    <svg viewBox=\"0 0 87.3 78\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 175.216 175.552\"\n      {...props}\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        fill=\"#b3b3b3\"\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        filter=\"url(#a)\"\n      />\n      <path\n        fill=\"#fff\"\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n      />\n      <path\n        fill=\"url(#linearGradient1780)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n      />\n      <path\n        fill=\"url(#b)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n      />\n      <path\n        fill=\"#fff\"\n        fillRule=\"evenodd\"\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n      />\n    </svg>\n  ),\n}\n\n\n===== EXAMPLE: dock-demo-3 =====\nTitle: Dock Demo 3\n\n--- file: example/dock-demo-3.tsx ---\n\"use client\"\n\nimport React from \"react\"\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nexport default function DockDemo() {\n  return (\n    <div className=\"relative\">\n      <Dock iconMagnification={60} iconDistance={100}>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.gitHub className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.googleDrive className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.notion className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.whatsapp className=\"size-full\" />\n        </DockIcon>\n      </Dock>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n  notion: (props: IconProps) => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#fff\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000\"\n      />\n    </svg>\n  ),\n  googleDrive: (props: IconProps) => (\n    <svg viewBox=\"0 0 87.3 78\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 175.216 175.552\"\n      {...props}\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        fill=\"#b3b3b3\"\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        filter=\"url(#a)\"\n      />\n      <path\n        fill=\"#fff\"\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n      />\n      <path\n        fill=\"url(#linearGradient1780)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n      />\n      <path\n        fill=\"url(#b)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n      />\n      <path\n        fill=\"#fff\"\n        fillRule=\"evenodd\"\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n      />\n    </svg>\n  ),\n}\n\n\n\n===== COMPONENT: dot-pattern =====\nTitle: Dot Pattern\nDescription: A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/dot-pattern.tsx ---\n\"use client\"\n\nimport React, { useEffect, useId, useRef, useState } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n *  DotPattern Component Props\n *\n * @param {number} [width=16] - The horizontal spacing between dots\n * @param {number} [height=16] - The vertical spacing between dots\n * @param {number} [x=0] - The x-offset of the entire pattern\n * @param {number} [y=0] - The y-offset of the entire pattern\n * @param {number} [cx=1] - The x-offset of individual dots\n * @param {number} [cy=1] - The y-offset of individual dots\n * @param {number} [cr=1] - The radius of each dot\n * @param {string} [className] - Additional CSS classes to apply to the SVG container\n * @param {boolean} [glow=false] - Whether dots should have a glowing animation effect\n */\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  cx?: number\n  cy?: number\n  cr?: number\n  className?: string\n  glow?: boolean\n  [key: string]: unknown\n}\n\n/**\n * DotPattern Component\n *\n * A React component that creates an animated or static dot pattern background using SVG.\n * The pattern automatically adjusts to fill its container and can optionally display glowing dots.\n *\n * @component\n *\n * @see DotPatternProps for the props interface.\n *\n * @example\n * // Basic usage\n * <DotPattern />\n *\n * // With glowing effect and custom spacing\n * <DotPattern\n *   width={20}\n *   height={20}\n *   glow={true}\n *   className=\"opacity-50\"\n * />\n *\n * @notes\n * - The component is client-side only (\"use client\")\n * - Automatically responds to container size changes\n * - When glow is enabled, dots will animate with random delays and durations\n * - Uses Motion for animations\n * - Dots color can be controlled via the text color utility classes\n */\n\nexport function DotPattern({\n  width = 16,\n  height = 16,\n  x = 0,\n  y = 0,\n  cx = 1,\n  cy = 1,\n  cr = 1,\n  className,\n  glow = false,\n  ...props\n}: DotPatternProps) {\n  const id = useId()\n  const containerRef = useRef<SVGSVGElement>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n  useEffect(() => {\n    const updateDimensions = () => {\n      if (containerRef.current) {\n        const { width, height } = containerRef.current.getBoundingClientRect()\n        setDimensions({ width, height })\n      }\n    }\n\n    updateDimensions()\n    window.addEventListener(\"resize\", updateDimensions)\n    return () => window.removeEventListener(\"resize\", updateDimensions)\n  }, [])\n\n  const dots = Array.from(\n    {\n      length:\n        Math.ceil(dimensions.width / width) *\n        Math.ceil(dimensions.height / height),\n    },\n    (_, i) => {\n      const col = i % Math.ceil(dimensions.width / width)\n      const row = Math.floor(i / Math.ceil(dimensions.width / width))\n      return {\n        x: col * width + cx + x,\n        y: row * height + cy + y,\n        delay: Math.random() * 5,\n        duration: Math.random() * 3 + 2,\n      }\n    }\n  )\n\n  return (\n    <svg\n      ref={containerRef}\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full text-neutral-400/80\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <radialGradient id={`${id}-gradient`}>\n          <stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity=\"1\" />\n          <stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n        </radialGradient>\n      </defs>\n      {dots.map((dot) => (\n        <motion.circle\n          key={`${dot.x}-${dot.y}`}\n          cx={dot.x}\n          cy={dot.y}\n          r={cr}\n          fill={glow ? `url(#${id}-gradient)` : \"currentColor\"}\n          initial={glow ? { opacity: 0.4, scale: 1 } : {}}\n          animate={\n            glow\n              ? {\n                  opacity: [0.4, 1, 0.4],\n                  scale: [1, 1.5, 1],\n                }\n              : {}\n          }\n          transition={\n            glow\n              ? {\n                  duration: dot.duration,\n                  repeat: Infinity,\n                  repeatType: \"reverse\",\n                  delay: dot.delay,\n                  ease: \"easeInOut\",\n                }\n              : {}\n          }\n        />\n      ))}\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: dot-pattern-demo =====\nTitle: Dot Pattern Demo\n\n--- file: example/dot-pattern-demo.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <DotPattern\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: dot-pattern-linear-gradient =====\nTitle: Dot Pattern Linear Gradient\n\n--- file: example/dot-pattern-linear-gradient.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternLinearGradient() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <DotPattern\n        width={20}\n        height={20}\n        cx={1}\n        cy={1}\n        cr={1}\n        className={cn(\n          \"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: dot-pattern-with-glow-effect =====\nTitle: Dot Pattern with glow effect\n\n--- file: example/dot-pattern-with-glow-effect.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternWithGlowEffectDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\">\n      <DotPattern\n        glow={true}\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: dotted-map =====\nTitle: Dotted Map\nDescription: A component with a dotted map.\n\n--- file: magicui/dotted-map.tsx ---\nimport * as React from \"react\"\nimport { createMap } from \"svg-dotted-map\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface Marker {\n  lat: number\n  lng: number\n  size?: number\n  pulse?: boolean\n}\n\n/** addMarkers returns markers with lat/lng removed; only x, y and other props (e.g. size) remain */\ntype MapMarker<M extends Marker> = Omit<M, \"lat\" | \"lng\"> & {\n  x: number\n  y: number\n}\n\nexport interface DottedMapProps<\n  M extends Marker = Marker,\n> extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  mapSamples?: number\n  markers?: M[]\n  dotColor?: string\n  markerColor?: string\n  dotRadius?: number\n  stagger?: boolean\n  pulse?: boolean\n\n  renderMarkerOverlay?: (args: {\n    marker: MapMarker<M>\n    index: number\n    x: number\n    y: number\n    r: number\n  }) => React.ReactNode\n}\n\nexport function DottedMap<M extends Marker = Marker>({\n  width = 150,\n  height = 75,\n  mapSamples = 5000,\n  markers = [],\n  dotColor = \"currentColor\",\n  markerColor = \"#FF6900\",\n  dotRadius = 0.2,\n  stagger = true,\n  pulse = false,\n  renderMarkerOverlay,\n  className,\n  style,\n  ...svgProps\n}: DottedMapProps<M>) {\n  const { points, addMarkers } = createMap({\n    width,\n    height,\n    mapSamples,\n  })\n  const processedMarkers = addMarkers(markers)\n\n  // Compute stagger helpers in a single, simple pass\n  const { xStep, yToRowIndex } = React.useMemo(() => {\n    const sorted = [...points].sort((a, b) => a.y - b.y || a.x - b.x)\n    const rowMap = new Map<number, number>()\n    let step = 0\n    let prevY = Number.NaN\n    let prevXInRow = Number.NaN\n\n    for (const p of sorted) {\n      if (p.y !== prevY) {\n        // new row\n        prevY = p.y\n        prevXInRow = Number.NaN\n        if (!rowMap.has(p.y)) rowMap.set(p.y, rowMap.size)\n      }\n      if (!Number.isNaN(prevXInRow)) {\n        const delta = p.x - prevXInRow\n        if (delta > 0) step = step === 0 ? delta : Math.min(step, delta)\n      }\n      prevXInRow = p.x\n    }\n\n    return { xStep: step || 1, yToRowIndex: rowMap }\n  }, [points])\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      className={cn(\"text-gray-500 dark:text-gray-500\", className)}\n      style={{ width: \"100%\", height: \"100%\", ...style }}\n      {...svgProps}\n    >\n      {points.map((point, index) => {\n        const rowIndex = yToRowIndex.get(point.y) ?? 0\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\n        return (\n          <circle\n            cx={point.x + offsetX}\n            cy={point.y}\n            r={dotRadius}\n            fill={dotColor}\n            key={`${point.x}-${point.y}-${index}`}\n          />\n        )\n      })}\n\n      {processedMarkers.map((marker, index) => {\n        const rowIndex = yToRowIndex.get(marker.y) ?? 0\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\n\n        const x = marker.x + offsetX\n        const y = marker.y\n        const r = marker.size ?? dotRadius\n        const shouldPulse = pulse\n          ? marker.pulse !== false\n          : marker.pulse === true\n        const pulseTo = r * 2.8\n\n        return (\n          <g key={`${marker.x}-${marker.y}-${index}`}>\n            <circle cx={x} cy={y} r={r} fill={markerColor} />\n\n            {shouldPulse ? (\n              <g pointerEvents=\"none\">\n                <circle\n                  cx={x}\n                  cy={y}\n                  r={r}\n                  fill=\"none\"\n                  stroke={markerColor}\n                  strokeOpacity={1}\n                  strokeWidth={0.35}\n                >\n                  <animate\n                    attributeName=\"r\"\n                    values={`${r};${pulseTo}`}\n                    dur=\"1.4s\"\n                    repeatCount=\"indefinite\"\n                  />\n                  <animate\n                    attributeName=\"opacity\"\n                    values=\"1;0\"\n                    dur=\"1.4s\"\n                    repeatCount=\"indefinite\"\n                  />\n                </circle>\n                <circle\n                  cx={x}\n                  cy={y}\n                  r={r}\n                  fill=\"none\"\n                  stroke={markerColor}\n                  strokeOpacity={0.9}\n                  strokeWidth={0.3}\n                >\n                  <animate\n                    attributeName=\"r\"\n                    values={`${r};${pulseTo}`}\n                    dur=\"1.4s\"\n                    begin=\"0.7s\"\n                    repeatCount=\"indefinite\"\n                  />\n                  <animate\n                    attributeName=\"opacity\"\n                    values=\"0.9;0\"\n                    dur=\"1.4s\"\n                    begin=\"0.7s\"\n                    repeatCount=\"indefinite\"\n                  />\n                </circle>\n              </g>\n            ) : null}\n\n            {renderMarkerOverlay?.({\n              marker: { ...marker, x, y },\n              index,\n              x,\n              y,\n              r,\n            })}\n          </g>\n        )\n      })}\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: dotted-map-demo =====\nTitle: Dotted Map Demo\n\n--- file: example/dotted-map-demo.tsx ---\nimport * as React from \"react\"\nimport type { TCountryCode } from \"countries-list\"\n\nimport { DottedMap } from \"@/registry/magicui/dotted-map\"\nimport type { Marker } from \"@/registry/magicui/dotted-map\"\n\ntype CountryCode = Lowercase<TCountryCode>\n\ntype MyMarker = Marker & {\n  overlay: {\n    countryCode: CountryCode\n    label: string\n  }\n}\n\nconst markers: MyMarker[] = [\n  {\n    lat: 37.5665,\n    lng: 126.978,\n    size: 2.8,\n    overlay: { countryCode: \"kr\", label: \"Seoul\" },\n  },\n  {\n    lat: 40.7128,\n    lng: -74.006,\n    size: 2.8,\n    overlay: { countryCode: \"us\", label: \"NYC\" },\n  },\n]\n\nexport default function Component() {\n  const id = React.useId()\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"to-background absolute inset-0 bg-radial from-transparent to-200%\" />\n      <DottedMap<MyMarker>\n        markers={markers}\n        renderMarkerOverlay={({ marker, x, y, r, index }) => {\n          const { countryCode, label } = marker.overlay\n          const href = `https://flagcdn.com/w80/${countryCode}.webp` // FlagCDN  [oai_citation:7‡Flagpedia](https://flagpedia.net/download/api)\n\n          const clipId = `${id}-flag-clip-${index}`.replace(/:/g, \"-\")\n          const imgR = r * 0.75\n\n          const fontSize = r * 0.9\n          const pillH = r * 1.5\n          const pillW = label.length * (fontSize * 0.62) + r * 1.4\n          const pillX = x + r + r * 0.6\n          const pillY = y - pillH / 2\n\n          return (\n            <g style={{ pointerEvents: \"none\" }}>\n              <clipPath id={clipId}>\n                <circle cx={x} cy={y} r={imgR} />\n              </clipPath>\n\n              <image\n                href={href}\n                x={x - imgR}\n                y={y - imgR}\n                width={imgR * 2}\n                height={imgR * 2}\n                preserveAspectRatio=\"xMidYMid slice\"\n                clipPath={`url(#${clipId})`}\n              />\n\n              <rect\n                x={pillX}\n                y={pillY}\n                width={pillW}\n                height={pillH}\n                rx={pillH / 2}\n                fill=\"rgba(0,0,0,0.55)\"\n              />\n              <text\n                x={pillX + r * 0.7}\n                y={y + fontSize * 0.35}\n                fontSize={fontSize}\n                fill=\"white\"\n              >\n                {label}\n              </text>\n            </g>\n          )\n        }}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: dotted-map-demo-2 =====\nTitle: Dotted Map Demo 2\n\n--- file: example/dotted-map-demo-2.tsx ---\nimport { DottedMap } from \"@/registry/magicui/dotted-map\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <DottedMap dotRadius={0.1} />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: dotted-map-demo-3 =====\nTitle: Dotted Map Demo 3\n\n--- file: example/dotted-map-demo-3.tsx ---\nimport { DottedMap } from \"@/registry/magicui/dotted-map\"\nimport type { Marker } from \"@/registry/magicui/dotted-map\"\n\nconst markers: Marker[] = [\n  {\n    lat: 37.5665,\n    lng: 126.978,\n    size: 0.3,\n  },\n  {\n    lat: 40.7128,\n    lng: -74.006,\n    size: 0.3,\n    pulse: false,\n  },\n]\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"to-background absolute inset-0 bg-radial from-transparent to-200%\" />\n      <DottedMap markers={markers} pulse />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: file-tree =====\nTitle: File Tree\nDescription: A component used to showcase the folder and file structure of a directory.\n\n--- file: magicui/file-tree.tsx ---\n\"use client\"\n\nimport React, {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { FileIcon, FolderIcon, FolderOpenIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\n\ntype TreeViewElement = {\n  id: string\n  name: string\n  type?: \"file\" | \"folder\"\n  isSelectable?: boolean\n  children?: TreeViewElement[]\n}\n\ntype TreeSortMode =\n  | \"default\"\n  | \"none\"\n  | ((a: TreeViewElement, b: TreeViewElement) => number)\n\ntype TreeContextProps = {\n  selectedId: string | undefined\n  expandedItems: string[] | undefined\n  indicator: boolean\n  handleExpand: (id: string) => void\n  selectItem: (id: string) => void\n  setExpandedItems?: React.Dispatch<React.SetStateAction<string[] | undefined>>\n  openIcon?: React.ReactNode\n  closeIcon?: React.ReactNode\n  direction: \"rtl\" | \"ltr\"\n}\n\nconst TreeContext = createContext<TreeContextProps | null>(null)\n\nconst useTree = () => {\n  const context = useContext(TreeContext)\n  if (!context) {\n    throw new Error(\"useTree must be used within a TreeProvider\")\n  }\n  return context\n}\n\ntype Direction = \"rtl\" | \"ltr\" | undefined\n\nconst isFolderElement = (element: TreeViewElement) => {\n  if (element.type) {\n    return element.type === \"folder\"\n  }\n\n  return Array.isArray(element.children)\n}\n\nconst mergeExpandedItems = (\n  currentItems: string[] | undefined,\n  nextItems: string[]\n) => [...new Set([...(currentItems ?? []), ...nextItems])]\n\nconst treeCollator = new Intl.Collator(\"en\", {\n  numeric: true,\n  sensitivity: \"base\",\n})\n\nconst defaultTreeComparator = (a: TreeViewElement, b: TreeViewElement) => {\n  const aIsFolder = isFolderElement(a)\n  const bIsFolder = isFolderElement(b)\n\n  if (aIsFolder !== bIsFolder) {\n    return aIsFolder ? -1 : 1\n  }\n\n  return treeCollator.compare(a.name, b.name)\n}\n\nconst getTreeComparator = (sort: TreeSortMode) => {\n  if (sort === \"none\") {\n    return undefined\n  }\n\n  if (sort === \"default\") {\n    return defaultTreeComparator\n  }\n\n  return sort\n}\n\nconst sortTreeElements = (\n  elements: TreeViewElement[],\n  sort: TreeSortMode\n): TreeViewElement[] => {\n  const comparator = getTreeComparator(sort)\n\n  const nextElements = elements.map((element) => {\n    if (!Array.isArray(element.children)) {\n      return element\n    }\n\n    return {\n      ...element,\n      children: sortTreeElements(element.children, sort),\n    }\n  })\n\n  if (!comparator) {\n    return nextElements\n  }\n\n  return [...nextElements].sort(comparator)\n}\n\nconst renderTreeElements = (\n  elements: TreeViewElement[],\n  sort: TreeSortMode\n): React.ReactNode =>\n  sortTreeElements(elements, sort).map((element) => {\n    if (isFolderElement(element)) {\n      return (\n        <Folder\n          key={element.id}\n          value={element.id}\n          element={element.name}\n          isSelectable={element.isSelectable}\n        >\n          {Array.isArray(element.children)\n            ? renderTreeElements(element.children, sort)\n            : null}\n        </Folder>\n      )\n    }\n\n    return (\n      <File\n        key={element.id}\n        value={element.id}\n        isSelectable={element.isSelectable}\n      >\n        <span>{element.name}</span>\n      </File>\n    )\n  })\n\ntype TreeViewProps = {\n  initialSelectedId?: string\n  indicator?: boolean\n  elements?: TreeViewElement[]\n  initialExpandedItems?: string[]\n  openIcon?: React.ReactNode\n  closeIcon?: React.ReactNode\n  sort?: TreeSortMode\n} & Omit<\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n  \"defaultValue\" | \"onValueChange\" | \"type\" | \"value\"\n>\n\nconst Tree = forwardRef<HTMLDivElement, TreeViewProps>(\n  (\n    {\n      className,\n      elements,\n      initialSelectedId,\n      initialExpandedItems,\n      children,\n      indicator = true,\n      openIcon,\n      closeIcon,\n      sort = \"default\",\n      dir,\n      ...props\n    },\n    ref\n  ) => {\n    const [selectedId, setSelectedId] = useState<string | undefined>(\n      initialSelectedId\n    )\n    const [expandedItems, setExpandedItems] = useState<string[] | undefined>(\n      initialExpandedItems\n    )\n\n    const selectItem = useCallback((id: string) => {\n      setSelectedId(id)\n    }, [])\n\n    const handleExpand = useCallback((id: string) => {\n      setExpandedItems((prev) => {\n        if (prev?.includes(id)) {\n          return prev.filter((item) => item !== id)\n        }\n        return [...(prev ?? []), id]\n      })\n    }, [])\n\n    const expandSpecificTargetedElements = useCallback(\n      (elements?: TreeViewElement[], selectId?: string) => {\n        if (!elements || !selectId) return\n        const findParent = (\n          currentElement: TreeViewElement,\n          currentPath: string[] = []\n        ) => {\n          const isSelectable = currentElement.isSelectable ?? true\n          const newPath = [...currentPath, currentElement.id]\n          if (currentElement.id === selectId) {\n            if (isSelectable) {\n              setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\n            } else {\n              if (newPath.includes(currentElement.id)) {\n                newPath.pop()\n                setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\n              }\n            }\n            return\n          }\n          if (\n            Array.isArray(currentElement.children) &&\n            currentElement.children.length > 0\n          ) {\n            currentElement.children.forEach((child) => {\n              findParent(child, newPath)\n            })\n          }\n        }\n        elements.forEach((element) => {\n          findParent(element)\n        })\n      },\n      []\n    )\n\n    useEffect(() => {\n      if (initialSelectedId) {\n        expandSpecificTargetedElements(elements, initialSelectedId)\n      }\n    }, [initialSelectedId, elements, expandSpecificTargetedElements])\n\n    const direction = dir === \"rtl\" ? \"rtl\" : \"ltr\"\n    const treeChildren =\n      children ?? (elements ? renderTreeElements(elements, sort) : null)\n\n    return (\n      <TreeContext.Provider\n        value={{\n          selectedId,\n          expandedItems,\n          handleExpand,\n          selectItem,\n          setExpandedItems,\n          indicator,\n          openIcon,\n          closeIcon,\n          direction,\n        }}\n      >\n        <div className={cn(\"size-full\", className)}>\n          <ScrollArea\n            ref={ref}\n            className=\"relative h-full px-2\"\n            dir={dir as Direction}\n          >\n            <AccordionPrimitive.Root\n              {...props}\n              type=\"multiple\"\n              value={expandedItems}\n              className=\"flex flex-col gap-1\"\n              dir={dir as Direction}\n            >\n              {treeChildren}\n            </AccordionPrimitive.Root>\n          </ScrollArea>\n        </div>\n      </TreeContext.Provider>\n    )\n  }\n)\n\nTree.displayName = \"Tree\"\n\nconst TreeIndicator = forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { direction } = useTree()\n\n  return (\n    <div\n      dir={direction}\n      ref={ref}\n      className={cn(\n        \"bg-muted absolute left-1.5 h-full w-px rounded-md py-3 duration-300 ease-in-out hover:bg-slate-300 rtl:right-1.5\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\n\nTreeIndicator.displayName = \"TreeIndicator\"\n\ntype FolderProps = {\n  expandedItems?: string[]\n  element: string\n  isSelectable?: boolean\n  isSelect?: boolean\n} & React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n\nconst Folder = forwardRef<\n  HTMLDivElement,\n  FolderProps & React.HTMLAttributes<HTMLDivElement>\n>(\n  (\n    {\n      className,\n      element,\n      value,\n      isSelectable = true,\n      isSelect,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const {\n      direction,\n      handleExpand,\n      expandedItems,\n      indicator,\n      selectedId,\n      selectItem,\n      openIcon,\n      closeIcon,\n    } = useTree()\n    const isSelected = isSelect ?? selectedId === value\n\n    return (\n      <AccordionPrimitive.Item\n        ref={ref}\n        {...props}\n        value={value}\n        className=\"relative h-full overflow-hidden\"\n      >\n        <AccordionPrimitive.Trigger\n          className={cn(\n            `flex items-center gap-1 rounded-md text-sm`,\n            className,\n            {\n              \"bg-muted rounded-md\": isSelected && isSelectable,\n              \"cursor-pointer\": isSelectable,\n              \"cursor-not-allowed opacity-50\": !isSelectable,\n            }\n          )}\n          disabled={!isSelectable}\n          onClick={() => {\n            selectItem(value)\n            handleExpand(value)\n          }}\n        >\n          {expandedItems?.includes(value)\n            ? (openIcon ?? <FolderOpenIcon className=\"size-4\" />)\n            : (closeIcon ?? <FolderIcon className=\"size-4\" />)}\n          <span>{element}</span>\n        </AccordionPrimitive.Trigger>\n        <AccordionPrimitive.Content className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down relative h-full overflow-hidden text-sm\">\n          {element && indicator && <TreeIndicator aria-hidden=\"true\" />}\n          <AccordionPrimitive.Root\n            dir={direction}\n            type=\"multiple\"\n            className=\"ml-5 flex flex-col gap-1 py-1 rtl:mr-5\"\n            value={expandedItems}\n          >\n            {children}\n          </AccordionPrimitive.Root>\n        </AccordionPrimitive.Content>\n      </AccordionPrimitive.Item>\n    )\n  }\n)\n\nFolder.displayName = \"Folder\"\n\nconst File = forwardRef<\n  HTMLButtonElement,\n  {\n    value: string\n    handleSelect?: (id: string) => void\n    isSelectable?: boolean\n    isSelect?: boolean\n    fileIcon?: React.ReactNode\n  } & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(\n  (\n    {\n      value,\n      className,\n      handleSelect,\n      onClick,\n      isSelectable = true,\n      isSelect,\n      fileIcon,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const { direction, selectedId, selectItem } = useTree()\n    const isSelected = isSelect ?? selectedId === value\n    return (\n      <button\n        ref={ref}\n        type=\"button\"\n        disabled={!isSelectable}\n        className={cn(\n          \"flex w-fit items-center gap-1 rounded-md pr-1 text-sm duration-200 ease-in-out rtl:pr-0 rtl:pl-1\",\n          {\n            \"bg-muted\": isSelected && isSelectable,\n          },\n          isSelectable ? \"cursor-pointer\" : \"cursor-not-allowed opacity-50\",\n          direction === \"rtl\" ? \"rtl\" : \"ltr\",\n          className\n        )}\n        onClick={(event) => {\n          selectItem(value)\n          handleSelect?.(value)\n          onClick?.(event)\n        }}\n        {...props}\n      >\n        {fileIcon ?? <FileIcon className=\"size-4\" />}\n        {children}\n      </button>\n    )\n  }\n)\n\nFile.displayName = \"File\"\n\nconst CollapseButton = forwardRef<\n  HTMLButtonElement,\n  {\n    elements: TreeViewElement[]\n    expandAll?: boolean\n  } & React.HTMLAttributes<HTMLButtonElement>\n>(({ className, elements, expandAll = false, children, ...props }, ref) => {\n  const { expandedItems, setExpandedItems } = useTree()\n\n  const expendAllTree = useCallback((elements: TreeViewElement[]) => {\n    const expandedElementIds: string[] = []\n\n    const expandTree = (element: TreeViewElement) => {\n      const isSelectable = element.isSelectable ?? true\n      if (isSelectable && element.children && element.children.length > 0) {\n        expandedElementIds.push(element.id)\n        for (const child of element.children) {\n          expandTree(child)\n        }\n      }\n    }\n\n    for (const element of elements) {\n      expandTree(element)\n    }\n\n    return [...new Set(expandedElementIds)]\n  }, [])\n\n  const closeAll = useCallback(() => {\n    setExpandedItems?.([])\n  }, [setExpandedItems])\n\n  useEffect(() => {\n    if (expandAll) {\n      setExpandedItems?.(expendAllTree(elements))\n    }\n  }, [expandAll, elements, expendAllTree, setExpandedItems])\n\n  return (\n    <Button\n      variant={\"ghost\"}\n      className={cn(\"absolute right-2 bottom-1 h-8 w-fit p-1\", className)}\n      onClick={\n        expandedItems && expandedItems.length > 0\n          ? closeAll\n          : () => setExpandedItems?.(expendAllTree(elements))\n      }\n      ref={ref}\n      {...props}\n    >\n      {children}\n      <span className=\"sr-only\">Toggle</span>\n    </Button>\n  )\n})\n\nCollapseButton.displayName = \"CollapseButton\"\n\nexport { CollapseButton, File, Folder, Tree, type TreeViewElement }\nexport type { TreeSortMode }\n\n\n===== EXAMPLE: file-tree-demo =====\nTitle: File Tree Demo\n\n--- file: example/file-tree-demo.tsx ---\nimport { Tree } from \"@/registry/magicui/file-tree\"\nimport type { TreeViewElement } from \"@/registry/magicui/file-tree\"\n\nexport default function FileTreeDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[300px] w-full max-w-sm flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <Tree\n        className=\"bg-background overflow-hidden rounded-md p-2\"\n        initialSelectedId=\"button\"\n        initialExpandedItems={[\"src\", \"app\", \"components\", \"ui\", \"lib\"]}\n        elements={ELEMENTS}\n      />\n    </div>\n  )\n}\n\nconst ELEMENTS: TreeViewElement[] = [\n  {\n    id: \"src\",\n    type: \"folder\",\n    isSelectable: true,\n    name: \"src\",\n    children: [\n      {\n        id: \"lib\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"lib\",\n        children: [\n          {\n            id: \"utils\",\n            isSelectable: true,\n            name: \"utils.ts\",\n          },\n        ],\n      },\n      {\n        id: \"app\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"app\",\n        children: [\n          {\n            id: \"page\",\n            isSelectable: true,\n            name: \"page.tsx\",\n          },\n          {\n            id: \"layout\",\n            isSelectable: true,\n            name: \"layout.tsx\",\n          },\n        ],\n      },\n      {\n        id: \"components\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"components\",\n        children: [\n          {\n            id: \"header\",\n            isSelectable: true,\n            name: \"header.tsx\",\n          },\n          {\n            id: \"ui\",\n            type: \"folder\",\n            isSelectable: true,\n            name: \"ui\",\n            children: [\n              {\n                id: \"button\",\n                isSelectable: true,\n                name: \"button.tsx\",\n              },\n            ],\n          },\n          {\n            id: \"footer\",\n            isSelectable: true,\n            name: \"footer.tsx\",\n          },\n        ],\n      },\n    ],\n  },\n]\n\n\n\n===== COMPONENT: flickering-grid =====\nTitle: Flickering Grid\nDescription: A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/flickering-grid.tsx ---\n\"use client\"\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface FlickeringGridProps extends React.HTMLAttributes<HTMLDivElement> {\n  squareSize?: number\n  gridGap?: number\n  flickerChance?: number\n  color?: string\n  width?: number\n  height?: number\n  className?: string\n  maxOpacity?: number\n}\n\nexport const FlickeringGrid: React.FC<FlickeringGridProps> = ({\n  squareSize = 4,\n  gridGap = 6,\n  flickerChance = 0.3,\n  color = \"rgb(0, 0, 0)\",\n  width,\n  height,\n  className,\n  maxOpacity = 0.3,\n  ...props\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [isInView, setIsInView] = useState(false)\n  const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0 })\n\n  const memoizedColor = useMemo(() => {\n    const toRGBA = (color: string) => {\n      if (typeof window === \"undefined\") {\n        return `rgba(0, 0, 0,`\n      }\n      const canvas = document.createElement(\"canvas\")\n      canvas.width = canvas.height = 1\n      const ctx = canvas.getContext(\"2d\")\n      if (!ctx) return \"rgba(255, 0, 0,\"\n      ctx.fillStyle = color\n      ctx.fillRect(0, 0, 1, 1)\n      const [r, g, b] = Array.from(ctx.getImageData(0, 0, 1, 1).data)\n      return `rgba(${r}, ${g}, ${b},`\n    }\n    return toRGBA(color)\n  }, [color])\n\n  const setupCanvas = useCallback(\n    (canvas: HTMLCanvasElement, width: number, height: number) => {\n      const dpr = window.devicePixelRatio || 1\n      canvas.width = width * dpr\n      canvas.height = height * dpr\n      canvas.style.width = `${width}px`\n      canvas.style.height = `${height}px`\n      const cols = Math.ceil(width / (squareSize + gridGap))\n      const rows = Math.ceil(height / (squareSize + gridGap))\n\n      const squares = new Float32Array(cols * rows)\n      for (let i = 0; i < squares.length; i++) {\n        squares[i] = Math.random() * maxOpacity\n      }\n\n      return { cols, rows, squares, dpr }\n    },\n    [squareSize, gridGap, maxOpacity]\n  )\n\n  const updateSquares = useCallback(\n    (squares: Float32Array, deltaTime: number) => {\n      for (let i = 0; i < squares.length; i++) {\n        if (Math.random() < flickerChance * deltaTime) {\n          squares[i] = Math.random() * maxOpacity\n        }\n      }\n    },\n    [flickerChance, maxOpacity]\n  )\n\n  const drawGrid = useCallback(\n    (\n      ctx: CanvasRenderingContext2D,\n      width: number,\n      height: number,\n      cols: number,\n      rows: number,\n      squares: Float32Array,\n      dpr: number\n    ) => {\n      ctx.clearRect(0, 0, width, height)\n      ctx.fillStyle = \"transparent\"\n      ctx.fillRect(0, 0, width, height)\n\n      for (let i = 0; i < cols; i++) {\n        for (let j = 0; j < rows; j++) {\n          const opacity = squares[i * rows + j]\n          ctx.fillStyle = `${memoizedColor}${opacity})`\n          ctx.fillRect(\n            i * (squareSize + gridGap) * dpr,\n            j * (squareSize + gridGap) * dpr,\n            squareSize * dpr,\n            squareSize * dpr\n          )\n        }\n      }\n    },\n    [memoizedColor, squareSize, gridGap]\n  )\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const container = containerRef.current\n    const ctx = canvas?.getContext(\"2d\") ?? null\n    let animationFrameId: number | null = null\n    let resizeObserver: ResizeObserver | null = null\n    let intersectionObserver: IntersectionObserver | null = null\n    let gridParams: ReturnType<typeof setupCanvas> | null = null\n\n    if (canvas && container && ctx) {\n      const updateCanvasSize = () => {\n        const newWidth = width || container.clientWidth\n        const newHeight = height || container.clientHeight\n        setCanvasSize({ width: newWidth, height: newHeight })\n        gridParams = setupCanvas(canvas, newWidth, newHeight)\n      }\n\n      updateCanvasSize()\n\n      let lastTime = 0\n      const animate = (time: number) => {\n        if (!isInView || !gridParams) return\n\n        const deltaTime = (time - lastTime) / 1000\n        lastTime = time\n\n        updateSquares(gridParams.squares, deltaTime)\n        drawGrid(\n          ctx,\n          canvas.width,\n          canvas.height,\n          gridParams.cols,\n          gridParams.rows,\n          gridParams.squares,\n          gridParams.dpr\n        )\n        animationFrameId = requestAnimationFrame(animate)\n      }\n\n      resizeObserver = new ResizeObserver(() => {\n        updateCanvasSize()\n      })\n      resizeObserver.observe(container)\n\n      intersectionObserver = new IntersectionObserver(\n        ([entry]) => {\n          setIsInView(entry.isIntersecting)\n        },\n        { threshold: 0 }\n      )\n      intersectionObserver.observe(canvas)\n\n      if (isInView) {\n        animationFrameId = requestAnimationFrame(animate)\n      }\n    }\n\n    return () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n      }\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n      if (intersectionObserver) {\n        intersectionObserver.disconnect()\n      }\n    }\n  }, [setupCanvas, updateSquares, drawGrid, width, height, isInView])\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(`h-full w-full ${className}`)}\n      {...props}\n    >\n      <canvas\n        ref={canvasRef}\n        className=\"pointer-events-none\"\n        style={{\n          width: canvasSize.width,\n          height: canvasSize.height,\n        }}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: flickering-grid-demo =====\nTitle: Flickering Grid Demo\n\n--- file: example/flickering-grid-demo.tsx ---\nimport { FlickeringGrid } from \"@/registry/magicui/flickering-grid\"\n\nexport default function FlickeringGridDemo() {\n  return (\n    <div className=\"bg-background relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <FlickeringGrid\n        className=\"absolute inset-0 z-0 size-full\"\n        squareSize={4}\n        gridGap={6}\n        color=\"#6B7280\"\n        maxOpacity={0.5}\n        flickerChance={0.1}\n        height={800}\n        width={800}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: flickering-grid-rounded-demo =====\nTitle: Flickering Grid Rounded Demo\n\n--- file: example/flickering-grid-rounded-demo.tsx ---\nimport { FlickeringGrid } from \"@/registry/magicui/flickering-grid\"\n\nexport default function FlickeringGridRoundedDemo() {\n  return (\n    <div className=\"bg-background relative size-[600px] w-full overflow-hidden rounded-lg border\">\n      <FlickeringGrid\n        className=\"relative inset-0 z-0 [mask-image:radial-gradient(450px_circle_at_center,white,transparent)]\"\n        squareSize={4}\n        gridGap={6}\n        color=\"#60A5FA\"\n        maxOpacity={0.5}\n        flickerChance={0.1}\n        height={800}\n        width={800}\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: globe =====\nTitle: Globe\nDescription: An autorotating, interactive, and highly performant globe made using WebGL.\n\n--- file: magicui/globe.tsx ---\n\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport createGlobe, { type COBEOptions } from \"cobe\"\nimport { useMotionValue, useSpring } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst MOVEMENT_DAMPING = 1400\n\nconst GLOBE_CONFIG: COBEOptions = {\n  width: 800,\n  height: 800,\n  onRender: () => {},\n  devicePixelRatio: 2,\n  phi: 0,\n  theta: 0.3,\n  dark: 0,\n  diffuse: 0.4,\n  mapSamples: 16000,\n  mapBrightness: 1.2,\n  baseColor: [1, 1, 1],\n  markerColor: [251 / 255, 100 / 255, 21 / 255],\n  glowColor: [1, 1, 1],\n  markers: [\n    { location: [14.5995, 120.9842], size: 0.03 },\n    { location: [19.076, 72.8777], size: 0.1 },\n    { location: [23.8103, 90.4125], size: 0.05 },\n    { location: [30.0444, 31.2357], size: 0.07 },\n    { location: [39.9042, 116.4074], size: 0.08 },\n    { location: [-23.5505, -46.6333], size: 0.1 },\n    { location: [19.4326, -99.1332], size: 0.1 },\n    { location: [40.7128, -74.006], size: 0.1 },\n    { location: [34.6937, 135.5022], size: 0.05 },\n    { location: [41.0082, 28.9784], size: 0.06 },\n  ],\n}\n\nexport function Globe({\n  className,\n  config = GLOBE_CONFIG,\n}: {\n  className?: string\n  config?: COBEOptions\n}) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const phiRef = useRef(0)\n  const widthRef = useRef(0)\n  const pointerInteracting = useRef<number | null>(null)\n  const pointerInteractionMovement = useRef(0)\n\n  const r = useMotionValue(0)\n  const rs = useSpring(r, {\n    mass: 1,\n    damping: 30,\n    stiffness: 100,\n  })\n\n  const updatePointerInteraction = (value: number | null) => {\n    pointerInteracting.current = value\n    if (canvasRef.current) {\n      canvasRef.current.style.cursor = value !== null ? \"grabbing\" : \"grab\"\n    }\n  }\n\n  const updateMovement = (clientX: number) => {\n    if (pointerInteracting.current !== null) {\n      const delta = clientX - pointerInteracting.current\n      pointerInteractionMovement.current = delta\n      r.set(r.get() + delta / MOVEMENT_DAMPING)\n    }\n  }\n\n  useEffect(() => {\n    const onResize = () => {\n      if (canvasRef.current) {\n        widthRef.current = canvasRef.current.offsetWidth\n      }\n    }\n\n    window.addEventListener(\"resize\", onResize)\n    onResize()\n\n    const globe = createGlobe(canvasRef.current!, {\n      ...config,\n      width: widthRef.current * 2,\n      height: widthRef.current * 2,\n      onRender: (state) => {\n        if (!pointerInteracting.current) phiRef.current += 0.005\n        state.phi = phiRef.current + rs.get()\n        state.width = widthRef.current * 2\n        state.height = widthRef.current * 2\n      },\n    })\n\n    setTimeout(() => (canvasRef.current!.style.opacity = \"1\"), 0)\n    return () => {\n      globe.destroy()\n      window.removeEventListener(\"resize\", onResize)\n    }\n  }, [rs, config])\n\n  return (\n    <div\n      className={cn(\n        \"absolute inset-0 mx-auto aspect-square w-full max-w-150\",\n        className\n      )}\n    >\n      <canvas\n        className={cn(\n          \"size-full opacity-0 transition-opacity duration-500 contain-[layout_paint_size]\"\n        )}\n        ref={canvasRef}\n        onPointerDown={(e) => {\n          pointerInteracting.current = e.clientX\n          updatePointerInteraction(e.clientX)\n        }}\n        onPointerUp={() => updatePointerInteraction(null)}\n        onPointerOut={() => updatePointerInteraction(null)}\n        onMouseMove={(e) => updateMovement(e.clientX)}\n        onTouchMove={(e) =>\n          e.touches[0] && updateMovement(e.touches[0].clientX)\n        }\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: globe-demo =====\nTitle: Globe Demo\n\n--- file: example/globe-demo.tsx ---\nimport { Globe } from \"@/registry/magicui/globe\"\n\nexport default function GlobeDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border px-40 pt-8 pb-40 md:pb-60\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Globe\n      </span>\n      <Globe className=\"top-28\" />\n      <div className=\"pointer-events-none absolute inset-0 h-full bg-[radial-gradient(circle_at_50%_200%,rgba(0,0,0,0.2),rgba(255,255,255,0))]\" />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: grid-pattern =====\nTitle: Grid Pattern\nDescription: A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/grid-pattern.tsx ---\nimport { useId } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface GridPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  squares?: Array<[x: number, y: number]>\n  strokeDasharray?: string\n  className?: string\n  [key: string]: unknown\n}\n\nexport function GridPattern({\n  width = 40,\n  height = 40,\n  x = -1,\n  y = -1,\n  strokeDasharray = \"0\",\n  squares,\n  className,\n  ...props\n}: GridPatternProps) {\n  const id = useId()\n\n  return (\n    <svg\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <pattern\n          id={id}\n          width={width}\n          height={height}\n          patternUnits=\"userSpaceOnUse\"\n          x={x}\n          y={y}\n        >\n          <path\n            d={`M.5 ${height}V.5H${width}`}\n            fill=\"none\"\n            strokeDasharray={strokeDasharray}\n          />\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" strokeWidth={0} fill={`url(#${id})`} />\n      {squares && (\n        <svg x={x} y={y} className=\"overflow-visible\">\n          {squares.map(([x, y]) => (\n            <rect\n              strokeWidth=\"0\"\n              key={`${x}-${y}`}\n              width={width - 1}\n              height={height - 1}\n              x={x * width + 1}\n              y={y * height + 1}\n            />\n          ))}\n        </svg>\n      )}\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: grid-pattern-demo =====\nTitle: Grid Pattern Demo\n\n--- file: example/grid-pattern-demo.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <GridPattern\n        squares={[\n          [4, 4],\n          [5, 1],\n          [8, 2],\n          [5, 3],\n          [5, 5],\n          [10, 10],\n          [12, 15],\n          [15, 10],\n          [10, 15],\n          [15, 10],\n          [10, 15],\n          [15, 10],\n        ]}\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: grid-pattern-linear-gradient =====\nTitle: Grid Pattern Linear Gradient\n\n--- file: example/grid-pattern-linear-gradient.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternLinearGradient() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <GridPattern\n        width={20}\n        height={20}\n        x={-1}\n        y={-1}\n        className={cn(\n          \"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: grid-pattern-dashed =====\nTitle: Grid Pattern Dashed\n\n--- file: example/grid-pattern-dashed.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternDashed() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <GridPattern\n        width={30}\n        height={30}\n        x={-1}\n        y={-1}\n        strokeDasharray={\"4 2\"}\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: hero-video-dialog =====\nTitle: Hero Video Dialog\nDescription: A hero video dialog component.\n\n--- file: magicui/hero-video-dialog.tsx ---\n\"use client\"\n\nimport { useState } from \"react\"\nimport { Play, XIcon } from \"lucide-react\"\nimport { AnimatePresence, motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype AnimationStyle =\n  | \"from-bottom\"\n  | \"from-center\"\n  | \"from-top\"\n  | \"from-left\"\n  | \"from-right\"\n  | \"fade\"\n  | \"top-in-bottom-out\"\n  | \"left-in-right-out\"\n\ninterface HeroVideoProps {\n  animationStyle?: AnimationStyle\n  videoSrc: string\n  thumbnailSrc: string\n  thumbnailAlt?: string\n  className?: string\n}\n\nconst animationVariants = {\n  \"from-bottom\": {\n    initial: { y: \"100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"100%\", opacity: 0 },\n  },\n  \"from-center\": {\n    initial: { scale: 0.5, opacity: 0 },\n    animate: { scale: 1, opacity: 1 },\n    exit: { scale: 0.5, opacity: 0 },\n  },\n  \"from-top\": {\n    initial: { y: \"-100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"-100%\", opacity: 0 },\n  },\n  \"from-left\": {\n    initial: { x: \"-100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"-100%\", opacity: 0 },\n  },\n  \"from-right\": {\n    initial: { x: \"100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"100%\", opacity: 0 },\n  },\n  fade: {\n    initial: { opacity: 0 },\n    animate: { opacity: 1 },\n    exit: { opacity: 0 },\n  },\n  \"top-in-bottom-out\": {\n    initial: { y: \"-100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"100%\", opacity: 0 },\n  },\n  \"left-in-right-out\": {\n    initial: { x: \"-100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"100%\", opacity: 0 },\n  },\n}\n\nexport function HeroVideoDialog({\n  animationStyle = \"from-center\",\n  videoSrc,\n  thumbnailSrc,\n  thumbnailAlt = \"Video thumbnail\",\n  className,\n}: HeroVideoProps) {\n  const [isVideoOpen, setIsVideoOpen] = useState(false)\n  const selectedAnimation = animationVariants[animationStyle]\n\n  return (\n    <div className={cn(\"relative\", className)}>\n      <button\n        type=\"button\"\n        aria-label=\"Play video\"\n        className=\"group relative cursor-pointer border-0 bg-transparent p-0\"\n        onClick={() => setIsVideoOpen(true)}\n      >\n        <img\n          src={thumbnailSrc}\n          alt={thumbnailAlt}\n          width={1920}\n          height={1080}\n          className=\"w-full rounded-md border shadow-lg transition-all duration-200 ease-out group-hover:brightness-[0.8]\"\n        />\n        <div className=\"absolute inset-0 flex scale-[0.9] items-center justify-center rounded-2xl transition-all duration-200 ease-out group-hover:scale-100\">\n          <div className=\"bg-primary/10 flex size-28 items-center justify-center rounded-full backdrop-blur-md\">\n            <div\n              className={`from-primary/30 to-primary relative flex size-20 scale-100 items-center justify-center rounded-full bg-linear-to-b shadow-md transition-all duration-200 ease-out group-hover:scale-[1.2]`}\n            >\n              <Play\n                className=\"size-8 scale-100 fill-white text-white transition-transform duration-200 ease-out group-hover:scale-105\"\n                style={{\n                  filter:\n                    \"drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06))\",\n                }}\n              />\n            </div>\n          </div>\n        </div>\n      </button>\n      <AnimatePresence>\n        {isVideoOpen && (\n          <motion.div\n            initial={{ opacity: 0 }}\n            animate={{ opacity: 1 }}\n            role=\"button\"\n            tabIndex={0}\n            onKeyDown={(e) => {\n              if (e.key === \"Escape\" || e.key === \"Enter\" || e.key === \" \") {\n                setIsVideoOpen(false)\n              }\n            }}\n            onClick={() => setIsVideoOpen(false)}\n            exit={{ opacity: 0 }}\n            className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md\"\n          >\n            <motion.div\n              {...selectedAnimation}\n              transition={{ type: \"spring\", damping: 30, stiffness: 300 }}\n              className=\"relative mx-4 aspect-video w-full max-w-4xl md:mx-0\"\n            >\n              <motion.button className=\"absolute -top-16 right-0 rounded-full bg-neutral-900/50 p-2 text-xl text-white ring-1 backdrop-blur-md dark:bg-neutral-100/50 dark:text-black\">\n                <XIcon className=\"size-5\" />\n              </motion.button>\n              <div className=\"relative isolate z-1 size-full overflow-hidden rounded-2xl border-2 border-white\">\n                <iframe\n                  src={videoSrc}\n                  title=\"Hero Video player\"\n                  className=\"mt-0 size-full rounded-2xl\"\n                  allowFullScreen\n                  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                ></iframe>\n              </div>\n            </motion.div>\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: hero-video-dialog-demo =====\nTitle: Hero Video Dialog Demo\n\n--- file: example/hero-video-dialog-demo.tsx ---\nimport { HeroVideoDialog } from \"@/registry/magicui/hero-video-dialog\"\n\nexport default function HeroVideoDialogDemo() {\n  return (\n    <div className=\"relative\">\n      <HeroVideoDialog\n        className=\"block dark:hidden\"\n        animationStyle=\"from-center\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-light.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n      <HeroVideoDialog\n        className=\"hidden dark:block\"\n        animationStyle=\"from-center\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-dark.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: hero-video-dialog-demo-top-in-bottom-out =====\nTitle: Hero Video Dialog Top In Bottom Out Demo\n\n--- file: example/hero-video-dialog-demo-top-in-bottom-out.tsx ---\nimport { HeroVideoDialog } from \"@/registry/magicui/hero-video-dialog\"\n\nexport default function HeroVideoDialogDemoTopInBottomOut() {\n  return (\n    <div className=\"relative\">\n      <HeroVideoDialog\n        className=\"block dark:hidden\"\n        animationStyle=\"top-in-bottom-out\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-light.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n      <HeroVideoDialog\n        className=\"hidden dark:block\"\n        animationStyle=\"top-in-bottom-out\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-dark.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: highlighter =====\nTitle: Highlighter\nDescription: A text highlighter that mimics the effect of a human-drawn marker stroke.\n\n--- file: magicui/highlighter.tsx ---\n\"use client\"\n\nimport { useLayoutEffect, useRef } from \"react\"\nimport type React from \"react\"\nimport { useInView } from \"motion/react\"\nimport { annotate } from \"rough-notation\"\nimport { type RoughAnnotation } from \"rough-notation/lib/model\"\n\ntype AnnotationAction =\n  | \"highlight\"\n  | \"underline\"\n  | \"box\"\n  | \"circle\"\n  | \"strike-through\"\n  | \"crossed-off\"\n  | \"bracket\"\n\ninterface HighlighterProps {\n  children: React.ReactNode\n  action?: AnnotationAction\n  color?: string\n  strokeWidth?: number\n  animationDuration?: number\n  iterations?: number\n  padding?: number\n  multiline?: boolean\n  isView?: boolean\n}\n\nexport function Highlighter({\n  children,\n  action = \"highlight\",\n  color = \"#ffd1dc\",\n  strokeWidth = 1.5,\n  animationDuration = 600,\n  iterations = 2,\n  padding = 2,\n  multiline = true,\n  isView = false,\n}: HighlighterProps) {\n  const elementRef = useRef<HTMLSpanElement>(null)\n\n  const isInView = useInView(elementRef, {\n    once: true,\n    margin: \"-10%\",\n  })\n\n  // If isView is false, always show. If isView is true, wait for inView\n  const shouldShow = !isView || isInView\n\n  useLayoutEffect(() => {\n    const element = elementRef.current\n    let annotation: RoughAnnotation | null = null\n    let resizeObserver: ResizeObserver | null = null\n\n    if (shouldShow && element) {\n      const annotationConfig = {\n        type: action,\n        color,\n        strokeWidth,\n        animationDuration,\n        iterations,\n        padding,\n        multiline,\n      }\n\n      const currentAnnotation = annotate(element, annotationConfig)\n      annotation = currentAnnotation\n      currentAnnotation.show()\n\n      resizeObserver = new ResizeObserver(() => {\n        currentAnnotation.hide()\n        currentAnnotation.show()\n      })\n\n      resizeObserver.observe(element)\n      resizeObserver.observe(document.body)\n    }\n\n    return () => {\n      annotation?.remove()\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n    }\n  }, [\n    shouldShow,\n    action,\n    color,\n    strokeWidth,\n    animationDuration,\n    iterations,\n    padding,\n    multiline,\n  ])\n\n  return (\n    <span ref={elementRef} className=\"relative inline-block bg-transparent\">\n      {children}\n    </span>\n  )\n}\n\n\n===== EXAMPLE: highlighter-demo =====\nTitle: Highlighter Demo\n\n--- file: example/highlighter-demo.tsx ---\nimport { Highlighter } from \"@/registry/magicui/highlighter\"\n\nexport default function HighlighterDemo() {\n  return (\n    <div className=\"text-center\">\n      <p className=\"leading-relaxed\">\n        The{\" \"}\n        <Highlighter action=\"underline\" color=\"#FF9800\">\n          Magic UI Highlighter\n        </Highlighter>{\" \"}\n        makes important{\" \"}\n        <Highlighter action=\"highlight\" color=\"#87CEFA\">\n          text stand out\n        </Highlighter>{\" \"}\n        effortlessly.\n      </p>\n    </div>\n  )\n}\n\n--- file: magicui/highlighter.tsx ---\n\"use client\"\n\nimport { useLayoutEffect, useRef } from \"react\"\nimport type React from \"react\"\nimport { useInView } from \"motion/react\"\nimport { annotate } from \"rough-notation\"\nimport { type RoughAnnotation } from \"rough-notation/lib/model\"\n\ntype AnnotationAction =\n  | \"highlight\"\n  | \"underline\"\n  | \"box\"\n  | \"circle\"\n  | \"strike-through\"\n  | \"crossed-off\"\n  | \"bracket\"\n\ninterface HighlighterProps {\n  children: React.ReactNode\n  action?: AnnotationAction\n  color?: string\n  strokeWidth?: number\n  animationDuration?: number\n  iterations?: number\n  padding?: number\n  multiline?: boolean\n  isView?: boolean\n}\n\nexport function Highlighter({\n  children,\n  action = \"highlight\",\n  color = \"#ffd1dc\",\n  strokeWidth = 1.5,\n  animationDuration = 600,\n  iterations = 2,\n  padding = 2,\n  multiline = true,\n  isView = false,\n}: HighlighterProps) {\n  const elementRef = useRef<HTMLSpanElement>(null)\n\n  const isInView = useInView(elementRef, {\n    once: true,\n    margin: \"-10%\",\n  })\n\n  // If isView is false, always show. If isView is true, wait for inView\n  const shouldShow = !isView || isInView\n\n  useLayoutEffect(() => {\n    const element = elementRef.current\n    let annotation: RoughAnnotation | null = null\n    let resizeObserver: ResizeObserver | null = null\n\n    if (shouldShow && element) {\n      const annotationConfig = {\n        type: action,\n        color,\n        strokeWidth,\n        animationDuration,\n        iterations,\n        padding,\n        multiline,\n      }\n\n      const currentAnnotation = annotate(element, annotationConfig)\n      annotation = currentAnnotation\n      currentAnnotation.show()\n\n      resizeObserver = new ResizeObserver(() => {\n        currentAnnotation.hide()\n        currentAnnotation.show()\n      })\n\n      resizeObserver.observe(element)\n      resizeObserver.observe(document.body)\n    }\n\n    return () => {\n      annotation?.remove()\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n    }\n  }, [\n    shouldShow,\n    action,\n    color,\n    strokeWidth,\n    animationDuration,\n    iterations,\n    padding,\n    multiline,\n  ])\n\n  return (\n    <span ref={elementRef} className=\"relative inline-block bg-transparent\">\n      {children}\n    </span>\n  )\n}\n\n\n\n===== COMPONENT: hyper-text =====\nTitle: Hyper Text\nDescription: A text animation that scrambles letters before revealing the final text.\n\n--- file: magicui/hyper-text.tsx ---\n\"use client\"\n\nimport {\n  useEffect,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n} from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype CharacterSet = string[] | readonly string[]\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype HyperTextMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"div\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface HyperTextProps extends Omit<MotionProps, \"children\"> {\n  /** The text content to be animated */\n  children: string\n  /** Optional className for styling */\n  className?: string\n  /** Duration of the animation in milliseconds */\n  duration?: number\n  /** Delay before animation starts in milliseconds */\n  delay?: number\n  /** Component to render as - defaults to div */\n  as?: MotionElementType\n  /** Whether to start animation when element comes into view */\n  startOnView?: boolean\n  /** Whether to trigger animation on hover */\n  animateOnHover?: boolean\n  /** Custom character set for scramble effect. Defaults to uppercase alphabet */\n  characterSet?: CharacterSet\n}\n\nconst DEFAULT_CHARACTER_SET = Object.freeze(\n  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\")\n) as readonly string[]\n\nconst getRandomInt = (max: number): number => Math.floor(Math.random() * max)\n\nexport function HyperText({\n  children,\n  className,\n  duration = 800,\n  delay = 0,\n  as: Component = \"div\",\n  startOnView = false,\n  animateOnHover = true,\n  characterSet = DEFAULT_CHARACTER_SET,\n  ...props\n}: HyperTextProps) {\n  const MotionComponent = motionElements[Component] as HyperTextMotionComponent\n\n  const [displayText, setDisplayText] = useState<string[]>(() =>\n    children.split(\"\")\n  )\n  const [isAnimating, setIsAnimating] = useState(false)\n  const iterationCount = useRef(0)\n  const elementRef = useRef<HTMLElement | null>(null)\n\n  const handleAnimationTrigger = () => {\n    if (animateOnHover && !isAnimating) {\n      iterationCount.current = 0\n      setIsAnimating(true)\n    }\n  }\n\n  // Handle animation start based on view or delay\n  useEffect(() => {\n    if (!startOnView) {\n      const startTimeout = setTimeout(() => {\n        setIsAnimating(true)\n      }, delay)\n      return () => clearTimeout(startTimeout)\n    }\n\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        if (entry.isIntersecting) {\n          setTimeout(() => {\n            setIsAnimating(true)\n          }, delay)\n          observer.disconnect()\n        }\n      },\n      { threshold: 0.1, rootMargin: \"-30% 0px -30% 0px\" }\n    )\n\n    if (elementRef.current) {\n      observer.observe(elementRef.current)\n    }\n\n    return () => observer.disconnect()\n  }, [delay, startOnView])\n\n  // Handle scramble animation\n  useEffect(() => {\n    let animationFrameId: number | null = null\n\n    if (isAnimating) {\n      const maxIterations = children.length\n      const startTime = performance.now()\n\n      const animate = (currentTime: number) => {\n        const elapsed = currentTime - startTime\n        const progress = Math.min(elapsed / duration, 1)\n\n        iterationCount.current = progress * maxIterations\n\n        setDisplayText((currentText) =>\n          currentText.map((letter, index) =>\n            letter === \" \"\n              ? letter\n              : index <= iterationCount.current\n                ? children[index]\n                : characterSet[getRandomInt(characterSet.length)]\n          )\n        )\n\n        if (progress < 1) {\n          animationFrameId = requestAnimationFrame(animate)\n        } else {\n          setIsAnimating(false)\n        }\n      }\n\n      animationFrameId = requestAnimationFrame(animate)\n    }\n\n    return () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n      }\n    }\n  }, [children, duration, isAnimating, characterSet])\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\"overflow-hidden py-2 text-4xl font-bold\", className)}\n      onMouseEnter={handleAnimationTrigger}\n      {...props}\n    >\n      <AnimatePresence>\n        {displayText.map((letter, index) => (\n          <motion.span\n            key={index}\n            className={cn(\"font-mono\", letter === \" \" ? \"w-3\" : \"\")}\n          >\n            {letter.toUpperCase()}\n          </motion.span>\n        ))}\n      </AnimatePresence>\n    </MotionComponent>\n  )\n}\n\n\n===== EXAMPLE: hyper-text-demo =====\nTitle: Hyper Text Demo\n\n--- file: example/hyper-text-demo.tsx ---\nimport { HyperText } from \"@/registry/magicui/hyper-text\"\n\nexport default function HyperTextDemo() {\n  return <HyperText>Hover Me!</HyperText>\n}\n\n\n\n===== COMPONENT: icon-cloud =====\nTitle: Icon Cloud\nDescription: An interactive 3D tag cloud component\n\n--- file: magicui/icon-cloud.tsx ---\n\"use client\"\n\nimport React, { useEffect, useRef, useState } from \"react\"\nimport { renderToString } from \"react-dom/server\"\n\ninterface Icon {\n  x: number\n  y: number\n  z: number\n  scale: number\n  opacity: number\n  id: number\n}\n\ninterface IconCloudProps {\n  icons?: React.ReactNode[]\n  images?: string[]\n}\n\nfunction easeOutCubic(t: number): number {\n  return 1 - Math.pow(1 - t, 3)\n}\n\nexport function IconCloud({ icons, images }: IconCloudProps) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const [iconPositions, setIconPositions] = useState<Icon[]>([])\n  const [isDragging, setIsDragging] = useState(false)\n  const [lastMousePos, setLastMousePos] = useState({ x: 0, y: 0 })\n  const [mousePos, setMousePos] = useState({ x: 0, y: 0 })\n  const [targetRotation, setTargetRotation] = useState<{\n    x: number\n    y: number\n    startX: number\n    startY: number\n    distance: number\n    startTime: number\n    duration: number\n  } | null>(null)\n  const animationFrameRef = useRef<number>(0)\n  const rotationRef = useRef({ x: 0, y: 0 })\n  const iconCanvasesRef = useRef<HTMLCanvasElement[]>([])\n  const imagesLoadedRef = useRef<boolean[]>([])\n\n  // Create icon canvases once when icons/images change\n  useEffect(() => {\n    if (!icons && !images) return\n\n    const items = icons ?? images ?? []\n    imagesLoadedRef.current = new Array(items.length).fill(false)\n\n    const newIconCanvases = items.map((item, index) => {\n      const offscreen = document.createElement(\"canvas\")\n      offscreen.width = 40\n      offscreen.height = 40\n      const offCtx = offscreen.getContext(\"2d\")\n\n      if (offCtx) {\n        if (images) {\n          // Handle image URLs directly\n          const img = new Image()\n          img.crossOrigin = \"anonymous\"\n          img.src = items[index] as string\n          img.onload = () => {\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\n\n            // Create circular clipping path\n            offCtx.beginPath()\n            offCtx.arc(20, 20, 20, 0, Math.PI * 2)\n            offCtx.closePath()\n            offCtx.clip()\n\n            // Draw the image\n            offCtx.drawImage(img, 0, 0, 40, 40)\n\n            imagesLoadedRef.current[index] = true\n          }\n        } else {\n          // Handle SVG icons\n          offCtx.scale(0.4, 0.4)\n          const svgString = renderToString(item as React.ReactElement)\n          const img = new Image()\n          img.src = \"data:image/svg+xml;base64,\" + btoa(svgString)\n          img.onload = () => {\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\n            offCtx.drawImage(img, 0, 0)\n            imagesLoadedRef.current[index] = true\n          }\n        }\n      }\n      return offscreen\n    })\n\n    iconCanvasesRef.current = newIconCanvases\n  }, [icons, images])\n\n  // Generate initial icon positions on a sphere\n  useEffect(() => {\n    const items = icons ?? images ?? []\n    const newIcons: Icon[] = []\n    const numIcons = items.length || 20\n\n    // Fibonacci sphere parameters\n    const offset = 2 / numIcons\n    const increment = Math.PI * (3 - Math.sqrt(5))\n\n    for (let i = 0; i < numIcons; i++) {\n      const y = i * offset - 1 + offset / 2\n      const r = Math.sqrt(1 - y * y)\n      const phi = i * increment\n\n      const x = Math.cos(phi) * r\n      const z = Math.sin(phi) * r\n\n      newIcons.push({\n        x: x * 100,\n        y: y * 100,\n        z: z * 100,\n        scale: 1,\n        opacity: 1,\n        id: i,\n      })\n    }\n    setIconPositions(newIcons)\n  }, [icons, images])\n\n  // Handle mouse events\n  const handleMouseDown = (e: React.MouseEvent<HTMLCanvasElement>) => {\n    const rect = canvasRef.current?.getBoundingClientRect()\n    if (!rect || !canvasRef.current) return\n\n    const x = e.clientX - rect.left\n    const y = e.clientY - rect.top\n\n    const ctx = canvasRef.current.getContext(\"2d\")\n    if (!ctx) return\n\n    iconPositions.forEach((icon) => {\n      const cosX = Math.cos(rotationRef.current.x)\n      const sinX = Math.sin(rotationRef.current.x)\n      const cosY = Math.cos(rotationRef.current.y)\n      const sinY = Math.sin(rotationRef.current.y)\n\n      const rotatedX = icon.x * cosY - icon.z * sinY\n      const rotatedZ = icon.x * sinY + icon.z * cosY\n      const rotatedY = icon.y * cosX + rotatedZ * sinX\n\n      const screenX = canvasRef.current!.width / 2 + rotatedX\n      const screenY = canvasRef.current!.height / 2 + rotatedY\n\n      const scale = (rotatedZ + 200) / 300\n      const radius = 20 * scale\n      const dx = x - screenX\n      const dy = y - screenY\n\n      if (dx * dx + dy * dy < radius * radius) {\n        const targetX = -Math.atan2(\n          icon.y,\n          Math.sqrt(icon.x * icon.x + icon.z * icon.z)\n        )\n        const targetY = Math.atan2(icon.x, icon.z)\n\n        const currentX = rotationRef.current.x\n        const currentY = rotationRef.current.y\n        const distance = Math.sqrt(\n          Math.pow(targetX - currentX, 2) + Math.pow(targetY - currentY, 2)\n        )\n\n        const duration = Math.min(2000, Math.max(800, distance * 1000))\n\n        setTargetRotation({\n          x: targetX,\n          y: targetY,\n          startX: currentX,\n          startY: currentY,\n          distance,\n          startTime: performance.now(),\n          duration,\n        })\n        return\n      }\n    })\n\n    setIsDragging(true)\n    setLastMousePos({ x: e.clientX, y: e.clientY })\n  }\n\n  const handleMouseMove = (e: React.MouseEvent<HTMLCanvasElement>) => {\n    const rect = canvasRef.current?.getBoundingClientRect()\n    if (rect) {\n      const x = e.clientX - rect.left\n      const y = e.clientY - rect.top\n      setMousePos({ x, y })\n    }\n\n    if (isDragging) {\n      const deltaX = e.clientX - lastMousePos.x\n      const deltaY = e.clientY - lastMousePos.y\n\n      rotationRef.current = {\n        x: rotationRef.current.x + deltaY * 0.002,\n        y: rotationRef.current.y + deltaX * 0.002,\n      }\n\n      setLastMousePos({ x: e.clientX, y: e.clientY })\n    }\n  }\n\n  const handleMouseUp = () => {\n    setIsDragging(false)\n  }\n\n  // Animation and rendering\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const ctx = canvas?.getContext(\"2d\")\n    if (canvas && ctx) {\n      const animate = () => {\n        ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n        const centerX = canvas.width / 2\n        const centerY = canvas.height / 2\n        const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY)\n        const dx = mousePos.x - centerX\n        const dy = mousePos.y - centerY\n        const distance = Math.sqrt(dx * dx + dy * dy)\n        const speed = 0.003 + (distance / maxDistance) * 0.01\n\n        if (targetRotation) {\n          const elapsed = performance.now() - targetRotation.startTime\n          const progress = Math.min(1, elapsed / targetRotation.duration)\n          const easedProgress = easeOutCubic(progress)\n\n          rotationRef.current = {\n            x:\n              targetRotation.startX +\n              (targetRotation.x - targetRotation.startX) * easedProgress,\n            y:\n              targetRotation.startY +\n              (targetRotation.y - targetRotation.startY) * easedProgress,\n          }\n\n          if (progress >= 1) {\n            setTargetRotation(null)\n          }\n        } else if (!isDragging) {\n          rotationRef.current = {\n            x: rotationRef.current.x + (dy / canvas.height) * speed,\n            y: rotationRef.current.y + (dx / canvas.width) * speed,\n          }\n        }\n\n        iconPositions.forEach((icon, index) => {\n          const cosX = Math.cos(rotationRef.current.x)\n          const sinX = Math.sin(rotationRef.current.x)\n          const cosY = Math.cos(rotationRef.current.y)\n          const sinY = Math.sin(rotationRef.current.y)\n\n          const rotatedX = icon.x * cosY - icon.z * sinY\n          const rotatedZ = icon.x * sinY + icon.z * cosY\n          const rotatedY = icon.y * cosX + rotatedZ * sinX\n\n          const scale = (rotatedZ + 200) / 300\n          const opacity = Math.max(0.2, Math.min(1, (rotatedZ + 150) / 200))\n\n          ctx.save()\n          ctx.translate(\n            canvas.width / 2 + rotatedX,\n            canvas.height / 2 + rotatedY\n          )\n          ctx.scale(scale, scale)\n          ctx.globalAlpha = opacity\n\n          if (icons || images) {\n            // Only try to render icons/images if they exist\n            if (\n              iconCanvasesRef.current[index] &&\n              imagesLoadedRef.current[index]\n            ) {\n              ctx.drawImage(iconCanvasesRef.current[index], -20, -20, 40, 40)\n            }\n          } else {\n            // Show numbered circles if no icons/images are provided\n            ctx.beginPath()\n            ctx.arc(0, 0, 20, 0, Math.PI * 2)\n            ctx.fillStyle = \"#4444ff\"\n            ctx.fill()\n            ctx.fillStyle = \"white\"\n            ctx.textAlign = \"center\"\n            ctx.textBaseline = \"middle\"\n            ctx.font = \"16px Arial\"\n            ctx.fillText(`${icon.id + 1}`, 0, 0)\n          }\n\n          ctx.restore()\n        })\n        animationFrameRef.current = requestAnimationFrame(animate)\n      }\n\n      animate()\n    }\n\n    return () => {\n      if (animationFrameRef.current) {\n        cancelAnimationFrame(animationFrameRef.current)\n      }\n    }\n  }, [icons, images, iconPositions, isDragging, mousePos, targetRotation])\n\n  return (\n    <canvas\n      ref={canvasRef}\n      width={400}\n      height={400}\n      onMouseDown={handleMouseDown}\n      onMouseMove={handleMouseMove}\n      onMouseUp={handleMouseUp}\n      onMouseLeave={handleMouseUp}\n      className=\"rounded-lg\"\n      aria-label=\"Interactive 3D Icon Cloud\"\n      role=\"img\"\n    />\n  )\n}\n\n\n===== EXAMPLE: icon-cloud-demo =====\nTitle: Icon Cloud Demo\n\n--- file: example/icon-cloud-demo.tsx ---\nimport { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst slugs = [\n  \"typescript\",\n  \"javascript\",\n  \"dart\",\n  \"java\",\n  \"react\",\n  \"flutter\",\n  \"android\",\n  \"html5\",\n  \"css3\",\n  \"nodedotjs\",\n  \"express\",\n  \"nextdotjs\",\n  \"prisma\",\n  \"amazonaws\",\n  \"postgresql\",\n  \"firebase\",\n  \"nginx\",\n  \"vercel\",\n  \"testinglibrary\",\n  \"jest\",\n  \"cypress\",\n  \"docker\",\n  \"git\",\n  \"jira\",\n  \"github\",\n  \"gitlab\",\n  \"visualstudiocode\",\n  \"androidstudio\",\n  \"sonarqube\",\n  \"figma\",\n]\n\nexport default function IconCloudDemo() {\n  const images = slugs.map(\n    (slug) => `https://cdn.simpleicons.org/${slug}/${slug}`\n  )\n\n  return (\n    <div className=\"relative flex size-full items-center justify-center overflow-hidden\">\n      <IconCloud images={images} />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: icon-cloud-demo-2 =====\nTitle: Icon Cloud Demo 2\n\n--- file: example/icon-cloud-demo-2.tsx ---\nimport { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst images = [\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nexport default function IconCloudDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\">\n      <IconCloud images={images} />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: icon-cloud-demo-3 =====\nTitle: Icon Cloud Demo 3\n\n--- file: example/icon-cloud-demo-3.tsx ---\nimport { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst Icons = {\n  gitHub: () => (\n    <svg width=\"100\" height=\"100\" viewBox=\"0 0 438.549 438.549\">\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      />\n    </svg>\n  ),\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className=\"fill-black dark:fill-white\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n}\n\nexport default function IconCloudDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\">\n      <IconCloud\n        icons={[\n          <Icons.gitHub key=\"github\" />,\n          <Icons.notion key=\"notion\" />,\n          <Icons.openai key=\"openai\" />,\n          <Icons.googleDrive key=\"gdrive\" />,\n          <Icons.whatsapp key=\"whatsapp\" />,\n          <Icons.gitHub key=\"github2\" />,\n          <Icons.notion key=\"notion2\" />,\n          <Icons.openai key=\"openai2\" />,\n          <Icons.googleDrive key=\"gdrive2\" />,\n          <Icons.whatsapp key=\"whatsapp2\" />,\n          <Icons.gitHub key=\"github3\" />,\n          <Icons.notion key=\"notion3\" />,\n          <Icons.openai key=\"openai3\" />,\n          <Icons.googleDrive key=\"gdrive3\" />,\n          <Icons.whatsapp key=\"whatsapp3\" />,\n          <Icons.gitHub key=\"github4\" />,\n          <Icons.notion key=\"notion4\" />,\n          <Icons.openai key=\"openai4\" />,\n          <Icons.googleDrive key=\"gdrive4\" />,\n          <Icons.whatsapp key=\"whatsapp4\" />,\n          <Icons.notion key=\"notion4\" />,\n          <Icons.openai key=\"openai4\" />,\n          <Icons.googleDrive key=\"gdrive4\" />,\n          <Icons.whatsapp key=\"whatsapp4\" />,\n        ]}\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: interactive-grid-pattern =====\nTitle: Interactive Grid Pattern\nDescription: A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/interactive-grid-pattern.tsx ---\n\"use client\"\n\nimport React, { useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * InteractiveGridPattern is a component that renders a grid pattern with interactive squares.\n *\n * @param width - The width of each square.\n * @param height - The height of each square.\n * @param squares - The number of squares in the grid. The first element is the number of horizontal squares, and the second element is the number of vertical squares.\n * @param className - The class name of the grid.\n * @param squaresClassName - The class name of the squares.\n */\ninterface InteractiveGridPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  squares?: [number, number] // [horizontal, vertical]\n  className?: string\n  squaresClassName?: string\n}\n\n/**\n * The InteractiveGridPattern component.\n *\n * @see InteractiveGridPatternProps for the props interface.\n * @returns A React component.\n */\nexport function InteractiveGridPattern({\n  width = 40,\n  height = 40,\n  squares = [24, 24],\n  className,\n  squaresClassName,\n  ...props\n}: InteractiveGridPatternProps) {\n  const [horizontal, vertical] = squares\n  const [hoveredSquare, setHoveredSquare] = useState<number | null>(null)\n\n  return (\n    <svg\n      width={width * horizontal}\n      height={height * vertical}\n      className={cn(\n        \"absolute inset-0 h-full w-full border border-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      {Array.from({ length: horizontal * vertical }).map((_, index) => {\n        const x = (index % horizontal) * width\n        const y = Math.floor(index / horizontal) * height\n        return (\n          <rect\n            key={index}\n            x={x}\n            y={y}\n            width={width}\n            height={height}\n            className={cn(\n              \"stroke-gray-400/30 transition-all duration-100 ease-in-out not-[&:hover]:duration-1000\",\n              hoveredSquare === index ? \"fill-gray-300/30\" : \"fill-transparent\",\n              squaresClassName\n            )}\n            onMouseEnter={() => setHoveredSquare(index)}\n            onMouseLeave={() => setHoveredSquare(null)}\n          />\n        )\n      })}\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: interactive-grid-pattern-demo =====\nTitle: Interactive Grid Pattern Demo\n\n--- file: example/interactive-grid-pattern-demo.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\"\n\nexport default function InteractiveGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <InteractiveGridPattern\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: interactive-grid-pattern-demo-2 =====\nTitle: Interactive Grid Pattern Demo 2\n\n--- file: example/interactive-grid-pattern-demo-2.tsx ---\n\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\"\n\nexport default function InteractiveGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <InteractiveGridPattern\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\"\n        )}\n        width={20}\n        height={20}\n        squares={[80, 80]}\n        squaresClassName=\"hover:fill-blue-500\"\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: interactive-hover-button =====\nTitle: interactive-hover-button\nDescription: The interactive-hover-button component.\n\n--- file: magicui/interactive-hover-button.tsx ---\nimport { ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport function InteractiveHoverButton({\n  children,\n  className,\n  ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n  return (\n    <button\n      className={cn(\n        \"group bg-background relative w-auto cursor-pointer overflow-hidden rounded-full border p-2 px-6 text-center font-semibold\",\n        className\n      )}\n      {...props}\n    >\n      <div className=\"flex items-center justify-center gap-2\">\n        <div className=\"bg-primary h-2 w-2 rounded-full transition-all duration-300 group-hover:scale-[100.8]\"></div>\n        <span className=\"inline-block transition-all duration-300 group-hover:translate-x-12 group-hover:opacity-0\">\n          {children}\n        </span>\n      </div>\n      <div className=\"text-primary-foreground absolute top-0 z-10 flex h-full w-full translate-x-12 items-center justify-center gap-2 opacity-0 transition-all duration-300 group-hover:-translate-x-5 group-hover:opacity-100\">\n        <span>{children}</span>\n        <ArrowRight />\n      </div>\n    </button>\n  )\n}\n\n\n===== EXAMPLE: interactive-hover-button-demo =====\nTitle: Interactive Hover Button Demo\n\n--- file: example/interactive-hover-button-demo.tsx ---\nimport { InteractiveHoverButton } from \"@/registry/magicui/interactive-hover-button\"\n\nexport default function InteractiveHoverButtonDemo() {\n  return <InteractiveHoverButton>Hover Me</InteractiveHoverButton>\n}\n\n\n\n===== COMPONENT: iphone =====\nTitle: iPhone\nDescription: A mockup of the iPhone\n\n--- file: magicui/iphone.tsx ---\nimport type { HTMLAttributes } from \"react\"\n\nconst PHONE_WIDTH = 433\nconst PHONE_HEIGHT = 882\nconst SCREEN_X = 21.25\nconst SCREEN_Y = 19.25\nconst SCREEN_WIDTH = 389.5\nconst SCREEN_HEIGHT = 843.5\nconst SCREEN_RADIUS = 55.75\n\n// Calculated percentages\nconst LEFT_PCT = (SCREEN_X / PHONE_WIDTH) * 100\nconst TOP_PCT = (SCREEN_Y / PHONE_HEIGHT) * 100\nconst WIDTH_PCT = (SCREEN_WIDTH / PHONE_WIDTH) * 100\nconst HEIGHT_PCT = (SCREEN_HEIGHT / PHONE_HEIGHT) * 100\nconst RADIUS_H = (SCREEN_RADIUS / SCREEN_WIDTH) * 100\nconst RADIUS_V = (SCREEN_RADIUS / SCREEN_HEIGHT) * 100\n\nexport interface IphoneProps extends HTMLAttributes<HTMLDivElement> {\n  src?: string\n  videoSrc?: string\n}\n\nexport function Iphone({\n  src,\n  videoSrc,\n  className,\n  style,\n  ...props\n}: IphoneProps) {\n  const hasVideo = !!videoSrc\n  const hasMedia = hasVideo || !!src\n\n  return (\n    <div\n      className={`relative inline-block w-full align-middle leading-none ${className}`}\n      style={{\n        aspectRatio: `${PHONE_WIDTH}/${PHONE_HEIGHT}`,\n        ...style,\n      }}\n      {...props}\n    >\n      {hasVideo && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\n          }}\n        >\n          <video\n            className=\"block size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n            preload=\"metadata\"\n          />\n        </div>\n      )}\n\n      {!hasVideo && src && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\n          }}\n        >\n          <img\n            src={src}\n            alt=\"\"\n            className=\"block size-full object-cover object-top\"\n          />\n        </div>\n      )}\n\n      <svg\n        viewBox={`0 0 ${PHONE_WIDTH} ${PHONE_HEIGHT}`}\n        fill=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"absolute inset-0 size-full\"\n        style={{ transform: \"translateZ(0)\" }}\n      >\n        <g mask={hasMedia ? \"url(#screenPunch)\" : undefined}>\n          <path\n            d=\"M2 73C2 32.6832 34.6832 0 75 0H357C397.317 0 430 32.6832 430 73V809C430 849.317 397.317 882 357 882H75C34.6832 882 2 849.317 2 809V73Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M0 171C0 170.448 0.447715 170 1 170H3V204H1C0.447715 204 0 203.552 0 203V171Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M1 234C1 233.448 1.44772 233 2 233H3.5V300H2C1.44772 300 1 299.552 1 299V234Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M1 319C1 318.448 1.44772 318 2 318H3.5V385H2C1.44772 385 1 384.552 1 384V319Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M430 279H432C432.552 279 433 279.448 433 280V384C433 384.552 432.552 385 432 385H430V279Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M6 74C6 35.3401 37.3401 4 76 4H356C394.66 4 426 35.3401 426 74V808C426 846.66 394.66 878 356 878H76C37.3401 878 6 846.66 6 808V74Z\"\n            className=\"fill-white dark:fill-[#262626]\"\n          />\n        </g>\n\n        <path\n          opacity=\"0.5\"\n          d=\"M174 5H258V5.5C258 6.60457 257.105 7.5 256 7.5H176C174.895 7.5 174 6.60457 174 5.5V5Z\"\n          className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n        />\n\n        <path\n          d={`M${SCREEN_X} 75C${SCREEN_X} 44.2101 46.2101 ${SCREEN_Y} 77 ${SCREEN_Y}H355C385.79 ${SCREEN_Y} 410.75 44.2101 410.75 75V807C410.75 837.79 385.79 862.75 355 862.75H77C46.2101 862.75 ${SCREEN_X} 837.79 ${SCREEN_X} 807V75Z`}\n          className=\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\"\n          mask={hasMedia ? \"url(#screenPunch)\" : undefined}\n        />\n\n        <path\n          d=\"M154 48.5C154 38.2827 162.283 30 172.5 30H259.5C269.717 30 278 38.2827 278 48.5C278 58.7173 269.717 67 259.5 67H172.5C162.283 67 154 58.7173 154 48.5Z\"\n          className=\"fill-[#F5F5F5] dark:fill-[#262626]\"\n        />\n        <path\n          d=\"M249 48.5C249 42.701 253.701 38 259.5 38C265.299 38 270 42.701 270 48.5C270 54.299 265.299 59 259.5 59C253.701 59 249 54.299 249 48.5Z\"\n          className=\"fill-[#F5F5F5] dark:fill-[#262626]\"\n        />\n        <path\n          d=\"M254 48.5C254 45.4624 256.462 43 259.5 43C262.538 43 265 45.4624 265 48.5C265 51.5376 262.538 54 259.5 54C256.462 54 254 51.5376 254 48.5Z\"\n          className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n        />\n\n        <defs>\n          <mask id=\"screenPunch\" maskUnits=\"userSpaceOnUse\">\n            <rect\n              x=\"0\"\n              y=\"0\"\n              width={PHONE_WIDTH}\n              height={PHONE_HEIGHT}\n              fill=\"white\"\n            />\n            <rect\n              x={SCREEN_X}\n              y={SCREEN_Y}\n              width={SCREEN_WIDTH}\n              height={SCREEN_HEIGHT}\n              rx={SCREEN_RADIUS}\n              ry={SCREEN_RADIUS}\n              fill=\"black\"\n            />\n          </mask>\n          <clipPath id=\"roundedCorners\">\n            <rect\n              x={SCREEN_X}\n              y={SCREEN_Y}\n              width={SCREEN_WIDTH}\n              height={SCREEN_HEIGHT}\n              rx={SCREEN_RADIUS}\n              ry={SCREEN_RADIUS}\n            />\n          </clipPath>\n        </defs>\n      </svg>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: iphone-demo =====\nTitle: iPhone Demo\n\n--- file: example/iphone-demo.tsx ---\nimport { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: iphone-demo-2 =====\nTitle: iPhone Demo 2\n\n--- file: example/iphone-demo-2.tsx ---\nimport { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone src=\"https://placehold.co/900x1600?text=Hello+World\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: iphone-demo-3 =====\nTitle: iPhone Demo 3\n\n--- file: example/iphone-demo-3.tsx ---\nimport { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone videoSrc=\"https://videos.pexels.com/video-files/8946986/8946986-uhd_1440_2732_25fps.mp4\" />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: lens =====\nTitle: Lens\nDescription: A interactive component that enables zooming into images, videos and other elements.\n\n--- file: magicui/lens.tsx ---\n\"use client\"\n\nimport React, { useCallback, useMemo, useRef, useState } from \"react\"\nimport { AnimatePresence, motion, useMotionTemplate } from \"motion/react\"\n\ninterface Position {\n  /** The x coordinate of the lens */\n  x: number\n  /** The y coordinate of the lens */\n  y: number\n}\n\ninterface LensProps {\n  /** The children of the lens */\n  children: React.ReactNode\n  /** The zoom factor of the lens */\n  zoomFactor?: number\n  /** The size of the lens */\n  lensSize?: number\n  /** The position of the lens */\n  position?: Position\n  /** The default position of the lens */\n  defaultPosition?: Position\n  /** Whether the lens is static */\n  isStatic?: boolean\n  /** The duration of the animation */\n  duration?: number\n  /** The color of the lens */\n  lensColor?: string\n  /** The aria label of the lens */\n  ariaLabel?: string\n}\n\nexport function Lens({\n  children,\n  zoomFactor = 1.3,\n  lensSize = 170,\n  isStatic = false,\n  position = { x: 0, y: 0 },\n  defaultPosition,\n  duration = 0.1,\n  lensColor = \"black\",\n  ariaLabel = \"Zoom Area\",\n}: LensProps) {\n  if (zoomFactor < 1) {\n    throw new Error(\"zoomFactor must be greater than 1\")\n  }\n  if (lensSize < 0) {\n    throw new Error(\"lensSize must be greater than 0\")\n  }\n\n  const [isHovering, setIsHovering] = useState(false)\n  const [mousePosition, setMousePosition] = useState<Position>(position)\n  const containerRef = useRef<HTMLDivElement>(null)\n\n  const currentPosition = useMemo(() => {\n    if (isStatic) return position\n    if (defaultPosition && !isHovering) return defaultPosition\n    return mousePosition\n  }, [isStatic, position, defaultPosition, isHovering, mousePosition])\n\n  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    const rect = e.currentTarget.getBoundingClientRect()\n    setMousePosition({\n      x: e.clientX - rect.left,\n      y: e.clientY - rect.top,\n    })\n  }, [])\n\n  const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n    if (e.key === \"Escape\") setIsHovering(false)\n  }, [])\n\n  const maskImage = useMotionTemplate`radial-gradient(circle ${\n    lensSize / 2\n  }px at ${currentPosition.x}px ${\n    currentPosition.y\n  }px, ${lensColor} 100%, transparent 100%)`\n\n  const LensContent = useMemo(() => {\n    const { x, y } = currentPosition\n\n    return (\n      <motion.div\n        initial={{ opacity: 0, scale: 0.58 }}\n        animate={{ opacity: 1, scale: 1 }}\n        exit={{ opacity: 0, scale: 0.8 }}\n        transition={{ duration }}\n        className=\"absolute inset-0 overflow-hidden\"\n        style={{\n          maskImage,\n          WebkitMaskImage: maskImage,\n          transformOrigin: `${x}px ${y}px`,\n          zIndex: 50,\n        }}\n      >\n        <div\n          className=\"absolute inset-0\"\n          style={{\n            transform: `scale(${zoomFactor})`,\n            transformOrigin: `${x}px ${y}px`,\n          }}\n        >\n          {children}\n        </div>\n      </motion.div>\n    )\n  }, [currentPosition, maskImage, zoomFactor, children, duration])\n\n  return (\n    <div\n      ref={containerRef}\n      className=\"relative z-20 overflow-hidden rounded-xl\"\n      onMouseEnter={() => setIsHovering(true)}\n      onMouseLeave={() => setIsHovering(false)}\n      onMouseMove={handleMouseMove}\n      onKeyDown={handleKeyDown}\n      role=\"region\"\n      aria-label={ariaLabel}\n      tabIndex={0}\n    >\n      {children}\n      {isStatic || defaultPosition ? (\n        LensContent\n      ) : (\n        <AnimatePresence mode=\"popLayout\">\n          {isHovering && LensContent}\n        </AnimatePresence>\n      )}\n    </div>\n  )\n}\n\n\n===== EXAMPLE: lens-demo =====\nTitle: Lens Demo\n\n--- file: example/lens-demo.tsx ---\n\"use client\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens\n          zoomFactor={2}\n          lensSize={150}\n          isStatic={false}\n          ariaLabel=\"Zoom Area\"\n        >\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: lens-demo-2 =====\nTitle: Lens Demo 2\n\n--- file: example/lens-demo-2.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens isStatic position={{ x: 260, y: 150 }}>\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: lens-demo-3 =====\nTitle: Lens Demo 3\n\n--- file: example/lens-demo-3.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens defaultPosition={{ x: 260, y: 150 }}>\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n\n\n\n===== COMPONENT: light-rays =====\nTitle: Light Rays\nDescription: A component with animated light rays which shine down from above.\n\n--- file: magicui/light-rays.tsx ---\n\"use client\"\n\nimport { useEffect, useState, type CSSProperties } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface LightRaysProps extends React.HTMLAttributes<HTMLDivElement> {\n  ref?: React.Ref<HTMLDivElement>\n  count?: number\n  color?: string\n  blur?: number\n  speed?: number\n  length?: string\n}\n\ntype LightRay = {\n  id: string\n  left: number\n  rotate: number\n  width: number\n  swing: number\n  delay: number\n  duration: number\n  intensity: number\n}\n\nconst createRays = (count: number, cycle: number): LightRay[] => {\n  if (count <= 0) return []\n\n  return Array.from({ length: count }, (_, index) => {\n    const left = 8 + Math.random() * 84\n    const rotate = -28 + Math.random() * 56\n    const width = 160 + Math.random() * 160\n    const swing = 0.8 + Math.random() * 1.8\n    const delay = Math.random() * cycle\n    const duration = cycle * (0.75 + Math.random() * 0.5)\n    const intensity = 0.6 + Math.random() * 0.5\n\n    return {\n      id: `${index}-${Math.round(left * 10)}`,\n      left,\n      rotate,\n      width,\n      swing,\n      delay,\n      duration,\n      intensity,\n    }\n  })\n}\n\nconst Ray = ({\n  left,\n  rotate,\n  width,\n  swing,\n  delay,\n  duration,\n  intensity,\n}: LightRay) => {\n  return (\n    <motion.div\n      className=\"pointer-events-none absolute -top-[12%] left-[var(--ray-left)] h-[var(--light-rays-length)] w-[var(--ray-width)] origin-top -translate-x-1/2 rounded-full bg-linear-to-b from-[color-mix(in_srgb,var(--light-rays-color)_70%,transparent)] to-transparent opacity-0 mix-blend-screen blur-[var(--light-rays-blur)]\"\n      style={\n        {\n          \"--ray-left\": `${left}%`,\n          \"--ray-width\": `${width}px`,\n        } as CSSProperties\n      }\n      initial={{ rotate: rotate }}\n      animate={{\n        opacity: [0, intensity, 0],\n        rotate: [rotate - swing, rotate + swing, rotate - swing],\n      }}\n      transition={{\n        duration: duration,\n        repeat: Infinity,\n        ease: \"easeInOut\",\n        delay: delay,\n        repeatDelay: duration * 0.1,\n      }}\n    />\n  )\n}\n\nexport function LightRays({\n  className,\n  style,\n  count = 7,\n  color = \"rgba(160, 210, 255, 0.2)\",\n  blur = 36,\n  speed = 14,\n  length = \"70vh\",\n  ref,\n  ...props\n}: LightRaysProps) {\n  const [rays, setRays] = useState<LightRay[]>([])\n  const cycleDuration = Math.max(speed, 0.1)\n\n  useEffect(() => {\n    setRays(createRays(count, cycleDuration))\n  }, [count, cycleDuration])\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"pointer-events-none absolute inset-0 isolate overflow-hidden rounded-[inherit]\",\n        className\n      )}\n      style={\n        {\n          \"--light-rays-color\": color,\n          \"--light-rays-blur\": `${blur}px`,\n          \"--light-rays-length\": length,\n          ...style,\n        } as CSSProperties\n      }\n      {...props}\n    >\n      <div className=\"absolute inset-0 overflow-hidden\">\n        <div\n          aria-hidden\n          className=\"absolute inset-0 opacity-60\"\n          style={\n            {\n              background:\n                \"radial-gradient(circle at 20% 15%, color-mix(in srgb, var(--light-rays-color) 45%, transparent), transparent 70%)\",\n            } as CSSProperties\n          }\n        />\n        <div\n          aria-hidden\n          className=\"absolute inset-0 opacity-60\"\n          style={\n            {\n              background:\n                \"radial-gradient(circle at 80% 10%, color-mix(in srgb, var(--light-rays-color) 35%, transparent), transparent 75%)\",\n            } as CSSProperties\n          }\n        />\n        {rays.map((ray) => (\n          <Ray key={ray.id} {...ray} />\n        ))}\n      </div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: light-rays-demo =====\nTitle: light-rays-demo\n\n--- file: example/light-rays-demo.tsx ---\nimport { LightRays } from \"@/registry/magicui/light-rays\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"relative z-10 flex h-full flex-col items-center justify-center gap-4 px-6 text-center\">\n        <span className=\"text-xs font-semibold tracking-[0.35em] text-slate-800/60 uppercase dark:text-slate-200/60\">\n          Ambient glow\n        </span>\n        <h1 className=\"text-foreground text-4xl font-bold md:text-5xl\">\n          Light Rays\n        </h1>\n        <p className=\"max-w-md text-sm text-slate-800/80 md:text-base dark:text-slate-200/80\">\n          Drop this component into any container and it will fill the space with\n          softly animated light rays shining from above.\n        </p>\n      </div>\n      <LightRays />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: line-shadow-text =====\nTitle: Line Shadow Text\nDescription: A text component with a moving line shadow.\n\n--- file: magicui/line-shadow-text.tsx ---\n\"use client\"\n\nimport { type CSSProperties, type HTMLAttributes } from \"react\"\nimport {\n  motion,\n  type DOMMotionComponents,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\n\ninterface LineShadowTextProps\n  extends Omit<HTMLAttributes<HTMLElement>, keyof MotionProps>, MotionProps {\n  children: string\n  shadowColor?: string\n  as?: MotionElementType\n}\n\nexport function LineShadowText({\n  children,\n  shadowColor = \"black\",\n  className,\n  as: Component = \"span\",\n  ...props\n}: LineShadowTextProps) {\n  const MotionComponent = motionElements[Component]\n\n  return (\n    <MotionComponent\n      style={{ \"--shadow-color\": shadowColor } as CSSProperties}\n      className={cn(\n        \"relative z-0 inline-flex\",\n        \"after:absolute after:top-[0.04em] after:left-[0.04em] after:content-[attr(data-text)]\",\n        \"after:bg-[linear-gradient(45deg,transparent_45%,var(--shadow-color)_45%,var(--shadow-color)_55%,transparent_0)]\",\n        \"after:-z-10 after:bg-size-[0.06em_0.06em] after:bg-clip-text after:text-transparent\",\n        \"after:animate-line-shadow\",\n        className\n      )}\n      data-text={children}\n      {...props}\n    >\n      {children}\n    </MotionComponent>\n  )\n}\n\n\n===== EXAMPLE: line-shadow-text-demo =====\nTitle: Line Shadow Text Demo\n\n--- file: example/line-shadow-text-demo.tsx ---\n\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { LineShadowText } from \"@/registry/magicui/line-shadow-text\"\n\nexport default function LineShadowTextDemo() {\n  const theme = useTheme()\n  const shadowColor = theme.resolvedTheme === \"dark\" ? \"white\" : \"black\"\n  return (\n    <h1 className=\"text-5xl leading-none font-semibold tracking-tighter text-balance sm:text-6xl md:text-7xl lg:text-8xl\">\n      Ship\n      <LineShadowText className=\"italic\" shadowColor={shadowColor}>\n        Fast\n      </LineShadowText>\n    </h1>\n  )\n}\n\n\n\n===== COMPONENT: magic-card =====\nTitle: Magic Card\nDescription: A spotlight effect that follows your mouse cursor and highlights borders on hover.\n\n--- file: magicui/magic-card.tsx ---\n\"use client\"\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n  motion,\n  useMotionTemplate,\n  useMotionValue,\n  useSpring,\n} from \"motion/react\"\nimport { useTheme } from \"next-themes\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MagicCardBaseProps {\n  children?: React.ReactNode\n  className?: string\n  gradientSize?: number\n  gradientFrom?: string\n  gradientTo?: string\n}\n\ninterface MagicCardGradientProps extends MagicCardBaseProps {\n  mode?: \"gradient\"\n\n  gradientColor?: string\n  gradientOpacity?: number\n\n  glowFrom?: never\n  glowTo?: never\n  glowAngle?: never\n  glowSize?: never\n  glowBlur?: never\n  glowOpacity?: never\n}\n\ninterface MagicCardOrbProps extends MagicCardBaseProps {\n  mode: \"orb\"\n\n  glowFrom?: string\n  glowTo?: string\n  glowAngle?: number\n  glowSize?: number\n  glowBlur?: number\n  glowOpacity?: number\n\n  gradientColor?: never\n  gradientOpacity?: never\n}\n\ntype MagicCardProps = MagicCardGradientProps | MagicCardOrbProps\ntype ResetReason = \"enter\" | \"leave\" | \"global\" | \"init\"\n\nfunction isOrbMode(props: MagicCardProps): props is MagicCardOrbProps {\n  return props.mode === \"orb\"\n}\n\nexport function MagicCard(props: MagicCardProps) {\n  const {\n    children,\n    className,\n    gradientSize = 200,\n    gradientColor = \"#262626\",\n    gradientOpacity = 0.8,\n    gradientFrom = \"#9E7AFF\",\n    gradientTo = \"#FE8BBB\",\n    mode = \"gradient\",\n  } = props\n\n  const glowFrom = isOrbMode(props) ? (props.glowFrom ?? \"#ee4f27\") : \"#ee4f27\"\n  const glowTo = isOrbMode(props) ? (props.glowTo ?? \"#6b21ef\") : \"#6b21ef\"\n  const glowAngle = isOrbMode(props) ? (props.glowAngle ?? 90) : 90\n  const glowSize = isOrbMode(props) ? (props.glowSize ?? 420) : 420\n  const glowBlur = isOrbMode(props) ? (props.glowBlur ?? 60) : 60\n  const glowOpacity = isOrbMode(props) ? (props.glowOpacity ?? 0.9) : 0.9\n  const { theme, systemTheme } = useTheme()\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => setMounted(true), [])\n\n  const isDarkTheme = useMemo(() => {\n    if (!mounted) return true\n    const currentTheme = theme === \"system\" ? systemTheme : theme\n    return currentTheme === \"dark\"\n  }, [theme, systemTheme, mounted])\n\n  const mouseX = useMotionValue(-gradientSize)\n  const mouseY = useMotionValue(-gradientSize)\n\n  const orbX = useSpring(mouseX, { stiffness: 250, damping: 30, mass: 0.6 })\n  const orbY = useSpring(mouseY, { stiffness: 250, damping: 30, mass: 0.6 })\n  const orbVisible = useSpring(0, { stiffness: 300, damping: 35 })\n\n  const modeRef = useRef(mode)\n  const glowOpacityRef = useRef(glowOpacity)\n  const gradientSizeRef = useRef(gradientSize)\n\n  useEffect(() => {\n    modeRef.current = mode\n  }, [mode])\n\n  useEffect(() => {\n    glowOpacityRef.current = glowOpacity\n  }, [glowOpacity])\n\n  useEffect(() => {\n    gradientSizeRef.current = gradientSize\n  }, [gradientSize])\n\n  const reset = useCallback(\n    (reason: ResetReason = \"leave\") => {\n      const currentMode = modeRef.current\n\n      if (currentMode === \"orb\") {\n        if (reason === \"enter\") orbVisible.set(glowOpacityRef.current)\n        else orbVisible.set(0)\n        return\n      }\n\n      const off = -gradientSizeRef.current\n      mouseX.set(off)\n      mouseY.set(off)\n    },\n    [mouseX, mouseY, orbVisible]\n  )\n\n  const handlePointerMove = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      const rect = e.currentTarget.getBoundingClientRect()\n      mouseX.set(e.clientX - rect.left)\n      mouseY.set(e.clientY - rect.top)\n    },\n    [mouseX, mouseY]\n  )\n\n  useEffect(() => {\n    reset(\"init\")\n  }, [reset])\n\n  useEffect(() => {\n    const handleGlobalPointerOut = (e: PointerEvent) => {\n      if (!e.relatedTarget) reset(\"global\")\n    }\n    const handleBlur = () => reset(\"global\")\n    const handleVisibility = () => {\n      if (document.visibilityState !== \"visible\") reset(\"global\")\n    }\n\n    window.addEventListener(\"pointerout\", handleGlobalPointerOut)\n    window.addEventListener(\"blur\", handleBlur)\n    document.addEventListener(\"visibilitychange\", handleVisibility)\n\n    return () => {\n      window.removeEventListener(\"pointerout\", handleGlobalPointerOut)\n      window.removeEventListener(\"blur\", handleBlur)\n      document.removeEventListener(\"visibilitychange\", handleVisibility)\n    }\n  }, [reset])\n\n  return (\n    <motion.div\n      className={cn(\n        \"group relative isolate overflow-hidden rounded-[inherit] border border-transparent\",\n        className\n      )}\n      onPointerMove={handlePointerMove}\n      onPointerLeave={() => reset(\"leave\")}\n      onPointerEnter={() => reset(\"enter\")}\n      style={{\n        background: useMotionTemplate`\n          linear-gradient(var(--color-background) 0 0) padding-box,\n          radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\n            ${gradientFrom},\n            ${gradientTo},\n            var(--color-border) 100%\n          ) border-box\n        `,\n      }}\n    >\n      <div className=\"bg-background absolute inset-px z-20 rounded-[inherit]\" />\n\n      {mode === \"gradient\" && (\n        <motion.div\n          suppressHydrationWarning\n          className=\"pointer-events-none absolute inset-px z-30 rounded-[inherit] opacity-0 transition-opacity duration-300 group-hover:opacity-100\"\n          style={{\n            background: useMotionTemplate`\n              radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\n                ${gradientColor},\n                transparent 100%\n              )\n            `,\n            opacity: gradientOpacity,\n          }}\n        />\n      )}\n\n      {mode === \"orb\" && (\n        <motion.div\n          suppressHydrationWarning\n          aria-hidden=\"true\"\n          className=\"pointer-events-none absolute z-30\"\n          style={{\n            width: glowSize,\n            height: glowSize,\n            x: orbX,\n            y: orbY,\n            translateX: \"-50%\",\n            translateY: \"-50%\",\n            borderRadius: 9999,\n            filter: `blur(${glowBlur}px)`,\n            opacity: orbVisible,\n            background: `linear-gradient(${glowAngle}deg, ${glowFrom}, ${glowTo})`,\n\n            mixBlendMode: isDarkTheme ? \"screen\" : \"multiply\",\n            willChange: \"transform, opacity\",\n          }}\n        />\n      )}\n      <div className=\"relative z-40\">{children}</div>\n    </motion.div>\n  )\n}\n\n\n===== EXAMPLE: magic-card-demo =====\nTitle: Magic Card Demo\n\n--- file: example/magic-card-demo.tsx ---\n\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { MagicCard } from \"@/registry/magicui/magic-card\"\n\nexport default function MagicCardDemo() {\n  const { theme } = useTheme()\n  return (\n    <Card className=\"w-full max-w-sm border-none p-0 shadow-none\">\n      <MagicCard\n        gradientColor={theme === \"dark\" ? \"#262626\" : \"#D9D9D955\"}\n        className=\"p-0\"\n      >\n        <CardHeader className=\"border-border border-b p-4 [.border-b]:pb-4\">\n          <CardTitle>Login</CardTitle>\n          <CardDescription>\n            Enter your credentials to access your account\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"p-4\">\n          <form>\n            <div className=\"grid gap-4\">\n              <div className=\"grid gap-2\">\n                <Label htmlFor=\"email\">Email</Label>\n                <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n              </div>\n              <div className=\"grid gap-2\">\n                <Label htmlFor=\"password\">Password</Label>\n                <Input id=\"password\" type=\"password\" />\n              </div>\n            </div>\n          </form>\n        </CardContent>\n        <CardFooter className=\"border-border border-t p-4 [.border-t]:pt-4\">\n          <Button className=\"w-full\">Sign In</Button>\n        </CardFooter>\n      </MagicCard>\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: magic-card-demo-2 =====\nTitle: Magic Card Demo 2\n\n--- file: example/magic-card-demo2.tsx ---\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Link from \"next/link\"\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { AvatarCircles } from \"@/registry/magicui/avatar-circles\"\nimport { MagicCard } from \"@/registry/magicui/magic-card\"\n\nexport default function MagicCardDemo() {\n  const { theme, systemTheme } = useTheme()\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => {\n    setMounted(true)\n  }, [])\n\n  const isDark = mounted\n    ? (theme === \"system\" ? systemTheme : theme) === \"dark\"\n    : true\n\n  return (\n    <Card className=\"w-full max-w-sm border-none p-0 shadow-none\">\n      <MagicCard\n        mode=\"orb\"\n        glowFrom={isDark ? \"#ee4f27\" : \"#E9D5FF\"}\n        glowTo={isDark ? \"#6b21ef\" : \"#FBCFE8\"}\n        className=\"p-0\"\n      >\n        <CardHeader className=\"border-border border-b p-4 [.border-b]:pb-4\">\n          <div className=\"flex items-center gap-3\">\n            <AvatarCircles\n              avatarUrls={[\n                {\n                  imageUrl: \"https://avatars.githubusercontent.com/u/81306489\",\n                  profileUrl: \"https://github.com/Yeom-JinHo\",\n                },\n              ]}\n            />\n            <div className=\"flex-1\">\n              <CardTitle>Yeom JinHo</CardTitle>\n              <CardDescription className=\"mt-1\">\n                Frontend Developer\n              </CardDescription>\n            </div>\n          </div>\n        </CardHeader>\n        <CardContent className=\"space-y-2 p-4\">\n          <p className=\"text-sm font-medium\">\n            Frontend Developer focused on Interactive UI &amp; Performance\n          </p>\n          <p className=\"text-muted-foreground text-sm leading-relaxed\">\n            I&apos;m passionate about visual presentation and currently focusing\n            on interactive UI.\n          </p>\n        </CardContent>\n        <CardFooter className=\"border-border border-t p-4 [.border-t]:pt-4\">\n          <Button asChild className=\"w-full\">\n            <Link\n              href=\"https://github.com/Yeom-JinHo\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"flex items-center justify-center gap-2\"\n            >\n              <svg viewBox=\"0 0 438.549 438.549\" className=\"size-4\">\n                <path\n                  fill=\"currentColor\"\n                  d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n                ></path>\n              </svg>\n              View on GitHub\n            </Link>\n          </Button>\n        </CardFooter>\n      </MagicCard>\n    </Card>\n  )\n}\n\n\n\n===== COMPONENT: marquee =====\nTitle: Marquee\nDescription: An infinite scrolling component that can be used to display text, images, or videos.\n\n--- file: magicui/marquee.tsx ---\nimport { type ComponentPropsWithoutRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MarqueeProps extends ComponentPropsWithoutRef<\"div\"> {\n  /**\n   * Optional CSS class name to apply custom styles\n   */\n  className?: string\n  /**\n   * Whether to reverse the animation direction\n   * @default false\n   */\n  reverse?: boolean\n  /**\n   * Whether to pause the animation on hover\n   * @default false\n   */\n  pauseOnHover?: boolean\n  /**\n   * Content to be displayed in the marquee\n   */\n  children: React.ReactNode\n  /**\n   * Whether to animate vertically instead of horizontally\n   * @default false\n   */\n  vertical?: boolean\n  /**\n   * Number of times to repeat the content\n   * @default 4\n   */\n  repeat?: number\n}\n\nexport function Marquee({\n  className,\n  reverse = false,\n  pauseOnHover = false,\n  children,\n  vertical = false,\n  repeat = 4,\n  ...props\n}: MarqueeProps) {\n  return (\n    <div\n      {...props}\n      className={cn(\n        \"group flex gap-(--gap) overflow-hidden p-2 [--duration:40s] [--gap:1rem]\",\n        {\n          \"flex-row\": !vertical,\n          \"flex-col\": vertical,\n        },\n        className\n      )}\n    >\n      {Array(repeat)\n        .fill(0)\n        .map((_, i) => (\n          <div\n            key={i}\n            className={cn(\"flex shrink-0 justify-around gap-(--gap)\", {\n              \"animate-marquee flex-row\": !vertical,\n              \"animate-marquee-vertical flex-col\": vertical,\n              \"group-hover:[animation-play-state:paused]\": pauseOnHover,\n              \"[animation-direction:reverse]\": reverse,\n            })}\n          >\n            {children}\n          </div>\n        ))}\n    </div>\n  )\n}\n\n\n===== EXAMPLE: marquee-demo =====\nTitle: Marquee Demo\n\n--- file: example/marquee-demo.tsx ---\nimport { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n  {\n    name: \"Jane\",\n    username: \"@jane\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jane\",\n  },\n  {\n    name: \"Jenny\",\n    username: \"@jenny\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jenny\",\n  },\n  {\n    name: \"James\",\n    username: \"@james\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/james\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-64 cursor-pointer overflow-hidden rounded-xl border p-4\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function MarqueeDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden\">\n      <Marquee pauseOnHover className=\"[--duration:20s]\">\n        {firstRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <Marquee reverse pauseOnHover className=\"[--duration:20s]\">\n        {secondRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: marquee-demo-vertical =====\nTitle: Marquee Vertical Demo\n\n--- file: example/marquee-demo-vertical.tsx ---\nimport { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function MarqueeDemoVertical() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-row items-center justify-center overflow-hidden\">\n      <Marquee pauseOnHover vertical className=\"[--duration:20s]\">\n        {firstRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <Marquee reverse pauseOnHover vertical className=\"[--duration:20s]\">\n        {secondRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: marquee-logos =====\nTitle: Marquee Logos\n\n--- file: example/marquee-logos.tsx ---\nimport { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst logos = [\n  {\n    name: \"Microsoft\",\n    img: \"https://cdn.simpleicons.org/microsoft/000/fff\",\n  },\n  {\n    name: \"Apple\",\n    img: \"https://cdn.simpleicons.org/apple/000/fff\",\n  },\n  {\n    name: \"Google\",\n    img: \"https://cdn.simpleicons.org/google/000/fff\",\n  },\n  {\n    name: \"Facebook\",\n    img: \"https://cdn.simpleicons.org/facebook/000/fff\",\n  },\n  {\n    name: \"LinkedIn\",\n    img: \"https://cdn.simpleicons.org/linkedin/000/fff\",\n  },\n  {\n    name: \"Twitter\",\n    img: \"https://cdn.simpleicons.org/twitter/000/fff\",\n  },\n]\n\nconst Logo = ({ name, img }: { name: string; img: string }) => {\n  return (\n    <div className={cn(\"size-12 cursor-pointer\")}>\n      <img src={img} alt={name} />\n    </div>\n  )\n}\n\nexport default function MarqueeLogos() {\n  return (\n    <div className=\"bg-background relative flex size-full flex-col items-center justify-center gap-4 overflow-hidden rounded-lg border py-20 md:shadow-xl\">\n      <Marquee className=\"[--gap:3rem]\">\n        {logos.map((logo, idx) => (\n          <Logo key={idx} {...logo} />\n        ))}\n      </Marquee>\n      <div className=\"dark:from-background pointer-events-none absolute inset-y-0 left-0 w-1/3 bg-gradient-to-r from-white\"></div>\n      <div className=\"dark:from-background pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white\"></div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: marquee-3d =====\nTitle: Marquee 3D\n\n--- file: example/marquee-3d.tsx ---\nimport { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\nconst thirdRow = reviews.slice(0, reviews.length / 2)\nconst fourthRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function Marquee3D() {\n  return (\n    <div className=\"relative flex h-96 w-full flex-row items-center justify-center gap-4 overflow-hidden [perspective:300px]\">\n      <div\n        className=\"flex flex-row items-center gap-4\"\n        style={{\n          transform:\n            \"translateX(-100px) translateY(0px) translateZ(-100px) rotateX(20deg) rotateY(-10deg) rotateZ(20deg)\",\n        }}\n      >\n        <Marquee pauseOnHover vertical className=\"[--duration:20s]\">\n          {firstRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee reverse pauseOnHover className=\"[--duration:20s]\" vertical>\n          {secondRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee reverse pauseOnHover className=\"[--duration:20s]\" vertical>\n          {thirdRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee pauseOnHover className=\"[--duration:20s]\" vertical>\n          {fourthRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n      </div>\n\n      <div className=\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: bento-demo =====\nTitle: Bento Demo\n\n--- file: example/bento-demo.tsx ---\nimport { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\"\nimport { BellIcon, Share2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\"\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\"\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst files = [\n  {\n    name: \"bitcoin.pdf\",\n    body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n  },\n  {\n    name: \"finances.xlsx\",\n    body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n  },\n  {\n    name: \"logo.svg\",\n    body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n  },\n  {\n    name: \"keys.gpg\",\n    body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n  },\n  {\n    name: \"seed.txt\",\n    body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n  },\n]\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-1\",\n    background: (\n      <Marquee\n        pauseOnHover\n        className=\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\"\n      >\n        {files.map((f, idx) => (\n          <figure\n            key={idx}\n            className={cn(\n              \"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\",\n              \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n              \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\",\n              \"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\"\n            )}\n          >\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"flex flex-col\">\n                <figcaption className=\"text-sm font-medium dark:text-white\">\n                  {f.name}\n                </figcaption>\n              </div>\n            </div>\n            <blockquote className=\"mt-2 text-xs\">{f.body}</blockquote>\n          </figure>\n        ))}\n      </Marquee>\n    ),\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description: \"Get notified when something happens.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedListDemo className=\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\" />\n    ),\n  },\n  {\n    Icon: Share2Icon,\n    name: \"Integrations\",\n    description: \"Supports 100+ integrations and counting.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedBeamMultipleOutputDemo className=\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\" />\n    ),\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    className: \"col-span-3 lg:col-span-1\",\n    href: \"#\",\n    cta: \"Learn more\",\n    background: (\n      <Calendar\n        mode=\"single\"\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\n        className=\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\"\n      />\n    ),\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid>\n      {features.map((feature, idx) => (\n        <BentoCard key={idx} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n\n\n\n===== COMPONENT: meteors =====\nTitle: Meteors\nDescription: A meteor shower effect.\n\n--- file: magicui/meteors.tsx ---\n\"use client\"\n\nimport React, { useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MeteorsProps {\n  number?: number\n  minDelay?: number\n  maxDelay?: number\n  minDuration?: number\n  maxDuration?: number\n  angle?: number\n  className?: string\n}\n\nexport const Meteors = ({\n  number = 20,\n  minDelay = 0.2,\n  maxDelay = 1.2,\n  minDuration = 2,\n  maxDuration = 10,\n  angle = 215,\n  className,\n}: MeteorsProps) => {\n  const [meteorStyles, setMeteorStyles] = useState<Array<React.CSSProperties>>(\n    []\n  )\n\n  useEffect(() => {\n    const styles = [...new Array(number)].map(() => ({\n      \"--angle\": -angle + \"deg\",\n      top: \"-5%\",\n      left: `calc(0% + ${Math.floor(Math.random() * window.innerWidth)}px)`,\n      animationDelay: Math.random() * (maxDelay - minDelay) + minDelay + \"s\",\n      animationDuration:\n        Math.floor(Math.random() * (maxDuration - minDuration) + minDuration) +\n        \"s\",\n    }))\n    setMeteorStyles(styles)\n  }, [number, minDelay, maxDelay, minDuration, maxDuration, angle])\n\n  return (\n    <>\n      {[...meteorStyles].map((style, idx) => (\n        // Meteor Head\n        <span\n          key={idx}\n          style={{ ...style }}\n          className={cn(\n            \"animate-meteor pointer-events-none absolute size-0.5 rotate-(--angle) rounded-full bg-zinc-500 shadow-[0_0_0_1px_#ffffff10]\",\n            className\n          )}\n        >\n          {/* Meteor Tail */}\n          <div className=\"pointer-events-none absolute top-1/2 -z-10 h-px w-12.5 -translate-y-1/2 bg-linear-to-r from-zinc-500 to-transparent\" />\n        </span>\n      ))}\n    </>\n  )\n}\n\n\n===== EXAMPLE: meteors-demo =====\nTitle: Meteors Demo\n\n--- file: example/meteors-demo.tsx ---\nimport { Meteors } from \"@/registry/magicui/meteors\"\n\nexport default function MeteorDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <Meteors number={30} />\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Meteors\n      </span>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: morphing-text =====\nTitle: Morphing Text\nDescription: A dynamic text morphing component for Magic UI.\n\n--- file: magicui/morphing-text.tsx ---\n\"use client\"\n\nimport { useCallback, useEffect, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst morphTime = 1.5\nconst cooldownTime = 0.5\n\nconst useMorphingText = (texts: string[]) => {\n  const textIndexRef = useRef(0)\n  const morphRef = useRef(0)\n  const cooldownRef = useRef(0)\n  const timeRef = useRef(new Date())\n\n  const text1Ref = useRef<HTMLSpanElement>(null)\n  const text2Ref = useRef<HTMLSpanElement>(null)\n\n  const setStyles = useCallback(\n    (fraction: number) => {\n      const [current1, current2] = [text1Ref.current, text2Ref.current]\n      if (!current1 || !current2) return\n\n      current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`\n      current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`\n\n      const invertedFraction = 1 - fraction\n      current1.style.filter = `blur(${Math.min(\n        8 / invertedFraction - 8,\n        100\n      )}px)`\n      current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`\n\n      current1.textContent = texts[textIndexRef.current % texts.length]\n      current2.textContent = texts[(textIndexRef.current + 1) % texts.length]\n    },\n    [texts]\n  )\n\n  const doMorph = useCallback(() => {\n    morphRef.current -= cooldownRef.current\n    cooldownRef.current = 0\n\n    let fraction = morphRef.current / morphTime\n\n    if (fraction > 1) {\n      cooldownRef.current = cooldownTime\n      fraction = 1\n    }\n\n    setStyles(fraction)\n\n    if (fraction === 1) {\n      textIndexRef.current++\n    }\n  }, [setStyles])\n\n  const doCooldown = useCallback(() => {\n    morphRef.current = 0\n    const [current1, current2] = [text1Ref.current, text2Ref.current]\n    if (current1 && current2) {\n      current2.style.filter = \"none\"\n      current2.style.opacity = \"100%\"\n      current1.style.filter = \"none\"\n      current1.style.opacity = \"0%\"\n    }\n  }, [])\n\n  useEffect(() => {\n    let animationFrameId: number\n\n    const animate = () => {\n      animationFrameId = requestAnimationFrame(animate)\n\n      const newTime = new Date()\n      const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000\n      timeRef.current = newTime\n\n      cooldownRef.current -= dt\n\n      if (cooldownRef.current <= 0) doMorph()\n      else doCooldown()\n    }\n\n    animate()\n    return () => {\n      cancelAnimationFrame(animationFrameId)\n    }\n  }, [doMorph, doCooldown])\n\n  return { text1Ref, text2Ref }\n}\n\ninterface MorphingTextProps {\n  className?: string\n  texts: string[]\n}\n\nconst Texts: React.FC<Pick<MorphingTextProps, \"texts\">> = ({ texts }) => {\n  const { text1Ref, text2Ref } = useMorphingText(texts)\n  return (\n    <>\n      <span\n        className=\"absolute inset-x-0 top-0 m-auto inline-block w-full\"\n        ref={text1Ref}\n      />\n      <span\n        className=\"absolute inset-x-0 top-0 m-auto inline-block w-full\"\n        ref={text2Ref}\n      />\n    </>\n  )\n}\n\nconst SvgFilters: React.FC = () => (\n  <svg\n    id=\"filters\"\n    className=\"fixed h-0 w-0\"\n    preserveAspectRatio=\"xMidYMid slice\"\n  >\n    <defs>\n      <filter id=\"threshold\">\n        <feColorMatrix\n          in=\"SourceGraphic\"\n          type=\"matrix\"\n          values=\"1 0 0 0 0\n                  0 1 0 0 0\n                  0 0 1 0 0\n                  0 0 0 255 -140\"\n        />\n      </filter>\n    </defs>\n  </svg>\n)\n\nexport const MorphingText: React.FC<MorphingTextProps> = ({\n  texts,\n  className,\n}) => (\n  <div\n    className={cn(\n      \"relative mx-auto h-16 w-full max-w-3xl text-center font-sans text-[40pt] leading-none font-bold filter-[url(#threshold)_blur(0.6px)] md:h-24 lg:text-[6rem]\",\n      className\n    )}\n  >\n    <Texts texts={texts} />\n    <SvgFilters />\n  </div>\n)\n\n\n===== EXAMPLE: morphing-text-demo =====\nTitle: Morphing Text Demo\n\n--- file: example/morphing-text-demo.tsx ---\nimport { MorphingText } from \"@/registry/magicui/morphing-text\"\n\nconst texts = [\n  \"Hello\",\n  \"Morphing\",\n  \"Text\",\n  \"Animation\",\n  \"React\",\n  \"Component\",\n  \"Smooth\",\n  \"Transition\",\n  \"Engaging\",\n]\n\nexport default function MorphingTextDemo() {\n  return <MorphingText texts={texts} />\n}\n\n\n\n===== COMPONENT: neon-gradient-card =====\nTitle: Neon Gradient Card\nDescription: A beautiful neon card effect\n\n--- file: magicui/neon-gradient-card.tsx ---\n\"use client\"\n\nimport {\n  CSSProperties,\n  ReactElement,\n  ReactNode,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface NeonColorsProps {\n  firstColor: string\n  secondColor: string\n}\n\ninterface NeonGradientCardProps extends React.HTMLAttributes<HTMLDivElement> {\n  /**\n   * @default <div />\n   * @type ReactElement\n   * @description\n   * The component to be rendered as the card\n   * */\n  as?: ReactElement\n  /**\n   * @default \"\"\n   * @type string\n   * @description\n   * The className of the card\n   */\n  className?: string\n\n  /**\n   * @default \"\"\n   * @type ReactNode\n   * @description\n   * The children of the card\n   * */\n  children?: ReactNode\n\n  /**\n   * @default 5\n   * @type number\n   * @description\n   * The size of the border in pixels\n   * */\n  borderSize?: number\n\n  /**\n   * @default 20\n   * @type number\n   * @description\n   * The size of the radius in pixels\n   * */\n  borderRadius?: number\n\n  /**\n   * @default \"{ firstColor: '#ff00aa', secondColor: '#00FFF1' }\"\n   * @type string\n   * @description\n   * The colors of the neon gradient\n   * */\n  neonColors?: NeonColorsProps\n}\n\nexport const NeonGradientCard: React.FC<NeonGradientCardProps> = ({\n  className,\n  children,\n  borderSize = 2,\n  borderRadius = 20,\n  neonColors = {\n    firstColor: \"#ff00aa\",\n    secondColor: \"#00FFF1\",\n  },\n  ...props\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n  useEffect(() => {\n    const updateDimensions = () => {\n      if (containerRef.current) {\n        const { offsetWidth, offsetHeight } = containerRef.current\n        setDimensions({ width: offsetWidth, height: offsetHeight })\n      }\n    }\n\n    updateDimensions()\n    window.addEventListener(\"resize\", updateDimensions)\n\n    return () => {\n      window.removeEventListener(\"resize\", updateDimensions)\n    }\n  }, [])\n\n  useEffect(() => {\n    if (containerRef.current) {\n      const { offsetWidth, offsetHeight } = containerRef.current\n      setDimensions({ width: offsetWidth, height: offsetHeight })\n    }\n  }, [children])\n\n  return (\n    <div\n      ref={containerRef}\n      style={\n        {\n          \"--border-size\": `${borderSize}px`,\n          \"--border-radius\": `${borderRadius}px`,\n          \"--neon-first-color\": neonColors.firstColor,\n          \"--neon-second-color\": neonColors.secondColor,\n          \"--card-width\": `${dimensions.width}px`,\n          \"--card-height\": `${dimensions.height}px`,\n          \"--card-content-radius\": `${borderRadius - borderSize}px`,\n          \"--pseudo-element-background-image\": `linear-gradient(0deg, ${neonColors.firstColor}, ${neonColors.secondColor})`,\n          \"--pseudo-element-width\": `${dimensions.width + borderSize * 2}px`,\n          \"--pseudo-element-height\": `${dimensions.height + borderSize * 2}px`,\n          \"--after-blur\": `${dimensions.width / 3}px`,\n        } as CSSProperties\n      }\n      className={cn(\n        \"relative z-10 size-full rounded-(--border-radius)\",\n        className\n      )}\n      {...props}\n    >\n      <div\n        className={cn(\n          \"relative size-full min-h-[inherit] rounded-(--card-content-radius) bg-gray-100 p-6\",\n          \"before:absolute before:-top-(--border-size) before:-left-(--border-size) before:-z-10 before:block\",\n          \"before:h-(--pseudo-element-height) before:w-(--pseudo-element-width) before:rounded-(--border-radius) before:content-['']\",\n          \"before:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] before:bg-size-[100%_200%]\",\n          \"before:animate-background-position-spin\",\n          \"after:absolute after:-top-(--border-size) after:-left-(--border-size) after:-z-10 after:block\",\n          \"after:h-(--pseudo-element-height) after:w-(--pseudo-element-width) after:rounded-(--border-radius) after:blur-(--after-blur) after:content-['']\",\n          \"after:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] after:bg-size-[100%_200%] after:opacity-80\",\n          \"after:animate-background-position-spin\",\n          \"dark:bg-neutral-900\",\n          \"wrap-break-word\"\n        )}\n      >\n        {children}\n      </div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: neon-gradient-card-demo =====\nTitle: Neon Gradient Card Demo\n\n--- file: example/neon-gradient-card-demo.tsx ---\nimport { NeonGradientCard } from \"@/registry/magicui/neon-gradient-card\"\n\nexport default function NeonGradientCardDemo() {\n  return (\n    <NeonGradientCard className=\"max-w-sm items-center justify-center text-center\">\n      <span className=\"pointer-events-none z-10 h-full bg-linear-to-br from-[#ff2975] from-35% to-[#00FFF1] bg-clip-text text-center text-3xl leading-none font-bold tracking-tighter text-balance whitespace-pre-wrap text-transparent md:text-5xl xl:text-6xl dark:drop-shadow-[0_5px_5px_rgba(0,0,0,0.8)]\">\n        Neon Gradient Card\n      </span>\n    </NeonGradientCard>\n  )\n}\n\n\n\n===== COMPONENT: number-ticker =====\nTitle: Number Ticker\nDescription: Animate numbers to count up or down to a target number\n\n--- file: magicui/number-ticker.tsx ---\n\"use client\"\n\nimport { useEffect, useRef, type ComponentPropsWithoutRef } from \"react\"\nimport { useInView, useMotionValue, useSpring } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface NumberTickerProps extends ComponentPropsWithoutRef<\"span\"> {\n  value: number\n  startValue?: number\n  direction?: \"up\" | \"down\"\n  delay?: number\n  decimalPlaces?: number\n}\n\nexport function NumberTicker({\n  value,\n  startValue = 0,\n  direction = \"up\",\n  delay = 0,\n  className,\n  decimalPlaces = 0,\n  ...props\n}: NumberTickerProps) {\n  const ref = useRef<HTMLSpanElement>(null)\n  const motionValue = useMotionValue(direction === \"down\" ? value : startValue)\n  const springValue = useSpring(motionValue, {\n    damping: 60,\n    stiffness: 100,\n  })\n  const isInView = useInView(ref, { once: true, margin: \"0px\" })\n\n  useEffect(() => {\n    let timer: ReturnType<typeof setTimeout> | null = null\n\n    if (isInView) {\n      timer = setTimeout(() => {\n        motionValue.set(direction === \"down\" ? startValue : value)\n      }, delay * 1000)\n    }\n\n    return () => {\n      if (timer !== null) {\n        clearTimeout(timer)\n      }\n    }\n  }, [motionValue, isInView, delay, value, direction, startValue])\n\n  useEffect(\n    () =>\n      springValue.on(\"change\", (latest) => {\n        if (ref.current) {\n          ref.current.textContent = Intl.NumberFormat(\"en-US\", {\n            minimumFractionDigits: decimalPlaces,\n            maximumFractionDigits: decimalPlaces,\n          }).format(Number(latest.toFixed(decimalPlaces)))\n        }\n      }),\n    [springValue, decimalPlaces]\n  )\n\n  return (\n    <span\n      ref={ref}\n      className={cn(\n        \"inline-block tracking-wider text-black tabular-nums dark:text-white\",\n        className\n      )}\n      {...props}\n    >\n      {startValue}\n    </span>\n  )\n}\n\n\n===== EXAMPLE: number-ticker-demo =====\nTitle: Number Ticker Demo\n\n--- file: example/number-ticker-demo.tsx ---\nimport { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={100}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n\n\n===== EXAMPLE: number-ticker-demo-2 =====\nTitle: Number Ticker Demo 2\n\n--- file: example/number-ticker-demo-2.tsx ---\nimport { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={100}\n      startValue={80}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n\n\n===== EXAMPLE: number-ticker-decimal-demo =====\nTitle: Number Ticker Decimal Demo\n\n--- file: example/number-ticker-decimal-demo.tsx ---\nimport { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={5.67}\n      decimalPlaces={2}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n\n\n\n===== COMPONENT: orbiting-circles =====\nTitle: Orbiting Circles\nDescription: A collection of circles which move in orbit along a circular path\n\n--- file: magicui/orbiting-circles.tsx ---\nimport React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface OrbitingCirclesProps extends React.HTMLAttributes<HTMLDivElement> {\n  className?: string\n  children?: React.ReactNode\n  reverse?: boolean\n  duration?: number\n  delay?: number\n  radius?: number\n  path?: boolean\n  iconSize?: number\n  speed?: number\n}\n\nexport function OrbitingCircles({\n  className,\n  children,\n  reverse,\n  duration = 20,\n  radius = 160,\n  path = true,\n  iconSize = 30,\n  speed = 1,\n  ...props\n}: OrbitingCirclesProps) {\n  const calculatedDuration = duration / speed\n  return (\n    <>\n      {path && (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          version=\"1.1\"\n          className=\"pointer-events-none absolute inset-0 size-full\"\n        >\n          <circle\n            className=\"stroke-black/10 stroke-1 dark:stroke-white/10\"\n            cx=\"50%\"\n            cy=\"50%\"\n            r={radius}\n            fill=\"none\"\n          />\n        </svg>\n      )}\n      {React.Children.map(children, (child, index) => {\n        const angle = (360 / React.Children.count(children)) * index\n        return (\n          <div\n            style={\n              {\n                \"--duration\": calculatedDuration,\n                \"--radius\": radius,\n                \"--angle\": angle,\n                \"--icon-size\": `${iconSize}px`,\n              } as React.CSSProperties\n            }\n            className={cn(\n              `animate-orbit absolute flex size-(--icon-size) transform-gpu items-center justify-center rounded-full`,\n              { \"[animation-direction:reverse]\": reverse },\n              className\n            )}\n            {...props}\n          >\n            {child}\n          </div>\n        )\n      })}\n    </>\n  )\n}\n\n\n===== EXAMPLE: orbiting-circles-demo =====\nTitle: Orbiting Circles Demo\n\n--- file: example/orbiting-circles-demo.tsx ---\nimport { OrbitingCircles } from \"@/registry/magicui/orbiting-circles\"\n\nexport default function OrbitingCirclesDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\">\n      <OrbitingCircles iconSize={40}>\n        <Icons.whatsapp />\n        <Icons.notion />\n        <Icons.openai />\n        <Icons.googleDrive />\n        <Icons.whatsapp />\n      </OrbitingCircles>\n      <OrbitingCircles iconSize={30} radius={100} reverse speed={2}>\n        <Icons.whatsapp />\n        <Icons.notion />\n        <Icons.openai />\n        <Icons.googleDrive />\n      </OrbitingCircles>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: () => (\n    <svg width=\"100\" height=\"100\" viewBox=\"0 0 438.549 438.549\">\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      />\n    </svg>\n  ),\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className=\"fill-black dark:fill-white\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n}\n\n\n\n===== COMPONENT: particles =====\nTitle: Particles\nDescription: Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\n\n--- file: magicui/particles.tsx ---\n\"use client\"\n\nimport React, {\n  useEffect,\n  useRef,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MousePosition {\n  x: number\n  y: number\n}\n\nfunction MousePosition(): MousePosition {\n  const [mousePosition, setMousePosition] = useState<MousePosition>({\n    x: 0,\n    y: 0,\n  })\n\n  useEffect(() => {\n    const handleMouseMove = (event: MouseEvent) => {\n      setMousePosition({ x: event.clientX, y: event.clientY })\n    }\n\n    window.addEventListener(\"mousemove\", handleMouseMove)\n\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove)\n    }\n  }, [])\n\n  return mousePosition\n}\n\ninterface ParticlesProps extends ComponentPropsWithoutRef<\"div\"> {\n  className?: string\n  quantity?: number\n  staticity?: number\n  ease?: number\n  size?: number\n  refresh?: boolean\n  color?: string\n  vx?: number\n  vy?: number\n}\n\nfunction hexToRgb(hex: string): number[] {\n  hex = hex.replace(\"#\", \"\")\n\n  if (hex.length === 3) {\n    hex = hex\n      .split(\"\")\n      .map((char) => char + char)\n      .join(\"\")\n  }\n\n  const hexInt = parseInt(hex, 16)\n  const red = (hexInt >> 16) & 255\n  const green = (hexInt >> 8) & 255\n  const blue = hexInt & 255\n  return [red, green, blue]\n}\n\ntype Circle = {\n  x: number\n  y: number\n  translateX: number\n  translateY: number\n  size: number\n  alpha: number\n  targetAlpha: number\n  dx: number\n  dy: number\n  magnetism: number\n}\n\nexport const Particles: React.FC<ParticlesProps> = ({\n  className = \"\",\n  quantity = 100,\n  staticity = 50,\n  ease = 50,\n  size = 0.4,\n  refresh = false,\n  color = \"#ffffff\",\n  vx = 0,\n  vy = 0,\n  ...props\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const canvasContainerRef = useRef<HTMLDivElement>(null)\n  const context = useRef<CanvasRenderingContext2D | null>(null)\n  const circles = useRef<Circle[]>([])\n  const mousePosition = MousePosition()\n  const mouse = useRef<{ x: number; y: number }>({ x: 0, y: 0 })\n  const canvasSize = useRef<{ w: number; h: number }>({ w: 0, h: 0 })\n  const dpr = typeof window !== \"undefined\" ? window.devicePixelRatio : 1\n  const rafID = useRef<number | null>(null)\n  const resizeTimeout = useRef<NodeJS.Timeout | null>(null)\n  const initCanvasRef = useRef<() => void>(() => {})\n  const onMouseMoveRef = useRef<() => void>(() => {})\n  const animateRef = useRef<() => void>(() => {})\n\n  useEffect(() => {\n    if (canvasRef.current) {\n      context.current = canvasRef.current.getContext(\"2d\")\n    }\n    initCanvasRef.current()\n    animateRef.current()\n\n    const handleResize = () => {\n      if (resizeTimeout.current) {\n        clearTimeout(resizeTimeout.current)\n      }\n      resizeTimeout.current = setTimeout(() => {\n        initCanvasRef.current()\n      }, 200)\n    }\n\n    window.addEventListener(\"resize\", handleResize)\n\n    return () => {\n      if (rafID.current != null) {\n        window.cancelAnimationFrame(rafID.current)\n      }\n      if (resizeTimeout.current) {\n        clearTimeout(resizeTimeout.current)\n      }\n      window.removeEventListener(\"resize\", handleResize)\n    }\n  }, [color])\n\n  useEffect(() => {\n    onMouseMoveRef.current()\n  }, [mousePosition.x, mousePosition.y])\n\n  useEffect(() => {\n    initCanvasRef.current()\n  }, [refresh])\n\n  const initCanvas = () => {\n    resizeCanvas()\n    drawParticles()\n  }\n\n  const onMouseMove = () => {\n    if (canvasRef.current) {\n      const rect = canvasRef.current.getBoundingClientRect()\n      const { w, h } = canvasSize.current\n      const x = mousePosition.x - rect.left - w / 2\n      const y = mousePosition.y - rect.top - h / 2\n      const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2\n      if (inside) {\n        mouse.current.x = x\n        mouse.current.y = y\n      }\n    }\n  }\n\n  const resizeCanvas = () => {\n    if (canvasContainerRef.current && canvasRef.current && context.current) {\n      canvasSize.current.w = canvasContainerRef.current.offsetWidth\n      canvasSize.current.h = canvasContainerRef.current.offsetHeight\n\n      canvasRef.current.width = canvasSize.current.w * dpr\n      canvasRef.current.height = canvasSize.current.h * dpr\n      canvasRef.current.style.width = `${canvasSize.current.w}px`\n      canvasRef.current.style.height = `${canvasSize.current.h}px`\n      context.current.scale(dpr, dpr)\n\n      // Clear existing particles and create new ones with exact quantity\n      circles.current = []\n      for (let i = 0; i < quantity; i++) {\n        const circle = circleParams()\n        drawCircle(circle)\n      }\n    }\n  }\n\n  const circleParams = (): Circle => {\n    const x = Math.floor(Math.random() * canvasSize.current.w)\n    const y = Math.floor(Math.random() * canvasSize.current.h)\n    const translateX = 0\n    const translateY = 0\n    const pSize = Math.floor(Math.random() * 2) + size\n    const alpha = 0\n    const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1))\n    const dx = (Math.random() - 0.5) * 0.1\n    const dy = (Math.random() - 0.5) * 0.1\n    const magnetism = 0.1 + Math.random() * 4\n    return {\n      x,\n      y,\n      translateX,\n      translateY,\n      size: pSize,\n      alpha,\n      targetAlpha,\n      dx,\n      dy,\n      magnetism,\n    }\n  }\n\n  const rgb = hexToRgb(color)\n\n  const drawCircle = (circle: Circle, update = false) => {\n    if (context.current) {\n      const { x, y, translateX, translateY, size, alpha } = circle\n      context.current.translate(translateX, translateY)\n      context.current.beginPath()\n      context.current.arc(x, y, size, 0, 2 * Math.PI)\n      context.current.fillStyle = `rgba(${rgb.join(\", \")}, ${alpha})`\n      context.current.fill()\n      context.current.setTransform(dpr, 0, 0, dpr, 0, 0)\n\n      if (!update) {\n        circles.current.push(circle)\n      }\n    }\n  }\n\n  const clearContext = () => {\n    if (context.current) {\n      context.current.clearRect(\n        0,\n        0,\n        canvasSize.current.w,\n        canvasSize.current.h\n      )\n    }\n  }\n\n  const drawParticles = () => {\n    clearContext()\n    const particleCount = quantity\n    for (let i = 0; i < particleCount; i++) {\n      const circle = circleParams()\n      drawCircle(circle)\n    }\n  }\n\n  const remapValue = (\n    value: number,\n    start1: number,\n    end1: number,\n    start2: number,\n    end2: number\n  ): number => {\n    const remapped =\n      ((value - start1) * (end2 - start2)) / (end1 - start1) + start2\n    return remapped > 0 ? remapped : 0\n  }\n\n  const animate = () => {\n    clearContext()\n    circles.current.forEach((circle: Circle, i: number) => {\n      // Handle the alpha value\n      const edge = [\n        circle.x + circle.translateX - circle.size, // distance from left edge\n        canvasSize.current.w - circle.x - circle.translateX - circle.size, // distance from right edge\n        circle.y + circle.translateY - circle.size, // distance from top edge\n        canvasSize.current.h - circle.y - circle.translateY - circle.size, // distance from bottom edge\n      ]\n      const closestEdge = edge.reduce((a, b) => Math.min(a, b))\n      const remapClosestEdge = parseFloat(\n        remapValue(closestEdge, 0, 20, 0, 1).toFixed(2)\n      )\n      if (remapClosestEdge > 1) {\n        circle.alpha += 0.02\n        if (circle.alpha > circle.targetAlpha) {\n          circle.alpha = circle.targetAlpha\n        }\n      } else {\n        circle.alpha = circle.targetAlpha * remapClosestEdge\n      }\n      circle.x += circle.dx + vx\n      circle.y += circle.dy + vy\n      circle.translateX +=\n        (mouse.current.x / (staticity / circle.magnetism) - circle.translateX) /\n        ease\n      circle.translateY +=\n        (mouse.current.y / (staticity / circle.magnetism) - circle.translateY) /\n        ease\n\n      drawCircle(circle, true)\n\n      // circle gets out of the canvas\n      if (\n        circle.x < -circle.size ||\n        circle.x > canvasSize.current.w + circle.size ||\n        circle.y < -circle.size ||\n        circle.y > canvasSize.current.h + circle.size\n      ) {\n        // remove the circle from the array\n        circles.current.splice(i, 1)\n        // create a new circle\n        const newCircle = circleParams()\n        drawCircle(newCircle)\n      }\n    })\n    rafID.current = window.requestAnimationFrame(animateRef.current)\n  }\n\n  initCanvasRef.current = initCanvas\n  onMouseMoveRef.current = onMouseMove\n  animateRef.current = animate\n\n  return (\n    <div\n      className={cn(\"pointer-events-none\", className)}\n      ref={canvasContainerRef}\n      aria-hidden=\"true\"\n      {...props}\n    >\n      <canvas ref={canvasRef} className=\"size-full\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: particles-demo =====\nTitle: Particles Demo\n\n--- file: example/particles-demo.tsx ---\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useTheme } from \"next-themes\"\n\nimport { Particles } from \"@/registry/magicui/particles\"\n\nexport default function ParticlesDemo() {\n  const { resolvedTheme } = useTheme()\n  const [color, setColor] = useState(\"#ffffff\")\n\n  useEffect(() => {\n    setColor(resolvedTheme === \"dark\" ? \"#ffffff\" : \"#000000\")\n  }, [resolvedTheme])\n\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none z-10 text-center text-8xl leading-none font-semibold whitespace-pre-wrap\">\n        Particles\n      </span>\n      <Particles\n        className=\"absolute inset-0 z-0\"\n        quantity={100}\n        ease={80}\n        color={color}\n        refresh\n      />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: pixel-image =====\nTitle: Pixel Image\nDescription: A component that displays an image with a pixelated effect, creating a retro aesthetic.\n\n--- file: magicui/pixel-image.tsx ---\n\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Grid = {\n  rows: number\n  cols: number\n}\n\nconst DEFAULT_GRIDS: Record<string, Grid> = {\n  \"6x4\": { rows: 4, cols: 6 },\n  \"8x8\": { rows: 8, cols: 8 },\n  \"8x3\": { rows: 3, cols: 8 },\n  \"4x6\": { rows: 6, cols: 4 },\n  \"3x8\": { rows: 8, cols: 3 },\n}\n\ntype PredefinedGridKey = keyof typeof DEFAULT_GRIDS\n\ninterface PixelImageProps {\n  src: string\n  grid?: PredefinedGridKey\n  customGrid?: Grid\n  grayscaleAnimation?: boolean\n  pixelFadeInDuration?: number // in ms\n  maxAnimationDelay?: number // in ms\n  colorRevealDelay?: number // in ms\n}\n\nexport const PixelImage = ({\n  src,\n  grid = \"6x4\",\n  grayscaleAnimation = true,\n  pixelFadeInDuration = 1000,\n  maxAnimationDelay = 1200,\n  colorRevealDelay = 1300,\n  customGrid,\n}: PixelImageProps) => {\n  const [isVisible, setIsVisible] = useState(false)\n  const [showColor, setShowColor] = useState(false)\n\n  const MIN_GRID = 1\n  const MAX_GRID = 16\n\n  const { rows, cols } = useMemo(() => {\n    const isValidGrid = (grid?: Grid) => {\n      if (!grid) return false\n      const { rows, cols } = grid\n      return (\n        Number.isInteger(rows) &&\n        Number.isInteger(cols) &&\n        rows >= MIN_GRID &&\n        cols >= MIN_GRID &&\n        rows <= MAX_GRID &&\n        cols <= MAX_GRID\n      )\n    }\n\n    return isValidGrid(customGrid) ? customGrid! : DEFAULT_GRIDS[grid]\n  }, [customGrid, grid])\n\n  useEffect(() => {\n    setIsVisible(true)\n    const colorTimeout = setTimeout(() => {\n      setShowColor(true)\n    }, colorRevealDelay)\n    return () => clearTimeout(colorTimeout)\n  }, [colorRevealDelay])\n\n  const pieces = useMemo(() => {\n    const total = rows * cols\n    return Array.from({ length: total }, (_, index) => {\n      const row = Math.floor(index / cols)\n      const col = index % cols\n\n      const clipPath = `polygon(\n        ${col * (100 / cols)}% ${row * (100 / rows)}%,\n        ${(col + 1) * (100 / cols)}% ${row * (100 / rows)}%,\n        ${(col + 1) * (100 / cols)}% ${(row + 1) * (100 / rows)}%,\n        ${col * (100 / cols)}% ${(row + 1) * (100 / rows)}%\n      )`\n\n      const delay = Math.random() * maxAnimationDelay\n      return {\n        clipPath,\n        delay,\n      }\n    })\n  }, [rows, cols, maxAnimationDelay])\n\n  return (\n    <div className=\"relative h-72 w-72 select-none md:h-96 md:w-96\">\n      {pieces.map((piece, index) => (\n        <div\n          key={index}\n          className={cn(\n            \"absolute inset-0 transition-all ease-out\",\n            isVisible ? \"opacity-100\" : \"opacity-0\"\n          )}\n          style={{\n            clipPath: piece.clipPath,\n            transitionDelay: `${piece.delay}ms`,\n            transitionDuration: `${pixelFadeInDuration}ms`,\n          }}\n        >\n          <img\n            src={src}\n            alt={`Pixel image piece ${index + 1}`}\n            className={cn(\n              \"z-1 rounded-[2.5rem] object-cover\",\n              grayscaleAnimation && (showColor ? \"grayscale-0\" : \"grayscale\")\n            )}\n            style={{\n              transition: grayscaleAnimation\n                ? `filter ${pixelFadeInDuration}ms cubic-bezier(0.4, 0, 0.2, 1)`\n                : \"none\",\n            }}\n            draggable={false}\n          />\n        </div>\n      ))}\n    </div>\n  )\n}\n\n\n===== EXAMPLE: pixel-image-demo =====\nTitle: Pixel Image Demo\n\n--- file: example/pixel-image-demo.tsx ---\nimport { PixelImage } from \"@/registry/magicui/pixel-image\"\n\nexport default function Home() {\n  return (\n    <PixelImage\n      src=\"/pixel-image-demo.jpg\"\n      customGrid={{ rows: 4, cols: 6 }}\n      grayscaleAnimation\n    />\n  )\n}\n\n\n\n===== COMPONENT: pointer =====\nTitle: Pointer\nDescription: A component that displays a pointer when hovering over an element\n\n--- file: magicui/pointer.tsx ---\n\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport {\n  AnimatePresence,\n  HTMLMotionProps,\n  motion,\n  useMotionValue,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * A custom pointer component that displays an animated cursor.\n * Add this as a child to any component to enable a custom pointer when hovering.\n * You can pass custom children to render as the pointer.\n *\n * @component\n * @param {HTMLMotionProps<\"div\">} props - The component props\n */\nexport function Pointer({\n  className,\n  style,\n  children,\n  ...props\n}: HTMLMotionProps<\"div\">): React.ReactNode {\n  const x = useMotionValue(0)\n  const y = useMotionValue(0)\n  const [isActive, setIsActive] = useState<boolean>(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const parentElement =\n      typeof window !== \"undefined\"\n        ? (containerRef.current?.parentElement ?? null)\n        : null\n\n    const handleMouseMove = (e: MouseEvent) => {\n      x.set(e.clientX)\n      y.set(e.clientY)\n      setIsActive(true)\n    }\n\n    const handleMouseEnter = (e: MouseEvent) => {\n      x.set(e.clientX)\n      y.set(e.clientY)\n      setIsActive(true)\n    }\n\n    const handleMouseLeave = () => {\n      setIsActive(false)\n    }\n\n    if (parentElement) {\n      parentElement.style.cursor = \"none\"\n      parentElement.addEventListener(\"mousemove\", handleMouseMove)\n      parentElement.addEventListener(\"mouseenter\", handleMouseEnter)\n      parentElement.addEventListener(\"mouseleave\", handleMouseLeave)\n    }\n\n    return () => {\n      if (parentElement) {\n        parentElement.style.cursor = \"\"\n        parentElement.removeEventListener(\"mousemove\", handleMouseMove)\n        parentElement.removeEventListener(\"mouseenter\", handleMouseEnter)\n        parentElement.removeEventListener(\"mouseleave\", handleMouseLeave)\n      }\n    }\n  }, [x, y])\n\n  return (\n    <>\n      <div ref={containerRef} />\n      <AnimatePresence>\n        {isActive && (\n          <motion.div\n            className=\"pointer-events-none fixed z-50 transform-[translate(-50%,-50%)]\"\n            style={{\n              top: y,\n              left: x,\n              ...style,\n            }}\n            initial={{\n              scale: 0,\n              opacity: 0,\n            }}\n            animate={{\n              scale: 1,\n              opacity: 1,\n            }}\n            exit={{\n              scale: 0,\n              opacity: 0,\n            }}\n            {...props}\n          >\n            {children || (\n              <svg\n                stroke=\"currentColor\"\n                fill=\"currentColor\"\n                strokeWidth=\"1\"\n                viewBox=\"0 0 16 16\"\n                height=\"24\"\n                width=\"24\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                className={cn(\n                  \"rotate-[-70deg] stroke-white text-black\",\n                  className\n                )}\n              >\n                <path d=\"M14.082 2.182a.5.5 0 0 1 .103.557L8.528 15.467a.5.5 0 0 1-.917-.007L5.57 10.694.803 8.652a.5.5 0 0 1-.006-.916l12.728-5.657a.5.5 0 0 1 .556.103z\" />\n              </svg>\n            )}\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </>\n  )\n}\n\n\n===== EXAMPLE: pointer-demo-1 =====\nTitle: Pointer Demo 1\n\n--- file: example/pointer-demo-1.tsx ---\n\"use client\"\n\nimport { motion } from \"motion/react\"\n\nimport { Pointer } from \"@/registry/magicui/pointer\"\n\nexport default function PointerDemo1() {\n  return (\n    <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2 md:grid-rows-2\">\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Animated Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">Animated pointer</p>\n        </div>\n        <Pointer>\n          <motion.div\n            animate={{\n              scale: [0.8, 1, 0.8],\n              rotate: [0, 5, -5, 0],\n            }}\n            transition={{\n              duration: 1.5,\n              repeat: Infinity,\n              ease: \"easeInOut\",\n            }}\n          >\n            <svg\n              width=\"40\"\n              height=\"40\"\n              viewBox=\"0 0 40 40\"\n              fill=\"none\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"text-pink-600\"\n            >\n              <motion.path\n                d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"\n                fill=\"currentColor\"\n                animate={{ scale: [1, 1.2, 1] }}\n                transition={{\n                  duration: 0.8,\n                  repeat: Infinity,\n                  ease: \"easeInOut\",\n                }}\n              />\n            </svg>\n          </motion.div>\n        </Pointer>\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Colored Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            A custom pointer with different color\n          </p>\n        </div>\n        <Pointer className=\"fill-blue-500\" />\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Custom Shape</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            A pointer with a custom SVG shape\n          </p>\n        </div>\n        <Pointer>\n          <svg\n            width=\"24\"\n            height=\"24\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <circle cx=\"12\" cy=\"12\" r=\"10\" className=\"fill-purple-500\" />\n            <circle cx=\"12\" cy=\"12\" r=\"5\" className=\"fill-white\" />\n          </svg>\n        </Pointer>\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Emoji Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            Using an emoji as a custom pointer\n          </p>\n        </div>\n        <Pointer>\n          <div className=\"text-2xl\">👆</div>\n        </Pointer>\n      </div>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: progressive-blur =====\nTitle: Progressive Blur\nDescription: The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\n\n--- file: magicui/progressive-blur.tsx ---\n\"use client\"\n\nimport React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface ProgressiveBlurProps {\n  className?: string\n  height?: string\n  position?: \"top\" | \"bottom\" | \"both\"\n  blurLevels?: number[]\n  children?: React.ReactNode\n}\n\nexport function ProgressiveBlur({\n  className,\n  height = \"30%\",\n  position = \"bottom\",\n  blurLevels = [0.5, 1, 2, 4, 8, 16, 32, 64],\n}: ProgressiveBlurProps) {\n  // Create array with length equal to blurLevels.length - 2 (for before/after pseudo elements)\n  const divElements = Array(blurLevels.length - 2).fill(null)\n\n  return (\n    <div\n      className={cn(\n        \"gradient-blur pointer-events-none absolute inset-x-0 z-10\",\n        className,\n        position === \"top\"\n          ? \"top-0\"\n          : position === \"bottom\"\n            ? \"bottom-0\"\n            : \"inset-y-0\"\n      )}\n      style={{\n        height: position === \"both\" ? \"100%\" : height,\n      }}\n    >\n      {/* First blur layer (pseudo element) */}\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: 1,\n          backdropFilter: `blur(${blurLevels[0]}px)`,\n          WebkitBackdropFilter: `blur(${blurLevels[0]}px)`,\n          maskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n          WebkitMaskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n        }}\n      />\n\n      {/* Middle blur layers */}\n      {divElements.map((_, index) => {\n        const blurIndex = index + 1\n        const startPercent = blurIndex * 12.5\n        const midPercent = (blurIndex + 1) * 12.5\n        const endPercent = (blurIndex + 2) * 12.5\n\n        const maskGradient =\n          position === \"bottom\"\n            ? `linear-gradient(to bottom, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\n            : position === \"top\"\n              ? `linear-gradient(to top, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\n              : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`\n\n        return (\n          <div\n            key={`blur-${index}`}\n            className=\"absolute inset-0\"\n            style={{\n              zIndex: index + 2,\n              backdropFilter: `blur(${blurLevels[blurIndex]}px)`,\n              WebkitBackdropFilter: `blur(${blurLevels[blurIndex]}px)`,\n              maskImage: maskGradient,\n              WebkitMaskImage: maskGradient,\n            }}\n          />\n        )\n      })}\n\n      {/* Last blur layer (pseudo element) */}\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: blurLevels.length,\n          backdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\n          WebkitBackdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\n          maskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n          WebkitMaskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n        }}\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: progressive-blur-demo =====\nTitle: Progressive Blur Demo\n\n--- file: example/progressive-blur-demo.tsx ---\n\"use client\"\n\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { ProgressiveBlur } from \"@/registry/magicui/progressive-blur\"\n\nexport default function ProgressiveBlurDemo() {\n  return (\n    <div className=\"relative w-full rounded-xl border\">\n      <ScrollArea className=\"relative h-[400px] overflow-hidden\">\n        <div className=\"flex flex-col gap-2 p-4\">\n          {Array.from({ length: 20 }).map((_, index) => (\n            <div\n              key={index}\n              className=\"bg-card flex h-20 w-full items-center justify-center rounded-xl border\"\n            >\n              {index}\n            </div>\n          ))}\n        </div>\n        <ProgressiveBlur position=\"bottom\" height=\"40%\" />\n      </ScrollArea>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: pulsating-button =====\nTitle: Pulsating Button\nDescription: An animated pulsating button useful for capturing attention of users.\n\n--- file: magicui/pulsating-button.tsx ---\nimport React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface PulsatingButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  pulseColor?: string\n  duration?: string\n}\n\nexport const PulsatingButton = React.forwardRef<\n  HTMLButtonElement,\n  PulsatingButtonProps\n>(\n  (\n    {\n      className,\n      children,\n      pulseColor = \"#808080\",\n      duration = \"1.5s\",\n      ...props\n    },\n    ref\n  ) => {\n    return (\n      <button\n        ref={ref}\n        className={cn(\n          \"bg-primary text-primary-foreground relative flex cursor-pointer items-center justify-center rounded-lg px-4 py-2 text-center\",\n          className\n        )}\n        style={\n          {\n            \"--pulse-color\": pulseColor,\n            \"--duration\": duration,\n          } as React.CSSProperties\n        }\n        {...props}\n      >\n        <div className=\"relative z-10\">{children}</div>\n        <div className=\"absolute top-1/2 left-1/2 size-full -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-lg bg-inherit\" />\n      </button>\n    )\n  }\n)\n\nPulsatingButton.displayName = \"PulsatingButton\"\n\n\n===== EXAMPLE: pulsating-button-demo =====\nTitle: Pulsating Button Demo\n\n--- file: example/pulsating-button-demo.tsx ---\nimport { PulsatingButton } from \"@/registry/magicui/pulsating-button\"\n\nexport default function PulsatingButtonDemo() {\n  return <PulsatingButton>Join Affiliate Program</PulsatingButton>\n}\n\n\n\n===== COMPONENT: rainbow-button =====\nTitle: Rainbow Button\nDescription: An animated button with a rainbow effect.\n\n--- file: magicui/rainbow-button.tsx ---\nimport React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst rainbowButtonVariants = cva(\n  cn(\n    \"relative cursor-pointer group transition-all animate-rainbow\",\n    \"inline-flex items-center justify-center gap-2 shrink-0\",\n    \"rounded-sm outline-none focus-visible:ring-[3px] aria-invalid:border-destructive\",\n    \"text-sm font-medium whitespace-nowrap\",\n    \"disabled:pointer-events-none disabled:opacity-50\",\n    \"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0\"\n  ),\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.125rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n        outline:\n          \"border border-input border-b-transparent bg-[linear-gradient(#ffffff,#ffffff),linear-gradient(#ffffff_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-accent-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n      },\n      size: {\n        default: \"h-9 px-4 py-2\",\n        sm: \"h-8 rounded-xl px-3 text-xs\",\n        lg: \"h-11 rounded-xl px-8\",\n        icon: \"size-9\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\ninterface RainbowButtonProps\n  extends\n    React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof rainbowButtonVariants> {\n  asChild?: boolean\n}\n\nconst RainbowButton = React.forwardRef<HTMLButtonElement, RainbowButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : \"button\"\n    return (\n      <Comp\n        data-slot=\"button\"\n        className={cn(rainbowButtonVariants({ variant, size, className }))}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\n\nRainbowButton.displayName = \"RainbowButton\"\n\nexport { RainbowButton, rainbowButtonVariants, type RainbowButtonProps }\n\n\n===== EXAMPLE: rainbow-button-demo =====\nTitle: Rainbow Button Demo\n\n--- file: example/rainbow-button-demo.tsx ---\nimport { RainbowButton } from \"@/registry/magicui/rainbow-button\"\n\nexport default function RainbowButtonDemo() {\n  return <RainbowButton>Get Unlimited Access</RainbowButton>\n}\n\n\n===== EXAMPLE: rainbow-button-demo-2 =====\nTitle: Rainbow Button Demo 2\n\n--- file: example/rainbow-button-demo-2.tsx ---\nimport { RainbowButton } from \"@/registry/magicui/rainbow-button\"\n\nexport default function RainbowButtonDemo() {\n  return <RainbowButton variant=\"outline\">Get Unlimited Access</RainbowButton>\n}\n\n\n\n===== COMPONENT: retro-grid =====\nTitle: Retro Grid\nDescription: An animated scrolling retro grid effect\n\n--- file: magicui/retro-grid.tsx ---\n\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport type { CSSProperties, HTMLAttributes } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ANIMATION_DURATION_SECONDS = 15\nconst GRID_HEIGHT_RATIO = 3\nconst GRID_LINE_ALIGNMENT_OFFSET_PX = 0.5\nconst GRID_LINE_ANTIALIAS_MULTIPLIER = 0.9\nconst GRID_LINE_WIDTH_PX = 0.92\nconst GRID_START_OFFSET_RATIO = -0.5\nconst GRID_WIDTH_RATIO = 6\nconst GRID_X_OFFSET_RATIO = -2\nconst MAX_ANGLE = 89\nconst MAX_DEVICE_PIXEL_RATIO = 2\nconst MIN_ANGLE = 1\nconst PERSPECTIVE_PX = 200\nconst FALLBACK_ANIMATION_NAME = \"retro-grid-fallback-scroll\"\nconst FALLBACK_STYLES = `\n@keyframes ${FALLBACK_ANIMATION_NAME} {\n  from {\n    transform: translateY(-50%);\n  }\n\n  to {\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  [data-retro-grid-scroll=\"true\"] {\n    animation: none !important;\n    transform: translateY(-50%) !important;\n  }\n}\n`\n\nconst VERTEX_SHADER_SOURCE = `\nattribute vec2 a_position;\n\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n}\n`\n\nconst FRAGMENT_SHADER_SOURCE = `\n#extension GL_OES_standard_derivatives : enable\nprecision highp float;\n\nuniform vec2 u_container_size;\nuniform vec2 u_viewport_size;\nuniform vec4 u_line_color;\nuniform float u_angle;\nuniform float u_cell_size;\nuniform float u_device_pixel_ratio;\nuniform float u_time;\n\nconst float animationDurationSeconds = ${ANIMATION_DURATION_SECONDS.toFixed(1)};\nconst float gridHeightRatio = ${GRID_HEIGHT_RATIO.toFixed(1)};\nconst float gridStartOffsetRatio = ${GRID_START_OFFSET_RATIO.toFixed(1)};\nconst float gridWidthRatio = ${GRID_WIDTH_RATIO.toFixed(1)};\nconst float gridXOffsetRatio = ${GRID_X_OFFSET_RATIO.toFixed(1)};\nconst float gridLineAlignmentOffsetPx = ${GRID_LINE_ALIGNMENT_OFFSET_PX.toFixed(1)};\nconst float gridLineAntialiasMultiplier = ${GRID_LINE_ANTIALIAS_MULTIPLIER.toFixed(1)};\nconst float horizontalLodLevelOneEndPx = 5.6;\nconst float horizontalLodLevelOneStartPx = 2.8;\nconst float horizontalLodLevelTwoEndPx = 3.0;\nconst float horizontalLodLevelTwoStartPx = 1.4;\nconst float horizontalCompressionEndPx = 2.8;\nconst float horizontalCompressionStartPx = 1.2;\nconst float lineWidthPx = ${GRID_LINE_WIDTH_PX.toFixed(2)};\nconst float perspectivePx = ${PERSPECTIVE_PX.toFixed(1)};\nconst float gridTravelRatio = 0.5;\nconst float verticalCompressionEndPx = 2.6;\nconst float verticalCompressionStartPx = 1.0;\nconst float verticalEdgeCompressionEnd = 0.95;\nconst float verticalEdgeCompressionStart = 0.45;\nconst float verticalLodLevelEnd = 0.64;\nconst float verticalLodLevelStart = 0.22;\nconst float verticalTopCompressionEndCells = 6.0;\nconst float verticalTopCompressionStartCells = 2.0;\n\nfloat renderGridLine(\n  float wrappedCoord,\n  float antiAliasWidth,\n  float softnessBoost\n) {\n  return 1.0 - smoothstep(\n    lineWidthPx,\n    lineWidthPx + (antiAliasWidth * (1.5 + softnessBoost)),\n    wrappedCoord\n  );\n}\n\nvoid main() {\n  float angle = radians(clamp(u_angle, 1.0, 89.0));\n  float sinAngle = sin(angle);\n  float cosAngle = cos(angle);\n  vec2 screen = vec2(\n    (gl_FragCoord.x / u_device_pixel_ratio) - (u_container_size.x * 0.5),\n    (u_container_size.y * 0.5) - (gl_FragCoord.y / u_device_pixel_ratio)\n  );\n\n  vec3 rayOrigin = vec3(0.0, 0.0, perspectivePx);\n  vec3 rayDirection = normalize(vec3(screen, -perspectivePx));\n  vec3 planeXAxis = vec3(1.0, 0.0, 0.0);\n  vec3 planeYAxis = vec3(0.0, cosAngle, sinAngle);\n  vec3 planeNormal = normalize(cross(planeXAxis, planeYAxis));\n  float denominator = dot(rayDirection, planeNormal);\n\n  if (abs(denominator) < 0.0001) {\n    discard;\n  }\n\n  float distanceToPlane = dot(-rayOrigin, planeNormal) / denominator;\n\n  if (distanceToPlane <= 0.0) {\n    discard;\n  }\n\n  vec3 hitPoint = rayOrigin + (rayDirection * distanceToPlane);\n  float localX = hitPoint.x;\n  float localY = dot(hitPoint, planeYAxis);\n  float gridWidth = u_viewport_size.x * gridWidthRatio;\n  float gridHeight = u_viewport_size.y * gridHeightRatio;\n  float gridScrollSpeed = (gridHeight * gridTravelRatio) / animationDurationSeconds;\n  float patternOffsetY = u_time * gridScrollSpeed;\n  float gridLeft = (-0.5 * u_container_size.x) + (gridXOffsetRatio * u_container_size.x);\n  float gridTop = (-0.5 * u_container_size.y) + (gridStartOffsetRatio * gridHeight);\n  vec2 planePosition = vec2(localX - gridLeft, localY - gridTop);\n\n  if (\n    planePosition.x < 0.0 ||\n    planePosition.y < 0.0 ||\n    planePosition.x > gridWidth ||\n    planePosition.y > gridHeight\n  ) {\n    discard;\n  }\n\n  vec2 patternPosition = vec2(planePosition.x, planePosition.y - patternOffsetY);\n  vec2 wrapped = mod(\n    patternPosition + vec2(gridLineAlignmentOffsetPx),\n    u_cell_size\n  );\n  vec2 patternDerivative = max(fwidth(patternPosition), vec2(0.0001));\n  vec2 antiAliasWidth = patternDerivative * gridLineAntialiasMultiplier;\n  float horizontalCellSpanPx = u_cell_size / patternDerivative.y;\n  float horizontalCompression = 1.0 - smoothstep(\n    horizontalCompressionStartPx,\n    horizontalCompressionEndPx,\n    horizontalCellSpanPx\n  );\n  float verticalCellSpanPx = u_cell_size / patternDerivative.x;\n  float sideDistance = abs((planePosition.x / gridWidth) * 2.0 - 1.0);\n  float verticalEdgeCompression = smoothstep(\n    verticalEdgeCompressionStart,\n    verticalEdgeCompressionEnd,\n    sideDistance\n  );\n  float verticalTopCompression = 1.0 - smoothstep(\n    u_cell_size * verticalTopCompressionStartCells,\n    u_cell_size * verticalTopCompressionEndCells,\n    planePosition.y\n  );\n  float verticalCompression =\n    (1.0 - smoothstep(\n      verticalCompressionStartPx,\n      verticalCompressionEndPx,\n      verticalCellSpanPx\n    )) * verticalEdgeCompression * verticalTopCompression;\n  float horizontalSoftnessBoost = 1.0 + (horizontalCompression * 3.0);\n  float verticalSoftnessBoost = 1.0 + (verticalCompression * 3.5);\n  float verticalLod = smoothstep(\n    verticalLodLevelStart,\n    verticalLodLevelEnd,\n    verticalCompression\n  );\n  float verticalLineFine = renderGridLine(\n    wrapped.x,\n    antiAliasWidth.x,\n    verticalSoftnessBoost\n  );\n  float verticalWrappedLod = mod(\n    patternPosition.x + gridLineAlignmentOffsetPx,\n    u_cell_size * 2.0\n  );\n  float verticalLineCoarse = renderGridLine(\n    verticalWrappedLod,\n    antiAliasWidth.x,\n    verticalSoftnessBoost + verticalLod\n  );\n  float verticalLine = max(\n    verticalLineFine * (1.0 - verticalLod),\n    verticalLineCoarse * verticalLod\n  );\n  float horizontalLodLevelOne = 1.0 - smoothstep(\n    horizontalLodLevelOneStartPx,\n    horizontalLodLevelOneEndPx,\n    horizontalCellSpanPx\n  );\n  float horizontalLodLevelTwo = 1.0 - smoothstep(\n    horizontalLodLevelTwoStartPx,\n    horizontalLodLevelTwoEndPx,\n    horizontalCellSpanPx\n  );\n  float horizontalLineFine = renderGridLine(\n    wrapped.y,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost\n  );\n  float horizontalWrappedLodOne = mod(\n    patternPosition.y + gridLineAlignmentOffsetPx,\n    u_cell_size * 2.0\n  );\n  float horizontalWrappedLodTwo = mod(\n    patternPosition.y + gridLineAlignmentOffsetPx,\n    u_cell_size * 4.0\n  );\n  float horizontalLineCoarse = renderGridLine(\n    horizontalWrappedLodOne,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost + horizontalLodLevelOne\n  );\n  float horizontalLineExtraCoarse = renderGridLine(\n    horizontalWrappedLodTwo,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost + horizontalLodLevelOne + horizontalLodLevelTwo\n  );\n  float horizontalLineReduced = max(\n    horizontalLineFine * (1.0 - horizontalLodLevelOne),\n    horizontalLineCoarse * horizontalLodLevelOne\n  );\n  float horizontalLine = max(\n    horizontalLineReduced * (1.0 - horizontalLodLevelTwo),\n    horizontalLineExtraCoarse * horizontalLodLevelTwo\n  );\n  float line = max(verticalLine, horizontalLine);\n\n  if (line <= 0.001) {\n    discard;\n  }\n\n  float alpha = u_line_color.a * line;\n  gl_FragColor = vec4(u_line_color.rgb * alpha, alpha);\n}\n`\n\ninterface RetroGridProps extends HTMLAttributes<HTMLDivElement> {\n  /**\n   * Additional CSS classes to apply to the grid container\n   */\n  className?: string\n  /**\n   * Rotation angle of the grid in degrees\n   * @default 65\n   */\n  angle?: number\n  /**\n   * Grid cell size in pixels\n   * @default 60\n   */\n  cellSize?: number\n  /**\n   * Grid opacity value between 0 and 1\n   * @default 0.5\n   */\n  opacity?: number\n  /**\n   * Grid line color in light mode\n   * @default \"gray\"\n   */\n  lightLineColor?: string\n  /**\n   * Grid line color in dark mode\n   * @default \"gray\"\n   */\n  darkLineColor?: string\n}\n\ninterface ProgramInfo {\n  attributeLocation: number\n  program: WebGLProgram\n  uniforms: {\n    angle: WebGLUniformLocation\n    cellSize: WebGLUniformLocation\n    containerSize: WebGLUniformLocation\n    devicePixelRatio: WebGLUniformLocation\n    lineColor: WebGLUniformLocation\n    time: WebGLUniformLocation\n    viewportSize: WebGLUniformLocation\n  }\n}\n\nlet colorResolveContext: CanvasRenderingContext2D | null | undefined\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max)\n}\n\nfunction createShader(gl: WebGLRenderingContext, type: number, source: string) {\n  const shader = gl.createShader(type)\n\n  if (!shader) {\n    return null\n  }\n\n  gl.shaderSource(shader, source)\n  gl.compileShader(shader)\n\n  if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    return shader\n  }\n\n  gl.deleteShader(shader)\n  return null\n}\n\nfunction createProgram(gl: WebGLRenderingContext) {\n  const vertexShader = createShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER_SOURCE)\n  const fragmentShader = createShader(\n    gl,\n    gl.FRAGMENT_SHADER,\n    FRAGMENT_SHADER_SOURCE\n  )\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  const program = gl.createProgram()\n\n  if (!program) {\n    gl.deleteShader(vertexShader)\n    gl.deleteShader(fragmentShader)\n    return null\n  }\n\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n  gl.deleteShader(vertexShader)\n  gl.deleteShader(fragmentShader)\n\n  if (gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    return program\n  }\n\n  gl.deleteProgram(program)\n  return null\n}\n\nfunction getProgramInfo(\n  gl: WebGLRenderingContext,\n  program: WebGLProgram\n): ProgramInfo | null {\n  const attributeLocation = gl.getAttribLocation(program, \"a_position\")\n  const angle = gl.getUniformLocation(program, \"u_angle\")\n  const cellSize = gl.getUniformLocation(program, \"u_cell_size\")\n  const containerSize = gl.getUniformLocation(program, \"u_container_size\")\n  const devicePixelRatio = gl.getUniformLocation(\n    program,\n    \"u_device_pixel_ratio\"\n  )\n  const lineColor = gl.getUniformLocation(program, \"u_line_color\")\n  const time = gl.getUniformLocation(program, \"u_time\")\n  const viewportSize = gl.getUniformLocation(program, \"u_viewport_size\")\n\n  if (\n    attributeLocation < 0 ||\n    !angle ||\n    !cellSize ||\n    !containerSize ||\n    !devicePixelRatio ||\n    !lineColor ||\n    !time ||\n    !viewportSize\n  ) {\n    return null\n  }\n\n  return {\n    attributeLocation,\n    program,\n    uniforms: {\n      angle,\n      cellSize,\n      containerSize,\n      devicePixelRatio,\n      lineColor,\n      time,\n      viewportSize,\n    },\n  }\n}\n\nfunction isDarkMode(colorScheme: MediaQueryList) {\n  const root = document.documentElement\n\n  if (root.classList.contains(\"dark\")) {\n    return true\n  }\n\n  if (root.classList.contains(\"light\")) {\n    return false\n  }\n\n  return colorScheme.matches\n}\n\nfunction getColorResolveContext() {\n  if (colorResolveContext !== undefined) {\n    return colorResolveContext\n  }\n\n  const canvas = document.createElement(\"canvas\")\n  canvas.width = 1\n  canvas.height = 1\n  colorResolveContext = canvas.getContext(\"2d\", {\n    willReadFrequently: true,\n  })\n\n  return colorResolveContext\n}\n\nfunction resolveLineColor(color: string, element: HTMLElement) {\n  const resolver = document.createElement(\"span\")\n  resolver.style.color = color\n  resolver.style.opacity = \"0\"\n  resolver.style.pointerEvents = \"none\"\n  resolver.style.position = \"absolute\"\n  element.appendChild(resolver)\n\n  const resolvedColor = getComputedStyle(resolver).color\n  resolver.remove()\n  const context = getColorResolveContext()\n\n  if (!context) {\n    return new Float32Array([0.5, 0.5, 0.5, 1])\n  }\n\n  context.clearRect(0, 0, 1, 1)\n  context.fillStyle = resolvedColor\n  context.fillRect(0, 0, 1, 1)\n  const pixel = context.getImageData(0, 0, 1, 1).data\n\n  return new Float32Array([\n    pixel[0] / 255,\n    pixel[1] / 255,\n    pixel[2] / 255,\n    pixel[3] / 255,\n  ])\n}\n\nfunction createFallbackGridStyle(\n  cellSize: number,\n  lineColor: string\n): CSSProperties {\n  return {\n    animation: `${FALLBACK_ANIMATION_NAME} ${ANIMATION_DURATION_SECONDS}s linear infinite`,\n    backgroundImage: `linear-gradient(to right, ${lineColor} 1px, transparent 0), linear-gradient(to bottom, ${lineColor} 1px, transparent 0)`,\n    backgroundRepeat: \"repeat\",\n    backgroundSize: `${cellSize}px ${cellSize}px`,\n    transform: \"translateY(-50%)\",\n  }\n}\n\nexport function RetroGrid({\n  className,\n  angle = 65,\n  cellSize = 60,\n  opacity = 0.5,\n  lightLineColor = \"gray\",\n  darkLineColor = \"gray\",\n  style,\n  ...props\n}: RetroGridProps) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [isWebGlReady, setIsWebGlReady] = useState(false)\n  const angleRef = useRef(angle)\n  const cellSizeRef = useRef(cellSize)\n  const darkLineColorRef = useRef(darkLineColor)\n  const lightLineColorRef = useRef(lightLineColor)\n  const syncSceneRef = useRef<(() => void) | null>(null)\n\n  useEffect(() => {\n    angleRef.current = angle\n    cellSizeRef.current = cellSize\n    darkLineColorRef.current = darkLineColor\n    lightLineColorRef.current = lightLineColor\n    syncSceneRef.current?.()\n  }, [angle, cellSize, darkLineColor, lightLineColor])\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const container = containerRef.current\n\n    if (!canvas || !container) {\n      return\n    }\n\n    const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n    const colorScheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\n    let animationFrameId: number | null = null\n    let currentWidth = 0\n    let currentHeight = 0\n    let currentDevicePixelRatio = 1\n    let gl: WebGLRenderingContext | null = null\n    let isVisible = true\n    let isContextLost = false\n    let lineColor = resolveLineColor(lightLineColorRef.current, container)\n    let positionBuffer: WebGLBuffer | null = null\n    let programInfo: ProgramInfo | null = null\n\n    const getContext = () => {\n      const nextGl = canvas.getContext(\"webgl\", {\n        alpha: true,\n        antialias: true,\n        premultipliedAlpha: true,\n      })\n\n      if (!nextGl || !nextGl.getExtension(\"OES_standard_derivatives\")) {\n        return null\n      }\n\n      return nextGl\n    }\n\n    const releasePipeline = (shouldDeleteResources: boolean) => {\n      if (shouldDeleteResources && gl) {\n        if (positionBuffer) {\n          gl.deleteBuffer(positionBuffer)\n        }\n\n        if (programInfo) {\n          gl.deleteProgram(programInfo.program)\n        }\n      }\n\n      positionBuffer = null\n      programInfo = null\n\n      if (shouldDeleteResources) {\n        gl = null\n      }\n    }\n\n    const initializePipeline = () => {\n      const nextGl = getContext()\n\n      if (!nextGl) {\n        releasePipeline(false)\n        return false\n      }\n\n      gl = nextGl\n      releasePipeline(true)\n      gl = nextGl\n\n      const program = createProgram(nextGl)\n\n      if (!program) {\n        return false\n      }\n\n      const nextProgramInfo = getProgramInfo(nextGl, program)\n\n      if (!nextProgramInfo) {\n        nextGl.deleteProgram(program)\n        return false\n      }\n\n      const nextPositionBuffer = nextGl.createBuffer()\n\n      if (!nextPositionBuffer) {\n        nextGl.deleteProgram(program)\n        return false\n      }\n\n      nextGl.bindBuffer(nextGl.ARRAY_BUFFER, nextPositionBuffer)\n      nextGl.bufferData(\n        nextGl.ARRAY_BUFFER,\n        new Float32Array([-1, -1, 3, -1, -1, 3]),\n        nextGl.STATIC_DRAW\n      )\n\n      positionBuffer = nextPositionBuffer\n      programInfo = nextProgramInfo\n\n      return true\n    }\n\n    const updateLineColor = () => {\n      const activeColor = isDarkMode(colorScheme)\n        ? darkLineColorRef.current\n        : lightLineColorRef.current\n      lineColor = resolveLineColor(activeColor, container)\n    }\n\n    const resizeCanvas = () => {\n      currentWidth = Math.floor(container.clientWidth)\n      currentHeight = Math.floor(container.clientHeight)\n\n      if (currentWidth === 0 || currentHeight === 0 || !gl) {\n        return\n      }\n\n      currentDevicePixelRatio = Math.min(\n        window.devicePixelRatio || 1,\n        MAX_DEVICE_PIXEL_RATIO\n      )\n\n      canvas.width = Math.floor(currentWidth * currentDevicePixelRatio)\n      canvas.height = Math.floor(currentHeight * currentDevicePixelRatio)\n      canvas.style.width = `${currentWidth}px`\n      canvas.style.height = `${currentHeight}px`\n      gl.viewport(0, 0, canvas.width, canvas.height)\n    }\n\n    const draw = (timestamp: number) => {\n      if (\n        currentWidth === 0 ||\n        currentHeight === 0 ||\n        !gl ||\n        !positionBuffer ||\n        !programInfo ||\n        isContextLost\n      ) {\n        return\n      }\n\n      gl.useProgram(programInfo.program)\n      gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n      gl.enableVertexAttribArray(programInfo.attributeLocation)\n      gl.vertexAttribPointer(\n        programInfo.attributeLocation,\n        2,\n        gl.FLOAT,\n        false,\n        0,\n        0\n      )\n      gl.clearColor(0, 0, 0, 0)\n      gl.clear(gl.COLOR_BUFFER_BIT)\n      gl.uniform1f(\n        programInfo.uniforms.angle,\n        clamp(angleRef.current, MIN_ANGLE, MAX_ANGLE)\n      )\n      gl.uniform1f(\n        programInfo.uniforms.cellSize,\n        Math.max(cellSizeRef.current, 1)\n      )\n      gl.uniform2f(\n        programInfo.uniforms.containerSize,\n        currentWidth,\n        currentHeight\n      )\n      gl.uniform1f(\n        programInfo.uniforms.devicePixelRatio,\n        currentDevicePixelRatio\n      )\n      gl.uniform4fv(programInfo.uniforms.lineColor, lineColor)\n      gl.uniform1f(\n        programInfo.uniforms.time,\n        reducedMotion.matches ? 0 : timestamp / 1000\n      )\n      gl.uniform2f(\n        programInfo.uniforms.viewportSize,\n        window.innerWidth,\n        window.innerHeight\n      )\n      gl.drawArrays(gl.TRIANGLES, 0, 3)\n    }\n\n    const stopAnimation = () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n        animationFrameId = null\n      }\n    }\n\n    const frame = (timestamp: number) => {\n      draw(timestamp)\n\n      if (!reducedMotion.matches && isVisible) {\n        animationFrameId = requestAnimationFrame(frame)\n        return\n      }\n\n      animationFrameId = null\n    }\n\n    const syncScene = () => {\n      if (isContextLost) {\n        stopAnimation()\n        setIsWebGlReady(false)\n        return\n      }\n\n      if (!gl || !positionBuffer || !programInfo) {\n        if (!initializePipeline()) {\n          stopAnimation()\n          setIsWebGlReady(false)\n          return\n        }\n      }\n\n      resizeCanvas()\n\n      if (currentWidth === 0 || currentHeight === 0) {\n        stopAnimation()\n        return\n      }\n\n      updateLineColor()\n      draw(performance.now())\n      setIsWebGlReady(true)\n\n      if (reducedMotion.matches || !isVisible) {\n        stopAnimation()\n        return\n      }\n\n      if (animationFrameId === null) {\n        animationFrameId = requestAnimationFrame(frame)\n      }\n    }\n\n    syncSceneRef.current = syncScene\n\n    const resizeObserver = new ResizeObserver(() => {\n      syncScene()\n    })\n    resizeObserver.observe(container)\n\n    const handleWindowResize = () => {\n      syncScene()\n    }\n\n    const intersectionObserver = new IntersectionObserver(([entry]) => {\n      isVisible = entry?.isIntersecting ?? false\n\n      if (isVisible) {\n        syncScene()\n        return\n      }\n\n      stopAnimation()\n    })\n    intersectionObserver.observe(container)\n\n    const themeObserver = new MutationObserver(() => {\n      syncScene()\n    })\n    themeObserver.observe(document.documentElement, {\n      attributeFilter: [\"class\"],\n      attributes: true,\n    })\n\n    const handleMotionChange = () => {\n      syncScene()\n    }\n\n    const handleColorSchemeChange = () => {\n      syncScene()\n    }\n\n    const handleContextLost = (event: Event) => {\n      event.preventDefault()\n      isContextLost = true\n      stopAnimation()\n      releasePipeline(false)\n      setIsWebGlReady(false)\n    }\n\n    const handleContextRestored = () => {\n      isContextLost = false\n      syncScene()\n    }\n\n    reducedMotion.addEventListener(\"change\", handleMotionChange)\n    colorScheme.addEventListener(\"change\", handleColorSchemeChange)\n    window.addEventListener(\"resize\", handleWindowResize)\n    canvas.addEventListener(\"webglcontextlost\", handleContextLost)\n    canvas.addEventListener(\"webglcontextrestored\", handleContextRestored)\n\n    syncScene()\n\n    return () => {\n      stopAnimation()\n      resizeObserver.disconnect()\n      intersectionObserver.disconnect()\n      themeObserver.disconnect()\n      reducedMotion.removeEventListener(\"change\", handleMotionChange)\n      colorScheme.removeEventListener(\"change\", handleColorSchemeChange)\n      window.removeEventListener(\"resize\", handleWindowResize)\n      canvas.removeEventListener(\"webglcontextlost\", handleContextLost)\n      canvas.removeEventListener(\"webglcontextrestored\", handleContextRestored)\n      syncSceneRef.current = null\n      releasePipeline(!isContextLost)\n    }\n  }, [])\n\n  const gridStyles = {\n    ...style,\n    opacity,\n  } as CSSProperties\n  const normalizedAngle = clamp(angle, MIN_ANGLE, MAX_ANGLE)\n  const normalizedCellSize = Math.max(cellSize, 1)\n  const fallbackProjectionStyles = {\n    perspective: `${PERSPECTIVE_PX}px`,\n  } as CSSProperties\n  const fallbackRotationStyles = {\n    transform: `rotateX(${normalizedAngle}deg)`,\n  } as CSSProperties\n  const lightFallbackGridStyles = createFallbackGridStyle(\n    normalizedCellSize,\n    lightLineColor\n  )\n  const darkFallbackGridStyles = createFallbackGridStyle(\n    normalizedCellSize,\n    darkLineColor\n  )\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\n        \"pointer-events-none absolute size-full overflow-hidden\",\n        className\n      )}\n      style={gridStyles}\n      {...props}\n    >\n      <style>{FALLBACK_STYLES}</style>\n      {!isWebGlReady ? (\n        <div className=\"absolute inset-0\" style={fallbackProjectionStyles}>\n          <div className=\"absolute inset-0\" style={fallbackRotationStyles}>\n            <div\n              data-retro-grid-scroll=\"true\"\n              className=\"absolute inset-[0%_0px] ml-[-200%] h-[300vh] w-[600vw] origin-[100%_0_0] dark:hidden\"\n              style={lightFallbackGridStyles}\n            />\n            <div\n              data-retro-grid-scroll=\"true\"\n              className=\"absolute inset-[0%_0px] ml-[-200%] hidden h-[300vh] w-[600vw] origin-[100%_0_0] dark:block\"\n              style={darkFallbackGridStyles}\n            />\n          </div>\n        </div>\n      ) : null}\n      <canvas\n        ref={canvasRef}\n        className={cn(\n          \"absolute inset-0 size-full\",\n          isWebGlReady ? \"opacity-100\" : \"opacity-0\"\n        )}\n      />\n      <div className=\"absolute inset-0 bg-linear-to-t from-white to-transparent to-90% dark:from-black\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: retro-grid-demo =====\nTitle: Retro Grid Demo\n\n--- file: example/retro-grid-demo.tsx ---\n\"use client\"\n\nimport { RetroGrid } from \"@/registry/magicui/retro-grid\"\n\nexport default function RetroGridDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none z-10 bg-linear-to-b from-[#ffd319] via-[#ff2975] to-[#8c1eff] bg-clip-text text-center text-7xl leading-none font-bold tracking-tighter whitespace-pre-wrap text-transparent\">\n        Retro Grid\n      </span>\n\n      <RetroGrid />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: ripple =====\nTitle: Ripple\nDescription: An animated ripple effect typically used behind elements to emphasize them.\n\n--- file: magicui/ripple.tsx ---\nimport React, { type ComponentPropsWithoutRef, type CSSProperties } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface RippleProps extends ComponentPropsWithoutRef<\"div\"> {\n  mainCircleSize?: number\n  mainCircleOpacity?: number\n  numCircles?: number\n}\n\nexport const Ripple = React.memo(function Ripple({\n  mainCircleSize = 210,\n  mainCircleOpacity = 0.24,\n  numCircles = 8,\n  className,\n  ...props\n}: RippleProps) {\n  return (\n    <div\n      className={cn(\n        \"pointer-events-none absolute inset-0 mask-[linear-gradient(to_bottom,white,transparent)] select-none\",\n        className\n      )}\n      {...props}\n    >\n      {Array.from({ length: numCircles }, (_, i) => {\n        const size = mainCircleSize + i * 70\n        const opacity = mainCircleOpacity - i * 0.03\n        const animationDelay = `${i * 0.06}s`\n        const borderStyle = \"solid\"\n\n        return (\n          <div\n            key={i}\n            className={`animate-ripple bg-foreground/25 absolute rounded-full border shadow-xl`}\n            style={\n              {\n                \"--i\": i,\n                width: `${size}px`,\n                height: `${size}px`,\n                opacity,\n                animationDelay,\n                borderStyle,\n                borderWidth: \"1px\",\n                borderColor: `var(--foreground)`,\n                top: \"50%\",\n                left: \"50%\",\n                transform: \"translate(-50%, -50%) scale(1)\",\n              } as CSSProperties\n            }\n          />\n        )\n      })}\n    </div>\n  )\n})\n\nRipple.displayName = \"Ripple\"\n\n\n===== EXAMPLE: ripple-demo =====\nTitle: Ripple Demo\n\n--- file: example/ripple-demo.tsx ---\nimport { Ripple } from \"@/registry/magicui/ripple\"\n\nexport default function RippleDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <p className=\"z-10 text-center text-5xl font-medium tracking-tighter whitespace-pre-wrap text-white\">\n        Ripple\n      </p>\n      <Ripple />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: ripple-button =====\nTitle: Ripple Button\nDescription: An animated button with ripple useful for user engagement.\n\n--- file: magicui/ripple-button.tsx ---\n\"use client\"\n\nimport React, { MouseEvent, useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface RippleButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  rippleColor?: string\n  duration?: string\n}\n\nexport const RippleButton = React.forwardRef<\n  HTMLButtonElement,\n  RippleButtonProps\n>(\n  (\n    {\n      className,\n      children,\n      rippleColor = \"#ffffff\",\n      duration = \"600ms\",\n      onClick,\n      ...props\n    },\n    ref\n  ) => {\n    const [buttonRipples, setButtonRipples] = useState<\n      Array<{ x: number; y: number; size: number; key: number }>\n    >([])\n\n    const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n      createRipple(event)\n      onClick?.(event)\n    }\n\n    const createRipple = (event: MouseEvent<HTMLButtonElement>) => {\n      const button = event.currentTarget\n      const rect = button.getBoundingClientRect()\n      const size = Math.max(rect.width, rect.height)\n      const x = event.clientX - rect.left - size / 2\n      const y = event.clientY - rect.top - size / 2\n\n      const newRipple = { x, y, size, key: Date.now() }\n      setButtonRipples((prevRipples) => [...prevRipples, newRipple])\n    }\n\n    useEffect(() => {\n      let timeout: ReturnType<typeof setTimeout> | null = null\n\n      if (buttonRipples.length > 0) {\n        const lastRipple = buttonRipples[buttonRipples.length - 1]\n        timeout = setTimeout(() => {\n          setButtonRipples((prevRipples) =>\n            prevRipples.filter((ripple) => ripple.key !== lastRipple.key)\n          )\n        }, parseInt(duration))\n      }\n\n      return () => {\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n      }\n    }, [buttonRipples, duration])\n\n    return (\n      <button\n        className={cn(\n          \"bg-background text-primary relative flex cursor-pointer items-center justify-center overflow-hidden rounded-lg border-2 px-4 py-2 text-center\",\n          className\n        )}\n        onClick={handleClick}\n        ref={ref}\n        {...props}\n      >\n        <div className=\"relative z-10\">{children}</div>\n        <span className=\"pointer-events-none absolute inset-0\">\n          {buttonRipples.map((ripple) => (\n            <span\n              className=\"animate-rippling bg-background absolute rounded-full opacity-30\"\n              key={ripple.key}\n              style={\n                {\n                  width: `${ripple.size}px`,\n                  height: `${ripple.size}px`,\n                  top: `${ripple.y}px`,\n                  left: `${ripple.x}px`,\n                  backgroundColor: rippleColor,\n                  transform: `scale(0)`,\n                  \"--duration\": duration,\n                } as React.CSSProperties\n              }\n            />\n          ))}\n        </span>\n      </button>\n    )\n  }\n)\n\nRippleButton.displayName = \"RippleButton\"\n\n\n===== EXAMPLE: ripple-button-demo =====\nTitle: Ripple Button Demo\n\n--- file: example/ripple-button-demo.tsx ---\nimport { RippleButton } from \"@/registry/magicui/ripple-button\"\n\nexport default function RippleButtonDemo() {\n  return <RippleButton rippleColor=\"#ADD8E6\">Click me</RippleButton>\n}\n\n\n\n===== COMPONENT: safari =====\nTitle: Safari\nDescription: A safari browser mockup to showcase your website.\n\n--- file: magicui/safari.tsx ---\nimport type { HTMLAttributes } from \"react\"\n\nconst SAFARI_WIDTH = 1203\nconst SAFARI_HEIGHT = 753\nconst SCREEN_X = 1\nconst SCREEN_Y = 52\nconst SCREEN_WIDTH = 1200\nconst SCREEN_HEIGHT = 700\n\n// Calculated percentages\nconst LEFT_PCT = (SCREEN_X / SAFARI_WIDTH) * 100\nconst TOP_PCT = (SCREEN_Y / SAFARI_HEIGHT) * 100\nconst WIDTH_PCT = (SCREEN_WIDTH / SAFARI_WIDTH) * 100\nconst HEIGHT_PCT = (SCREEN_HEIGHT / SAFARI_HEIGHT) * 100\n\ntype SafariMode = \"default\" | \"simple\"\n\nexport interface SafariProps extends HTMLAttributes<HTMLDivElement> {\n  url?: string\n  imageSrc?: string\n  videoSrc?: string\n  mode?: SafariMode\n}\n\nexport function Safari({\n  imageSrc,\n  videoSrc,\n  url,\n  mode = \"default\",\n  className,\n  style,\n  ...props\n}: SafariProps) {\n  const hasVideo = !!videoSrc\n  const hasMedia = hasVideo || !!imageSrc\n\n  return (\n    <div\n      className={`relative inline-block w-full align-middle leading-none ${className ?? \"\"}`}\n      style={{\n        aspectRatio: `${SAFARI_WIDTH}/${SAFARI_HEIGHT}`,\n        ...style,\n      }}\n      {...props}\n    >\n      {hasVideo && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n          }}\n        >\n          <video\n            className=\"block size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n            preload=\"metadata\"\n          />\n        </div>\n      )}\n\n      {!hasVideo && imageSrc && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: \"0 0 11px 11px\",\n          }}\n        >\n          <img\n            src={imageSrc}\n            alt=\"\"\n            className=\"block size-full object-cover object-top\"\n          />\n        </div>\n      )}\n\n      <svg\n        viewBox={`0 0 ${SAFARI_WIDTH} ${SAFARI_HEIGHT}`}\n        fill=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"absolute inset-0 z-10 size-full\"\n        style={{ transform: \"translateZ(0)\" }}\n      >\n        <defs>\n          <mask id=\"safariPunch\" maskUnits=\"userSpaceOnUse\">\n            <rect\n              x=\"0\"\n              y=\"0\"\n              width={SAFARI_WIDTH}\n              height={SAFARI_HEIGHT}\n              fill=\"white\"\n            />\n            <path\n              d=\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\"\n              fill=\"black\"\n            />\n          </mask>\n\n          <clipPath id=\"path0\">\n            <rect width={SAFARI_WIDTH} height={SAFARI_HEIGHT} fill=\"white\" />\n          </clipPath>\n\n          <clipPath id=\"roundedBottom\">\n            <path\n              d=\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\"\n              fill=\"white\"\n            />\n          </clipPath>\n        </defs>\n\n        <g\n          clipPath=\"url(#path0)\"\n          mask={hasMedia ? \"url(#safariPunch)\" : undefined}\n        >\n          <path\n            d=\"M0 52H1202V741C1202 747.627 1196.63 753 1190 753H12C5.37258 753 0 747.627 0 741V52Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M0 12C0 5.37258 5.37258 0 12 0H1190C1196.63 0 1202 5.37258 1202 12V52H0L0 12Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M1.06738 12C1.06738 5.92487 5.99225 1 12.0674 1H1189.93C1196.01 1 1200.93 5.92487 1200.93 12V51H1.06738V12Z\"\n            className=\"fill-white dark:fill-[#262626]\"\n          />\n          <circle\n            cx=\"27\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <circle\n            cx=\"47\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <circle\n            cx=\"67\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M286 17C286 13.6863 288.686 11 292 11H946C949.314 11 952 13.6863 952 17V35C952 38.3137 949.314 41 946 41H292C288.686 41 286 38.3137 286 35V17Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <g className=\"mix-blend-luminosity\">\n            <path\n              d=\"M566.269 32.0852H572.426C573.277 32.0852 573.696 31.6663 573.696 30.7395V25.9851C573.696 25.1472 573.353 24.7219 572.642 24.6521V23.0842C572.642 20.6721 571.036 19.5105 569.348 19.5105C567.659 19.5105 566.053 20.6721 566.053 23.0842V24.6711C565.393 24.7727 565 25.1917 565 25.9851V30.7395C565 31.6663 565.418 32.0852 566.269 32.0852ZM567.272 22.97C567.272 21.491 568.211 20.6785 569.348 20.6785C570.478 20.6785 571.423 21.491 571.423 22.97V24.6394L567.272 24.6458V22.97Z\"\n              fill=\"#A3A3A3\"\n            />\n          </g>\n\n          <g className=\"mix-blend-luminosity\">\n            <text\n              x=\"580\"\n              y=\"30\"\n              fill=\"#A3A3A3\"\n              fontSize=\"12\"\n              fontFamily=\"Arial, sans-serif\"\n            >\n              {url}\n            </text>\n          </g>\n\n          {mode === \"default\" ? (\n            <>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M265.5 33.8984C265.641 33.8984 265.852 33.8516 266.047 33.7422C270.547 31.2969 272.109 30.1641 272.109 27.3203V21.4219C272.109 20.4844 271.742 20.1484 270.961 19.8125C270.094 19.4453 267.18 18.4297 266.328 18.1406C266.07 18.0547 265.766 18 265.5 18C265.234 18 264.93 18.0703 264.672 18.1406C263.82 18.3828 260.906 19.4531 260.039 19.8125C259.258 20.1406 258.891 20.4844 258.891 21.4219V27.3203C258.891 30.1641 260.461 31.2812 264.945 33.7422C265.148 33.8516 265.359 33.8984 265.5 33.8984ZM265.922 19.5781C266.945 19.9766 269.172 20.7656 270.344 21.1875C270.562 21.2656 270.617 21.3828 270.617 21.6641V27.0234C270.617 29.3125 269.469 29.9375 265.945 32.0625C265.727 32.1875 265.617 32.2344 265.508 32.2344V19.4844C265.617 19.4844 265.734 19.5156 265.922 19.5781Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M936.273 24.9766C936.5 24.9766 936.68 24.9062 936.82 24.7578L940.023 21.5312C940.195 21.3594 940.273 21.1719 940.273 20.9531C940.273 20.7422 940.188 20.5391 940.023 20.3828L936.82 17.125C936.68 16.9688 936.5 16.8906 936.273 16.8906C935.852 16.8906 935.516 17.2422 935.516 17.6719C935.516 17.8828 935.594 18.0547 935.727 18.2031L937.594 20.0312C937.227 19.9766 936.852 19.9453 936.477 19.9453C932.609 19.9453 929.516 23.0391 929.516 26.9141C929.516 30.7891 932.633 33.9062 936.5 33.9062C940.375 33.9062 943.484 30.7891 943.484 26.9141C943.484 26.4453 943.156 26.1094 942.688 26.1094C942.234 26.1094 941.93 26.4453 941.93 26.9141C941.93 29.9297 939.516 32.3516 936.5 32.3516C933.492 32.3516 931.07 29.9297 931.07 26.9141C931.07 23.875 933.469 21.4688 936.477 21.4688C936.984 21.4688 937.453 21.5078 937.867 21.5781L935.734 23.6875C935.594 23.8281 935.516 24 935.516 24.2109C935.516 24.6406 935.852 24.9766 936.273 24.9766Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1134 33.0156C1134.49 33.0156 1134.89 32.6094 1134.89 32.1484V27.2578H1139.66C1140.13 27.2578 1140.54 26.8594 1140.54 26.3672C1140.54 25.8828 1140.13 25.4766 1139.66 25.4766H1134.89V20.5859C1134.89 20.1172 1134.49 19.7188 1134 19.7188C1133.52 19.7188 1133.11 20.1172 1133.11 20.5859V25.4766H1128.34C1127.88 25.4766 1127.46 25.8828 1127.46 26.3672C1127.46 26.8594 1127.88 27.2578 1128.34 27.2578H1133.11V32.1484C1133.11 32.6094 1133.52 33.0156 1134 33.0156Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1161.8 31.0703H1163.23V32.375C1163.23 34.0547 1164.12 34.9219 1165.81 34.9219H1174.2C1175.89 34.9219 1176.77 34.0547 1176.77 32.3828V24.0469C1176.77 22.375 1175.89 21.5 1174.2 21.5H1172.77V20.2578C1172.77 18.5859 1171.88 17.7109 1170.19 17.7109H1161.8C1160.1 17.7109 1159.23 18.5781 1159.23 20.2578V28.5234C1159.23 30.1953 1160.1 31.0703 1161.8 31.0703ZM1161.9 29.5078C1161.18 29.5078 1160.78 29.1328 1160.78 28.3828V20.3984C1160.78 19.6406 1161.18 19.2656 1161.9 19.2656H1170.09C1170.8 19.2656 1171.2 19.6406 1171.2 20.3984V21.5H1165.81C1164.12 21.5 1163.23 22.375 1163.23 24.0469V29.5078H1161.9ZM1165.91 33.3672C1165.19 33.3672 1164.8 32.9922 1164.8 32.2422V24.1875C1164.8 23.4297 1165.19 23.0625 1165.91 23.0625H1174.1C1174.81 23.0625 1175.21 23.4297 1175.21 24.1875V32.2422C1175.21 32.9922 1174.81 33.3672 1174.1 33.3672H1165.91Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1099.51 28.4141C1099.91 28.4141 1100.24 28.0859 1100.24 27.6953V19.8359L1100.18 18.6797L1100.66 19.25L1101.75 20.4141C1101.88 20.5547 1102.06 20.625 1102.24 20.625C1102.6 20.625 1102.9 20.3672 1102.9 20C1102.9 19.8047 1102.82 19.6641 1102.69 19.5312L1100.06 17.0078C1099.88 16.8203 1099.7 16.7578 1099.51 16.7578C1099.32 16.7578 1099.14 16.8203 1098.95 17.0078L1096.33 19.5312C1096.2 19.6641 1096.12 19.8047 1096.12 20C1096.12 20.3672 1096.41 20.625 1096.77 20.625C1096.95 20.625 1097.14 20.5547 1097.27 20.4141L1098.35 19.25L1098.84 18.6719L1098.78 19.8359V27.6953C1098.78 28.0859 1099.11 28.4141 1099.51 28.4141ZM1095 34.6562H1104C1105.7 34.6562 1106.57 33.7812 1106.57 32.1094V24.4297C1106.57 22.7578 1105.7 21.8828 1104 21.8828H1101.89V23.4375H1103.9C1104.61 23.4375 1105.02 23.8125 1105.02 24.5625V31.9688C1105.02 32.7188 1104.61 33.0938 1103.9 33.0938H1095.1C1094.38 33.0938 1093.98 32.7188 1093.98 31.9688V24.5625C1093.98 23.8125 1094.38 23.4375 1095.1 23.4375H1097.13V21.8828H1095C1093.31 21.8828 1092.43 22.75 1092.43 24.4297V32.1094C1092.43 33.7812 1093.31 34.6562 1095 34.6562Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M99.5703 33.6016H112.938C114.633 33.6016 115.516 32.7266 115.516 31.0547V21.5469C115.516 19.875 114.633 19 112.938 19H99.5703C97.8828 19 97 19.8672 97 21.5469V31.0547C97 32.7266 97.8828 33.6016 99.5703 33.6016ZM99.6719 32.0469C98.9531 32.0469 98.5547 31.6719 98.5547 30.9141V21.6875C98.5547 20.9297 98.9531 20.5547 99.6719 20.5547H103.234V32.0469H99.6719ZM112.836 20.5547C113.555 20.5547 113.953 20.9297 113.953 21.6875V30.9141C113.953 31.6719 113.555 32.0469 112.836 32.0469H104.711V20.5547H112.836ZM101.703 23.4141C101.984 23.4141 102.219 23.1719 102.219 22.9062C102.219 22.6406 101.984 22.4062 101.703 22.4062H100.102C99.8203 22.4062 99.5859 22.6406 99.5859 22.9062C99.5859 23.1719 99.8203 23.4141 100.102 23.4141H101.703ZM101.703 25.5156C101.984 25.5156 102.219 25.2812 102.219 25.0078C102.219 24.7422 101.984 24.5078 101.703 24.5078H100.102C99.8203 24.5078 99.5859 24.7422 99.5859 25.0078C99.5859 25.2812 99.8203 25.5156 100.102 25.5156H101.703ZM101.703 27.6094C101.984 27.6094 102.219 27.3828 102.219 27.1094C102.219 26.8438 101.984 26.6172 101.703 26.6172H100.102C99.8203 26.6172 99.5859 26.8438 99.5859 27.1094C99.5859 27.3828 99.8203 27.6094 100.102 27.6094H101.703Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M143.914 32.5938C144.094 32.7656 144.312 32.8594 144.562 32.8594C145.086 32.8594 145.492 32.4531 145.492 31.9375C145.492 31.6797 145.391 31.4453 145.211 31.2656L139.742 25.9219L145.211 20.5938C145.391 20.4141 145.492 20.1719 145.492 19.9219C145.492 19.4062 145.086 19 144.562 19C144.312 19 144.094 19.0938 143.922 19.2656L137.844 25.2031C137.625 25.4062 137.516 25.6562 137.516 25.9297C137.516 26.2031 137.625 26.4375 137.836 26.6484L143.914 32.5938Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M168.422 32.8594C168.68 32.8594 168.891 32.7656 169.07 32.5938L175.148 26.6562C175.359 26.4375 175.469 26.2109 175.469 25.9297C175.469 25.6562 175.367 25.4141 175.148 25.2109L169.07 19.2656C168.891 19.0938 168.68 19 168.422 19C167.898 19 167.492 19.4062 167.492 19.9219C167.492 20.1719 167.602 20.4141 167.773 20.5938L173.25 25.9375L167.773 31.2656C167.594 31.4531 167.492 31.6797 167.492 31.9375C167.492 32.4531 167.898 32.8594 168.422 32.8594Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n            </>\n          ) : null}\n        </g>\n      </svg>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: safari-demo =====\nTitle: Safari Demo\n\n--- file: example/safari-demo.tsx ---\nimport { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari url=\"magicui.design\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: safari-demo-2 =====\nTitle: Safari Demo 2\n\n--- file: example/safari-demo-2.tsx ---\nimport { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari\n        url=\"magicui.design\"\n        imageSrc=\"https://placehold.co/1200x750?text=Hello+World\"\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: safari-demo-3 =====\nTitle: Safari Demo 3\n\n--- file: example/safari-demo-3.tsx ---\nimport { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari\n        url=\"magicui.design\"\n        videoSrc=\"https://videos.pexels.com/video-files/27180348/12091515_2560_1440_50fps.mp4\"\n      />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: safari-demo-4 =====\nTitle: Safari Demo 4\n\n--- file: example/safari-demo-4.tsx ---\nimport { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari url=\"magicui.design\" mode=\"simple\" />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: scroll-based-velocity =====\nTitle: Scroll Based Velocity\nDescription: Scrolling text whose speed changes based on scroll speed\n\n--- file: magicui/scroll-based-velocity.tsx ---\n\"use client\"\n\nimport React, { useContext, useEffect, useRef, useState } from \"react\"\nimport {\n  motion,\n  useAnimationFrame,\n  useMotionValue,\n  useScroll,\n  useSpring,\n  useTransform,\n  useVelocity,\n} from \"motion/react\"\nimport type { MotionValue } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ScrollVelocityRowProps extends React.HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode\n  baseVelocity?: number\n  direction?: 1 | -1\n  scrollReactivity?: boolean\n}\n\nexport const wrap = (min: number, max: number, v: number) => {\n  const rangeSize = max - min\n  return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min\n}\n\nconst ScrollVelocityContext = React.createContext<MotionValue<number> | null>(\n  null\n)\n\nexport function ScrollVelocityContainer({\n  children,\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  const { scrollY } = useScroll()\n  const scrollVelocity = useVelocity(scrollY)\n  const smoothVelocity = useSpring(scrollVelocity, {\n    damping: 50,\n    stiffness: 400,\n  })\n  const velocityFactor = useTransform(smoothVelocity, (v) => {\n    const sign = v < 0 ? -1 : 1\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\n    return sign * magnitude\n  })\n\n  return (\n    <ScrollVelocityContext.Provider value={velocityFactor}>\n      <div className={cn(\"relative w-full\", className)} {...props}>\n        {children}\n      </div>\n    </ScrollVelocityContext.Provider>\n  )\n}\n\nexport function ScrollVelocityRow(props: ScrollVelocityRowProps) {\n  const sharedVelocityFactor = useContext(ScrollVelocityContext)\n  if (sharedVelocityFactor) {\n    return (\n      <ScrollVelocityRowImpl {...props} velocityFactor={sharedVelocityFactor} />\n    )\n  }\n  return <ScrollVelocityRowLocal {...props} />\n}\n\ninterface ScrollVelocityRowImplProps extends ScrollVelocityRowProps {\n  velocityFactor: MotionValue<number>\n}\n\nfunction ScrollVelocityRowImpl({\n  children,\n  baseVelocity = 5,\n  direction = 1,\n  className,\n  velocityFactor,\n  scrollReactivity = true,\n  ...props\n}: ScrollVelocityRowImplProps) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const blockRef = useRef<HTMLDivElement>(null)\n  const [numCopies, setNumCopies] = useState(1)\n\n  const baseX = useMotionValue(0)\n  const baseDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\n  const currentDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\n  const unitWidth = useMotionValue(0)\n\n  const isInViewRef = useRef(true)\n  const isPageVisibleRef = useRef(true)\n  const prefersReducedMotionRef = useRef(false)\n\n  useEffect(() => {\n    const container = containerRef.current\n    const block = blockRef.current\n    let ro: ResizeObserver | null = null\n    let io: IntersectionObserver | null = null\n    let mq: MediaQueryList | null = null\n    const handleVisibility = () => {\n      isPageVisibleRef.current = document.visibilityState === \"visible\"\n    }\n    const handlePRM = () => {\n      if (mq) {\n        prefersReducedMotionRef.current = mq.matches\n      }\n    }\n\n    if (container && block) {\n      const updateSizes = () => {\n        const cw = container.offsetWidth || 0\n        const bw = block.scrollWidth || 0\n        unitWidth.set(bw)\n        const nextCopies = bw > 0 ? Math.max(3, Math.ceil(cw / bw) + 2) : 1\n        setNumCopies((prev) => (prev === nextCopies ? prev : nextCopies))\n      }\n\n      updateSizes()\n\n      ro = new ResizeObserver(updateSizes)\n      ro.observe(container)\n      ro.observe(block)\n\n      io = new IntersectionObserver(([entry]) => {\n        isInViewRef.current = entry.isIntersecting\n      })\n      io.observe(container)\n\n      document.addEventListener(\"visibilitychange\", handleVisibility, {\n        passive: true,\n      })\n      handleVisibility()\n\n      mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n      mq.addEventListener(\"change\", handlePRM)\n      handlePRM()\n    }\n\n    return () => {\n      if (ro) {\n        ro.disconnect()\n      }\n      if (io) {\n        io.disconnect()\n      }\n      document.removeEventListener(\"visibilitychange\", handleVisibility)\n      if (mq) {\n        mq.removeEventListener(\"change\", handlePRM)\n      }\n    }\n  }, [children, unitWidth])\n\n  const x = useTransform([baseX, unitWidth], ([v, bw]) => {\n    const width = Number(bw) || 1\n    const offset = Number(v) || 0\n    return `${-wrap(0, width, offset)}px`\n  })\n\n  useAnimationFrame((_, delta) => {\n    if (!isInViewRef.current || !isPageVisibleRef.current) return\n    const dt = delta / 1000\n    const vf = scrollReactivity ? velocityFactor.get() : 0\n    const absVf = Math.min(5, Math.abs(vf))\n    const speedMultiplier = prefersReducedMotionRef.current ? 1 : 1 + absVf\n\n    if (absVf > 0.1) {\n      const scrollDirection = vf >= 0 ? 1 : -1\n      currentDirectionRef.current = baseDirectionRef.current * scrollDirection\n    }\n\n    const bw = unitWidth.get() || 0\n    if (bw <= 0) return\n    const pixelsPerSecond = (bw * baseVelocity) / 100\n    const moveBy =\n      currentDirectionRef.current * pixelsPerSecond * speedMultiplier * dt\n    baseX.set(baseX.get() + moveBy)\n  })\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\"w-full overflow-hidden whitespace-nowrap\", className)}\n      {...props}\n    >\n      <motion.div\n        className=\"inline-flex transform-gpu items-center will-change-transform select-none\"\n        style={{ x }}\n      >\n        {Array.from({ length: numCopies }).map((_, i) => (\n          <div\n            key={i}\n            ref={i === 0 ? blockRef : null}\n            aria-hidden={i !== 0}\n            className=\"inline-flex shrink-0 items-center\"\n          >\n            {children}\n          </div>\n        ))}\n      </motion.div>\n    </div>\n  )\n}\n\nfunction ScrollVelocityRowLocal(props: ScrollVelocityRowProps) {\n  const { scrollY } = useScroll()\n  const localVelocity = useVelocity(scrollY)\n  const localSmoothVelocity = useSpring(localVelocity, {\n    damping: 50,\n    stiffness: 400,\n  })\n  const localVelocityFactor = useTransform(localSmoothVelocity, (v) => {\n    const sign = v < 0 ? -1 : 1\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\n    return sign * magnitude\n  })\n  return (\n    <ScrollVelocityRowImpl {...props} velocityFactor={localVelocityFactor} />\n  )\n}\n\n\n===== EXAMPLE: scroll-based-velocity-demo =====\nTitle: Scroll Based Velocity Demo\n\n--- file: example/scroll-based-velocity-demo.tsx ---\nimport {\n  ScrollVelocityContainer,\n  ScrollVelocityRow,\n} from \"@/registry/magicui/scroll-based-velocity\"\n\nexport default function ScrollBasedVelocityDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden\">\n      <ScrollVelocityContainer className=\"text-4xl font-bold tracking-[-0.02em] md:text-7xl md:leading-20\">\n        <ScrollVelocityRow baseVelocity={20} direction={1}>\n          Velocity Scroll\n        </ScrollVelocityRow>\n        <ScrollVelocityRow baseVelocity={20} direction={-1}>\n          Velocity Scroll\n        </ScrollVelocityRow>\n      </ScrollVelocityContainer>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: scroll-based-velocity-images-demo =====\nTitle: Scroll Based Velocity Images\n\n--- file: example/scroll-based-velocity-images-demo.tsx ---\nimport {\n  ScrollVelocityContainer,\n  ScrollVelocityRow,\n} from \"@/registry/magicui/scroll-based-velocity\"\n\nconst IMAGES_ROW_A = [\n  \"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nconst IMAGES_ROW_B = [\n  \"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nexport default function ScrollBasedVelocityImagesDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden py-8\">\n      <ScrollVelocityContainer className=\"w-full\">\n        <ScrollVelocityRow baseVelocity={6} direction={1} className=\"py-4\">\n          {IMAGES_ROW_A.map((src, idx) => (\n            <img\n              key={idx}\n              src={`${src}&ixlib=rb-4.0.3`}\n              alt=\"Unsplash sample\"\n              width={240}\n              height={160}\n              loading=\"lazy\"\n              decoding=\"async\"\n              className=\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\"\n            />\n          ))}\n        </ScrollVelocityRow>\n        <ScrollVelocityRow baseVelocity={6} direction={-1} className=\"py-4\">\n          {IMAGES_ROW_B.map((src, idx) => (\n            <img\n              key={idx}\n              src={`${src}&ixlib=rb-4.0.3`}\n              alt=\"Unsplash sample\"\n              width={240}\n              height={160}\n              loading=\"lazy\"\n              decoding=\"async\"\n              className=\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\"\n            />\n          ))}\n        </ScrollVelocityRow>\n      </ScrollVelocityContainer>\n\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: scroll-progress =====\nTitle: Scroll Progress\nDescription: Animated Scroll Progress for your pages\n\n--- file: magicui/scroll-progress.tsx ---\n\"use client\"\n\nimport { motion, useScroll, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ScrollProgressProps extends Omit<\n  React.HTMLAttributes<HTMLElement>,\n  keyof MotionProps\n> {\n  ref?: React.Ref<HTMLDivElement>\n}\n\nexport function ScrollProgress({\n  className,\n  ref,\n  ...props\n}: ScrollProgressProps) {\n  const { scrollYProgress } = useScroll()\n\n  return (\n    <motion.div\n      ref={ref}\n      className={cn(\n        \"fixed inset-x-0 top-0 z-50 h-px origin-left bg-linear-to-r from-[#A97CF8] via-[#F38CB8] to-[#FDCC92]\",\n        className\n      )}\n      style={{\n        scaleX: scrollYProgress,\n      }}\n      {...props}\n    />\n  )\n}\n\n\n===== EXAMPLE: scroll-progress-demo =====\nTitle: Scroll Progress Demo\n\n--- file: example/scroll-progress-demo.tsx ---\nimport { ScrollProgress } from \"@/registry/magicui/scroll-progress\"\n\nexport default function ScrollProgressDemo() {\n  return (\n    <div className=\"z-10 rounded-lg p-4\">\n      <ScrollProgress className=\"top-[65px]\" />\n      <h2 className=\"pb-4 font-bold\">\n        Note: The scroll progress is shown below the navbar of the page.\n      </h2>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: shimmer-button =====\nTitle: Shimmer Button\nDescription: A button with a shimmering light which travels around the perimeter.\n\n--- file: magicui/shimmer-button.tsx ---\nimport React, { type ComponentPropsWithoutRef, type CSSProperties } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface ShimmerButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n  shimmerColor?: string\n  shimmerSize?: string\n  borderRadius?: string\n  shimmerDuration?: string\n  background?: string\n  className?: string\n  children?: React.ReactNode\n}\n\nexport const ShimmerButton = React.forwardRef<\n  HTMLButtonElement,\n  ShimmerButtonProps\n>(\n  (\n    {\n      shimmerColor = \"#ffffff\",\n      shimmerSize = \"0.05em\",\n      shimmerDuration = \"3s\",\n      borderRadius = \"100px\",\n      background = \"rgba(0, 0, 0, 1)\",\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    return (\n      <button\n        style={\n          {\n            \"--spread\": \"90deg\",\n            \"--shimmer-color\": shimmerColor,\n            \"--radius\": borderRadius,\n            \"--speed\": shimmerDuration,\n            \"--cut\": shimmerSize,\n            \"--bg\": background,\n          } as CSSProperties\n        }\n        className={cn(\n          \"group relative z-0 flex cursor-pointer items-center justify-center overflow-hidden [border-radius:var(--radius)] border border-white/10 px-6 py-3 whitespace-nowrap text-white [background:var(--bg)]\",\n          \"transform-gpu transition-transform duration-300 ease-in-out active:translate-y-px\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      >\n        {/* spark container */}\n        <div\n          className={cn(\n            \"-z-30 blur-[2px]\",\n            \"@container-[size] absolute inset-0 overflow-visible\"\n          )}\n        >\n          {/* spark */}\n          <div className=\"animate-shimmer-slide absolute inset-0 aspect-[1] h-[100cqh] rounded-none [mask:none]\">\n            {/* spark before */}\n            <div className=\"animate-spin-around absolute -inset-full w-auto [translate:0_0] rotate-0 [background:conic-gradient(from_calc(270deg-(var(--spread)*0.5)),transparent_0,var(--shimmer-color)_var(--spread),transparent_var(--spread))]\" />\n          </div>\n        </div>\n        {children}\n\n        {/* Highlight */}\n        <div\n          className={cn(\n            \"absolute inset-0 size-full\",\n\n            \"rounded-2xl px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#ffffff1f]\",\n\n            // transition\n            \"transform-gpu transition-all duration-300 ease-in-out\",\n\n            // on hover\n            \"group-hover:shadow-[inset_0_-6px_10px_#ffffff3f]\",\n\n            // on click\n            \"group-active:shadow-[inset_0_-10px_10px_#ffffff3f]\"\n          )}\n        />\n\n        {/* backdrop */}\n        <div\n          className={cn(\n            \"absolute inset-(--cut) -z-20 [border-radius:var(--radius)] [background:var(--bg)]\"\n          )}\n        />\n      </button>\n    )\n  }\n)\n\nShimmerButton.displayName = \"ShimmerButton\"\n\n\n===== EXAMPLE: shimmer-button-demo =====\nTitle: Shimmer Button Demo\n\n--- file: example/shimmer-button-demo.tsx ---\nimport { ShimmerButton } from \"@/registry/magicui/shimmer-button\"\n\nexport default function ShimmerButtonDemo() {\n  return (\n    <ShimmerButton className=\"shadow-2xl\">\n      <span className=\"text-center text-sm leading-none font-medium tracking-tight whitespace-pre-wrap text-white lg:text-lg dark:from-white dark:to-slate-900/10\">\n        Shimmer Button\n      </span>\n    </ShimmerButton>\n  )\n}\n\n\n\n===== COMPONENT: shine-border =====\nTitle: Shine Border\nDescription: Shine border is an animated background border effect.\n\n--- file: magicui/shine-border.tsx ---\n\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {\n  /**\n   * Width of the border in pixels\n   * @default 1\n   */\n  borderWidth?: number\n  /**\n   * Duration of the animation in seconds\n   * @default 14\n   */\n  duration?: number\n  /**\n   * Color of the border, can be a single color or an array of colors\n   * @default \"#000000\"\n   */\n  shineColor?: string | string[]\n}\n\n/**\n * Shine Border\n *\n * An animated background border effect component with configurable properties.\n */\nexport function ShineBorder({\n  borderWidth = 1,\n  duration = 14,\n  shineColor = \"#000000\",\n  className,\n  style,\n  ...props\n}: ShineBorderProps) {\n  return (\n    <div\n      style={\n        {\n          \"--border-width\": `${borderWidth}px`,\n          \"--duration\": `${duration}s`,\n          backgroundImage: `radial-gradient(transparent,transparent, ${\n            Array.isArray(shineColor) ? shineColor.join(\",\") : shineColor\n          },transparent,transparent)`,\n          backgroundSize: \"300% 300%\",\n          mask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n          WebkitMask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n          WebkitMaskComposite: \"xor\",\n          maskComposite: \"exclude\",\n          padding: \"var(--border-width)\",\n          ...style,\n        } as React.CSSProperties\n      }\n      className={cn(\n        \"motion-safe:animate-shine pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\n\n===== EXAMPLE: shine-border-demo =====\nTitle: Shine Border Demo\n\n--- file: example/shine-border-demo.tsx ---\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { ShineBorder } from \"@/registry/magicui/shine-border\"\n\nexport default function ShineBorderDemo() {\n  return (\n    <Card className=\"relative w-full max-w-[350px] overflow-hidden\">\n      <ShineBorder shineColor={[\"#A07CFE\", \"#FE8FB5\", \"#FFBE7B\"]} />\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid gap-4\">\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n            </div>\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input id=\"password\" type=\"password\" />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter>\n        <Button className=\"w-full\">Sign In</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n\n\n===== EXAMPLE: shine-border-demo-2 =====\nTitle: Shine Border Demo 2\n\n--- file: example/shine-border-demo-2.tsx ---\n\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { ShineBorder } from \"@/registry/magicui/shine-border\"\n\nexport default function ShineBorderDemo2() {\n  const theme = useTheme()\n  return (\n    <Card className=\"relative overflow-hidden\">\n      <ShineBorder shineColor={theme.theme === \"dark\" ? \"white\" : \"black\"} />\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid gap-4\">\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n            </div>\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input id=\"password\" type=\"password\" />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter>\n        <Button className=\"w-full\">Sign In</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n\n\n\n===== COMPONENT: shiny-button =====\nTitle: Shiny Button\nDescription: A shiny button component with dynamic styles in the dark mode or light mode.\n\n--- file: magicui/shiny-button.tsx ---\n\"use client\"\n\nimport React from \"react\"\nimport { motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst animationProps: MotionProps = {\n  initial: { \"--x\": \"100%\", scale: 0.8 },\n  animate: { \"--x\": \"-100%\", scale: 1 },\n  whileTap: { scale: 0.95 },\n  transition: {\n    repeat: Infinity,\n    repeatType: \"loop\",\n    repeatDelay: 1,\n    type: \"spring\",\n    stiffness: 20,\n    damping: 15,\n    mass: 2,\n    scale: {\n      type: \"spring\",\n      stiffness: 200,\n      damping: 5,\n      mass: 0.5,\n    },\n  },\n}\n\ninterface ShinyButtonProps\n  extends\n    Omit<React.HTMLAttributes<HTMLElement>, keyof MotionProps>,\n    MotionProps {\n  children: React.ReactNode\n  className?: string\n}\n\nexport const ShinyButton = React.forwardRef<\n  HTMLButtonElement,\n  ShinyButtonProps\n>(({ children, className, ...props }, ref) => {\n  return (\n    <motion.button\n      ref={ref}\n      className={cn(\n        \"relative cursor-pointer rounded-lg border px-6 py-2 font-medium backdrop-blur-xl transition-shadow duration-300 ease-in-out hover:shadow dark:bg-[radial-gradient(circle_at_50%_0%,var(--primary)/10%_0%,transparent_60%)] dark:hover:shadow-[0_0_20px_var(--primary)/10%]\",\n        className\n      )}\n      {...animationProps}\n      {...props}\n    >\n      <span\n        className=\"relative block size-full text-sm tracking-wide text-[rgb(0,0,0,65%)] uppercase dark:font-light dark:text-[rgb(255,255,255,90%)]\"\n        style={{\n          maskImage:\n            \"linear-gradient(-75deg,var(--primary) calc(var(--x) + 20%),transparent calc(var(--x) + 30%),var(--primary) calc(var(--x) + 100%))\",\n        }}\n      >\n        {children}\n      </span>\n      <span\n        style={{\n          mask: \"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\",\n          WebkitMask:\n            \"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\",\n          backgroundImage:\n            \"linear-gradient(-75deg,var(--primary)/10% calc(var(--x)+20%),var(--primary)/50% calc(var(--x)+25%),var(--primary)/10% calc(var(--x)+100%))\",\n        }}\n        className=\"absolute inset-0 z-10 block rounded-[inherit] p-px\"\n      />\n    </motion.button>\n  )\n})\n\nShinyButton.displayName = \"ShinyButton\"\n\n\n===== EXAMPLE: shiny-button-demo =====\nTitle: Shiny Button Demo\n\n--- file: example/shiny-button-demo.tsx ---\nimport { ShinyButton } from \"@/registry/magicui/shiny-button\"\n\nexport default function ShinyButtonDemo() {\n  return <ShinyButton>Shiny Button</ShinyButton>\n}\n\n\n\n===== COMPONENT: smooth-cursor =====\nTitle: smooth-cursor\nDescription: A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\n\n--- file: magicui/smooth-cursor.tsx ---\n\"use client\"\n\nimport { FC, useEffect, useRef, useState } from \"react\"\nimport { motion, useSpring } from \"motion/react\"\n\ninterface Position {\n  x: number\n  y: number\n}\n\nexport interface SmoothCursorProps {\n  cursor?: React.ReactNode\n  springConfig?: {\n    damping: number\n    stiffness: number\n    mass: number\n    restDelta: number\n  }\n}\n\nconst DESKTOP_POINTER_QUERY = \"(any-hover: hover) and (any-pointer: fine)\"\n\nfunction isTrackablePointer(pointerType: string) {\n  return pointerType !== \"touch\"\n}\n\nconst DefaultCursorSVG: FC = () => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width={50}\n      height={54}\n      viewBox=\"0 0 50 54\"\n      fill=\"none\"\n      style={{ scale: 0.5 }}\n    >\n      <g filter=\"url(#filter0_d_91_7928)\">\n        <path\n          d=\"M42.6817 41.1495L27.5103 6.79925C26.7269 5.02557 24.2082 5.02558 23.3927 6.79925L7.59814 41.1495C6.75833 42.9759 8.52712 44.8902 10.4125 44.1954L24.3757 39.0496C24.8829 38.8627 25.4385 38.8627 25.9422 39.0496L39.8121 44.1954C41.6849 44.8902 43.4884 42.9759 42.6817 41.1495Z\"\n          fill=\"black\"\n        />\n        <path\n          d=\"M43.7146 40.6933L28.5431 6.34306C27.3556 3.65428 23.5772 3.69516 22.3668 6.32755L6.57226 40.6778C5.3134 43.4156 7.97238 46.298 10.803 45.2549L24.7662 40.109C25.0221 40.0147 25.2999 40.0156 25.5494 40.1082L39.4193 45.254C42.2261 46.2953 44.9254 43.4347 43.7146 40.6933Z\"\n          stroke=\"white\"\n          strokeWidth={2.25825}\n        />\n      </g>\n      <defs>\n        <filter\n          id=\"filter0_d_91_7928\"\n          x={0.602397}\n          y={0.952444}\n          width={49.0584}\n          height={52.428}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feColorMatrix\n            in=\"SourceAlpha\"\n            type=\"matrix\"\n            values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n            result=\"hardAlpha\"\n          />\n          <feOffset dy={2.25825} />\n          <feGaussianBlur stdDeviation={2.25825} />\n          <feComposite in2=\"hardAlpha\" operator=\"out\" />\n          <feColorMatrix\n            type=\"matrix\"\n            values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\"\n          />\n          <feBlend\n            mode=\"normal\"\n            in2=\"BackgroundImageFix\"\n            result=\"effect1_dropShadow_91_7928\"\n          />\n          <feBlend\n            mode=\"normal\"\n            in=\"SourceGraphic\"\n            in2=\"effect1_dropShadow_91_7928\"\n            result=\"shape\"\n          />\n        </filter>\n      </defs>\n    </svg>\n  )\n}\n\nexport function SmoothCursor({\n  cursor = <DefaultCursorSVG />,\n  springConfig = {\n    damping: 45,\n    stiffness: 400,\n    mass: 1,\n    restDelta: 0.001,\n  },\n}: SmoothCursorProps) {\n  const lastMousePos = useRef<Position>({ x: 0, y: 0 })\n  const velocity = useRef<Position>({ x: 0, y: 0 })\n  const lastUpdateTime = useRef(Date.now())\n  const previousAngle = useRef(0)\n  const accumulatedRotation = useRef(0)\n  const [isEnabled, setIsEnabled] = useState(false)\n  const [isVisible, setIsVisible] = useState(false)\n\n  const cursorX = useSpring(0, springConfig)\n  const cursorY = useSpring(0, springConfig)\n  const rotation = useSpring(0, {\n    ...springConfig,\n    damping: 60,\n    stiffness: 300,\n  })\n  const scale = useSpring(1, {\n    ...springConfig,\n    stiffness: 500,\n    damping: 35,\n  })\n\n  useEffect(() => {\n    const mediaQuery = window.matchMedia(DESKTOP_POINTER_QUERY)\n\n    const updateEnabled = () => {\n      const nextIsEnabled = mediaQuery.matches\n      setIsEnabled(nextIsEnabled)\n\n      if (!nextIsEnabled) {\n        setIsVisible(false)\n      }\n    }\n\n    updateEnabled()\n    mediaQuery.addEventListener(\"change\", updateEnabled)\n\n    return () => {\n      mediaQuery.removeEventListener(\"change\", updateEnabled)\n    }\n  }, [])\n\n  useEffect(() => {\n    if (!isEnabled) {\n      return\n    }\n\n    let timeout: ReturnType<typeof setTimeout> | null = null\n\n    const updateVelocity = (currentPos: Position) => {\n      const currentTime = Date.now()\n      const deltaTime = currentTime - lastUpdateTime.current\n\n      if (deltaTime > 0) {\n        velocity.current = {\n          x: (currentPos.x - lastMousePos.current.x) / deltaTime,\n          y: (currentPos.y - lastMousePos.current.y) / deltaTime,\n        }\n      }\n\n      lastUpdateTime.current = currentTime\n      lastMousePos.current = currentPos\n    }\n\n    const smoothPointerMove = (e: PointerEvent) => {\n      if (!isTrackablePointer(e.pointerType)) {\n        return\n      }\n\n      setIsVisible(true)\n\n      const currentPos = { x: e.clientX, y: e.clientY }\n      updateVelocity(currentPos)\n\n      const speed = Math.sqrt(\n        Math.pow(velocity.current.x, 2) + Math.pow(velocity.current.y, 2)\n      )\n\n      cursorX.set(currentPos.x)\n      cursorY.set(currentPos.y)\n\n      if (speed > 0.1) {\n        const currentAngle =\n          Math.atan2(velocity.current.y, velocity.current.x) * (180 / Math.PI) +\n          90\n\n        let angleDiff = currentAngle - previousAngle.current\n        if (angleDiff > 180) angleDiff -= 360\n        if (angleDiff < -180) angleDiff += 360\n        accumulatedRotation.current += angleDiff\n        rotation.set(accumulatedRotation.current)\n        previousAngle.current = currentAngle\n\n        scale.set(0.95)\n\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n\n        timeout = setTimeout(() => {\n          scale.set(1)\n        }, 150)\n      }\n    }\n\n    let rafId = 0\n    const throttledPointerMove = (e: PointerEvent) => {\n      if (!isTrackablePointer(e.pointerType)) {\n        return\n      }\n\n      if (rafId) return\n\n      rafId = requestAnimationFrame(() => {\n        smoothPointerMove(e)\n        rafId = 0\n      })\n    }\n\n    document.body.style.cursor = \"none\"\n    window.addEventListener(\"pointermove\", throttledPointerMove, {\n      passive: true,\n    })\n\n    return () => {\n      window.removeEventListener(\"pointermove\", throttledPointerMove)\n      document.body.style.cursor = \"auto\"\n      if (rafId) cancelAnimationFrame(rafId)\n      if (timeout !== null) {\n        clearTimeout(timeout)\n      }\n    }\n  }, [cursorX, cursorY, rotation, scale, isEnabled])\n\n  if (!isEnabled) {\n    return null\n  }\n\n  return (\n    <motion.div\n      style={{\n        position: \"fixed\",\n        left: cursorX,\n        top: cursorY,\n        translateX: \"-50%\",\n        translateY: \"-50%\",\n        rotate: rotation,\n        scale: scale,\n        zIndex: 100,\n        pointerEvents: \"none\",\n        willChange: \"transform\",\n        opacity: isVisible ? 1 : 0,\n      }}\n      initial={false}\n      animate={{ opacity: isVisible ? 1 : 0 }}\n      transition={{\n        duration: 0.15,\n      }}\n    >\n      {cursor}\n    </motion.div>\n  )\n}\n\n\n===== EXAMPLE: smooth-cursor-demo =====\nTitle: smooth-cursor-demo\n\n--- file: example/smooth-cursor-demo.tsx ---\nimport { SmoothCursor } from \"@/registry/magicui/smooth-cursor\"\n\nexport default function SmoothCursorDemo() {\n  return (\n    <>\n      <span className=\"hidden md:block\">Move your mouse around</span>\n      <span className=\"block md:hidden\">\n        SmoothCursor is disabled on touch devices\n      </span>\n      <SmoothCursor />\n    </>\n  )\n}\n\n\n\n===== COMPONENT: sparkles-text =====\nTitle: Sparkles Text\nDescription: A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\n\n--- file: magicui/sparkles-text.tsx ---\n\"use client\"\n\nimport { CSSProperties, ReactElement, useEffect, useState } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Sparkle {\n  id: string\n  x: string\n  y: string\n  color: string\n  delay: number\n  scale: number\n  lifespan: number\n}\n\nconst Sparkle: React.FC<Sparkle> = ({ id, x, y, color, delay, scale }) => {\n  return (\n    <motion.svg\n      key={id}\n      className=\"pointer-events-none absolute z-20\"\n      initial={{ opacity: 0, left: x, top: y }}\n      animate={{\n        opacity: [0, 1, 0],\n        scale: [0, scale, 0],\n        rotate: [75, 120, 150],\n      }}\n      transition={{ duration: 0.8, repeat: Infinity, delay }}\n      width=\"21\"\n      height=\"21\"\n      viewBox=\"0 0 21 21\"\n    >\n      <path\n        d=\"M9.82531 0.843845C10.0553 0.215178 10.9446 0.215178 11.1746 0.843845L11.8618 2.72026C12.4006 4.19229 12.3916 6.39157 13.5 7.5C14.6084 8.60843 16.8077 8.59935 18.2797 9.13822L20.1561 9.82534C20.7858 10.0553 20.7858 10.9447 20.1561 11.1747L18.2797 11.8618C16.8077 12.4007 14.6084 12.3916 13.5 13.5C12.3916 14.6084 12.4006 16.8077 11.8618 18.2798L11.1746 20.1562C10.9446 20.7858 10.0553 20.7858 9.82531 20.1562L9.13819 18.2798C8.59932 16.8077 8.60843 14.6084 7.5 13.5C6.39157 12.3916 4.19225 12.4007 2.72023 11.8618L0.843814 11.1747C0.215148 10.9447 0.215148 10.0553 0.843814 9.82534L2.72023 9.13822C4.19225 8.59935 6.39157 8.60843 7.5 7.5C8.60843 6.39157 8.59932 4.19229 9.13819 2.72026L9.82531 0.843845Z\"\n        fill={color}\n      />\n    </motion.svg>\n  )\n}\n\ninterface SparklesTextProps {\n  /**\n   * @default <div />\n   * @type ReactElement\n   * @description\n   * The component to be rendered as the text\n   * */\n  as?: ReactElement\n\n  /**\n   * @default \"\"\n   * @type string\n   * @description\n   * The className of the text\n   */\n  className?: string\n\n  /**\n   * @required\n   * @type ReactNode\n   * @description\n   * The content to be displayed\n   * */\n  children: React.ReactNode\n\n  /**\n   * @default 10\n   * @type number\n   * @description\n   * The count of sparkles\n   * */\n  sparklesCount?: number\n\n  /**\n   * @default \"{first: '#9E7AFF', second: '#FE8BBB'}\"\n   * @type string\n   * @description\n   * The colors of the sparkles\n   * */\n  colors?: {\n    first: string\n    second: string\n  }\n}\n\nexport const SparklesText: React.FC<SparklesTextProps> = ({\n  children,\n  colors = { first: \"#9E7AFF\", second: \"#FE8BBB\" },\n  className,\n  sparklesCount = 10,\n  ...props\n}) => {\n  const [sparkles, setSparkles] = useState<Sparkle[]>([])\n\n  useEffect(() => {\n    const generateStar = (): Sparkle => {\n      const starX = `${Math.random() * 100}%`\n      const starY = `${Math.random() * 100}%`\n      const color = Math.random() > 0.5 ? colors.first : colors.second\n      const delay = Math.random() * 2\n      const scale = Math.random() * 1 + 0.3\n      const lifespan = Math.random() * 10 + 5\n      const id = `${starX}-${starY}-${Date.now()}`\n      return { id, x: starX, y: starY, color, delay, scale, lifespan }\n    }\n\n    const initializeStars = () => {\n      const newSparkles = Array.from({ length: sparklesCount }, generateStar)\n      setSparkles(newSparkles)\n    }\n\n    const updateStars = () => {\n      setSparkles((currentSparkles) =>\n        currentSparkles.map((star) => {\n          if (star.lifespan <= 0) {\n            return generateStar()\n          } else {\n            return { ...star, lifespan: star.lifespan - 0.1 }\n          }\n        })\n      )\n    }\n\n    initializeStars()\n    const interval = setInterval(updateStars, 100)\n\n    return () => clearInterval(interval)\n  }, [colors.first, colors.second, sparklesCount])\n\n  return (\n    <div\n      className={cn(\"text-6xl font-bold\", className)}\n      {...props}\n      style={\n        {\n          \"--sparkles-first-color\": `${colors.first}`,\n          \"--sparkles-second-color\": `${colors.second}`,\n        } as CSSProperties\n      }\n    >\n      <span className=\"relative inline-block\">\n        {sparkles.map((sparkle) => (\n          <Sparkle key={sparkle.id} {...sparkle} />\n        ))}\n        <strong>{children}</strong>\n      </span>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: sparkles-text-demo =====\nTitle: Sparkles Text Demo\n\n--- file: example/sparkles-text-demo.tsx ---\nimport { SparklesText } from \"@/registry/magicui/sparkles-text\"\n\nexport default function SparklesTextDemo() {\n  return <SparklesText>Magic UI</SparklesText>\n}\n\n\n\n===== COMPONENT: spinning-text =====\nTitle: Spinning Text\nDescription: The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\n\n--- file: magicui/spinning-text.tsx ---\n\"use client\"\n\nimport React, { type ComponentPropsWithoutRef } from \"react\"\nimport { motion, Transition, Variants } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface SpinningTextProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: string | string[]\n  duration?: number\n  reverse?: boolean\n  radius?: number\n  transition?: Transition\n  variants?: {\n    container?: Variants\n    item?: Variants\n  }\n}\n\nconst BASE_TRANSITION: Transition = {\n  repeat: Infinity,\n  ease: \"linear\",\n}\n\nconst BASE_ITEM_VARIANTS: Variants = {\n  hidden: {\n    opacity: 1,\n  },\n  visible: {\n    opacity: 1,\n  },\n}\n\nexport function SpinningText({\n  children,\n  duration = 10,\n  reverse = false,\n  radius = 5,\n  transition,\n  variants,\n  className,\n  style,\n}: SpinningTextProps) {\n  if (typeof children !== \"string\" && !Array.isArray(children)) {\n    throw new Error(\"children must be a string or an array of strings\")\n  }\n\n  if (Array.isArray(children)) {\n    // Validate all elements are strings\n    if (!children.every((child) => typeof child === \"string\")) {\n      throw new Error(\"all elements in children array must be strings\")\n    }\n    children = children.join(\"\")\n  }\n\n  const letters = children.split(\"\")\n  letters.push(\" \")\n\n  const finalTransition: Transition = {\n    ...BASE_TRANSITION,\n    ...transition,\n    duration: (transition as { duration?: number })?.duration ?? duration,\n  }\n\n  const containerVariants: Variants = {\n    visible: { rotate: reverse ? -360 : 360 },\n    ...variants?.container,\n  }\n\n  const itemVariants: Variants = {\n    ...BASE_ITEM_VARIANTS,\n    ...variants?.item,\n  }\n\n  return (\n    <motion.div\n      className={cn(\"relative\", className)}\n      style={{\n        ...style,\n      }}\n      initial=\"hidden\"\n      animate=\"visible\"\n      variants={containerVariants}\n      transition={finalTransition}\n    >\n      {letters.map((letter, index) => (\n        <motion.span\n          aria-hidden=\"true\"\n          key={`${index}-${letter}`}\n          variants={itemVariants}\n          className=\"absolute top-1/2 left-1/2 inline-block\"\n          style={\n            {\n              \"--index\": index,\n              \"--total\": letters.length,\n              \"--radius\": radius,\n              transform: `\n                  translate(-50%, -50%)\n                  rotate(calc(360deg / var(--total) * var(--index)))\n                  translateY(calc(var(--radius, 5) * -1ch))\n                `,\n              transformOrigin: \"center\",\n            } as React.CSSProperties\n          }\n        >\n          {letter}\n        </motion.span>\n      ))}\n      <span className=\"sr-only\">{children}</span>\n    </motion.div>\n  )\n}\n\n\n===== EXAMPLE: spinning-text-demo =====\nTitle: Spinning Text Demo\n\n--- file: example/spinning-text-demo.tsx ---\nimport { SpinningText } from \"@/registry/magicui/spinning-text\"\n\nexport default function SpinningTextBasic() {\n  return <SpinningText>learn more • earn more • grow more •</SpinningText>\n}\n\n\n===== EXAMPLE: spinning-text-demo-2 =====\nTitle: Spinning Text Demo 2\n\n--- file: example/spinning-text-demo-2.tsx ---\nimport { SpinningText } from \"@/registry/magicui/spinning-text\"\n\nexport default function SpinningTextBasic() {\n  return (\n    <SpinningText reverse className=\"text-4xl\" duration={4} radius={6}>\n      learn more • earn more • grow more •\n    </SpinningText>\n  )\n}\n\n\n\n===== COMPONENT: striped-pattern =====\nTitle: Striped Pattern\nDescription: A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\n\n--- file: magicui/striped-pattern.tsx ---\nimport React, { useId } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface StripedPatternProps extends React.SVGProps<SVGSVGElement> {\n  direction?: \"left\" | \"right\"\n}\n\nexport function StripedPattern({\n  direction = \"left\",\n  className,\n  width = 10,\n  height = 10,\n  ...props\n}: StripedPatternProps) {\n  const id = useId()\n  const w = Number(width)\n  const h = Number(height)\n\n  return (\n    <svg\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 z-10 h-full w-full stroke-[0.5]\",\n        className\n      )}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <defs>\n        <pattern id={id} width={w} height={h} patternUnits=\"userSpaceOnUse\">\n          {direction === \"left\" ? (\n            <>\n              <line x1=\"0\" y1={h} x2={w} y2=\"0\" stroke=\"currentColor\" />\n              <line x1={-w} y1={h} x2=\"0\" y2=\"0\" stroke=\"currentColor\" />\n              <line x1={w} y1={h} x2={w * 2} y2=\"0\" stroke=\"currentColor\" />\n            </>\n          ) : (\n            <>\n              <line x1=\"0\" y1=\"0\" x2={w} y2={h} stroke=\"currentColor\" />\n              <line x1={-w} y1=\"0\" x2=\"0\" y2={h} stroke=\"currentColor\" />\n              <line x1={w} y1=\"0\" x2={w * 2} y2={h} stroke=\"currentColor\" />\n            </>\n          )}\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n    </svg>\n  )\n}\n\n\n===== EXAMPLE: striped-pattern-demo =====\nTitle: Striped Pattern Demo\n\n--- file: example/striped-pattern-demo.tsx ---\nimport { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function StripedPatternDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern className=\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: striped-pattern-dashed =====\nTitle: Striped Pattern (Dashed)\n\n--- file: example/striped-pattern-dashed.tsx ---\nimport { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern className=\"stroke-[0.3] [stroke-dasharray:8,4]\" />\n    </div>\n  )\n}\n\n\n===== EXAMPLE: striped-pattern-right =====\nTitle: Striped Pattern (Right)\n\n--- file: example/striped-pattern-right.tsx ---\nimport { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function StripedPatternRight() {\n  return (\n    <div className=\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern direction=\"right\" />\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: terminal =====\nTitle: Terminal\nDescription: A terminal component\n\n--- file: magicui/terminal.tsx ---\n\"use client\"\n\nimport {\n  Children,\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n} from \"react\"\nimport {\n  motion,\n  useInView,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface SequenceContextValue {\n  completeItem: (index: number) => void\n  activeIndex: number\n  sequenceStarted: boolean\n}\n\nconst SequenceContext = createContext<SequenceContextValue | null>(null)\n\nconst useSequence = () => useContext(SequenceContext)\n\nconst ItemIndexContext = createContext<number | null>(null)\nconst useItemIndex = () => useContext(ItemIndexContext)\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype TerminalTypingMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"span\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface AnimatedSpanProps extends MotionProps {\n  children: React.ReactNode\n  delay?: number\n  className?: string\n  startOnView?: boolean\n}\n\nexport const AnimatedSpan = ({\n  children,\n  delay = 0,\n  className,\n  startOnView = false,\n  ...props\n}: AnimatedSpanProps) => {\n  const elementRef = useRef<HTMLDivElement | null>(null)\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const sequence = useSequence()\n  const itemIndex = useItemIndex()\n  const [hasStarted, setHasStarted] = useState(false)\n  useEffect(() => {\n    if (!sequence || itemIndex === null) return\n    if (!sequence.sequenceStarted) return\n    if (hasStarted) return\n    if (sequence.activeIndex === itemIndex) {\n      setHasStarted(true)\n    }\n  }, [sequence, hasStarted, itemIndex])\n\n  const shouldAnimate = sequence ? hasStarted : startOnView ? isInView : true\n\n  return (\n    <motion.div\n      ref={elementRef}\n      initial={{ opacity: 0, y: -5 }}\n      animate={shouldAnimate ? { opacity: 1, y: 0 } : { opacity: 0, y: -5 }}\n      transition={{ duration: 0.3, delay: sequence ? 0 : delay / 1000 }}\n      className={cn(\"grid text-sm font-normal tracking-tight\", className)}\n      onAnimationComplete={() => {\n        if (!sequence) return\n        if (itemIndex === null) return\n        sequence.completeItem(itemIndex)\n      }}\n      {...props}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\ninterface TypingAnimationProps extends Omit<MotionProps, \"children\"> {\n  children: string\n  className?: string\n  duration?: number\n  delay?: number\n  as?: MotionElementType\n  startOnView?: boolean\n}\n\nexport const TypingAnimation = ({\n  children,\n  className,\n  duration = 60,\n  delay = 0,\n  as: Component = \"span\",\n  startOnView = true,\n  ...props\n}: TypingAnimationProps) => {\n  if (typeof children !== \"string\") {\n    throw new Error(\"TypingAnimation: children must be a string. Received:\")\n  }\n\n  const MotionComponent = motionElements[\n    Component\n  ] as TerminalTypingMotionComponent\n\n  const [displayedText, setDisplayedText] = useState<string>(\"\")\n  const [started, setStarted] = useState(false)\n  const elementRef = useRef<HTMLElement | null>(null)\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const sequence = useSequence()\n  const itemIndex = useItemIndex()\n  const hasSequence = sequence !== null\n  const sequenceStarted = sequence?.sequenceStarted ?? false\n  const sequenceActiveIndex = sequence?.activeIndex ?? null\n  const sequenceCompleteItemRef = useRef<\n    SequenceContextValue[\"completeItem\"] | null\n  >(null)\n  const sequenceItemIndexRef = useRef<number | null>(null)\n\n  useEffect(() => {\n    sequenceCompleteItemRef.current = sequence?.completeItem ?? null\n    sequenceItemIndexRef.current = itemIndex\n  }, [sequence?.completeItem, itemIndex])\n\n  useEffect(() => {\n    let startTimeout: ReturnType<typeof setTimeout> | null = null\n\n    if (hasSequence && itemIndex !== null) {\n      if (sequenceStarted && !started && sequenceActiveIndex === itemIndex) {\n        setStarted(true)\n      }\n    } else if (!startOnView || isInView) {\n      startTimeout = setTimeout(() => setStarted(true), delay)\n    }\n\n    return () => {\n      if (startTimeout !== null) {\n        clearTimeout(startTimeout)\n      }\n    }\n  }, [\n    delay,\n    startOnView,\n    isInView,\n    started,\n    hasSequence,\n    sequenceActiveIndex,\n    sequenceStarted,\n    itemIndex,\n  ])\n\n  useEffect(() => {\n    let typingEffect: ReturnType<typeof setInterval> | null = null\n\n    if (started) {\n      let i = 0\n      typingEffect = setInterval(() => {\n        if (i < children.length) {\n          setDisplayedText(children.substring(0, i + 1))\n          i++\n        } else {\n          if (typingEffect !== null) {\n            clearInterval(typingEffect)\n          }\n          const completeItem = sequenceCompleteItemRef.current\n          const currentItemIndex = sequenceItemIndexRef.current\n          if (completeItem && currentItemIndex !== null) {\n            completeItem(currentItemIndex)\n          }\n        }\n      }, duration)\n    }\n\n    return () => {\n      if (typingEffect !== null) {\n        clearInterval(typingEffect)\n      }\n    }\n  }, [children, duration, started])\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\"text-sm font-normal tracking-tight\", className)}\n      {...props}\n    >\n      {displayedText}\n    </MotionComponent>\n  )\n}\n\ninterface TerminalProps {\n  children: React.ReactNode\n  className?: string\n  sequence?: boolean\n  startOnView?: boolean\n}\n\nexport const Terminal = ({\n  children,\n  className,\n  sequence = true,\n  startOnView = true,\n}: TerminalProps) => {\n  const containerRef = useRef<HTMLDivElement | null>(null)\n  const isInView = useInView(containerRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const [activeIndex, setActiveIndex] = useState(0)\n  const sequenceHasStarted = sequence ? !startOnView || isInView : false\n\n  const contextValue = useMemo<SequenceContextValue | null>(() => {\n    if (!sequence) return null\n    return {\n      completeItem: (index: number) => {\n        setActiveIndex((current) => (index === current ? current + 1 : current))\n      },\n      activeIndex,\n      sequenceStarted: sequenceHasStarted,\n    }\n  }, [sequence, activeIndex, sequenceHasStarted])\n\n  const wrappedChildren = useMemo(() => {\n    if (!sequence) return children\n    const array = Children.toArray(children)\n    return array.map((child, index) => (\n      <ItemIndexContext.Provider key={index} value={index}>\n        {child as React.ReactNode}\n      </ItemIndexContext.Provider>\n    ))\n  }, [children, sequence])\n\n  const content = (\n    <div\n      ref={containerRef}\n      className={cn(\n        \"border-border bg-background z-0 h-full max-h-100 w-full max-w-lg rounded-xl border\",\n        className\n      )}\n    >\n      <div className=\"border-border flex flex-col gap-y-2 border-b p-4\">\n        <div className=\"flex flex-row gap-x-2\">\n          <div className=\"h-2 w-2 rounded-full bg-red-500\"></div>\n          <div className=\"h-2 w-2 rounded-full bg-yellow-500\"></div>\n          <div className=\"h-2 w-2 rounded-full bg-green-500\"></div>\n        </div>\n      </div>\n      <pre className=\"p-4\">\n        <code className=\"grid gap-y-1 overflow-auto\">{wrappedChildren}</code>\n      </pre>\n    </div>\n  )\n\n  if (!sequence) return content\n\n  return (\n    <SequenceContext.Provider value={contextValue}>\n      {content}\n    </SequenceContext.Provider>\n  )\n}\n\n\n===== EXAMPLE: terminal-demo =====\nTitle: Terminal Demo\n\n--- file: example/terminal-demo.tsx ---\nimport {\n  AnimatedSpan,\n  Terminal,\n  TypingAnimation,\n} from \"@/registry/magicui/terminal\"\n\nexport default function TerminalDemo() {\n  return (\n    <Terminal>\n      <TypingAnimation>&gt; pnpm dlx shadcn@latest init</TypingAnimation>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Preflight checks.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Verifying framework. Found Next.js.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Validating Tailwind CSS.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Validating import alias.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Writing components.json.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Checking registry.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Updating tailwind.config.ts\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Updating app/globals.css\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Installing dependencies.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-blue-500\">\n        <span>ℹ Updated 1 file:</span>\n        <span className=\"pl-2\">- lib/utils.ts</span>\n      </AnimatedSpan>\n\n      <TypingAnimation className=\"text-muted-foreground\">\n        Success! Project initialization completed.\n      </TypingAnimation>\n\n      <TypingAnimation className=\"text-muted-foreground\">\n        You may now add components.\n      </TypingAnimation>\n    </Terminal>\n  )\n}\n\n\n===== EXAMPLE: terminal-demo-2 =====\nTitle: Terminal Demo\n\n--- file: example/terminal-demo-2.tsx ---\nimport {\n  AnimatedSpan,\n  Terminal,\n  TypingAnimation,\n} from \"@/registry/magicui/terminal\"\n\nexport default function TerminalDemo2() {\n  return (\n    <Terminal>\n      <TypingAnimation delay={0}>$ ls</TypingAnimation>\n\n      <AnimatedSpan delay={800} className=\"text-blue-500\">\n        Documents Downloads Pictures\n      </AnimatedSpan>\n\n      <TypingAnimation delay={1600}>$ cd Documents</TypingAnimation>\n\n      <TypingAnimation delay={2400}>$ pwd</TypingAnimation>\n\n      <AnimatedSpan delay={3200} className=\"text-green-500\">\n        /home/user/Documents\n      </AnimatedSpan>\n    </Terminal>\n  )\n}\n\n\n\n===== COMPONENT: text-animate =====\nTitle: Text Animate\nDescription: A text animation component that animates text using a variety of different animations.\n\n--- file: magicui/text-animate.tsx ---\n\"use client\"\n\nimport { memo } from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  Variants,\n  type DOMMotionComponents,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype AnimationType = \"text\" | \"word\" | \"character\" | \"line\"\ntype AnimationVariant =\n  | \"fadeIn\"\n  | \"blurIn\"\n  | \"blurInUp\"\n  | \"blurInDown\"\n  | \"slideUp\"\n  | \"slideDown\"\n  | \"slideLeft\"\n  | \"slideRight\"\n  | \"scaleUp\"\n  | \"scaleDown\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\n\ninterface TextAnimateProps extends Omit<MotionProps, \"children\"> {\n  /**\n   * The text content to animate\n   */\n  children: string\n  /**\n   * The class name to be applied to the component\n   */\n  className?: string\n  /**\n   * The class name to be applied to each segment\n   */\n  segmentClassName?: string\n  /**\n   * The delay before the animation starts\n   */\n  delay?: number\n  /**\n   * The duration of the animation\n   */\n  duration?: number\n  /**\n   * Custom motion variants for the animation\n   */\n  variants?: Variants\n  /**\n   * The element type to render\n   */\n  as?: MotionElementType\n  /**\n   * How to split the text (\"text\", \"word\", \"character\")\n   */\n  by?: AnimationType\n  /**\n   * Whether to start animation when component enters viewport\n   */\n  startOnView?: boolean\n  /**\n   * Whether to animate only once\n   */\n  once?: boolean\n  /**\n   * The animation preset to use\n   */\n  animation?: AnimationVariant\n  /**\n   * Whether to enable accessibility features (default: true)\n   */\n  accessible?: boolean\n}\n\nconst staggerTimings: Record<AnimationType, number> = {\n  text: 0.06,\n  word: 0.05,\n  character: 0.03,\n  line: 0.06,\n}\n\nconst defaultContainerVariants = {\n  hidden: { opacity: 1 },\n  show: {\n    opacity: 1,\n    transition: {\n      delayChildren: 0,\n      staggerChildren: 0.05,\n    },\n  },\n  exit: {\n    opacity: 0,\n    transition: {\n      staggerChildren: 0.05,\n      staggerDirection: -1,\n    },\n  },\n}\n\nconst defaultItemVariants: Variants = {\n  hidden: { opacity: 0 },\n  show: {\n    opacity: 1,\n  },\n  exit: {\n    opacity: 0,\n  },\n}\n\nconst defaultItemAnimationVariants: Record<\n  AnimationVariant,\n  { container: Variants; item: Variants }\n> = {\n  fadeIn: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, y: 20 },\n      show: {\n        opacity: 1,\n        y: 0,\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        opacity: 0,\n        y: 20,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  blurIn: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\" },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        opacity: 0,\n        filter: \"blur(10px)\",\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  blurInUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\", y: 20 },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        y: 0,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n      exit: {\n        opacity: 0,\n        filter: \"blur(10px)\",\n        y: 20,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n    },\n  },\n  blurInDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\", y: -20 },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        y: 0,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n    },\n  },\n  slideUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { y: 20, opacity: 0 },\n      show: {\n        y: 0,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        y: -20,\n        opacity: 0,\n        transition: {\n          duration: 0.3,\n        },\n      },\n    },\n  },\n  slideDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { y: -20, opacity: 0 },\n      show: {\n        y: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        y: 20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  slideLeft: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { x: 20, opacity: 0 },\n      show: {\n        x: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        x: -20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  slideRight: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { x: -20, opacity: 0 },\n      show: {\n        x: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        x: 20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  scaleUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { scale: 0.5, opacity: 0 },\n      show: {\n        scale: 1,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n          scale: {\n            type: \"spring\",\n            damping: 15,\n            stiffness: 300,\n          },\n        },\n      },\n      exit: {\n        scale: 0.5,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  scaleDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { scale: 1.5, opacity: 0 },\n      show: {\n        scale: 1,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n          scale: {\n            type: \"spring\",\n            damping: 15,\n            stiffness: 300,\n          },\n        },\n      },\n      exit: {\n        scale: 1.5,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n}\n\nconst TextAnimateBase = ({\n  children,\n  delay = 0,\n  duration = 0.3,\n  variants,\n  className,\n  segmentClassName,\n  as: Component = \"p\",\n  startOnView = true,\n  once = false,\n  by = \"word\",\n  animation = \"fadeIn\",\n  accessible = true,\n  ...props\n}: TextAnimateProps) => {\n  const MotionComponent = motionElements[Component]\n\n  let segments: string[] = []\n  switch (by) {\n    case \"word\":\n      segments = children.split(/(\\s+)/)\n      break\n    case \"character\":\n      segments = children.split(\"\")\n      break\n    case \"line\":\n      segments = children.split(\"\\n\")\n      break\n    case \"text\":\n    default:\n      segments = [children]\n      break\n  }\n\n  const finalVariants = variants\n    ? {\n        container: {\n          hidden: { opacity: 0 },\n          show: {\n            opacity: 1,\n            transition: {\n              opacity: { duration: 0.01, delay },\n              delayChildren: delay,\n              staggerChildren: duration / segments.length,\n            },\n          },\n          exit: {\n            opacity: 0,\n            transition: {\n              staggerChildren: duration / segments.length,\n              staggerDirection: -1,\n            },\n          },\n        },\n        item: variants,\n      }\n    : animation\n      ? {\n          container: {\n            ...defaultItemAnimationVariants[animation].container,\n            show: {\n              ...defaultItemAnimationVariants[animation].container.show,\n              transition: {\n                delayChildren: delay,\n                staggerChildren: duration / segments.length,\n              },\n            },\n            exit: {\n              ...defaultItemAnimationVariants[animation].container.exit,\n              transition: {\n                staggerChildren: duration / segments.length,\n                staggerDirection: -1,\n              },\n            },\n          },\n          item: defaultItemAnimationVariants[animation].item,\n        }\n      : { container: defaultContainerVariants, item: defaultItemVariants }\n\n  return (\n    <AnimatePresence mode=\"popLayout\">\n      <MotionComponent\n        variants={finalVariants.container as Variants}\n        initial=\"hidden\"\n        whileInView={startOnView ? \"show\" : undefined}\n        animate={startOnView ? undefined : \"show\"}\n        exit=\"exit\"\n        className={cn(\"whitespace-pre-wrap\", className)}\n        viewport={{ once }}\n        aria-label={accessible ? children : undefined}\n        {...props}\n      >\n        {accessible && <span className=\"sr-only\">{children}</span>}\n        {segments.map((segment, i) => (\n          <motion.span\n            key={`${by}-${segment}-${i}`}\n            variants={finalVariants.item}\n            custom={i * staggerTimings[by]}\n            className={cn(\n              by === \"line\" ? \"block\" : \"inline-block whitespace-pre\",\n              by === \"character\" && \"\",\n              segmentClassName\n            )}\n            aria-hidden={accessible ? true : undefined}\n          >\n            {segment}\n          </motion.span>\n        ))}\n      </MotionComponent>\n    </AnimatePresence>\n  )\n}\n\n// Export the memoized version\nexport const TextAnimate = memo(TextAnimateBase)\n\n\n===== EXAMPLE: text-animate-demo =====\nTitle: Text Animate Demo\n\n--- file: example/text-animate-demo.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" once>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-2 =====\nTitle: Text Animate Demo 2\n\n--- file: example/text-animate-demo-2.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo2() {\n  return (\n    <TextAnimate animation=\"blurIn\" as=\"h1\">\n      Blur in text\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-3 =====\nTitle: Text Animate Demo 3\n\n--- file: example/text-animate-demo-3.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo3() {\n  return (\n    <TextAnimate animation=\"slideUp\" by=\"word\">\n      Slide up by word\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-4 =====\nTitle: Text Animate Demo 4\n\n--- file: example/text-animate-demo-4.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo4() {\n  return (\n    <TextAnimate animation=\"scaleUp\" by=\"text\">\n      Scale up by text\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-5 =====\nTitle: Text Animate Demo 5\n\n--- file: example/text-animate-demo-5.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo5() {\n  return (\n    <TextAnimate animation=\"fadeIn\" by=\"line\" as=\"p\">\n      {`Fade in by line as paragraph\\n\\nFade in by line as paragraph\\n\\nFade in by line as paragraph`}\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-6 =====\nTitle: Text Animate Demo 6\n\n--- file: example/text-animate-demo-6.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo6() {\n  return (\n    <TextAnimate animation=\"slideLeft\" by=\"character\">\n      Slide left by character\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-7 =====\nTitle: Text Animate Demo 7\n\n--- file: example/text-animate-demo-7.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo7() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" delay={2}>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-8 =====\nTitle: Text Animate Demo 8\n\n--- file: example/text-animate-demo-8.tsx ---\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo8() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" duration={5}>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n\n\n===== EXAMPLE: text-animate-demo-9 =====\nTitle: Text Animate Demo 9\n\n--- file: example/text-animate-demo-9.tsx ---\n\"use client\"\n\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo9() {\n  return (\n    <TextAnimate\n      variants={{\n        hidden: {\n          opacity: 0,\n          y: 30,\n          rotate: 45,\n          scale: 0.5,\n        },\n        show: (i) => ({\n          opacity: 1,\n          y: 0,\n          rotate: 0,\n          scale: 1,\n          transition: {\n            delay: i * 0.1,\n            duration: 0.4,\n            y: {\n              type: \"spring\",\n              damping: 12,\n              stiffness: 200,\n              mass: 0.8,\n            },\n            rotate: {\n              type: \"spring\",\n              damping: 8,\n              stiffness: 150,\n            },\n            scale: {\n              type: \"spring\",\n              damping: 10,\n              stiffness: 300,\n            },\n          },\n        }),\n        exit: (i) => ({\n          opacity: 0,\n          y: 30,\n          rotate: 45,\n          scale: 0.5,\n          transition: {\n            delay: i * 0.1,\n            duration: 0.4,\n          },\n        }),\n      }}\n      by=\"character\"\n    >\n      Wavy Motion!\n    </TextAnimate>\n  )\n}\n\n\n\n===== COMPONENT: text-reveal =====\nTitle: Text Reveal\nDescription: Fade in text as you scroll down the page.\n\n--- file: magicui/text-reveal.tsx ---\n\"use client\"\n\nimport {\n  useRef,\n  type ComponentPropsWithoutRef,\n  type FC,\n  type ReactNode,\n} from \"react\"\nimport { motion, MotionValue, useScroll, useTransform } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface TextRevealProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: string\n}\n\nexport const TextReveal: FC<TextRevealProps> = ({ children, className }) => {\n  const sectionRef = useRef<HTMLDivElement | null>(null)\n  const { scrollYProgress } = useScroll({\n    target: sectionRef,\n  })\n\n  if (typeof children !== \"string\") {\n    throw new Error(\"TextReveal: children must be a string\")\n  }\n\n  const words = children.split(\" \")\n\n  return (\n    <div ref={sectionRef} className={cn(\"relative z-0 h-[200vh]\", className)}>\n      <div\n        className={\n          \"sticky top-0 mx-auto flex h-[50%] max-w-4xl items-center bg-transparent px-4 py-20\"\n        }\n      >\n        <span\n          className={\n            \"flex flex-wrap p-5 text-2xl font-bold text-black/20 md:p-8 md:text-3xl lg:p-10 lg:text-4xl xl:text-5xl dark:text-white/20\"\n          }\n        >\n          {words.map((word, i) => {\n            const start = i / words.length\n            const end = start + 1 / words.length\n            return (\n              <Word key={i} progress={scrollYProgress} range={[start, end]}>\n                {word}\n              </Word>\n            )\n          })}\n        </span>\n      </div>\n    </div>\n  )\n}\n\ninterface WordProps {\n  children: ReactNode\n  progress: MotionValue<number>\n  range: [number, number]\n}\n\nconst Word: FC<WordProps> = ({ children, progress, range }) => {\n  const opacity = useTransform(progress, range, [0, 1])\n  return (\n    <span className=\"xl:lg-3 relative mx-1 lg:mx-1.5\">\n      <span className=\"absolute opacity-30\">{children}</span>\n      <motion.span\n        style={{ opacity: opacity }}\n        className={\"text-black dark:text-white\"}\n      >\n        {children}\n      </motion.span>\n    </span>\n  )\n}\n\n\n===== EXAMPLE: text-reveal-demo =====\nTitle: Text Reveal Demo\n\n--- file: example/text-reveal-demo.tsx ---\nimport { TextReveal } from \"@/registry/magicui/text-reveal\"\n\nexport default function TextRevealDemo() {\n  return <TextReveal>Magic UI will change the way you design.</TextReveal>\n}\n\n\n\n===== COMPONENT: tweet-card =====\nTitle: Tweet Card\nDescription: A card that displays a tweet with the author's name, handle, and profile picture.\n\n--- file: magicui/tweet-card.tsx ---\nimport { Suspense } from \"react\"\nimport { enrichTweet, type EnrichedTweet, type TweetProps } from \"react-tweet\"\nimport { getTweet, type Tweet } from \"react-tweet/api\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface TwitterIconProps {\n  className?: string\n  [key: string]: unknown\n}\nconst Twitter = ({ className, ...props }: TwitterIconProps) => (\n  <svg\n    stroke=\"currentColor\"\n    fill=\"currentColor\"\n    strokeWidth=\"0\"\n    viewBox=\"0 0 24 24\"\n    height=\"1em\"\n    width=\"1em\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className={className}\n    {...props}\n  >\n    <g>\n      <path fill=\"none\" d=\"M0 0h24v24H0z\"></path>\n      <path d=\"M22.162 5.656a8.384 8.384 0 0 1-2.402.658A4.196 4.196 0 0 0 21.6 4c-.82.488-1.719.83-2.656 1.015a4.182 4.182 0 0 0-7.126 3.814 11.874 11.874 0 0 1-8.62-4.37 4.168 4.168 0 0 0-.566 2.103c0 1.45.738 2.731 1.86 3.481a4.168 4.168 0 0 1-1.894-.523v.052a4.185 4.185 0 0 0 3.355 4.101 4.21 4.21 0 0 1-1.89.072A4.185 4.185 0 0 0 7.97 16.65a8.394 8.394 0 0 1-6.191 1.732 11.83 11.83 0 0 0 6.41 1.88c7.693 0 11.9-6.373 11.9-11.9 0-.18-.005-.362-.013-.54a8.496 8.496 0 0 0 2.087-2.165z\"></path>\n    </g>\n  </svg>\n)\n\nconst Verified = ({ className, ...props }: TwitterIconProps) => (\n  <svg\n    aria-label=\"Verified Account\"\n    viewBox=\"0 0 24 24\"\n    className={className}\n    {...props}\n  >\n    <g fill=\"currentColor\">\n      <path d=\"M22.5 12.5c0-1.58-.875-2.95-2.148-3.6.154-.435.238-.905.238-1.4 0-2.21-1.71-3.998-3.818-3.998-.47 0-.92.084-1.336.25C14.818 2.415 13.51 1.5 12 1.5s-2.816.917-3.437 2.25c-.415-.165-.866-.25-1.336-.25-2.11 0-3.818 1.79-3.818 4 0 .494.083.964.237 1.4-1.272.65-2.147 2.018-2.147 3.6 0 1.495.782 2.798 1.942 3.486-.02.17-.032.34-.032.514 0 2.21 1.708 4 3.818 4 .47 0 .92-.086 1.335-.25.62 1.334 1.926 2.25 3.437 2.25 1.512 0 2.818-.916 3.437-2.25.415.163.865.248 1.336.248 2.11 0 3.818-1.79 3.818-4 0-.174-.012-.344-.033-.513 1.158-.687 1.943-1.99 1.943-3.484zm-6.616-3.334l-4.334 6.5c-.145.217-.382.334-.625.334-.143 0-.288-.04-.416-.126l-.115-.094-2.415-2.415c-.293-.293-.293-.768 0-1.06s.768-.294 1.06 0l1.77 1.767 3.825-5.74c.23-.345.696-.436 1.04-.207.346.23.44.696.21 1.04z\" />\n    </g>\n  </svg>\n)\n\nexport const truncate = (str: string | null, length: number) => {\n  if (!str || str.length <= length) return str\n  return `${str.slice(0, length - 3)}...`\n}\n\nconst Skeleton = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => {\n  return (\n    <div className={cn(\"bg-primary/10 rounded-md\", className)} {...props} />\n  )\n}\n\nexport const TweetSkeleton = ({\n  className,\n  ...props\n}: {\n  className?: string\n  [key: string]: unknown\n}) => (\n  <div\n    className={cn(\n      \"flex size-full max-h-max min-w-72 flex-col gap-2 rounded-xl border p-4\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"flex flex-row gap-2\">\n      <Skeleton className=\"size-10 shrink-0 rounded-full\" />\n      <Skeleton className=\"h-10 w-full\" />\n    </div>\n    <Skeleton className=\"h-20 w-full\" />\n  </div>\n)\n\nexport const TweetNotFound = ({\n  className,\n  ...props\n}: {\n  className?: string\n  [key: string]: unknown\n}) => (\n  <div\n    className={cn(\n      \"flex size-full flex-col items-center justify-center gap-2 rounded-lg border p-4\",\n      className\n    )}\n    {...props}\n  >\n    <h3>Tweet not found</h3>\n  </div>\n)\n\nexport const TweetHeader = ({ tweet }: { tweet: EnrichedTweet }) => (\n  <div className=\"flex flex-row items-start justify-between tracking-normal\">\n    <div className=\"flex items-center space-x-3\">\n      <a\n        href={tweet.user.url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className=\"shrink-0\"\n      >\n        <img\n          title={`Profile picture of ${tweet.user.name}`}\n          alt={tweet.user.screen_name}\n          height={48}\n          width={48}\n          src={tweet.user.profile_image_url_https}\n          className=\"border-border/50 overflow-hidden rounded-full border\"\n        />\n      </a>\n      <div className=\"flex flex-col gap-0.5\">\n        <a\n          href={tweet.user.url}\n          target=\"_blank\"\n          rel=\"noreferrer\"\n          className=\"text-foreground flex items-center font-medium whitespace-nowrap transition-opacity hover:opacity-80\"\n        >\n          {truncate(tweet.user.name, 20)}\n          {tweet.user.verified ||\n            (tweet.user.is_blue_verified && (\n              <Verified className=\"ml-1 inline size-4 text-blue-500\" />\n            ))}\n        </a>\n        <div className=\"flex items-center space-x-1\">\n          <a\n            href={tweet.user.url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"text-muted-foreground hover:text-foreground text-sm transition-colors\"\n          >\n            @{truncate(tweet.user.screen_name, 16)}\n          </a>\n        </div>\n      </div>\n    </div>\n    <a href={tweet.url} target=\"_blank\" rel=\"noreferrer\">\n      <span className=\"sr-only\">Link to tweet</span>\n      <Twitter className=\"text-muted-foreground hover:text-foreground size-5 items-start transition-all ease-in-out hover:scale-105\" />\n    </a>\n  </div>\n)\n\nexport const TweetBody = ({ tweet }: { tweet: EnrichedTweet }) => (\n  <div className=\"text-[15px] leading-relaxed tracking-normal wrap-break-word\">\n    {tweet.entities.map((entity, idx) => {\n      switch (entity.type) {\n        case \"url\":\n        case \"symbol\":\n        case \"hashtag\":\n        case \"mention\":\n          return (\n            <a\n              key={idx}\n              href={entity.href}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"text-muted-foreground hover:text-foreground text-[15px] font-normal transition-colors\"\n            >\n              <span>{entity.text}</span>\n            </a>\n          )\n        case \"text\":\n          return (\n            <span\n              key={idx}\n              className=\"text-foreground text-[15px] font-normal\"\n              dangerouslySetInnerHTML={{ __html: entity.text }}\n            />\n          )\n        default:\n          return null\n      }\n    })}\n  </div>\n)\n\nexport const TweetMedia = ({ tweet }: { tweet: EnrichedTweet }) => {\n  if (!tweet.video && !tweet.photos) return null\n  return (\n    <div className=\"flex flex-1 items-center justify-center\">\n      {tweet.video && (\n        <video\n          poster={tweet.video.poster}\n          autoPlay\n          loop\n          muted\n          playsInline\n          className=\"rounded-xl border shadow-sm\"\n        >\n          <source src={tweet.video.variants[0].src} type=\"video/mp4\" />\n          Your browser does not support the video tag.\n        </video>\n      )}\n      {tweet.photos && (\n        <div className=\"relative flex transform-gpu snap-x snap-mandatory gap-4 overflow-x-auto\">\n          <div className=\"shrink-0 snap-center sm:w-2\" />\n          {tweet.photos.map((photo) => (\n            <img\n              key={photo.url}\n              src={photo.url}\n              width={photo.width}\n              height={photo.height}\n              title={\"Photo by \" + tweet.user.name}\n              alt={tweet.text}\n              className=\"h-64 w-5/6 shrink-0 snap-center snap-always rounded-xl border object-cover shadow-sm\"\n            />\n          ))}\n          <div className=\"shrink-0 snap-center sm:w-2\" />\n        </div>\n      )}\n      {!tweet.video &&\n        !tweet.photos &&\n        // @ts-expect-error package doesn't have type definitions\n        tweet?.card?.binding_values?.thumbnail_image_large?.image_value.url && (\n          <img\n            src={\n              // @ts-expect-error package doesn't have type definitions\n              tweet.card.binding_values.thumbnail_image_large.image_value.url\n            }\n            className=\"h-64 rounded-xl border object-cover shadow-sm\"\n            alt={tweet.text}\n          />\n        )}\n    </div>\n  )\n}\n\nexport const MagicTweet = ({\n  tweet,\n  className,\n  ...props\n}: {\n  tweet: Tweet\n  className?: string\n}) => {\n  const enrichedTweet = enrichTweet(tweet)\n  return (\n    <div\n      className={cn(\n        \"relative flex h-fit w-full max-w-lg flex-col gap-4 overflow-hidden rounded-xl border p-5\",\n        className\n      )}\n      {...props}\n    >\n      <TweetHeader tweet={enrichedTweet} />\n      <TweetBody tweet={enrichedTweet} />\n      <TweetMedia tweet={enrichedTweet} />\n    </div>\n  )\n}\n\n/**\n * TweetCard (Server Side Only)\n */\nexport const TweetCard = async ({\n  id,\n  components,\n  fallback = <TweetSkeleton />,\n  onError,\n  ...props\n}: TweetProps & {\n  className?: string\n}) => {\n  const tweet = id\n    ? await getTweet(id).catch((err) => {\n        if (onError) {\n          onError(err)\n        } else {\n          console.error(err)\n        }\n      })\n    : undefined\n\n  if (!tweet) {\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\n    return <NotFound {...props} />\n  }\n\n  return (\n    <Suspense fallback={fallback}>\n      <MagicTweet tweet={tweet} {...props} />\n    </Suspense>\n  )\n}\n\n\n===== EXAMPLE: tweet-card-demo =====\nTitle: Tweet Card Demo\n\n--- file: example/tweet-card-demo.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\n/**\n * <TweetCard /> (Server Side Only)\n * <ClientTweetCard /> (Client Side Only)\n */\nexport default function TweetDemo() {\n  return <ClientTweetCard id=\"1668408059125702661\" />\n}\n\n\n===== EXAMPLE: tweet-card-images =====\nTitle: Tweet Card Images\n\n--- file: example/tweet-card-images.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetImages() {\n  return <ClientTweetCard id=\"1678577280489234432\" className=\"shadow-2xl\" />\n}\n\n\n===== EXAMPLE: tweet-card-meta-preview =====\nTitle: Tweet Card Meta Preview\n\n--- file: example/tweet-card-meta-preview.tsx ---\nimport { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetMetaPreview() {\n  return <ClientTweetCard id=\"1675849118445436929\" className=\"shadow-2xl\" />\n}\n\n\n\n===== COMPONENT: typing-animation =====\nTitle: Typing Animation\nDescription: Characters appearing in typed animation\n\n--- file: magicui/typing-animation.tsx ---\n\"use client\"\n\nimport {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n  type RefObject,\n} from \"react\"\nimport {\n  motion,\n  useInView,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype TypingAnimationMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"span\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface TypingAnimationProps extends Omit<MotionProps, \"children\"> {\n  children?: string\n  words?: string[]\n  className?: string\n  duration?: number\n  typeSpeed?: number\n  deleteSpeed?: number\n  delay?: number\n  pauseDelay?: number\n  loop?: boolean\n  as?: MotionElementType\n  startOnView?: boolean\n  showCursor?: boolean\n  blinkCursor?: boolean\n  cursorStyle?: \"line\" | \"block\" | \"underscore\"\n}\n\nexport function TypingAnimation({\n  children,\n  words,\n  className,\n  duration = 100,\n  typeSpeed,\n  deleteSpeed,\n  delay = 0,\n  pauseDelay = 1000,\n  loop = false,\n  as: Component = \"span\",\n  startOnView = true,\n  showCursor = true,\n  blinkCursor = true,\n  cursorStyle = \"line\",\n  ...props\n}: TypingAnimationProps) {\n  const MotionComponent = motionElements[\n    Component\n  ] as TypingAnimationMotionComponent\n\n  const [displayedText, setDisplayedText] = useState<string>(\"\")\n  const [currentWordIndex, setCurrentWordIndex] = useState(0)\n  const [currentCharIndex, setCurrentCharIndex] = useState(0)\n  const [phase, setPhase] = useState<\"typing\" | \"pause\" | \"deleting\">(\"typing\")\n  const elementRef = useRef<HTMLElement | null>(null)\n  const isInView = useInView(elementRef as RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const wordsToAnimate = useMemo(\n    () => words ?? (children ? [children] : []),\n    [words, children]\n  )\n  const hasMultipleWords = wordsToAnimate.length > 1\n\n  const typingSpeed = typeSpeed ?? duration\n  const deletingSpeed = deleteSpeed ?? typingSpeed / 2\n\n  const shouldStart = startOnView ? isInView : true\n  const animationSourceKey = useMemo(\n    () => (words ? words.join(\"\\u0000\") : (children ?? \"\")),\n    [words, children]\n  )\n\n  useEffect(() => {\n    setDisplayedText(\"\")\n    setCurrentWordIndex(0)\n    setCurrentCharIndex(0)\n    setPhase(\"typing\")\n  }, [animationSourceKey])\n\n  useEffect(() => {\n    let timeout: ReturnType<typeof setTimeout> | null = null\n\n    if (shouldStart && wordsToAnimate.length > 0) {\n      const timeoutDelay =\n        delay > 0 && displayedText === \"\"\n          ? delay\n          : phase === \"typing\"\n            ? typingSpeed\n            : phase === \"deleting\"\n              ? deletingSpeed\n              : pauseDelay\n\n      timeout = setTimeout(() => {\n        const currentWord = wordsToAnimate[currentWordIndex] || \"\"\n        const graphemes = Array.from(currentWord)\n\n        switch (phase) {\n          case \"typing\":\n            if (currentCharIndex < graphemes.length) {\n              setDisplayedText(\n                graphemes.slice(0, currentCharIndex + 1).join(\"\")\n              )\n              setCurrentCharIndex(currentCharIndex + 1)\n            } else {\n              if (hasMultipleWords || loop) {\n                const isLastWord =\n                  currentWordIndex === wordsToAnimate.length - 1\n                if (!isLastWord || loop) {\n                  setPhase(\"pause\")\n                }\n              }\n            }\n            break\n\n          case \"pause\":\n            setPhase(\"deleting\")\n            break\n\n          case \"deleting\":\n            if (currentCharIndex > 0) {\n              setDisplayedText(\n                graphemes.slice(0, currentCharIndex - 1).join(\"\")\n              )\n              setCurrentCharIndex(currentCharIndex - 1)\n            } else {\n              const nextIndex = (currentWordIndex + 1) % wordsToAnimate.length\n              setCurrentWordIndex(nextIndex)\n              setPhase(\"typing\")\n            }\n            break\n        }\n      }, timeoutDelay)\n    }\n\n    return () => {\n      if (timeout !== null) {\n        clearTimeout(timeout)\n      }\n    }\n  }, [\n    shouldStart,\n    phase,\n    currentCharIndex,\n    currentWordIndex,\n    displayedText,\n    wordsToAnimate,\n    hasMultipleWords,\n    loop,\n    typingSpeed,\n    deletingSpeed,\n    pauseDelay,\n    delay,\n  ])\n\n  const currentWordGraphemes = Array.from(\n    wordsToAnimate[currentWordIndex] || \"\"\n  )\n  const isComplete =\n    !loop &&\n    currentWordIndex === wordsToAnimate.length - 1 &&\n    currentCharIndex >= currentWordGraphemes.length &&\n    phase !== \"deleting\"\n\n  const shouldShowCursor =\n    showCursor &&\n    !isComplete &&\n    (hasMultipleWords || loop || currentCharIndex < currentWordGraphemes.length)\n\n  const getCursorChar = () => {\n    switch (cursorStyle) {\n      case \"block\":\n        return \"▌\"\n      case \"underscore\":\n        return \"_\"\n      case \"line\":\n      default:\n        return \"|\"\n    }\n  }\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\n        \"leading-20 tracking-[-0.02em]\",\n        Component === \"span\" && \"inline-block\",\n        className\n      )}\n      {...props}\n    >\n      {displayedText}\n      {shouldShowCursor && (\n        <span\n          className={cn(\"inline-block\", blinkCursor && \"animate-blink-cursor\")}\n        >\n          {getCursorChar()}\n        </span>\n      )}\n    </MotionComponent>\n  )\n}\n\n\n===== EXAMPLE: typing-animation-demo =====\nTitle: Typing Animation Demo\n\n--- file: example/typing-animation-demo.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation>Hello World! 👋</TypingAnimation>\n}\n\n\n===== EXAMPLE: typing-animation-demo-2 =====\nTitle: Typing Animation Multiple Words\n\n--- file: example/typing-animation-demo-2.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation words={[\"Design 🎨\", \"Build 🔨\", \"Ship 🚀\"]} loop />\n}\n\n\n===== EXAMPLE: typing-animation-demo-3 =====\nTitle: Typing Animation Custom Speed\n\n--- file: example/typing-animation-demo-3.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <TypingAnimation\n      words={[\"Fast typing\", \"Slow delete\"]}\n      typeSpeed={50}\n      deleteSpeed={150}\n      pauseDelay={2000}\n      loop\n    />\n  )\n}\n\n\n===== EXAMPLE: typing-animation-demo-4 =====\nTitle: Typing Animation Start on View\n\n--- file: example/typing-animation-demo-4.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <TypingAnimation startOnView>Starts typing when in view</TypingAnimation>\n  )\n}\n\n\n===== EXAMPLE: typing-animation-demo-5 =====\nTitle: Typing Animation Without Cursor\n\n--- file: example/typing-animation-demo-5.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation showCursor={false}>No cursor shown</TypingAnimation>\n}\n\n\n===== EXAMPLE: typing-animation-demo-6 =====\nTitle: Typing Animation Single Play\n\n--- file: example/typing-animation-demo-6.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation words={[\"First\", \"Second\", \"Final\"]} loop={false} />\n}\n\n\n===== EXAMPLE: typing-animation-demo-7 =====\nTitle: Typing Animation Cursor Blinking\n\n--- file: example/typing-animation-demo-7.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <div className=\"flex-1 space-y-8\">\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          With blinking cursor (default) - watch during pause\n        </p>\n        <TypingAnimation\n          words={[\"Type\", \"Pause\", \"Delete\"]}\n          blinkCursor={true}\n          pauseDelay={2000}\n          loop\n          className=\"text-4xl font-bold\"\n        >\n          Blinking cursor\n        </TypingAnimation>\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Without blinking cursor - static during pause\n        </p>\n        <TypingAnimation\n          words={[\"Type\", \"Pause\", \"Delete\"]}\n          blinkCursor={false}\n          pauseDelay={2000}\n          loop\n          className=\"text-4xl font-bold\"\n        >\n          Static cursor\n        </TypingAnimation>\n      </div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: typing-animation-demo-8 =====\nTitle: Typing Animation Cursor Styles\n\n--- file: example/typing-animation-demo-8.tsx ---\nimport { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <div className=\"flex-1 space-y-8\">\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Line cursor (default)\n        </p>\n        <TypingAnimation\n          words={[\"Line cursor\"]}\n          cursorStyle=\"line\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Block cursor (VSCode style)\n        </p>\n        <TypingAnimation\n          words={[\"Block cursor\"]}\n          cursorStyle=\"block\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">Underscore cursor</p>\n        <TypingAnimation\n          words={[\"Underscore cursor\"]}\n          cursorStyle=\"underscore\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: video-text =====\nTitle: Video Text\nDescription: A component that displays text with a video playing in the background.\n\n--- file: magicui/video-text.tsx ---\n\"use client\"\n\nimport React, { ElementType, ReactNode, useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface VideoTextProps {\n  /**\n   * The video source URL\n   */\n  src: string\n  /**\n   * Additional className for the container\n   */\n  className?: string\n  /**\n   * Whether to autoplay the video\n   */\n  autoPlay?: boolean\n  /**\n   * Whether to mute the video\n   */\n  muted?: boolean\n  /**\n   * Whether to loop the video\n   */\n  loop?: boolean\n  /**\n   * Whether to preload the video\n   */\n  preload?: \"auto\" | \"metadata\" | \"none\"\n  /**\n   * The content to display (will have the video \"inside\" it)\n   */\n  children: ReactNode\n  /**\n   * Font size for the text mask (in viewport width units)\n   * @default 10\n   */\n  fontSize?: string | number\n  /**\n   * Font weight for the text mask\n   * @default \"bold\"\n   */\n  fontWeight?: string | number\n  /**\n   * Text anchor for the text mask\n   * @default \"middle\"\n   */\n  textAnchor?: string\n  /**\n   * Dominant baseline for the text mask\n   * @default \"middle\"\n   */\n  dominantBaseline?: string\n  /**\n   * Font family for the text mask\n   * @default \"sans-serif\"\n   */\n  fontFamily?: string\n  /**\n   * The element type to render for the text\n   * @default \"div\"\n   */\n  as?: ElementType\n}\n\nexport function VideoText({\n  src,\n  children,\n  className = \"\",\n  autoPlay = true,\n  muted = true,\n  loop = true,\n  preload = \"auto\",\n  fontSize = 20,\n  fontWeight = \"bold\",\n  textAnchor = \"middle\",\n  dominantBaseline = \"middle\",\n  fontFamily = \"sans-serif\",\n  as: Component = \"div\",\n}: VideoTextProps) {\n  const [svgMask, setSvgMask] = useState(\"\")\n  const content = React.Children.toArray(children).join(\"\")\n\n  useEffect(() => {\n    const updateSvgMask = () => {\n      const responsiveFontSize =\n        typeof fontSize === \"number\" ? `${fontSize}vw` : fontSize\n      const newSvgMask = `<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%'><text x='50%' y='50%' font-size='${responsiveFontSize}' font-weight='${fontWeight}' text-anchor='${textAnchor}' dominant-baseline='${dominantBaseline}' font-family='${fontFamily}'>${content}</text></svg>`\n      setSvgMask(newSvgMask)\n    }\n\n    updateSvgMask()\n    window.addEventListener(\"resize\", updateSvgMask)\n    return () => window.removeEventListener(\"resize\", updateSvgMask)\n  }, [content, fontSize, fontWeight, textAnchor, dominantBaseline, fontFamily])\n\n  const dataUrlMask = `url(\"data:image/svg+xml,${encodeURIComponent(svgMask)}\")`\n\n  return (\n    <Component className={cn(`relative size-full`, className)}>\n      {/* Create a container that masks the video to only show within text */}\n      <div\n        className=\"absolute inset-0 flex items-center justify-center\"\n        style={{\n          maskImage: dataUrlMask,\n          WebkitMaskImage: dataUrlMask,\n          maskSize: \"contain\",\n          WebkitMaskSize: \"contain\",\n          maskRepeat: \"no-repeat\",\n          WebkitMaskRepeat: \"no-repeat\",\n          maskPosition: \"center\",\n          WebkitMaskPosition: \"center\",\n        }}\n      >\n        <video\n          className=\"h-full w-full object-cover\"\n          autoPlay={autoPlay}\n          muted={muted}\n          loop={loop}\n          preload={preload}\n          playsInline\n        >\n          <source src={src} />\n          Your browser does not support the video tag.\n        </video>\n      </div>\n\n      {/* Add a backup text element for SEO/accessibility */}\n      <span className=\"sr-only\">{content}</span>\n    </Component>\n  )\n}\n\n\n===== EXAMPLE: video-text-demo =====\nTitle: Video Text Demo\n\n--- file: example/video-text-demo.tsx ---\nimport { VideoText } from \"@/registry/magicui/video-text\"\n\nexport default function VideoTextDemo() {\n  return (\n    <div className=\"relative h-[200px] w-full overflow-hidden\">\n      <VideoText src=\"https://cdn.magicui.design/ocean-small.webm\">\n        OCEAN\n      </VideoText>\n    </div>\n  )\n}\n\n\n\n===== COMPONENT: warp-background =====\nTitle: Warp Background\nDescription: A card with a time warping background effect.\n\n--- file: magicui/warp-background.tsx ---\n\"use client\"\n\nimport React, { HTMLAttributes, useCallback, useMemo } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface WarpBackgroundProps extends HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode\n  perspective?: number\n  beamsPerSide?: number\n  beamSize?: number\n  beamDelayMax?: number\n  beamDelayMin?: number\n  beamDuration?: number\n  gridColor?: string\n}\n\nconst Beam = ({\n  width,\n  x,\n  delay,\n  duration,\n}: {\n  width: string | number\n  x: string | number\n  delay: number\n  duration: number\n}) => {\n  const hue = Math.floor(Math.random() * 360)\n  const ar = Math.floor(Math.random() * 10) + 1\n\n  return (\n    <motion.div\n      style={\n        {\n          \"--x\": `${x}`,\n          \"--width\": `${width}`,\n          \"--aspect-ratio\": `${ar}`,\n          \"--background\": `linear-gradient(hsl(${hue} 80% 60%), transparent)`,\n        } as React.CSSProperties\n      }\n      className={`absolute top-0 left-(--x) aspect-[1/var(--aspect-ratio)] w-(--width) [background:var(--background)]`}\n      initial={{ y: \"100cqmax\", x: \"-50%\" }}\n      animate={{ y: \"-100%\", x: \"-50%\" }}\n      transition={{\n        duration,\n        delay,\n        repeat: Infinity,\n        ease: \"linear\",\n      }}\n    />\n  )\n}\n\nexport const WarpBackground: React.FC<WarpBackgroundProps> = ({\n  children,\n  perspective = 100,\n  className,\n  beamsPerSide = 3,\n  beamSize = 5,\n  beamDelayMax = 3,\n  beamDelayMin = 0,\n  beamDuration = 3,\n  gridColor = \"var(--border)\",\n  ...props\n}) => {\n  const generateBeams = useCallback(() => {\n    const beams = []\n    const cellsPerSide = Math.floor(100 / beamSize)\n    const step = cellsPerSide / beamsPerSide\n\n    for (let i = 0; i < beamsPerSide; i++) {\n      const x = Math.floor(i * step)\n      const delay = Math.random() * (beamDelayMax - beamDelayMin) + beamDelayMin\n      beams.push({ x, delay })\n    }\n    return beams\n  }, [beamsPerSide, beamSize, beamDelayMax, beamDelayMin])\n\n  const topBeams = useMemo(() => generateBeams(), [generateBeams])\n  const rightBeams = useMemo(() => generateBeams(), [generateBeams])\n  const bottomBeams = useMemo(() => generateBeams(), [generateBeams])\n  const leftBeams = useMemo(() => generateBeams(), [generateBeams])\n\n  return (\n    <div className={cn(\"relative rounded border p-20\", className)} {...props}>\n      <div\n        style={\n          {\n            \"--perspective\": `${perspective}px`,\n            \"--grid-color\": gridColor,\n            \"--beam-size\": `${beamSize}%`,\n          } as React.CSSProperties\n        }\n        className={\n          \"@container-[size] pointer-events-none absolute top-0 left-0 size-full overflow-hidden [clipPath:inset(0)] perspective-(--perspective) transform-3d\"\n        }\n      >\n        {/* top side */}\n        <div className=\"@container absolute z-20 h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {topBeams.map((beam, index) => (\n            <Beam\n              key={`top-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* bottom side */}\n        <div className=\"@container absolute top-full h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {bottomBeams.map((beam, index) => (\n            <Beam\n              key={`bottom-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* left side */}\n        <div className=\"@container absolute top-0 left-0 h-[100cqmax] w-[100cqh] origin-[0%_0%] transform-[rotate(90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {leftBeams.map((beam, index) => (\n            <Beam\n              key={`left-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* right side */}\n        <div className=\"@container absolute top-0 right-0 h-[100cqmax] w-[100cqh] origin-[100%_0%] transform-[rotate(-90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {rightBeams.map((beam, index) => (\n            <Beam\n              key={`right-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n      </div>\n      <div className=\"relative\">{children}</div>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: warp-background-demo =====\nTitle: Warp Background Demo\n\n--- file: example/warp-background-demo.tsx ---\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { WarpBackground } from \"@/registry/magicui/warp-background\"\n\nexport default function ExampleComponentDemo() {\n  return (\n    <WarpBackground>\n      <Card className=\"w-80\">\n        <CardContent className=\"flex flex-col gap-2 p-4\">\n          <CardTitle>Congratulations on Your Promotion!</CardTitle>\n          <CardDescription>\n            Your hard work and dedication have paid off. We&apos;re thrilled to\n            see you take this next step in your career. Keep up the fantastic\n            work!\n          </CardDescription>\n        </CardContent>\n      </Card>\n    </WarpBackground>\n  )\n}\n\n\n\n===== COMPONENT: word-rotate =====\nTitle: Word Rotate\nDescription: A vertical rotation of words\n\n--- file: magicui/word-rotate.tsx ---\n\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { AnimatePresence, motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface WordRotateProps {\n  words: string[]\n  duration?: number\n  motionProps?: MotionProps\n  className?: string\n}\n\nexport function WordRotate({\n  words,\n  duration = 2500,\n  motionProps = {\n    initial: { opacity: 0, y: -50 },\n    animate: { opacity: 1, y: 0 },\n    exit: { opacity: 0, y: 50 },\n    transition: { duration: 0.25, ease: \"easeOut\" },\n  },\n  className,\n}: WordRotateProps) {\n  const [index, setIndex] = useState(0)\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setIndex((prevIndex) => (prevIndex + 1) % words.length)\n    }, duration)\n\n    // Clean up interval on unmount\n    return () => clearInterval(interval)\n  }, [words, duration])\n\n  return (\n    <div className=\"overflow-hidden py-2\">\n      <AnimatePresence mode=\"wait\">\n        <motion.h1\n          key={words[index]}\n          className={cn(className)}\n          {...motionProps}\n        >\n          {words[index]}\n        </motion.h1>\n      </AnimatePresence>\n    </div>\n  )\n}\n\n\n===== EXAMPLE: word-rotate-demo =====\nTitle: Word Rotate Demo\n\n--- file: example/word-rotate-demo.tsx ---\nimport { WordRotate } from \"@/registry/magicui/word-rotate\"\n\nexport default function WordRotateDemo() {\n  return (\n    <WordRotate\n      className=\"text-4xl font-bold text-black dark:text-white\"\n      words={[\"Word\", \"Rotate\"]}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/public/llms.txt",
    "content": "# Magic UI\n\n> Beautifully designed landing page components built with React & Tailwind CSS.\n\nThis file provides LLM-friendly entry points to documentation and examples.\n\n## Components\n\n- [Android](https://magicui.design/docs/components/android): A mockup of an Android device.\n- [Animated Beam](https://magicui.design/docs/components/animated-beam): An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\n- [Animated Circular Progress Bar](https://magicui.design/docs/components/animated-circular-progress-bar): Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\n- [Animated Gradient Text](https://magicui.design/docs/components/animated-gradient-text): An animated gradient background which transitions between colors for text.\n- [Animated Grid Pattern](https://magicui.design/docs/components/animated-grid-pattern): A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n- [Animated List](https://magicui.design/docs/components/animated-list): A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\n- [Animated Shiny Text](https://magicui.design/docs/components/animated-shiny-text): A light glare effect which pans across text making it appear as if it is shimmering.\n- [Theme Toggler](https://magicui.design/docs/components/animated-theme-toggler): A component for theme changing animation.\n- [Aurora Text](https://magicui.design/docs/components/aurora-text): A beautiful aurora text effect\n- [Avatar Circles](https://magicui.design/docs/components/avatar-circles): Overlapping circles of avatars.\n- [Bento Grid](https://magicui.design/docs/components/bento-grid): Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\n- [Blur Fade](https://magicui.design/docs/components/blur-fade): Blur fade in and out animation. Used to smoothly fade in and out content.\n- [Border Beam](https://magicui.design/docs/components/border-beam): An animated beam of light which travels along the border of its container.\n- [Client Tweet Card](https://magicui.design/docs/components/client-tweet-card): A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\n- [Code Comparison](https://magicui.design/docs/components/code-comparison): A component which compares two code snippets.\n- [Comic Text](https://magicui.design/docs/components/comic-text): Comic text animation\n- [Confetti](https://magicui.design/docs/components/confetti): Confetti animations are best used to delight your users when something special happens\n- [Cool Mode](https://magicui.design/docs/components/cool-mode): Cool mode effect for buttons, links, and other DOMs\n- [Dock](https://magicui.design/docs/components/dock): An implementation of the MacOS dock using react + tailwindcss + motion\n- [Dot Pattern](https://magicui.design/docs/components/dot-pattern): A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\n- [Dotted Map](https://magicui.design/docs/components/dotted-map): A component with a dotted map.\n- [File Tree](https://magicui.design/docs/components/file-tree): A component used to showcase the folder and file structure of a directory.\n- [Flickering Grid](https://magicui.design/docs/components/flickering-grid): A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\n- [Globe](https://magicui.design/docs/components/globe): An autorotating, interactive, and highly performant globe made using WebGL.\n- [Grid Pattern](https://magicui.design/docs/components/grid-pattern): A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n- [Hero Video Dialog](https://magicui.design/docs/components/hero-video-dialog): A hero video dialog component.\n- [Highlighter](https://magicui.design/docs/components/highlighter): A text highlighter that mimics the effect of a human-drawn marker stroke.\n- [Hyper Text](https://magicui.design/docs/components/hyper-text): A text animation that scrambles letters before revealing the final text.\n- [Icon Cloud](https://magicui.design/docs/components/icon-cloud): An interactive 3D tag cloud component\n- [Interactive Grid Pattern](https://magicui.design/docs/components/interactive-grid-pattern): A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\n- [interactive-hover-button](https://magicui.design/docs/components/interactive-hover-button): The interactive-hover-button component.\n- [iPhone](https://magicui.design/docs/components/iphone): A mockup of the iPhone\n- [Lens](https://magicui.design/docs/components/lens): A interactive component that enables zooming into images, videos and other elements.\n- [Light Rays](https://magicui.design/docs/components/light-rays): A component with animated light rays which shine down from above.\n- [Line Shadow Text](https://magicui.design/docs/components/line-shadow-text): A text component with a moving line shadow.\n- [Magic Card](https://magicui.design/docs/components/magic-card): A spotlight effect that follows your mouse cursor and highlights borders on hover.\n- [Marquee](https://magicui.design/docs/components/marquee): An infinite scrolling component that can be used to display text, images, or videos.\n- [Meteors](https://magicui.design/docs/components/meteors): A meteor shower effect.\n- [Morphing Text](https://magicui.design/docs/components/morphing-text): A dynamic text morphing component for Magic UI.\n- [Neon Gradient Card](https://magicui.design/docs/components/neon-gradient-card): A beautiful neon card effect\n- [Number Ticker](https://magicui.design/docs/components/number-ticker): Animate numbers to count up or down to a target number\n- [Orbiting Circles](https://magicui.design/docs/components/orbiting-circles): A collection of circles which move in orbit along a circular path\n- [Particles](https://magicui.design/docs/components/particles): Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\n- [Pixel Image](https://magicui.design/docs/components/pixel-image): A component that displays an image with a pixelated effect, creating a retro aesthetic.\n- [Pointer](https://magicui.design/docs/components/pointer): A component that displays a pointer when hovering over an element\n- [Progressive Blur](https://magicui.design/docs/components/progressive-blur): The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\n- [Pulsating Button](https://magicui.design/docs/components/pulsating-button): An animated pulsating button useful for capturing attention of users.\n- [Rainbow Button](https://magicui.design/docs/components/rainbow-button): An animated button with a rainbow effect.\n- [Retro Grid](https://magicui.design/docs/components/retro-grid): An animated scrolling retro grid effect\n- [Ripple](https://magicui.design/docs/components/ripple): An animated ripple effect typically used behind elements to emphasize them.\n- [Ripple Button](https://magicui.design/docs/components/ripple-button): An animated button with ripple useful for user engagement.\n- [Safari](https://magicui.design/docs/components/safari): A safari browser mockup to showcase your website.\n- [Scroll Based Velocity](https://magicui.design/docs/components/scroll-based-velocity): Scrolling text whose speed changes based on scroll speed\n- [Scroll Progress](https://magicui.design/docs/components/scroll-progress): Animated Scroll Progress for your pages\n- [Shimmer Button](https://magicui.design/docs/components/shimmer-button): A button with a shimmering light which travels around the perimeter.\n- [Shine Border](https://magicui.design/docs/components/shine-border): Shine border is an animated background border effect.\n- [Shiny Button](https://magicui.design/docs/components/shiny-button): A shiny button component with dynamic styles in the dark mode or light mode.\n- [smooth-cursor](https://magicui.design/docs/components/smooth-cursor): A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\n- [Sparkles Text](https://magicui.design/docs/components/sparkles-text): A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\n- [Spinning Text](https://magicui.design/docs/components/spinning-text): The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\n- [Striped Pattern](https://magicui.design/docs/components/striped-pattern): A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\n- [Terminal](https://magicui.design/docs/components/terminal): A terminal component\n- [Text Animate](https://magicui.design/docs/components/text-animate): A text animation component that animates text using a variety of different animations.\n- [Text Reveal](https://magicui.design/docs/components/text-reveal): Fade in text as you scroll down the page.\n- [Tweet Card](https://magicui.design/docs/components/tweet-card): A card that displays a tweet with the author's name, handle, and profile picture.\n- [Typing Animation](https://magicui.design/docs/components/typing-animation): Characters appearing in typed animation\n- [Video Text](https://magicui.design/docs/components/video-text): A component that displays text with a video playing in the background.\n- [Warp Background](https://magicui.design/docs/components/warp-background): A card with a time warping background effect.\n- [Word Rotate](https://magicui.design/docs/components/word-rotate): A vertical rotation of words\n\n## Examples\n\n- [Magic Card Demo](https://github.com/magicuidesign/magicui/blob/main/example/magic-card-demo.tsx): Example usage\n- [Magic Card Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/magic-card-demo2.tsx): Example usage\n- [Android Demo](https://github.com/magicuidesign/magicui/blob/main/example/android-demo.tsx): Example usage\n- [Android Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/android-demo-2.tsx): Example usage\n- [Android Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/android-demo-3.tsx): Example usage\n- [Warp Background Demo](https://github.com/magicuidesign/magicui/blob/main/example/warp-background-demo.tsx): Example usage\n- [Line Shadow Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/line-shadow-text-demo.tsx): Example usage\n- [Aurora Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/aurora-text-demo.tsx): Example usage\n- [Morphing Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/morphing-text-demo.tsx): Example usage\n- [Scroll Progress Demo](https://github.com/magicuidesign/magicui/blob/main/example/scroll-progress-demo.tsx): Example usage\n- [Lens Demo](https://github.com/magicuidesign/magicui/blob/main/example/lens-demo.tsx): Example usage\n- [Lens Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/lens-demo-2.tsx): Example usage\n- [Lens Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/lens-demo-3.tsx): Example usage\n- [Pointer Demo 1](https://github.com/magicuidesign/magicui/blob/main/example/pointer-demo-1.tsx): Example usage\n- [smooth-cursor-demo](https://github.com/magicuidesign/magicui/blob/main/example/smooth-cursor-demo.tsx): Example usage\n- [Progressive Blur Demo](https://github.com/magicuidesign/magicui/blob/main/example/progressive-blur-demo.tsx): Example usage\n- [Neon Gradient Card Demo](https://github.com/magicuidesign/magicui/blob/main/example/neon-gradient-card-demo.tsx): Example usage\n- [Meteors Demo](https://github.com/magicuidesign/magicui/blob/main/example/meteors-demo.tsx): Example usage\n- [Grid Pattern Demo](https://github.com/magicuidesign/magicui/blob/main/example/grid-pattern-demo.tsx): Example usage\n- [Striped Pattern Demo](https://github.com/magicuidesign/magicui/blob/main/example/striped-pattern-demo.tsx): Example usage\n- [Striped Pattern (Dashed)](https://github.com/magicuidesign/magicui/blob/main/example/striped-pattern-dashed.tsx): Example usage\n- [Striped Pattern (Right)](https://github.com/magicuidesign/magicui/blob/main/example/striped-pattern-right.tsx): Example usage\n- [Grid Pattern Linear Gradient](https://github.com/magicuidesign/magicui/blob/main/example/grid-pattern-linear-gradient.tsx): Example usage\n- [Grid Pattern Dashed](https://github.com/magicuidesign/magicui/blob/main/example/grid-pattern-dashed.tsx): Example usage\n- [Dot Pattern Demo](https://github.com/magicuidesign/magicui/blob/main/example/dot-pattern-demo.tsx): Example usage\n- [Dot Pattern Linear Gradient](https://github.com/magicuidesign/magicui/blob/main/example/dot-pattern-linear-gradient.tsx): Example usage\n- [Dot Pattern with glow effect](https://github.com/magicuidesign/magicui/blob/main/example/dot-pattern-with-glow-effect.tsx): Example usage\n- [Flickering Grid Demo](https://github.com/magicuidesign/magicui/blob/main/example/flickering-grid-demo.tsx): Example usage\n- [Flickering Grid Rounded Demo](https://github.com/magicuidesign/magicui/blob/main/example/flickering-grid-rounded-demo.tsx): Example usage\n- [Hero Video Dialog Demo](https://github.com/magicuidesign/magicui/blob/main/example/hero-video-dialog-demo.tsx): Example usage\n- [Hero Video Dialog Top In Bottom Out Demo](https://github.com/magicuidesign/magicui/blob/main/example/hero-video-dialog-demo-top-in-bottom-out.tsx): Example usage\n- [Code Comparison Demo](https://github.com/magicuidesign/magicui/blob/main/example/code-comparison-demo.tsx): Example usage\n- [Marquee Demo](https://github.com/magicuidesign/magicui/blob/main/example/marquee-demo.tsx): Example usage\n- [Marquee Vertical Demo](https://github.com/magicuidesign/magicui/blob/main/example/marquee-demo-vertical.tsx): Example usage\n- [Marquee Logos](https://github.com/magicuidesign/magicui/blob/main/example/marquee-logos.tsx): Example usage\n- [Marquee 3D](https://github.com/magicuidesign/magicui/blob/main/example/marquee-3d.tsx): Example usage\n- [Globe Demo](https://github.com/magicuidesign/magicui/blob/main/example/globe-demo.tsx): Example usage\n- [Tweet Card Demo](https://github.com/magicuidesign/magicui/blob/main/example/tweet-card-demo.tsx): Example usage\n- [Tweet Card Images](https://github.com/magicuidesign/magicui/blob/main/example/tweet-card-images.tsx): Example usage\n- [Tweet Card Meta Preview](https://github.com/magicuidesign/magicui/blob/main/example/tweet-card-meta-preview.tsx): Example usage\n- [Shimmer Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/shimmer-button-demo.tsx): Example usage\n- [Bento Demo](https://github.com/magicuidesign/magicui/blob/main/example/bento-demo.tsx): Example usage\n- [Bento Vertical Demo](https://github.com/magicuidesign/magicui/blob/main/example/bento-demo-vertical.tsx): Example usage\n- [Number Ticker Demo](https://github.com/magicuidesign/magicui/blob/main/example/number-ticker-demo.tsx): Example usage\n- [Number Ticker Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/number-ticker-demo-2.tsx): Example usage\n- [Number Ticker Decimal Demo](https://github.com/magicuidesign/magicui/blob/main/example/number-ticker-decimal-demo.tsx): Example usage\n- [Ripple Demo](https://github.com/magicuidesign/magicui/blob/main/example/ripple-demo.tsx): Example usage\n- [Retro Grid Demo](https://github.com/magicuidesign/magicui/blob/main/example/retro-grid-demo.tsx): Example usage\n- [Animated List Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-list-demo.tsx): Example usage\n- [Animated Shiny Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-shiny-text-demo.tsx): Example usage\n- [Particles Demo](https://github.com/magicuidesign/magicui/blob/main/example/particles-demo.tsx): Example usage\n- [Animated Grid Pattern Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-grid-pattern-demo.tsx): Example usage\n- [Interactive Grid Pattern Demo](https://github.com/magicuidesign/magicui/blob/main/example/interactive-grid-pattern-demo.tsx): Example usage\n- [Interactive Grid Pattern Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/interactive-grid-pattern-demo-2.tsx): Example usage\n- [Border Beam Demo](https://github.com/magicuidesign/magicui/blob/main/example/border-beam-demo.tsx): Example usage\n- [Border Beam Demo](https://github.com/magicuidesign/magicui/blob/main/example/border-beam-demo-2.tsx): Example usage\n- [Border Beam Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/border-beam-demo-3.tsx): Example usage\n- [Border Beam Demo 4](https://github.com/magicuidesign/magicui/blob/main/example/border-beam-demo-4.tsx): Example usage\n- [Animated Beam Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-beam-demo.tsx): Example usage\n- [Animated Beam Unidirectional](https://github.com/magicuidesign/magicui/blob/main/example/animated-beam-unidirectional.tsx): Example usage\n- [Animated Beam Bidirectional](https://github.com/magicuidesign/magicui/blob/main/example/animated-beam-bidirectional.tsx): Example usage\n- [Animated Beam Multiple Inputs](https://github.com/magicuidesign/magicui/blob/main/example/animated-beam-multiple-inputs.tsx): Example usage\n- [Animated Beam Multiple Outputs](https://github.com/magicuidesign/magicui/blob/main/example/animated-beam-multiple-outputs.tsx): Example usage\n- [Text Reveal Demo](https://github.com/magicuidesign/magicui/blob/main/example/text-reveal-demo.tsx): Example usage\n- [Animated Gradient Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-gradient-text-demo.tsx): Example usage\n- [Animated Gradient Text Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/animated-gradient-text-demo-2.tsx): Example usage\n- [Orbiting Circles Demo](https://github.com/magicuidesign/magicui/blob/main/example/orbiting-circles-demo.tsx): Example usage\n- [Dock Demo](https://github.com/magicuidesign/magicui/blob/main/example/dock-demo.tsx): Example usage\n- [Dock Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/dock-demo-2.tsx): Example usage\n- [Dock Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/dock-demo-3.tsx): Example usage\n- [Word Rotate Demo](https://github.com/magicuidesign/magicui/blob/main/example/word-rotate-demo.tsx): Example usage\n- [Hyper Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/hyper-text-demo.tsx): Example usage\n- [Avatar Circles Demo](https://github.com/magicuidesign/magicui/blob/main/example/avatar-circles-demo.tsx): Example usage\n- [Typing Animation Demo](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo.tsx): Example usage\n- [Typing Animation Multiple Words](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-2.tsx): Example usage\n- [Typing Animation Custom Speed](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-3.tsx): Example usage\n- [Typing Animation Start on View](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-4.tsx): Example usage\n- [Typing Animation Without Cursor](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-5.tsx): Example usage\n- [Typing Animation Single Play](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-6.tsx): Example usage\n- [Typing Animation Cursor Blinking](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-7.tsx): Example usage\n- [Typing Animation Cursor Styles](https://github.com/magicuidesign/magicui/blob/main/example/typing-animation-demo-8.tsx): Example usage\n- [Scroll Based Velocity Demo](https://github.com/magicuidesign/magicui/blob/main/example/scroll-based-velocity-demo.tsx): Example usage\n- [Scroll Based Velocity Images](https://github.com/magicuidesign/magicui/blob/main/example/scroll-based-velocity-images-demo.tsx): Example usage\n- [Sparkles Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/sparkles-text-demo.tsx): Example usage\n- [Spinning Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/spinning-text-demo.tsx): Example usage\n- [Spinning Text Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/spinning-text-demo-2.tsx): Example usage\n- [Comic Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/comic-text-demo.tsx): Example usage\n- [Icon Cloud Demo](https://github.com/magicuidesign/magicui/blob/main/example/icon-cloud-demo.tsx): Example usage\n- [Icon Cloud Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/icon-cloud-demo-2.tsx): Example usage\n- [Icon Cloud Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/icon-cloud-demo-3.tsx): Example usage\n- [Text Animate Demo](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo.tsx): Example usage\n- [Text Animate Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-2.tsx): Example usage\n- [Text Animate Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-3.tsx): Example usage\n- [Text Animate Demo 4](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-4.tsx): Example usage\n- [Text Animate Demo 5](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-5.tsx): Example usage\n- [Text Animate Demo 6](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-6.tsx): Example usage\n- [Text Animate Demo 7](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-7.tsx): Example usage\n- [Text Animate Demo 8](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-8.tsx): Example usage\n- [Text Animate Demo 9](https://github.com/magicuidesign/magicui/blob/main/example/text-animate-demo-9.tsx): Example usage\n- [Shiny Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/shiny-button-demo.tsx): Example usage\n- [Animated Circular Progress Bar Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-circular-progress-bar-demo.tsx): Example usage\n- [Shine Border Demo](https://github.com/magicuidesign/magicui/blob/main/example/shine-border-demo.tsx): Example usage\n- [Shine Border Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/shine-border-demo-2.tsx): Example usage\n- [Confetti Demo](https://github.com/magicuidesign/magicui/blob/main/example/confetti-demo.tsx): Example usage\n- [Confetti Basic Cannon](https://github.com/magicuidesign/magicui/blob/main/example/confetti-basic-cannon.tsx): Example usage\n- [Confetti Random Direction](https://github.com/magicuidesign/magicui/blob/main/example/confetti-random-direction.tsx): Example usage\n- [Confetti Fireworks](https://github.com/magicuidesign/magicui/blob/main/example/confetti-fireworks.tsx): Example usage\n- [Confetti Stars](https://github.com/magicuidesign/magicui/blob/main/example/confetti-stars.tsx): Example usage\n- [Confetti Side Cannons](https://github.com/magicuidesign/magicui/blob/main/example/confetti-side-cannons.tsx): Example usage\n- [Confetti Custom Shapes](https://github.com/magicuidesign/magicui/blob/main/example/confetti-custom-shapes.tsx): Example usage\n- [Confetti Emoji](https://github.com/magicuidesign/magicui/blob/main/example/confetti-emoji.tsx): Example usage\n- [Cool Mode Demo](https://github.com/magicuidesign/magicui/blob/main/example/cool-mode-demo.tsx): Example usage\n- [Cool Mode Custom](https://github.com/magicuidesign/magicui/blob/main/example/cool-mode-custom.tsx): Example usage\n- [Pulsating Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/pulsating-button-demo.tsx): Example usage\n- [Ripple Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/ripple-button-demo.tsx): Example usage\n- [File Tree Demo](https://github.com/magicuidesign/magicui/blob/main/example/file-tree-demo.tsx): Example usage\n- [Blur Fade Demo](https://github.com/magicuidesign/magicui/blob/main/example/blur-fade-demo.tsx): Example usage\n- [Blur Fade Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/blur-fade-text-demo.tsx): Example usage\n- [Safari Demo](https://github.com/magicuidesign/magicui/blob/main/example/safari-demo.tsx): Example usage\n- [Safari Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/safari-demo-2.tsx): Example usage\n- [Safari Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/safari-demo-3.tsx): Example usage\n- [Safari Demo 4](https://github.com/magicuidesign/magicui/blob/main/example/safari-demo-4.tsx): Example usage\n- [iPhone Demo](https://github.com/magicuidesign/magicui/blob/main/example/iphone-demo.tsx): Example usage\n- [iPhone Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/iphone-demo-2.tsx): Example usage\n- [iPhone Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/iphone-demo-3.tsx): Example usage\n- [Rainbow Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/rainbow-button-demo.tsx): Example usage\n- [Rainbow Button Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/rainbow-button-demo-2.tsx): Example usage\n- [Interactive Hover Button Demo](https://github.com/magicuidesign/magicui/blob/main/example/interactive-hover-button-demo.tsx): Example usage\n- [Terminal Demo](https://github.com/magicuidesign/magicui/blob/main/example/terminal-demo.tsx): Example usage\n- [Terminal Demo](https://github.com/magicuidesign/magicui/blob/main/example/terminal-demo-2.tsx): Example usage\n- [Video Text Demo](https://github.com/magicuidesign/magicui/blob/main/example/video-text-demo.tsx): Example usage\n- [Pixel Image Demo](https://github.com/magicuidesign/magicui/blob/main/example/pixel-image-demo.tsx): Example usage\n- [Highlighter Demo](https://github.com/magicuidesign/magicui/blob/main/example/highlighter-demo.tsx): Example usage\n- [Animated Theme Toggler Demo](https://github.com/magicuidesign/magicui/blob/main/example/animated-theme-toggler-demo.tsx): Example usage\n- [light-rays-demo](https://github.com/magicuidesign/magicui/blob/main/example/light-rays-demo.tsx): Example usage\n- [Dotted Map Demo](https://github.com/magicuidesign/magicui/blob/main/example/dotted-map-demo.tsx): Example usage\n- [Dotted Map Demo 2](https://github.com/magicuidesign/magicui/blob/main/example/dotted-map-demo-2.tsx): Example usage\n- [Dotted Map Demo 3](https://github.com/magicuidesign/magicui/blob/main/example/dotted-map-demo-3.tsx): Example usage\n\n## Optional\n\n- [Repository](https://github.com/magicuidesign/magicui): Source code and issues\n- [Sitemap](https://magicui.design/sitemap.xml): Indexable pages"
  },
  {
    "path": "apps/www/public/mcp.json",
    "content": "{\n  \"mcpServers\": {\n    \"magicuidesign-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@magicuidesign/mcp@latest\"]\n    }\n  }\n}\n"
  },
  {
    "path": "apps/www/public/r/android-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"android-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Android Demo 2\",\n  \"description\": \"Second example showing a mockup of an Android device.\",\n  \"registryDependencies\": [\n    \"@magicui/android\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/android-demo-2.tsx\",\n      \"content\": \"import { Android } from \\\"@/registry/magicui/android\\\"\\n\\nexport default function AndroidDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Android\\n        className=\\\"size-full\\\"\\n        src=\\\"https://images.unsplash.com/photo-1730326405863-c6fa7e499a6e?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/android-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"android-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Android Demo 3\",\n  \"description\": \"Third example showing a mockup of an Android device.\",\n  \"registryDependencies\": [\n    \"@magicui/android\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/android-demo-3.tsx\",\n      \"content\": \"import { Android } from \\\"@/registry/magicui/android\\\"\\n\\nexport default function AndroidDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Android\\n        className=\\\"size-full\\\"\\n        videoSrc=\\\"https://videos.pexels.com/video-files/14993748/14993748-uhd_1296_2304_30fps.mp4\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/android-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"android-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Android Demo\",\n  \"description\": \"Example showing a mockup of an Android device.\",\n  \"registryDependencies\": [\n    \"@magicui/android\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/android-demo.tsx\",\n      \"content\": \"import { Android } from \\\"@/registry/magicui/android\\\"\\n\\nexport default function AndroidDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Android className=\\\"size-full\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/android.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"android\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Android\",\n  \"description\": \"A mockup of an Android device.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/android.tsx\",\n      \"content\": \"import { SVGProps } from \\\"react\\\"\\n\\nexport interface AndroidProps extends SVGProps<SVGSVGElement> {\\n  width?: number\\n  height?: number\\n  src?: string\\n  videoSrc?: string\\n}\\n\\nexport function Android({\\n  width = 433,\\n  height = 882,\\n  src,\\n  videoSrc,\\n  ...props\\n}: AndroidProps) {\\n  return (\\n    <svg\\n      width={width}\\n      height={height}\\n      viewBox={`0 0 ${width} ${height}`}\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      {...props}\\n    >\\n      <path\\n        d=\\\"M376 153H378C379.105 153 380 153.895 380 155V249C380 250.105 379.105 251 378 251H376V153Z\\\"\\n        className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n      />\\n      <path\\n        d=\\\"M376 301H378C379.105 301 380 301.895 380 303V351C380 352.105 379.105 353 378 353H376V301Z\\\"\\n        className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n      />\\n      <path\\n        d=\\\"M0 42C0 18.8041 18.804 0 42 0H336C359.196 0 378 18.804 378 42V788C378 811.196 359.196 830 336 830H42C18.804 830 0 811.196 0 788V42Z\\\"\\n        className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n      />\\n      <path\\n        d=\\\"M2 43C2 22.0132 19.0132 5 40 5H338C358.987 5 376 22.0132 376 43V787C376 807.987 358.987 825 338 825H40C19.0132 825 2 807.987 2 787V43Z\\\"\\n        className=\\\"fill-white dark:fill-[#262626]\\\"\\n      />\\n\\n      <g clipPath=\\\"url(#clip0_514_20855)\\\">\\n        <path\\n          d=\\\"M9.25 48C9.25 29.3604 24.3604 14.25 43 14.25H335C353.64 14.25 368.75 29.3604 368.75 48V780C368.75 798.64 353.64 813.75 335 813.75H43C24.3604 813.75 9.25 798.64 9.25 780V48Z\\\"\\n          className=\\\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\\\"\\n        />\\n      </g>\\n      <circle\\n        cx=\\\"189\\\"\\n        cy=\\\"28\\\"\\n        r=\\\"9\\\"\\n        className=\\\"fill-white dark:fill-[#262626]\\\"\\n      />\\n      <circle\\n        cx=\\\"189\\\"\\n        cy=\\\"28\\\"\\n        r=\\\"4\\\"\\n        className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n      />\\n      {src && (\\n        <image\\n          href={src}\\n          width=\\\"360\\\"\\n          height=\\\"800\\\"\\n          className=\\\"size-full object-cover\\\"\\n          preserveAspectRatio=\\\"xMidYMid slice\\\"\\n          clipPath=\\\"url(#clip0_514_20855)\\\"\\n        />\\n      )}\\n      {videoSrc && (\\n        <foreignObject\\n          width=\\\"380\\\"\\n          height=\\\"820\\\"\\n          clipPath=\\\"url(#clip0_514_20855)\\\"\\n          preserveAspectRatio=\\\"xMidYMid slice\\\"\\n        >\\n          <video\\n            className=\\\"size-full object-cover\\\"\\n            src={videoSrc}\\n            autoPlay\\n            loop\\n            muted\\n            playsInline\\n          />\\n        </foreignObject>\\n      )}\\n      <defs>\\n        <clipPath id=\\\"clip0_514_20855\\\">\\n          <rect\\n            width=\\\"360\\\"\\n            height=\\\"800\\\"\\n            rx=\\\"33\\\"\\n            ry=\\\"25\\\"\\n            className=\\\"fill-white dark:fill-[#262626]\\\"\\n            transform=\\\"translate(9 14)\\\"\\n          />\\n        </clipPath>\\n      </defs>\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam-bidirectional.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam-bidirectional\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Beam Bidirectional\",\n  \"description\": \"Example showing a bidirectional animated beam effect.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-beam-bidirectional.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { forwardRef, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedBeam } from \\\"@/registry/magicui/animated-beam\\\"\\n\\nconst Circle = forwardRef<\\n  HTMLDivElement,\\n  { className?: string; children?: React.ReactNode }\\n>(({ className, children }, ref) => {\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\\\",\\n        className\\n      )}\\n    >\\n      {children}\\n    </div>\\n  )\\n})\\n\\nCircle.displayName = \\\"Circle\\\"\\n\\nexport default function AnimatedBeamDemo() {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const div1Ref = useRef<HTMLDivElement>(null)\\n  const div2Ref = useRef<HTMLDivElement>(null)\\n\\n  return (\\n    <div\\n      className=\\\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\\\"\\n      ref={containerRef}\\n    >\\n      <div className=\\\"flex size-full flex-col items-stretch justify-between gap-10\\\">\\n        <div className=\\\"flex flex-row justify-between\\\">\\n          <Circle ref={div1Ref}>\\n            <Icons.user />\\n          </Circle>\\n          <Circle ref={div2Ref}>\\n            <Icons.openai />\\n          </Circle>\\n        </div>\\n      </div>\\n\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div2Ref}\\n        startYOffset={10}\\n        endYOffset={10}\\n        curvature={-20}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div2Ref}\\n        startYOffset={-10}\\n        endYOffset={-10}\\n        curvature={20}\\n        reverse\\n      />\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  openai: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  user: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"#000000\\\"\\n      strokeWidth=\\\"2\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\\\" />\\n      <circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\" />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Beam Demo\",\n  \"description\": \"Example showing an animated beam of light effect.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/animated-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-beam-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { forwardRef, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedBeam } from \\\"@/registry/magicui/animated-beam\\\"\\n\\nconst Circle = forwardRef<\\n  HTMLDivElement,\\n  { className?: string; children?: React.ReactNode }\\n>(({ className, children }, ref) => {\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\\\",\\n        className\\n      )}\\n    >\\n      {children}\\n    </div>\\n  )\\n})\\n\\nCircle.displayName = \\\"Circle\\\"\\n\\nexport default function AnimatedBeamDemo() {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const div1Ref = useRef<HTMLDivElement>(null)\\n  const div2Ref = useRef<HTMLDivElement>(null)\\n  const div3Ref = useRef<HTMLDivElement>(null)\\n  const div4Ref = useRef<HTMLDivElement>(null)\\n  const div5Ref = useRef<HTMLDivElement>(null)\\n  const div6Ref = useRef<HTMLDivElement>(null)\\n  const div7Ref = useRef<HTMLDivElement>(null)\\n\\n  return (\\n    <div\\n      className=\\\"relative flex h-[300px] w-full items-center justify-center overflow-hidden p-10\\\"\\n      ref={containerRef}\\n    >\\n      <div className=\\\"flex size-full max-h-[200px] max-w-lg flex-col items-stretch justify-between gap-10\\\">\\n        <div className=\\\"flex flex-row items-center justify-between\\\">\\n          <Circle ref={div1Ref}>\\n            <Icons.googleDrive />\\n          </Circle>\\n          <Circle ref={div5Ref}>\\n            <Icons.googleDocs />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-row items-center justify-between\\\">\\n          <Circle ref={div2Ref}>\\n            <Icons.notion />\\n          </Circle>\\n          <Circle ref={div4Ref} className=\\\"size-16\\\">\\n            <Icons.openai />\\n          </Circle>\\n          <Circle ref={div6Ref}>\\n            <Icons.zapier />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-row items-center justify-between\\\">\\n          <Circle ref={div3Ref}>\\n            <Icons.whatsapp />\\n          </Circle>\\n          <Circle ref={div7Ref}>\\n            <Icons.messenger />\\n          </Circle>\\n        </div>\\n      </div>\\n\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div4Ref}\\n        curvature={-75}\\n        endYOffset={-10}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div2Ref}\\n        toRef={div4Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div3Ref}\\n        toRef={div4Ref}\\n        curvature={75}\\n        endYOffset={10}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div5Ref}\\n        toRef={div4Ref}\\n        curvature={-75}\\n        endYOffset={-10}\\n        reverse\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div6Ref}\\n        toRef={div4Ref}\\n        reverse\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div7Ref}\\n        toRef={div4Ref}\\n        curvature={75}\\n        endYOffset={10}\\n        reverse\\n      />\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  notion: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000000\\\"\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  openai: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  googleDrive: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 87.3 78\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        fill=\\\"#b3b3b3\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n        fill=\\\"url(#linearGradient1780)\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n        fill=\\\"url(#b)\\\"\\n      />\\n      <path\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n        fill=\\\"#ffffff\\\"\\n        fillRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  googleDocs: () => (\\n    <svg\\n      width=\\\"47px\\\"\\n      height=\\\"65px\\\"\\n      viewBox=\\\"0 0 47 65\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-1\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-3\\\"\\n        />\\n        <linearGradient\\n          x1=\\\"50.0053945%\\\"\\n          y1=\\\"8.58610612%\\\"\\n          x2=\\\"50.0053945%\\\"\\n          y2=\\\"100.013939%\\\"\\n          id=\\\"linearGradient-5\\\"\\n        >\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.2\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.02\\\" offset=\\\"100%\\\" />\\n        </linearGradient>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-6\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-8\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-10\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-12\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-14\\\"\\n        />\\n        <radialGradient\\n          cx=\\\"3.16804688%\\\"\\n          cy=\\\"2.71744318%\\\"\\n          fx=\\\"3.16804688%\\\"\\n          fy=\\\"2.71744318%\\\"\\n          r=\\\"161.248516%\\\"\\n          gradientTransform=\\\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\\\"\\n          id=\\\"radialGradient-16\\\"\\n        >\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0.1\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0\\\" offset=\\\"100%\\\" />\\n        </radialGradient>\\n      </defs>\\n      <g\\n        id=\\\"Page-1\\\"\\n        stroke=\\\"none\\\"\\n        strokeWidth=\\\"1\\\"\\n        fill=\\\"none\\\"\\n        fillRule=\\\"evenodd\\\"\\n      >\\n        <g transform=\\\"translate(-451.000000, -463.000000)\\\">\\n          <g id=\\\"Hero\\\" transform=\\\"translate(0.000000, 63.000000)\\\">\\n            <g id=\\\"Personal\\\" transform=\\\"translate(277.000000, 309.000000)\\\">\\n              <g id=\\\"Docs-icon\\\" transform=\\\"translate(174.000000, 91.000000)\\\">\\n                <g id=\\\"Group\\\">\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-2\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-1\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fill=\\\"#4285F4\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-2)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-4\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-3\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <polygon\\n                      id=\\\"Path\\\"\\n                      fill=\\\"url(#linearGradient-5)\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-4)\\\"\\n                      points=\\\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\\\"\\n                    ></polygon>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-7\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-6\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\\\"\\n                      id=\\\"Shape\\\"\\n                      fill=\\\"#F1F1F1\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-7)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-9\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-8\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <g id=\\\"Group\\\" mask=\\\"url(#mask-9)\\\">\\n                      <g transform=\\\"translate(26.437500, -2.954545)\\\">\\n                        <path\\n                          d=\\\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\\\"\\n                          id=\\\"Path\\\"\\n                          fill=\\\"#A1C2FA\\\"\\n                          fillRule=\\\"nonzero\\\"\\n                        />\\n                      </g>\\n                    </g>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-11\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-10\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#FFFFFF\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-11)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-13\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-12\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-13)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-15\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-14\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.1\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-15)\\\"\\n                    />\\n                  </g>\\n                </g>\\n                <path\\n                  d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n                  id=\\\"Path\\\"\\n                  fill=\\\"url(#radialGradient-16)\\\"\\n                  fillRule=\\\"nonzero\\\"\\n                />\\n              </g>\\n            </g>\\n          </g>\\n        </g>\\n      </g>\\n    </svg>\\n  ),\\n  zapier: () => (\\n    <svg\\n      width=\\\"105\\\"\\n      height=\\\"28\\\"\\n      viewBox=\\\"0 0 244 66\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path d=\\\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\\\" fill=\\\"#FF4F00\\\" />\\n    </svg>\\n  ),\\n  messenger: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 48 48\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <radialGradient\\n        id=\\\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\\\"\\n        cx=\\\"11.087\\\"\\n        cy=\\\"7.022\\\"\\n        r=\\\"47.612\\\"\\n        gradientTransform=\\\"matrix(1 0 0 -1 0 50)\\\"\\n        gradientUnits=\\\"userSpaceOnUse\\\"\\n      >\\n        <stop offset=\\\"0\\\" stopColor=\\\"#1292ff\\\"></stop>\\n        <stop offset=\\\".079\\\" stopColor=\\\"#2982ff\\\"></stop>\\n        <stop offset=\\\".23\\\" stopColor=\\\"#4e69ff\\\"></stop>\\n        <stop offset=\\\".351\\\" stopColor=\\\"#6559ff\\\"></stop>\\n        <stop offset=\\\".428\\\" stopColor=\\\"#6d53ff\\\"></stop>\\n        <stop offset=\\\".754\\\" stopColor=\\\"#df47aa\\\"></stop>\\n        <stop offset=\\\".946\\\" stopColor=\\\"#ff6257\\\"></stop>\\n      </radialGradient>\\n      <path\\n        fill=\\\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\\\"\\n        d=\\\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\\\"\\n        opacity=\\\".05\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\\\"\\n        opacity=\\\".07\\\"\\n      />\\n      <path\\n        fill=\\\"#ffffff\\\"\\n        d=\\\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\\\"\\n      />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam-multiple-inputs.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam-multiple-inputs\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Beam Multiple Inputs\",\n  \"description\": \"Example showing animated beams with multiple input points.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-beam-multiple-inputs.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { forwardRef, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedBeam } from \\\"@/registry/magicui/animated-beam\\\"\\n\\nconst Circle = forwardRef<\\n  HTMLDivElement,\\n  { className?: string; children?: React.ReactNode }\\n>(({ className, children }, ref) => {\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"border-border z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\\\",\\n        className\\n      )}\\n    >\\n      {children}\\n    </div>\\n  )\\n})\\n\\nCircle.displayName = \\\"Circle\\\"\\n\\nexport default function AnimatedBeamMultipleOutputDemo({\\n  className,\\n}: {\\n  className?: string\\n}) {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const div1Ref = useRef<HTMLDivElement>(null)\\n  const div2Ref = useRef<HTMLDivElement>(null)\\n  const div3Ref = useRef<HTMLDivElement>(null)\\n  const div4Ref = useRef<HTMLDivElement>(null)\\n  const div5Ref = useRef<HTMLDivElement>(null)\\n  const div6Ref = useRef<HTMLDivElement>(null)\\n  const div7Ref = useRef<HTMLDivElement>(null)\\n\\n  return (\\n    <div\\n      className={cn(\\n        \\\"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\\\",\\n        className\\n      )}\\n      ref={containerRef}\\n    >\\n      <div className=\\\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\\\">\\n        <div className=\\\"flex flex-col justify-center gap-2\\\">\\n          <Circle ref={div1Ref}>\\n            <Icons.googleDrive />\\n          </Circle>\\n          <Circle ref={div2Ref}>\\n            <Icons.googleDocs />\\n          </Circle>\\n          <Circle ref={div3Ref}>\\n            <Icons.whatsapp />\\n          </Circle>\\n          <Circle ref={div4Ref}>\\n            <Icons.messenger />\\n          </Circle>\\n          <Circle ref={div5Ref}>\\n            <Icons.notion />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-col justify-center\\\">\\n          <Circle ref={div6Ref} className=\\\"size-16\\\">\\n            <Icons.openai />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-col justify-center\\\">\\n          <Circle ref={div7Ref}>\\n            <Icons.user />\\n          </Circle>\\n        </div>\\n      </div>\\n\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div6Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div2Ref}\\n        toRef={div6Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div3Ref}\\n        toRef={div6Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div4Ref}\\n        toRef={div6Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div5Ref}\\n        toRef={div6Ref}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div6Ref}\\n        toRef={div7Ref}\\n      />\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  notion: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000000\\\"\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  openai: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  googleDrive: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 87.3 78\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        fill=\\\"#b3b3b3\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n        fill=\\\"url(#linearGradient1780)\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n        fill=\\\"url(#b)\\\"\\n      />\\n      <path\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n        fill=\\\"#ffffff\\\"\\n        fillRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  googleDocs: () => (\\n    <svg\\n      width=\\\"47px\\\"\\n      height=\\\"65px\\\"\\n      viewBox=\\\"0 0 47 65\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-1\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-3\\\"\\n        />\\n        <linearGradient\\n          x1=\\\"50.0053945%\\\"\\n          y1=\\\"8.58610612%\\\"\\n          x2=\\\"50.0053945%\\\"\\n          y2=\\\"100.013939%\\\"\\n          id=\\\"linearGradient-5\\\"\\n        >\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.2\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.02\\\" offset=\\\"100%\\\" />\\n        </linearGradient>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-6\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-8\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-10\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-12\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-14\\\"\\n        />\\n        <radialGradient\\n          cx=\\\"3.16804688%\\\"\\n          cy=\\\"2.71744318%\\\"\\n          fx=\\\"3.16804688%\\\"\\n          fy=\\\"2.71744318%\\\"\\n          r=\\\"161.248516%\\\"\\n          gradientTransform=\\\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\\\"\\n          id=\\\"radialGradient-16\\\"\\n        >\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0.1\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0\\\" offset=\\\"100%\\\" />\\n        </radialGradient>\\n      </defs>\\n      <g\\n        id=\\\"Page-1\\\"\\n        stroke=\\\"none\\\"\\n        strokeWidth=\\\"1\\\"\\n        fill=\\\"none\\\"\\n        fillRule=\\\"evenodd\\\"\\n      >\\n        <g transform=\\\"translate(-451.000000, -463.000000)\\\">\\n          <g id=\\\"Hero\\\" transform=\\\"translate(0.000000, 63.000000)\\\">\\n            <g id=\\\"Personal\\\" transform=\\\"translate(277.000000, 309.000000)\\\">\\n              <g id=\\\"Docs-icon\\\" transform=\\\"translate(174.000000, 91.000000)\\\">\\n                <g id=\\\"Group\\\">\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-2\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-1\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fill=\\\"#4285F4\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-2)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-4\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-3\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <polygon\\n                      id=\\\"Path\\\"\\n                      fill=\\\"url(#linearGradient-5)\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-4)\\\"\\n                      points=\\\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\\\"\\n                    ></polygon>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-7\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-6\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\\\"\\n                      id=\\\"Shape\\\"\\n                      fill=\\\"#F1F1F1\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-7)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-9\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-8\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <g id=\\\"Group\\\" mask=\\\"url(#mask-9)\\\">\\n                      <g transform=\\\"translate(26.437500, -2.954545)\\\">\\n                        <path\\n                          d=\\\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\\\"\\n                          id=\\\"Path\\\"\\n                          fill=\\\"#A1C2FA\\\"\\n                          fillRule=\\\"nonzero\\\"\\n                        />\\n                      </g>\\n                    </g>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-11\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-10\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#FFFFFF\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-11)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-13\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-12\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-13)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-15\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-14\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.1\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-15)\\\"\\n                    />\\n                  </g>\\n                </g>\\n                <path\\n                  d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n                  id=\\\"Path\\\"\\n                  fill=\\\"url(#radialGradient-16)\\\"\\n                  fillRule=\\\"nonzero\\\"\\n                />\\n              </g>\\n            </g>\\n          </g>\\n        </g>\\n      </g>\\n    </svg>\\n  ),\\n  zapier: () => (\\n    <svg\\n      width=\\\"105\\\"\\n      height=\\\"28\\\"\\n      viewBox=\\\"0 0 244 66\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path d=\\\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\\\" fill=\\\"#FF4F00\\\" />\\n    </svg>\\n  ),\\n  messenger: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 48 48\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <radialGradient\\n        id=\\\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\\\"\\n        cx=\\\"11.087\\\"\\n        cy=\\\"7.022\\\"\\n        r=\\\"47.612\\\"\\n        gradientTransform=\\\"matrix(1 0 0 -1 0 50)\\\"\\n        gradientUnits=\\\"userSpaceOnUse\\\"\\n      >\\n        <stop offset=\\\"0\\\" stopColor=\\\"#1292ff\\\"></stop>\\n        <stop offset=\\\".079\\\" stopColor=\\\"#2982ff\\\"></stop>\\n        <stop offset=\\\".23\\\" stopColor=\\\"#4e69ff\\\"></stop>\\n        <stop offset=\\\".351\\\" stopColor=\\\"#6559ff\\\"></stop>\\n        <stop offset=\\\".428\\\" stopColor=\\\"#6d53ff\\\"></stop>\\n        <stop offset=\\\".754\\\" stopColor=\\\"#df47aa\\\"></stop>\\n        <stop offset=\\\".946\\\" stopColor=\\\"#ff6257\\\"></stop>\\n      </radialGradient>\\n      <path\\n        fill=\\\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\\\"\\n        d=\\\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\\\"\\n        opacity=\\\".05\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\\\"\\n        opacity=\\\".07\\\"\\n      />\\n      <path\\n        fill=\\\"#ffffff\\\"\\n        d=\\\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\\\"\\n      />\\n    </svg>\\n  ),\\n  user: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"#000000\\\"\\n      strokeWidth=\\\"2\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\\\" />\\n      <circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\" />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam-multiple-outputs.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam-multiple-outputs\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Beam Multiple Outputs\",\n  \"description\": \"Example showing animated beams with multiple output points.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-beam-multiple-outputs.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { forwardRef, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedBeam } from \\\"@/registry/magicui/animated-beam\\\"\\n\\nconst Circle = forwardRef<\\n  HTMLDivElement,\\n  { className?: string; children?: React.ReactNode }\\n>(({ className, children }, ref) => {\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\\\",\\n        className\\n      )}\\n    >\\n      {children}\\n    </div>\\n  )\\n})\\n\\nCircle.displayName = \\\"Circle\\\"\\n\\nexport default function AnimatedBeamMultipleOutputDemo({\\n  className,\\n}: {\\n  className?: string\\n}) {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const div1Ref = useRef<HTMLDivElement>(null)\\n  const div2Ref = useRef<HTMLDivElement>(null)\\n  const div3Ref = useRef<HTMLDivElement>(null)\\n  const div4Ref = useRef<HTMLDivElement>(null)\\n  const div5Ref = useRef<HTMLDivElement>(null)\\n  const div6Ref = useRef<HTMLDivElement>(null)\\n  const div7Ref = useRef<HTMLDivElement>(null)\\n\\n  return (\\n    <div\\n      className={cn(\\n        \\\"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\\\",\\n        className\\n      )}\\n      ref={containerRef}\\n    >\\n      <div className=\\\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\\\">\\n        <div className=\\\"flex flex-col justify-center\\\">\\n          <Circle ref={div7Ref}>\\n            <Icons.user />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-col justify-center\\\">\\n          <Circle ref={div6Ref} className=\\\"size-16\\\">\\n            <Icons.openai />\\n          </Circle>\\n        </div>\\n        <div className=\\\"flex flex-col justify-center gap-2\\\">\\n          <Circle ref={div1Ref}>\\n            <Icons.googleDrive />\\n          </Circle>\\n          <Circle ref={div2Ref}>\\n            <Icons.googleDocs />\\n          </Circle>\\n          <Circle ref={div3Ref}>\\n            <Icons.whatsapp />\\n          </Circle>\\n          <Circle ref={div4Ref}>\\n            <Icons.messenger />\\n          </Circle>\\n          <Circle ref={div5Ref}>\\n            <Icons.notion />\\n          </Circle>\\n        </div>\\n      </div>\\n\\n      {/* AnimatedBeams */}\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div6Ref}\\n        duration={3}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div2Ref}\\n        toRef={div6Ref}\\n        duration={3}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div3Ref}\\n        toRef={div6Ref}\\n        duration={3}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div4Ref}\\n        toRef={div6Ref}\\n        duration={3}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div5Ref}\\n        toRef={div6Ref}\\n        duration={3}\\n      />\\n      <AnimatedBeam\\n        containerRef={containerRef}\\n        fromRef={div6Ref}\\n        toRef={div7Ref}\\n        duration={3}\\n      />\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  notion: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000000\\\"\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  openai: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  googleDrive: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 87.3 78\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        fill=\\\"#b3b3b3\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n        fill=\\\"url(#linearGradient1780)\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n        fill=\\\"url(#b)\\\"\\n      />\\n      <path\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n        fill=\\\"#ffffff\\\"\\n        fillRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  googleDocs: () => (\\n    <svg\\n      width=\\\"47px\\\"\\n      height=\\\"65px\\\"\\n      viewBox=\\\"0 0 47 65\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-1\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-3\\\"\\n        />\\n        <linearGradient\\n          x1=\\\"50.0053945%\\\"\\n          y1=\\\"8.58610612%\\\"\\n          x2=\\\"50.0053945%\\\"\\n          y2=\\\"100.013939%\\\"\\n          id=\\\"linearGradient-5\\\"\\n        >\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.2\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#1A237E\\\" stopOpacity=\\\"0.02\\\" offset=\\\"100%\\\" />\\n        </linearGradient>\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-6\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-8\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-10\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-12\\\"\\n        />\\n        <path\\n          d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n          id=\\\"path-14\\\"\\n        />\\n        <radialGradient\\n          cx=\\\"3.16804688%\\\"\\n          cy=\\\"2.71744318%\\\"\\n          fx=\\\"3.16804688%\\\"\\n          fy=\\\"2.71744318%\\\"\\n          r=\\\"161.248516%\\\"\\n          gradientTransform=\\\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\\\"\\n          id=\\\"radialGradient-16\\\"\\n        >\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0.1\\\" offset=\\\"0%\\\" />\\n          <stop stopColor=\\\"#FFFFFF\\\" stopOpacity=\\\"0\\\" offset=\\\"100%\\\" />\\n        </radialGradient>\\n      </defs>\\n      <g\\n        id=\\\"Page-1\\\"\\n        stroke=\\\"none\\\"\\n        strokeWidth=\\\"1\\\"\\n        fill=\\\"none\\\"\\n        fillRule=\\\"evenodd\\\"\\n      >\\n        <g transform=\\\"translate(-451.000000, -463.000000)\\\">\\n          <g id=\\\"Hero\\\" transform=\\\"translate(0.000000, 63.000000)\\\">\\n            <g id=\\\"Personal\\\" transform=\\\"translate(277.000000, 309.000000)\\\">\\n              <g id=\\\"Docs-icon\\\" transform=\\\"translate(174.000000, 91.000000)\\\">\\n                <g id=\\\"Group\\\">\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-2\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-1\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fill=\\\"#4285F4\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-2)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-4\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-3\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <polygon\\n                      id=\\\"Path\\\"\\n                      fill=\\\"url(#linearGradient-5)\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-4)\\\"\\n                      points=\\\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\\\"\\n                    ></polygon>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-7\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-6\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\\\"\\n                      id=\\\"Shape\\\"\\n                      fill=\\\"#F1F1F1\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-7)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-9\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-8\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <g id=\\\"Group\\\" mask=\\\"url(#mask-9)\\\">\\n                      <g transform=\\\"translate(26.437500, -2.954545)\\\">\\n                        <path\\n                          d=\\\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\\\"\\n                          id=\\\"Path\\\"\\n                          fill=\\\"#A1C2FA\\\"\\n                          fillRule=\\\"nonzero\\\"\\n                        />\\n                      </g>\\n                    </g>\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-11\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-10\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#FFFFFF\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-11)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-13\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-12\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.2\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-13)\\\"\\n                    />\\n                  </g>\\n                  <g id=\\\"Clipped\\\">\\n                    <mask id=\\\"mask-15\\\" fill=\\\"white\\\">\\n                      <use xlinkHref=\\\"#path-14\\\" />\\n                    </mask>\\n                    <g id=\\\"SVGID_1_\\\" />\\n                    <path\\n                      d=\\\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\\\"\\n                      id=\\\"Path\\\"\\n                      fillOpacity=\\\"0.1\\\"\\n                      fill=\\\"#1A237E\\\"\\n                      fillRule=\\\"nonzero\\\"\\n                      mask=\\\"url(#mask-15)\\\"\\n                    />\\n                  </g>\\n                </g>\\n                <path\\n                  d=\\\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\\\"\\n                  id=\\\"Path\\\"\\n                  fill=\\\"url(#radialGradient-16)\\\"\\n                  fillRule=\\\"nonzero\\\"\\n                />\\n              </g>\\n            </g>\\n          </g>\\n        </g>\\n      </g>\\n    </svg>\\n  ),\\n  zapier: () => (\\n    <svg\\n      width=\\\"105\\\"\\n      height=\\\"28\\\"\\n      viewBox=\\\"0 0 244 66\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path\\n        d=\\\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\\\"\\n        fill=\\\"#201515\\\"\\n      />\\n      <path d=\\\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\\\" fill=\\\"#FF4F00\\\" />\\n    </svg>\\n  ),\\n  messenger: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 48 48\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <radialGradient\\n        id=\\\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\\\"\\n        cx=\\\"11.087\\\"\\n        cy=\\\"7.022\\\"\\n        r=\\\"47.612\\\"\\n        gradientTransform=\\\"matrix(1 0 0 -1 0 50)\\\"\\n        gradientUnits=\\\"userSpaceOnUse\\\"\\n      >\\n        <stop offset=\\\"0\\\" stopColor=\\\"#1292ff\\\"></stop>\\n        <stop offset=\\\".079\\\" stopColor=\\\"#2982ff\\\"></stop>\\n        <stop offset=\\\".23\\\" stopColor=\\\"#4e69ff\\\"></stop>\\n        <stop offset=\\\".351\\\" stopColor=\\\"#6559ff\\\"></stop>\\n        <stop offset=\\\".428\\\" stopColor=\\\"#6d53ff\\\"></stop>\\n        <stop offset=\\\".754\\\" stopColor=\\\"#df47aa\\\"></stop>\\n        <stop offset=\\\".946\\\" stopColor=\\\"#ff6257\\\"></stop>\\n      </radialGradient>\\n      <path\\n        fill=\\\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\\\"\\n        d=\\\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\\\"\\n        opacity=\\\".05\\\"\\n      />\\n      <path\\n        d=\\\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\\\"\\n        opacity=\\\".07\\\"\\n      />\\n      <path\\n        fill=\\\"#ffffff\\\"\\n        d=\\\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\\\"\\n      />\\n    </svg>\\n  ),\\n  user: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"#000000\\\"\\n      strokeWidth=\\\"2\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\\\" />\\n      <circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\" />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam-unidirectional.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam-unidirectional\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Beam Unidirectional\",\n  \"description\": \"Example showing a unidirectional animated beam effect.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-beam-unidirectional.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { forwardRef, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedBeam } from \\\"@/registry/magicui/animated-beam\\\"\\n\\nconst Circle = forwardRef<\\n  HTMLDivElement,\\n  { className?: string; children?: React.ReactNode }\\n>(({ className, children }, ref) => {\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\\\",\\n        className\\n      )}\\n    >\\n      {children}\\n    </div>\\n  )\\n})\\n\\nCircle.displayName = \\\"Circle\\\"\\n\\nexport default function AnimatedBeamDemo() {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const div1Ref = useRef<HTMLDivElement>(null)\\n  const div2Ref = useRef<HTMLDivElement>(null)\\n\\n  return (\\n    <div\\n      className=\\\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\\\"\\n      ref={containerRef}\\n    >\\n      <div className=\\\"flex size-full flex-col items-stretch justify-between gap-10\\\">\\n        <div className=\\\"flex flex-row justify-between\\\">\\n          <Circle ref={div1Ref}>\\n            <Icons.user />\\n          </Circle>\\n          <Circle ref={div2Ref}>\\n            <Icons.openai />\\n          </Circle>\\n        </div>\\n      </div>\\n\\n      <AnimatedBeam\\n        duration={3}\\n        containerRef={containerRef}\\n        fromRef={div1Ref}\\n        toRef={div2Ref}\\n      />\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  openai: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  user: () => (\\n    <svg\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"#000000\\\"\\n      strokeWidth=\\\"2\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path d=\\\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\\\" />\\n      <circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\" />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-beam.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-beam\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated Beam\",\n  \"description\": \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-beam.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useId, useState, type RefObject } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface AnimatedBeamProps {\\n  className?: string\\n  containerRef: RefObject<HTMLElement | null> // Container ref\\n  fromRef: RefObject<HTMLElement | null>\\n  toRef: RefObject<HTMLElement | null>\\n  curvature?: number\\n  reverse?: boolean\\n  pathColor?: string\\n  pathWidth?: number\\n  pathOpacity?: number\\n  gradientStartColor?: string\\n  gradientStopColor?: string\\n  delay?: number\\n  duration?: number\\n  repeat?: number\\n  repeatDelay?: number\\n  startXOffset?: number\\n  startYOffset?: number\\n  endXOffset?: number\\n  endYOffset?: number\\n}\\n\\nexport const AnimatedBeam: React.FC<AnimatedBeamProps> = ({\\n  className,\\n  containerRef,\\n  fromRef,\\n  toRef,\\n  curvature = 0,\\n  reverse = false, // Include the reverse prop\\n  duration = 5,\\n  delay = 0,\\n  pathColor = \\\"gray\\\",\\n  pathWidth = 2,\\n  pathOpacity = 0.2,\\n  gradientStartColor = \\\"#ffaa40\\\",\\n  gradientStopColor = \\\"#9c40ff\\\",\\n  repeat = Infinity,\\n  repeatDelay = 0,\\n  startXOffset = 0,\\n  startYOffset = 0,\\n  endXOffset = 0,\\n  endYOffset = 0,\\n}) => {\\n  const id = useId()\\n  const [pathD, setPathD] = useState(\\\"\\\")\\n  const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 })\\n\\n  // Calculate the gradient coordinates based on the reverse prop\\n  const gradientCoordinates = reverse\\n    ? {\\n        x1: [\\\"90%\\\", \\\"-10%\\\"],\\n        x2: [\\\"100%\\\", \\\"0%\\\"],\\n        y1: [\\\"0%\\\", \\\"0%\\\"],\\n        y2: [\\\"0%\\\", \\\"0%\\\"],\\n      }\\n    : {\\n        x1: [\\\"10%\\\", \\\"110%\\\"],\\n        x2: [\\\"0%\\\", \\\"100%\\\"],\\n        y1: [\\\"0%\\\", \\\"0%\\\"],\\n        y2: [\\\"0%\\\", \\\"0%\\\"],\\n      }\\n\\n  useEffect(() => {\\n    const updatePath = () => {\\n      if (containerRef.current && fromRef.current && toRef.current) {\\n        const containerRect = containerRef.current.getBoundingClientRect()\\n        const rectA = fromRef.current.getBoundingClientRect()\\n        const rectB = toRef.current.getBoundingClientRect()\\n\\n        const svgWidth = containerRect.width\\n        const svgHeight = containerRect.height\\n        setSvgDimensions({ width: svgWidth, height: svgHeight })\\n\\n        const startX =\\n          rectA.left - containerRect.left + rectA.width / 2 + startXOffset\\n        const startY =\\n          rectA.top - containerRect.top + rectA.height / 2 + startYOffset\\n        const endX =\\n          rectB.left - containerRect.left + rectB.width / 2 + endXOffset\\n        const endY =\\n          rectB.top - containerRect.top + rectB.height / 2 + endYOffset\\n\\n        const controlY = startY - curvature\\n        const d = `M ${startX},${startY} Q ${\\n          (startX + endX) / 2\\n        },${controlY} ${endX},${endY}`\\n        setPathD(d)\\n      }\\n    }\\n\\n    // Initialize ResizeObserver\\n    const resizeObserver = new ResizeObserver(() => {\\n      updatePath()\\n    })\\n\\n    // Observe the container element\\n    if (containerRef.current) {\\n      resizeObserver.observe(containerRef.current)\\n    }\\n\\n    // Call the updatePath initially to set the initial path\\n    updatePath()\\n\\n    // Clean up the observer on component unmount\\n    return () => {\\n      resizeObserver.disconnect()\\n    }\\n  }, [\\n    containerRef,\\n    fromRef,\\n    toRef,\\n    curvature,\\n    startXOffset,\\n    startYOffset,\\n    endXOffset,\\n    endYOffset,\\n  ])\\n\\n  return (\\n    <svg\\n      fill=\\\"none\\\"\\n      width={svgDimensions.width}\\n      height={svgDimensions.height}\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      className={cn(\\n        \\\"pointer-events-none absolute top-0 left-0 transform-gpu stroke-2\\\",\\n        className\\n      )}\\n      viewBox={`0 0 ${svgDimensions.width} ${svgDimensions.height}`}\\n    >\\n      <path\\n        d={pathD}\\n        stroke={pathColor}\\n        strokeWidth={pathWidth}\\n        strokeOpacity={pathOpacity}\\n        strokeLinecap=\\\"round\\\"\\n      />\\n      <path\\n        d={pathD}\\n        strokeWidth={pathWidth}\\n        stroke={`url(#${id})`}\\n        strokeOpacity=\\\"1\\\"\\n        strokeLinecap=\\\"round\\\"\\n      />\\n      <defs>\\n        <motion.linearGradient\\n          className=\\\"transform-gpu\\\"\\n          id={id}\\n          gradientUnits={\\\"userSpaceOnUse\\\"}\\n          initial={{\\n            x1: \\\"0%\\\",\\n            x2: \\\"0%\\\",\\n            y1: \\\"0%\\\",\\n            y2: \\\"0%\\\",\\n          }}\\n          animate={{\\n            x1: gradientCoordinates.x1,\\n            x2: gradientCoordinates.x2,\\n            y1: gradientCoordinates.y1,\\n            y2: gradientCoordinates.y2,\\n          }}\\n          transition={{\\n            delay,\\n            duration,\\n            ease: [0.16, 1, 0.3, 1], // https://easings.net/#easeOutExpo\\n            repeat,\\n            repeatDelay,\\n          }}\\n        >\\n          <stop stopColor={gradientStartColor} stopOpacity=\\\"0\\\"></stop>\\n          <stop stopColor={gradientStartColor}></stop>\\n          <stop offset=\\\"32.5%\\\" stopColor={gradientStopColor}></stop>\\n          <stop\\n            offset=\\\"100%\\\"\\n            stopColor={gradientStopColor}\\n            stopOpacity=\\\"0\\\"\\n          ></stop>\\n        </motion.linearGradient>\\n      </defs>\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-circular-progress-bar-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-circular-progress-bar-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Circular Progress Bar Demo\",\n  \"description\": \"Example showing an animated circular progress gauge.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-circular-progress-bar\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-circular-progress-bar-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useState } from \\\"react\\\"\\n\\nimport { AnimatedCircularProgressBar } from \\\"@/registry/magicui/animated-circular-progress-bar\\\"\\n\\nexport default function AnimatedCircularProgressBarDemo() {\\n  const [value, setValue] = useState(0)\\n\\n  useEffect(() => {\\n    const handleIncrement = (prev: number) => {\\n      if (prev === 100) {\\n        return 0\\n      }\\n      return prev + 10\\n    }\\n    setValue(handleIncrement)\\n    const interval = setInterval(() => setValue(handleIncrement), 2000)\\n    return () => clearInterval(interval)\\n  }, [])\\n\\n  return (\\n    <AnimatedCircularProgressBar\\n      value={value}\\n      gaugePrimaryColor=\\\"rgb(79 70 229)\\\"\\n      gaugeSecondaryColor=\\\"rgba(0, 0, 0, 0.1)\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-circular-progress-bar.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-circular-progress-bar\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated Circular Progress Bar\",\n  \"description\": \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-circular-progress-bar.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\n\\ninterface AnimatedCircularProgressBarProps {\\n  max?: number\\n  min?: number\\n  value: number\\n  gaugePrimaryColor: string\\n  gaugeSecondaryColor: string\\n  className?: string\\n}\\n\\nexport function AnimatedCircularProgressBar({\\n  max = 100,\\n  min = 0,\\n  value = 0,\\n  gaugePrimaryColor,\\n  gaugeSecondaryColor,\\n  className,\\n}: AnimatedCircularProgressBarProps) {\\n  const circumference = 2 * Math.PI * 45\\n  const percentPx = circumference / 100\\n  const currentPercent = Math.round(((value - min) / (max - min)) * 100)\\n\\n  return (\\n    <div\\n      className={cn(\\\"relative size-40 text-2xl font-semibold\\\", className)}\\n      style={\\n        {\\n          \\\"--circle-size\\\": \\\"100px\\\",\\n          \\\"--circumference\\\": circumference,\\n          \\\"--percent-to-px\\\": `${percentPx}px`,\\n          \\\"--gap-percent\\\": \\\"5\\\",\\n          \\\"--offset-factor\\\": \\\"0\\\",\\n          \\\"--transition-length\\\": \\\"1s\\\",\\n          \\\"--transition-step\\\": \\\"200ms\\\",\\n          \\\"--delay\\\": \\\"0s\\\",\\n          \\\"--percent-to-deg\\\": \\\"3.6deg\\\",\\n          transform: \\\"translateZ(0)\\\",\\n        } as React.CSSProperties\\n      }\\n    >\\n      <svg\\n        fill=\\\"none\\\"\\n        className=\\\"size-full\\\"\\n        strokeWidth=\\\"2\\\"\\n        viewBox=\\\"0 0 100 100\\\"\\n      >\\n        {currentPercent <= 90 && currentPercent >= 0 && (\\n          <circle\\n            cx=\\\"50\\\"\\n            cy=\\\"50\\\"\\n            r=\\\"45\\\"\\n            strokeWidth=\\\"10\\\"\\n            strokeDashoffset=\\\"0\\\"\\n            strokeLinecap=\\\"round\\\"\\n            strokeLinejoin=\\\"round\\\"\\n            className=\\\"opacity-100\\\"\\n            style={\\n              {\\n                stroke: gaugeSecondaryColor,\\n                \\\"--stroke-percent\\\": 90 - currentPercent,\\n                \\\"--offset-factor-secondary\\\": \\\"calc(1 - var(--offset-factor))\\\",\\n                strokeDasharray:\\n                  \\\"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\\\",\\n                transform:\\n                  \\\"rotate(calc(1turn - 90deg - (var(--gap-percent) * var(--percent-to-deg) * var(--offset-factor-secondary)))) scaleY(-1)\\\",\\n                transition: \\\"all var(--transition-length) ease var(--delay)\\\",\\n                transformOrigin:\\n                  \\\"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\\\",\\n              } as React.CSSProperties\\n            }\\n          />\\n        )}\\n        <circle\\n          cx=\\\"50\\\"\\n          cy=\\\"50\\\"\\n          r=\\\"45\\\"\\n          strokeWidth=\\\"10\\\"\\n          strokeDashoffset=\\\"0\\\"\\n          strokeLinecap=\\\"round\\\"\\n          strokeLinejoin=\\\"round\\\"\\n          className=\\\"opacity-100\\\"\\n          style={\\n            {\\n              stroke: gaugePrimaryColor,\\n              \\\"--stroke-percent\\\": currentPercent,\\n              strokeDasharray:\\n                \\\"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\\\",\\n              transition:\\n                \\\"var(--transition-length) ease var(--delay),stroke var(--transition-length) ease var(--delay)\\\",\\n              transitionProperty: \\\"stroke-dasharray,transform\\\",\\n              transform:\\n                \\\"rotate(calc(-90deg + var(--gap-percent) * var(--offset-factor) * var(--percent-to-deg)))\\\",\\n              transformOrigin:\\n                \\\"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\\\",\\n            } as React.CSSProperties\\n          }\\n        />\\n      </svg>\\n      <span\\n        data-current-value={currentPercent}\\n        className=\\\"animate-in fade-in absolute inset-0 m-auto size-fit delay-(--delay) duration-(--transition-length) ease-linear\\\"\\n      >\\n        {currentPercent}\\n      </span>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-gradient-text-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-gradient-text-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Gradient Text Demo 2\",\n  \"description\": \"Second example showing text with animated gradient backgrounds.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-gradient-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-gradient-text-demo-2.tsx\",\n      \"content\": \"import { AnimatedGradientText } from \\\"@/registry/magicui/animated-gradient-text\\\"\\n\\nexport default function AnimatedGradientTextDemo() {\\n  return (\\n    <AnimatedGradientText\\n      speed={2}\\n      colorFrom=\\\"#4ade80\\\"\\n      colorTo=\\\"#06b6d4\\\"\\n      className=\\\"text-4xl font-semibold tracking-tight\\\"\\n    >\\n      Fast Gradient\\n    </AnimatedGradientText>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-gradient-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-gradient-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Gradient Text Demo\",\n  \"description\": \"Example showing text with animated gradient backgrounds.\",\n  \"dependencies\": [\n    \"lucide-react\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/animated-gradient-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-gradient-text-demo.tsx\",\n      \"content\": \"import { ChevronRight } from \\\"lucide-react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedGradientText } from \\\"@/registry/magicui/animated-gradient-text\\\"\\n\\nexport default function AnimatedGradientTextDemo() {\\n  return (\\n    <div className=\\\"group relative mx-auto flex items-center justify-center rounded-full px-4 py-1.5 shadow-[inset_0_-8px_10px_#8fdfff1f] transition-shadow duration-500 ease-out hover:shadow-[inset_0_-5px_10px_#8fdfff3f]\\\">\\n      <span\\n        className={cn(\\n          \\\"animate-gradient absolute inset-0 block h-full w-full rounded-[inherit] bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:300%_100%] p-[1px]\\\"\\n        )}\\n        style={{\\n          WebkitMask:\\n            \\\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\\\",\\n          WebkitMaskComposite: \\\"destination-out\\\",\\n          mask: \\\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\\\",\\n          maskComposite: \\\"subtract\\\",\\n          WebkitClipPath: \\\"padding-box\\\",\\n        }}\\n      />\\n      🎉 <hr className=\\\"mx-2 h-4 w-px shrink-0 bg-neutral-500\\\" />\\n      <AnimatedGradientText className=\\\"text-sm font-medium\\\">\\n        Introducing Magic UI\\n      </AnimatedGradientText>\\n      <ChevronRight className=\\\"ml-1 size-4 stroke-neutral-500 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-gradient-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-gradient-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated Gradient Text\",\n  \"description\": \"An animated gradient background which transitions between colors for text.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-gradient-text.tsx\",\n      \"content\": \"import { type ComponentPropsWithoutRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface AnimatedGradientTextProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  speed?: number\\n  colorFrom?: string\\n  colorTo?: string\\n}\\n\\nexport function AnimatedGradientText({\\n  children,\\n  className,\\n  speed = 1,\\n  colorFrom = \\\"#ffaa40\\\",\\n  colorTo = \\\"#9c40ff\\\",\\n  ...props\\n}: AnimatedGradientTextProps) {\\n  return (\\n    <span\\n      style={\\n        {\\n          \\\"--bg-size\\\": `${speed * 300}%`,\\n          \\\"--color-from\\\": colorFrom,\\n          \\\"--color-to\\\": colorTo,\\n        } as React.CSSProperties\\n      }\\n      className={cn(\\n        `animate-gradient inline bg-linear-to-r from-(--color-from) via-(--color-to) to-(--color-from) bg-size-[var(--bg-size)_100%] bg-clip-text text-transparent`,\\n        className\\n      )}\\n      {...props}\\n    >\\n      {children}\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-gradient\": \"gradient 8s linear infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes gradient\": {\n      \"to\": {\n        \"background-position\": \"var(--bg-size, 300%) 0\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/animated-grid-pattern-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-grid-pattern-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Grid Pattern Demo\",\n  \"description\": \"Example showing an animated grid pattern background.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-grid-pattern-demo.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedGridPattern } from \\\"@/registry/magicui/animated-grid-pattern\\\"\\n\\nexport default function AnimatedGridPatternDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full items-center justify-center overflow-hidden rounded-lg border p-20\\\">\\n      <AnimatedGridPattern\\n        numSquares={30}\\n        maxOpacity={0.1}\\n        duration={3}\\n        repeatDelay={1}\\n        className={cn(\\n          \\\"mask-[radial-gradient(500px_circle_at_center,white,transparent)]\\\",\\n          \\\"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-grid-pattern.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-grid-pattern\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated Grid Pattern\",\n  \"description\": \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-grid-pattern.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  useCallback,\\n  useEffect,\\n  useId,\\n  useRef,\\n  useState,\\n  type ComponentPropsWithoutRef,\\n} from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface AnimatedGridPatternProps extends ComponentPropsWithoutRef<\\\"svg\\\"> {\\n  width?: number\\n  height?: number\\n  x?: number\\n  y?: number\\n  strokeDasharray?: number\\n  numSquares?: number\\n  maxOpacity?: number\\n  duration?: number\\n  repeatDelay?: number\\n}\\n\\ntype Square = {\\n  id: number\\n  pos: [number, number]\\n  iteration: number\\n}\\n\\nexport function AnimatedGridPattern({\\n  width = 40,\\n  height = 40,\\n  x = -1,\\n  y = -1,\\n  strokeDasharray = 0,\\n  numSquares = 50,\\n  className,\\n  maxOpacity = 0.5,\\n  duration = 4,\\n  repeatDelay = 0.5,\\n  ...props\\n}: AnimatedGridPatternProps) {\\n  const id = useId()\\n  const containerRef = useRef<SVGSVGElement | null>(null)\\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\\n  const [squares, setSquares] = useState<Array<Square>>([])\\n\\n  const getPos = useCallback((): [number, number] => {\\n    return [\\n      Math.floor((Math.random() * dimensions.width) / width),\\n      Math.floor((Math.random() * dimensions.height) / height),\\n    ]\\n  }, [dimensions.height, dimensions.width, height, width])\\n\\n  const generateSquares = useCallback(\\n    (count: number) => {\\n      return Array.from({ length: count }, (_, i) => ({\\n        id: i,\\n        pos: getPos(),\\n        iteration: 0,\\n      }))\\n    },\\n    [getPos]\\n  )\\n\\n  const updateSquarePosition = useCallback(\\n    (squareId: number) => {\\n      setSquares((currentSquares) => {\\n        const current = currentSquares[squareId]\\n        if (!current || current.id !== squareId) return currentSquares\\n\\n        const nextSquares = currentSquares.slice()\\n        nextSquares[squareId] = {\\n          ...current,\\n          pos: getPos(),\\n          iteration: current.iteration + 1,\\n        }\\n\\n        return nextSquares\\n      })\\n    },\\n    [getPos]\\n  )\\n\\n  useEffect(() => {\\n    if (dimensions.width && dimensions.height) {\\n      setSquares(generateSquares(numSquares))\\n    }\\n  }, [dimensions.width, dimensions.height, generateSquares, numSquares])\\n\\n  useEffect(() => {\\n    const element = containerRef.current\\n    let resizeObserver: ResizeObserver | null = null\\n\\n    if (element) {\\n      resizeObserver = new ResizeObserver((entries) => {\\n        for (const entry of entries) {\\n          setDimensions((currentDimensions) => {\\n            const nextWidth = entry.contentRect.width\\n            const nextHeight = entry.contentRect.height\\n            if (\\n              currentDimensions.width === nextWidth &&\\n              currentDimensions.height === nextHeight\\n            ) {\\n              return currentDimensions\\n            }\\n            return { width: nextWidth, height: nextHeight }\\n          })\\n        }\\n      })\\n\\n      resizeObserver.observe(element)\\n    }\\n\\n    return () => {\\n      if (resizeObserver) {\\n        resizeObserver.disconnect()\\n      }\\n    }\\n  }, [])\\n\\n  return (\\n    <svg\\n      ref={containerRef}\\n      aria-hidden=\\\"true\\\"\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <defs>\\n        <pattern\\n          id={id}\\n          width={width}\\n          height={height}\\n          patternUnits=\\\"userSpaceOnUse\\\"\\n          x={x}\\n          y={y}\\n        >\\n          <path\\n            d={`M.5 ${height}V.5H${width}`}\\n            fill=\\\"none\\\"\\n            strokeDasharray={strokeDasharray}\\n          />\\n        </pattern>\\n      </defs>\\n      <rect width=\\\"100%\\\" height=\\\"100%\\\" fill={`url(#${id})`} />\\n      <svg x={x} y={y} className=\\\"overflow-visible\\\">\\n        {squares.map(({ pos: [squareX, squareY], id, iteration }, index) => (\\n          <motion.rect\\n            initial={{ opacity: 0 }}\\n            animate={{ opacity: maxOpacity }}\\n            transition={{\\n              duration,\\n              repeat: 1,\\n              delay: index * 0.1,\\n              repeatType: \\\"reverse\\\",\\n              repeatDelay,\\n            }}\\n            onAnimationComplete={() => updateSquarePosition(id)}\\n            key={`${id}-${iteration}`}\\n            width={width - 1}\\n            height={height - 1}\\n            x={squareX * width + 1}\\n            y={squareY * height + 1}\\n            fill=\\\"currentColor\\\"\\n            strokeWidth=\\\"0\\\"\\n          />\\n        ))}\\n      </svg>\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-list-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-list-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated List Demo\",\n  \"description\": \"Example showing a list with sequenced item animations.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-list\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-list-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedList } from \\\"@/registry/magicui/animated-list\\\"\\n\\ninterface Item {\\n  name: string\\n  description: string\\n  icon: string\\n  color: string\\n  time: string\\n}\\n\\nlet notifications = [\\n  {\\n    name: \\\"Payment received\\\",\\n    description: \\\"Magic UI\\\",\\n    time: \\\"15m ago\\\",\\n\\n    icon: \\\"💸\\\",\\n    color: \\\"#00C9A7\\\",\\n  },\\n  {\\n    name: \\\"User signed up\\\",\\n    description: \\\"Magic UI\\\",\\n    time: \\\"10m ago\\\",\\n    icon: \\\"👤\\\",\\n    color: \\\"#FFB800\\\",\\n  },\\n  {\\n    name: \\\"New message\\\",\\n    description: \\\"Magic UI\\\",\\n    time: \\\"5m ago\\\",\\n    icon: \\\"💬\\\",\\n    color: \\\"#FF3D71\\\",\\n  },\\n  {\\n    name: \\\"New event\\\",\\n    description: \\\"Magic UI\\\",\\n    time: \\\"2m ago\\\",\\n    icon: \\\"🗞️\\\",\\n    color: \\\"#1E86FF\\\",\\n  },\\n]\\n\\nnotifications = Array.from({ length: 10 }, () => notifications).flat()\\n\\nconst Notification = ({ name, description, icon, color, time }: Item) => {\\n  return (\\n    <figure\\n      className={cn(\\n        \\\"relative mx-auto min-h-fit w-full max-w-[400px] cursor-pointer overflow-hidden rounded-2xl p-4\\\",\\n        // animation styles\\n        \\\"transition-all duration-200 ease-in-out hover:scale-[103%]\\\",\\n        // light styles\\n        \\\"bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\\\",\\n        // dark styles\\n        \\\"transform-gpu dark:bg-transparent dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:backdrop-blur-md dark:[border:1px_solid_rgba(255,255,255,.1)]\\\"\\n      )}\\n    >\\n      <div className=\\\"flex flex-row items-center gap-3\\\">\\n        <div\\n          className=\\\"flex size-10 items-center justify-center rounded-2xl\\\"\\n          style={{\\n            backgroundColor: color,\\n          }}\\n        >\\n          <span className=\\\"text-lg\\\">{icon}</span>\\n        </div>\\n        <div className=\\\"flex flex-col overflow-hidden\\\">\\n          <figcaption className=\\\"flex flex-row items-center text-lg font-medium whitespace-pre dark:text-white\\\">\\n            <span className=\\\"text-sm sm:text-lg\\\">{name}</span>\\n            <span className=\\\"mx-1\\\">·</span>\\n            <span className=\\\"text-xs text-gray-500\\\">{time}</span>\\n          </figcaption>\\n          <p className=\\\"text-sm font-normal dark:text-white/60\\\">\\n            {description}\\n          </p>\\n        </div>\\n      </div>\\n    </figure>\\n  )\\n}\\n\\nexport default function AnimatedListDemo({\\n  className,\\n}: {\\n  className?: string\\n}) {\\n  return (\\n    <div\\n      className={cn(\\n        \\\"relative flex h-[500px] w-full flex-col overflow-hidden p-2\\\",\\n        className\\n      )}\\n    >\\n      <AnimatedList>\\n        {notifications.map((item, idx) => (\\n          <Notification {...item} key={idx} />\\n        ))}\\n      </AnimatedList>\\n\\n      <div className=\\\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-list.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-list\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated List\",\n  \"description\": \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-list.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, {\\n  useEffect,\\n  useMemo,\\n  useState,\\n  type ComponentPropsWithoutRef,\\n} from \\\"react\\\"\\nimport { AnimatePresence, motion, type MotionProps } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport function AnimatedListItem({ children }: { children: React.ReactNode }) {\\n  const animations: MotionProps = {\\n    initial: { scale: 0, opacity: 0 },\\n    animate: { scale: 1, opacity: 1, originY: 0 },\\n    exit: { scale: 0, opacity: 0 },\\n    transition: { type: \\\"spring\\\", stiffness: 350, damping: 40 },\\n  }\\n\\n  return (\\n    <motion.div {...animations} layout className=\\\"mx-auto w-full\\\">\\n      {children}\\n    </motion.div>\\n  )\\n}\\n\\nexport interface AnimatedListProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  children: React.ReactNode\\n  delay?: number\\n}\\n\\nexport const AnimatedList = React.memo(\\n  ({ children, className, delay = 1000, ...props }: AnimatedListProps) => {\\n    const [index, setIndex] = useState(0)\\n    const childrenArray = useMemo(\\n      () => React.Children.toArray(children),\\n      [children]\\n    )\\n\\n    useEffect(() => {\\n      let timeout: ReturnType<typeof setTimeout> | null = null\\n\\n      if (index < childrenArray.length - 1) {\\n        timeout = setTimeout(() => {\\n          setIndex((prevIndex) => (prevIndex + 1) % childrenArray.length)\\n        }, delay)\\n      }\\n\\n      return () => {\\n        if (timeout !== null) {\\n          clearTimeout(timeout)\\n        }\\n      }\\n    }, [index, delay, childrenArray.length])\\n\\n    const itemsToShow = useMemo(() => {\\n      const result = childrenArray.slice(0, index + 1).reverse()\\n      return result\\n    }, [index, childrenArray])\\n\\n    return (\\n      <div\\n        className={cn(`flex flex-col items-center gap-4`, className)}\\n        {...props}\\n      >\\n        <AnimatePresence>\\n          {itemsToShow.map((item) => (\\n            <AnimatedListItem key={(item as React.ReactElement).key}>\\n              {item}\\n            </AnimatedListItem>\\n          ))}\\n        </AnimatePresence>\\n      </div>\\n    )\\n  }\\n)\\n\\nAnimatedList.displayName = \\\"AnimatedList\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-shiny-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-shiny-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Shiny Text Demo\",\n  \"description\": \"Example showing text with a shimmering light effect.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/animated-shiny-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-shiny-text-demo.tsx\",\n      \"content\": \"import { ArrowRightIcon } from \\\"@radix-ui/react-icons\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { AnimatedShinyText } from \\\"@/registry/magicui/animated-shiny-text\\\"\\n\\nexport default function AnimatedShinyTextDemo() {\\n  return (\\n    <div className=\\\"z-10 flex min-h-64 items-center justify-center\\\">\\n      <div\\n        className={cn(\\n          \\\"group rounded-full border border-black/5 bg-neutral-100 text-base text-white transition-all ease-in hover:cursor-pointer hover:bg-neutral-200 dark:border-white/5 dark:bg-neutral-900 dark:hover:bg-neutral-800\\\"\\n        )}\\n      >\\n        <AnimatedShinyText className=\\\"inline-flex items-center justify-center px-4 py-1 transition ease-out hover:text-neutral-600 hover:duration-300 hover:dark:text-neutral-400\\\">\\n          <span>✨ Introducing Magic UI</span>\\n          <ArrowRightIcon className=\\\"ml-1 size-3 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\\\" />\\n        </AnimatedShinyText>\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-shiny-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-shiny-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Animated Shiny Text\",\n  \"description\": \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-shiny-text.tsx\",\n      \"content\": \"import {\\n  type ComponentPropsWithoutRef,\\n  type CSSProperties,\\n  type FC,\\n} from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface AnimatedShinyTextProps extends ComponentPropsWithoutRef<\\\"span\\\"> {\\n  shimmerWidth?: number\\n}\\n\\nexport const AnimatedShinyText: FC<AnimatedShinyTextProps> = ({\\n  children,\\n  className,\\n  shimmerWidth = 100,\\n  ...props\\n}) => {\\n  return (\\n    <span\\n      style={\\n        {\\n          \\\"--shiny-width\\\": `${shimmerWidth}px`,\\n        } as CSSProperties\\n      }\\n      className={cn(\\n        \\\"mx-auto max-w-md text-neutral-600/70 dark:text-neutral-400/70\\\",\\n\\n        // Shine effect\\n        \\\"animate-shiny-text bg-size-[var(--shiny-width)_100%] bg-clip-text bg-position-[0_0] bg-no-repeat [transition:background-position_1s_cubic-bezier(.6,.6,0,1)_infinite]\\\",\\n\\n        // Shine gradient\\n        \\\"bg-linear-to-r from-transparent via-black/80 via-50% to-transparent dark:via-white/80\\\",\\n\\n        className\\n      )}\\n      {...props}\\n    >\\n      {children}\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-shiny-text\": \"shiny-text 8s infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes shiny-text\": {\n      \"0%, 90%, 100%\": {\n        \"background-position\": \"calc(-100% - var(--shiny-width)) 0\"\n      },\n      \"30%, 60%\": {\n        \"background-position\": \"calc(100% + var(--shiny-width)) 0\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/animated-theme-toggler-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-theme-toggler-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Animated Theme Toggler Demo\",\n  \"description\": \"Example showing animation while changing the theme.\",\n  \"registryDependencies\": [\n    \"@magicui/animated-theme-toggler\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n      \"content\": \"import { AnimatedThemeToggler } from \\\"@/registry/magicui/animated-theme-toggler\\\"\\n\\nexport default function AnimatedThemeTogglerDemo() {\\n  return <AnimatedThemeToggler />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/animated-theme-toggler.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"animated-theme-toggler\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Theme Toggler\",\n  \"description\": \"A component for theme changing animation.\",\n  \"dependencies\": [\n    \"lucide-react\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/animated-theme-toggler.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useCallback, useEffect, useRef, useState } from \\\"react\\\"\\nimport { Moon, Sun } from \\\"lucide-react\\\"\\nimport { flushSync } from \\\"react-dom\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutRef<\\\"button\\\"> {\\n  duration?: number\\n}\\n\\nexport const AnimatedThemeToggler = ({\\n  className,\\n  duration = 400,\\n  ...props\\n}: AnimatedThemeTogglerProps) => {\\n  const [isDark, setIsDark] = useState(false)\\n  const buttonRef = useRef<HTMLButtonElement>(null)\\n\\n  useEffect(() => {\\n    const updateTheme = () => {\\n      setIsDark(document.documentElement.classList.contains(\\\"dark\\\"))\\n    }\\n\\n    updateTheme()\\n\\n    const observer = new MutationObserver(updateTheme)\\n    observer.observe(document.documentElement, {\\n      attributes: true,\\n      attributeFilter: [\\\"class\\\"],\\n    })\\n\\n    return () => observer.disconnect()\\n  }, [])\\n\\n  const toggleTheme = useCallback(() => {\\n    const button = buttonRef.current\\n    if (!button) return\\n\\n    const { top, left, width, height } = button.getBoundingClientRect()\\n    const x = left + width / 2\\n    const y = top + height / 2\\n    const viewportWidth = window.visualViewport?.width ?? window.innerWidth\\n    const viewportHeight = window.visualViewport?.height ?? window.innerHeight\\n    const maxRadius = Math.hypot(\\n      Math.max(x, viewportWidth - x),\\n      Math.max(y, viewportHeight - y)\\n    )\\n\\n    const applyTheme = () => {\\n      const newTheme = !isDark\\n      setIsDark(newTheme)\\n      document.documentElement.classList.toggle(\\\"dark\\\")\\n      localStorage.setItem(\\\"theme\\\", newTheme ? \\\"dark\\\" : \\\"light\\\")\\n    }\\n\\n    if (typeof document.startViewTransition !== \\\"function\\\") {\\n      applyTheme()\\n      return\\n    }\\n\\n    const transition = document.startViewTransition(() => {\\n      flushSync(applyTheme)\\n    })\\n\\n    const ready = transition?.ready\\n    if (ready && typeof ready.then === \\\"function\\\") {\\n      ready.then(() => {\\n        document.documentElement.animate(\\n          {\\n            clipPath: [\\n              `circle(0px at ${x}px ${y}px)`,\\n              `circle(${maxRadius}px at ${x}px ${y}px)`,\\n            ],\\n          },\\n          {\\n            duration,\\n            easing: \\\"ease-in-out\\\",\\n            pseudoElement: \\\"::view-transition-new(root)\\\",\\n          }\\n        )\\n      })\\n    }\\n  }, [isDark, duration])\\n\\n  return (\\n    <button\\n      type=\\\"button\\\"\\n      ref={buttonRef}\\n      onClick={toggleTheme}\\n      className={cn(className)}\\n      {...props}\\n    >\\n      {isDark ? <Sun /> : <Moon />}\\n      <span className=\\\"sr-only\\\">Toggle theme</span>\\n    </button>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"css\": {\n    \"::view-transition-old(root), ::view-transition-new(root)\": {\n      \"animation\": \"none\",\n      \"mix-blend-mode\": \"normal\"\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/aurora-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"aurora-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Aurora Text Demo\",\n  \"description\": \"Example showing a beautiful aurora text effect.\",\n  \"registryDependencies\": [\n    \"@magicui/aurora-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/aurora-text-demo.tsx\",\n      \"content\": \"import { AuroraText } from \\\"@/registry/magicui/aurora-text\\\"\\n\\nexport default function AuroraTextDemo() {\\n  return (\\n    <h1 className=\\\"text-4xl font-bold tracking-tighter md:text-5xl lg:text-7xl\\\">\\n      Ship <AuroraText>beautiful</AuroraText>\\n    </h1>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/aurora-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"aurora-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Aurora Text\",\n  \"description\": \"A beautiful aurora text effect\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/aurora-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { memo } from \\\"react\\\"\\n\\ninterface AuroraTextProps {\\n  children: React.ReactNode\\n  className?: string\\n  colors?: string[]\\n  speed?: number\\n}\\n\\nexport const AuroraText = memo(\\n  ({\\n    children,\\n    className = \\\"\\\",\\n    colors = [\\\"#FF0080\\\", \\\"#7928CA\\\", \\\"#0070F3\\\", \\\"#38bdf8\\\"],\\n    speed = 1,\\n  }: AuroraTextProps) => {\\n    const gradientStyle = {\\n      backgroundImage: `linear-gradient(135deg, ${colors.join(\\\", \\\")}, ${\\n        colors[0]\\n      })`,\\n      WebkitBackgroundClip: \\\"text\\\",\\n      WebkitTextFillColor: \\\"transparent\\\",\\n      animationDuration: `${10 / speed}s`,\\n    }\\n\\n    return (\\n      <span className={`relative inline-block ${className}`}>\\n        <span className=\\\"sr-only\\\">{children}</span>\\n        <span\\n          className=\\\"animate-aurora relative bg-size-[200%_auto] bg-clip-text text-transparent\\\"\\n          style={gradientStyle}\\n          aria-hidden=\\\"true\\\"\\n        >\\n          {children}\\n        </span>\\n      </span>\\n    )\\n  }\\n)\\n\\nAuroraText.displayName = \\\"AuroraText\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\"\n    }\n  },\n  \"css\": {\n    \"@keyframes aurora\": {\n      \"0%\": {\n        \"background-position\": \"0% 50%\",\n        \"transform\": \"rotate(-5deg) scale(0.9)\"\n      },\n      \"25%\": {\n        \"background-position\": \"50% 100%\",\n        \"transform\": \"rotate(5deg) scale(1.1)\"\n      },\n      \"50%\": {\n        \"background-position\": \"100% 50%\",\n        \"transform\": \"rotate(-3deg) scale(0.95)\"\n      },\n      \"75%\": {\n        \"background-position\": \"50% 0%\",\n        \"transform\": \"rotate(3deg) scale(1.05)\"\n      },\n      \"100%\": {\n        \"background-position\": \"0% 50%\",\n        \"transform\": \"rotate(-5deg) scale(0.9)\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/avatar-circles-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"avatar-circles-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Avatar Circles Demo\",\n  \"description\": \"Example showing overlapping avatar circles.\",\n  \"registryDependencies\": [\n    \"@magicui/avatar-circles\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/avatar-circles-demo.tsx\",\n      \"content\": \"import { AvatarCircles } from \\\"@/registry/magicui/avatar-circles\\\"\\n\\nconst avatars = [\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/16860528\\\",\\n    profileUrl: \\\"https://github.com/dillionverma\\\",\\n  },\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/20110627\\\",\\n    profileUrl: \\\"https://github.com/tomonarifeehan\\\",\\n  },\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/106103625\\\",\\n    profileUrl: \\\"https://github.com/BankkRoll\\\",\\n  },\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/59228569\\\",\\n    profileUrl: \\\"https://github.com/safethecode\\\",\\n  },\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/59442788\\\",\\n    profileUrl: \\\"https://github.com/sanjay-mali\\\",\\n  },\\n  {\\n    imageUrl: \\\"https://avatars.githubusercontent.com/u/89768406\\\",\\n    profileUrl: \\\"https://github.com/itsarghyadas\\\",\\n  },\\n]\\n\\nexport default function AvatarCirclesDemo() {\\n  return <AvatarCircles numPeople={99} avatarUrls={avatars} />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/avatar-circles.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"avatar-circles\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Avatar Circles\",\n  \"description\": \"Overlapping circles of avatars.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/avatar-circles.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface Avatar {\\n  imageUrl: string\\n  profileUrl: string\\n}\\ninterface AvatarCirclesProps {\\n  className?: string\\n  numPeople?: number\\n  avatarUrls: Avatar[]\\n}\\n\\nexport const AvatarCircles = ({\\n  numPeople,\\n  className,\\n  avatarUrls,\\n}: AvatarCirclesProps) => {\\n  return (\\n    <div className={cn(\\\"z-10 flex -space-x-4 rtl:space-x-reverse\\\", className)}>\\n      {avatarUrls.map((url, index) => (\\n        <a\\n          key={index}\\n          href={url.profileUrl}\\n          target=\\\"_blank\\\"\\n          rel=\\\"noopener noreferrer\\\"\\n        >\\n          <img\\n            key={index}\\n            className=\\\"h-10 w-10 rounded-full border-2 border-white dark:border-gray-800\\\"\\n            src={url.imageUrl}\\n            width={40}\\n            height={40}\\n            alt={`Avatar ${index + 1}`}\\n          />\\n        </a>\\n      ))}\\n      {(numPeople ?? 0) > 0 && (\\n        <a\\n          className=\\\"flex h-10 w-10 items-center justify-center rounded-full border-2 border-white bg-black text-center text-xs font-medium text-white hover:bg-gray-600 dark:border-gray-800 dark:bg-white dark:text-black\\\"\\n          href=\\\"\\\"\\n        >\\n          +{numPeople}\\n        </a>\\n      )}\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/bento-demo-vertical.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"bento-demo-vertical\",\n  \"type\": \"registry:example\",\n  \"title\": \"Bento Vertical Demo\",\n  \"description\": \"Example showing a vertical bento grid layout.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/bento-grid\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/bento-demo-vertical.tsx\",\n      \"content\": \"import {\\n  BellIcon,\\n  CalendarIcon,\\n  FileTextIcon,\\n  GlobeIcon,\\n  InputIcon,\\n} from \\\"@radix-ui/react-icons\\\"\\n\\nimport { BentoCard, BentoGrid } from \\\"@/registry/magicui/bento-grid\\\"\\n\\nconst features = [\\n  {\\n    Icon: FileTextIcon,\\n    name: \\\"Save your files\\\",\\n    description: \\\"We automatically save your files as you type.\\\",\\n    href: \\\"/\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <img alt=\\\"\\\" className=\\\"absolute -top-20 -right-20 opacity-60\\\" />\\n    ),\\n    className: \\\"lg:row-start-1 lg:row-end-4 lg:col-start-2 lg:col-end-3\\\",\\n  },\\n  {\\n    Icon: InputIcon,\\n    name: \\\"Full text search\\\",\\n    description: \\\"Search through all your files in one place.\\\",\\n    href: \\\"/\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <img alt=\\\"\\\" className=\\\"absolute -top-20 -right-20 opacity-60\\\" />\\n    ),\\n    className: \\\"lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-3\\\",\\n  },\\n  {\\n    Icon: GlobeIcon,\\n    name: \\\"Multilingual\\\",\\n    description: \\\"Supports 100+ languages and counting.\\\",\\n    href: \\\"/\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <img alt=\\\"\\\" className=\\\"absolute -top-20 -right-20 opacity-60\\\" />\\n    ),\\n    className: \\\"lg:col-start-1 lg:col-end-2 lg:row-start-3 lg:row-end-4\\\",\\n  },\\n  {\\n    Icon: CalendarIcon,\\n    name: \\\"Calendar\\\",\\n    description: \\\"Use the calendar to filter your files by date.\\\",\\n    href: \\\"/\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <img alt=\\\"\\\" className=\\\"absolute -top-20 -right-20 opacity-60\\\" />\\n    ),\\n    className: \\\"lg:col-start-3 lg:col-end-3 lg:row-start-1 lg:row-end-2\\\",\\n  },\\n  {\\n    Icon: BellIcon,\\n    name: \\\"Notifications\\\",\\n    description:\\n      \\\"Get notified when someone shares a file or mentions you in a comment.\\\",\\n    href: \\\"/\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <img alt=\\\"\\\" className=\\\"absolute -top-20 -right-20 opacity-60\\\" />\\n    ),\\n    className: \\\"lg:col-start-3 lg:col-end-3 lg:row-start-2 lg:row-end-4\\\",\\n  },\\n]\\n\\nexport default function BentoDemo() {\\n  return (\\n    <BentoGrid className=\\\"lg:grid-rows-3\\\">\\n      {features.map((feature) => (\\n        <BentoCard key={feature.name} {...feature} />\\n      ))}\\n    </BentoGrid>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/bento-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"bento-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Bento Demo\",\n  \"description\": \"Example showing a bento grid layout for showcasing features.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"button\",\n    \"calendar\",\n    \"@magicui/marquee\",\n    \"@magicui/bento-grid\",\n    \"@magicui/animated-beam\",\n    \"@magicui/animated-list\",\n    \"@magicui/animated-beam-multiple-outputs\",\n    \"@magicui/animated-list-demo\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/bento-demo.tsx\",\n      \"content\": \"import { CalendarIcon, FileTextIcon } from \\\"@radix-ui/react-icons\\\"\\nimport { BellIcon, Share2Icon } from \\\"lucide-react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { Calendar } from \\\"@/components/ui/calendar\\\"\\nimport AnimatedBeamMultipleOutputDemo from \\\"@/registry/example/animated-beam-multiple-outputs\\\"\\nimport AnimatedListDemo from \\\"@/registry/example/animated-list-demo\\\"\\nimport { BentoCard, BentoGrid } from \\\"@/registry/magicui/bento-grid\\\"\\nimport { Marquee } from \\\"@/registry/magicui/marquee\\\"\\n\\nconst files = [\\n  {\\n    name: \\\"bitcoin.pdf\\\",\\n    body: \\\"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\\\",\\n  },\\n  {\\n    name: \\\"finances.xlsx\\\",\\n    body: \\\"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\\\",\\n  },\\n  {\\n    name: \\\"logo.svg\\\",\\n    body: \\\"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\\\",\\n  },\\n  {\\n    name: \\\"keys.gpg\\\",\\n    body: \\\"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\\\",\\n  },\\n  {\\n    name: \\\"seed.txt\\\",\\n    body: \\\"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\\\",\\n  },\\n]\\n\\nconst features = [\\n  {\\n    Icon: FileTextIcon,\\n    name: \\\"Save your files\\\",\\n    description: \\\"We automatically save your files as you type.\\\",\\n    href: \\\"#\\\",\\n    cta: \\\"Learn more\\\",\\n    className: \\\"col-span-3 lg:col-span-1\\\",\\n    background: (\\n      <Marquee\\n        pauseOnHover\\n        className=\\\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\\\"\\n      >\\n        {files.map((f, idx) => (\\n          <figure\\n            key={idx}\\n            className={cn(\\n              \\\"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\\\",\\n              \\\"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\\\",\\n              \\\"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\\\",\\n              \\\"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\\\"\\n            )}\\n          >\\n            <div className=\\\"flex flex-row items-center gap-2\\\">\\n              <div className=\\\"flex flex-col\\\">\\n                <figcaption className=\\\"text-sm font-medium dark:text-white\\\">\\n                  {f.name}\\n                </figcaption>\\n              </div>\\n            </div>\\n            <blockquote className=\\\"mt-2 text-xs\\\">{f.body}</blockquote>\\n          </figure>\\n        ))}\\n      </Marquee>\\n    ),\\n  },\\n  {\\n    Icon: BellIcon,\\n    name: \\\"Notifications\\\",\\n    description: \\\"Get notified when something happens.\\\",\\n    href: \\\"#\\\",\\n    cta: \\\"Learn more\\\",\\n    className: \\\"col-span-3 lg:col-span-2\\\",\\n    background: (\\n      <AnimatedListDemo className=\\\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\\\" />\\n    ),\\n  },\\n  {\\n    Icon: Share2Icon,\\n    name: \\\"Integrations\\\",\\n    description: \\\"Supports 100+ integrations and counting.\\\",\\n    href: \\\"#\\\",\\n    cta: \\\"Learn more\\\",\\n    className: \\\"col-span-3 lg:col-span-2\\\",\\n    background: (\\n      <AnimatedBeamMultipleOutputDemo className=\\\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\\\" />\\n    ),\\n  },\\n  {\\n    Icon: CalendarIcon,\\n    name: \\\"Calendar\\\",\\n    description: \\\"Use the calendar to filter your files by date.\\\",\\n    className: \\\"col-span-3 lg:col-span-1\\\",\\n    href: \\\"#\\\",\\n    cta: \\\"Learn more\\\",\\n    background: (\\n      <Calendar\\n        mode=\\\"single\\\"\\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\\n        className=\\\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\\\"\\n      />\\n    ),\\n  },\\n]\\n\\nexport default function BentoDemo() {\\n  return (\\n    <BentoGrid>\\n      {features.map((feature, idx) => (\\n        <BentoCard key={idx} {...feature} />\\n      ))}\\n    </BentoGrid>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/bento-grid.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"bento-grid\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Bento Grid\",\n  \"description\": \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/bento-grid.tsx\",\n      \"content\": \"import { type ComponentPropsWithoutRef, type ReactNode } from \\\"react\\\"\\nimport { ArrowRightIcon } from \\\"@radix-ui/react-icons\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\ninterface BentoGridProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  children: ReactNode\\n  className?: string\\n}\\n\\ninterface BentoCardProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  name: string\\n  className: string\\n  background: ReactNode\\n  Icon: React.ElementType\\n  description: string\\n  href: string\\n  cta: string\\n}\\n\\nconst BentoGrid = ({ children, className, ...props }: BentoGridProps) => {\\n  return (\\n    <div\\n      className={cn(\\n        \\\"grid w-full auto-rows-[22rem] grid-cols-3 gap-4\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      {children}\\n    </div>\\n  )\\n}\\n\\nconst BentoCard = ({\\n  name,\\n  className,\\n  background,\\n  Icon,\\n  description,\\n  href,\\n  cta,\\n  ...props\\n}: BentoCardProps) => (\\n  <div\\n    key={name}\\n    className={cn(\\n      \\\"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl\\\",\\n      // light styles\\n      \\\"bg-background [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\\\",\\n      // dark styles\\n      \\\"dark:bg-background transform-gpu dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:[border:1px_solid_rgba(255,255,255,.1)]\\\",\\n      className\\n    )}\\n    {...props}\\n  >\\n    <div>{background}</div>\\n    <div className=\\\"p-4\\\">\\n      <div className=\\\"pointer-events-none z-10 flex transform-gpu flex-col gap-1 transition-all duration-300 lg:group-hover:-translate-y-10\\\">\\n        <Icon className=\\\"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75\\\" />\\n        <h3 className=\\\"text-xl font-semibold text-neutral-700 dark:text-neutral-300\\\">\\n          {name}\\n        </h3>\\n        <p className=\\\"max-w-lg text-neutral-400\\\">{description}</p>\\n      </div>\\n\\n      <div\\n        className={cn(\\n          \\\"pointer-events-none flex w-full translate-y-0 transform-gpu flex-row items-center transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:hidden\\\"\\n        )}\\n      >\\n        <Button\\n          variant=\\\"link\\\"\\n          asChild\\n          size=\\\"sm\\\"\\n          className=\\\"pointer-events-auto p-0\\\"\\n        >\\n          <a href={href}>\\n            {cta}\\n            <ArrowRightIcon className=\\\"ms-2 h-4 w-4 rtl:rotate-180\\\" />\\n          </a>\\n        </Button>\\n      </div>\\n    </div>\\n\\n    <div\\n      className={cn(\\n        \\\"pointer-events-none absolute bottom-0 hidden w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:flex\\\"\\n      )}\\n    >\\n      <Button\\n        variant=\\\"link\\\"\\n        asChild\\n        size=\\\"sm\\\"\\n        className=\\\"pointer-events-auto p-0\\\"\\n      >\\n        <a href={href}>\\n          {cta}\\n          <ArrowRightIcon className=\\\"ms-2 h-4 w-4 rtl:rotate-180\\\" />\\n        </a>\\n      </Button>\\n    </div>\\n\\n    <div className=\\\"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/3 group-hover:dark:bg-neutral-800/10\\\" />\\n  </div>\\n)\\n\\nexport { BentoCard, BentoGrid }\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/blur-fade-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"blur-fade-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Blur Fade Demo\",\n  \"description\": \"Example showing blur fade in and out animations.\",\n  \"registryDependencies\": [\n    \"@magicui/blur-fade\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/blur-fade-demo.tsx\",\n      \"content\": \"import { BlurFade } from \\\"@/registry/magicui/blur-fade\\\"\\n\\nconst images = Array.from({ length: 9 }, (_, i) => {\\n  const isLandscape = i % 2 === 0\\n  const width = isLandscape ? 800 : 600\\n  const height = isLandscape ? 600 : 800\\n  return `https://picsum.photos/seed/${i + 1}/${width}/${height}`\\n})\\n\\nexport default function BlurFadeDemo() {\\n  return (\\n    <section id=\\\"photos\\\">\\n      <div className=\\\"columns-2 gap-4 sm:columns-3\\\">\\n        {images.map((imageUrl, idx) => (\\n          <BlurFade key={imageUrl} delay={0.25 + idx * 0.05} inView>\\n            <img\\n              className=\\\"mb-4 size-full rounded-lg object-contain\\\"\\n              src={imageUrl}\\n              alt={`Random stock image ${idx + 1}`}\\n            />\\n          </BlurFade>\\n        ))}\\n      </div>\\n    </section>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/blur-fade-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"blur-fade-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Blur Fade Text Demo\",\n  \"description\": \"Example showing blur fade animations with text.\",\n  \"registryDependencies\": [\n    \"@magicui/blur-fade\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/blur-fade-text-demo.tsx\",\n      \"content\": \"import { BlurFade } from \\\"@/registry/magicui/blur-fade\\\"\\n\\nexport default function BlurFadeTextDemo() {\\n  return (\\n    <section id=\\\"header\\\">\\n      <BlurFade delay={0.25} inView>\\n        <h2 className=\\\"text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none\\\">\\n          Hello World 👋\\n        </h2>\\n      </BlurFade>\\n      <BlurFade delay={0.25 * 2} inView>\\n        <span className=\\\"text-xl tracking-tighter text-pretty sm:text-3xl xl:text-4xl/none\\\">\\n          Nice to meet you\\n        </span>\\n      </BlurFade>\\n    </section>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/blur-fade.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"blur-fade\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Blur Fade\",\n  \"description\": \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/blur-fade.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useRef } from \\\"react\\\"\\nimport {\\n  AnimatePresence,\\n  motion,\\n  useInView,\\n  type MotionProps,\\n  type UseInViewOptions,\\n  type Variants,\\n} from \\\"motion/react\\\"\\n\\ntype MarginType = UseInViewOptions[\\\"margin\\\"]\\n\\ninterface BlurFadeProps extends MotionProps {\\n  children: React.ReactNode\\n  className?: string\\n  variant?: {\\n    hidden: { y: number }\\n    visible: { y: number }\\n  }\\n  duration?: number\\n  delay?: number\\n  offset?: number\\n  direction?: \\\"up\\\" | \\\"down\\\" | \\\"left\\\" | \\\"right\\\"\\n  inView?: boolean\\n  inViewMargin?: MarginType\\n  blur?: string\\n}\\n\\nconst getFilter = (v: Variants[string]) =>\\n  typeof v === \\\"function\\\" ? undefined : v.filter\\n\\nexport function BlurFade({\\n  children,\\n  className,\\n  variant,\\n  duration = 0.4,\\n  delay = 0,\\n  offset = 6,\\n  direction = \\\"down\\\",\\n  inView = false,\\n  inViewMargin = \\\"-50px\\\",\\n  blur = \\\"6px\\\",\\n  ...props\\n}: BlurFadeProps) {\\n  const ref = useRef(null)\\n  const inViewResult = useInView(ref, { once: true, margin: inViewMargin })\\n  const isInView = !inView || inViewResult\\n  const defaultVariants: Variants = {\\n    hidden: {\\n      [direction === \\\"left\\\" || direction === \\\"right\\\" ? \\\"x\\\" : \\\"y\\\"]:\\n        direction === \\\"right\\\" || direction === \\\"down\\\" ? -offset : offset,\\n      opacity: 0,\\n      filter: `blur(${blur})`,\\n    },\\n    visible: {\\n      [direction === \\\"left\\\" || direction === \\\"right\\\" ? \\\"x\\\" : \\\"y\\\"]: 0,\\n      opacity: 1,\\n      filter: `blur(0px)`,\\n    },\\n  }\\n  const combinedVariants = variant ?? defaultVariants\\n\\n  const hiddenFilter = getFilter(combinedVariants.hidden)\\n  const visibleFilter = getFilter(combinedVariants.visible)\\n\\n  const shouldTransitionFilter =\\n    hiddenFilter != null &&\\n    visibleFilter != null &&\\n    hiddenFilter !== visibleFilter\\n\\n  return (\\n    <AnimatePresence>\\n      <motion.div\\n        ref={ref}\\n        initial=\\\"hidden\\\"\\n        animate={isInView ? \\\"visible\\\" : \\\"hidden\\\"}\\n        exit=\\\"hidden\\\"\\n        variants={combinedVariants}\\n        transition={{\\n          delay: 0.04 + delay,\\n          duration,\\n          ease: \\\"easeOut\\\",\\n          ...(shouldTransitionFilter ? { filter: { duration } } : {}),\\n        }}\\n        className={className}\\n        {...props}\\n      >\\n        {children}\\n      </motion.div>\\n    </AnimatePresence>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/border-beam-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"border-beam-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Border Beam Demo\",\n  \"description\": \"Example showing an animated border beam effect.\",\n  \"registryDependencies\": [\n    \"button\",\n    \"card\",\n    \"@magicui/border-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/border-beam-demo-2.tsx\",\n      \"content\": \"import { Play, SkipBack, SkipForward } from \\\"lucide-react\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { BorderBeam } from \\\"@/registry/magicui/border-beam\\\"\\n\\nexport default function MusicPlayer() {\\n  return (\\n    <Card className=\\\"relative w-[350px] overflow-hidden\\\">\\n      <CardHeader>\\n        <CardTitle>Now Playing</CardTitle>\\n        <CardDescription>Stairway to Heaven - Led Zeppelin</CardDescription>\\n      </CardHeader>\\n      <CardContent>\\n        <div className=\\\"flex flex-col items-center gap-4\\\">\\n          <div className=\\\"h-48 w-48 rounded-lg bg-linear-to-br from-purple-500 to-pink-500\\\" />\\n          <div className=\\\"bg-secondary h-1 w-full rounded-full\\\">\\n            <div className=\\\"bg-primary h-full w-1/3 rounded-full\\\" />\\n          </div>\\n          <div className=\\\"text-muted-foreground flex w-full justify-between text-sm\\\">\\n            <span>2:45</span>\\n            <span>8:02</span>\\n          </div>\\n        </div>\\n      </CardContent>\\n      <CardFooter className=\\\"flex justify-center gap-4\\\">\\n        <Button variant=\\\"outline\\\" size=\\\"icon\\\" className=\\\"rounded-full\\\">\\n          <SkipBack className=\\\"size-4\\\" />\\n        </Button>\\n        <Button size=\\\"icon\\\" className=\\\"rounded-full\\\">\\n          <Play className=\\\"size-4\\\" />\\n        </Button>\\n        <Button variant=\\\"outline\\\" size=\\\"icon\\\" className=\\\"rounded-full\\\">\\n          <SkipForward className=\\\"size-4\\\" />\\n        </Button>\\n      </CardFooter>\\n      <BorderBeam\\n        duration={6}\\n        size={400}\\n        className=\\\"from-transparent via-red-500 to-transparent\\\"\\n      />\\n      <BorderBeam\\n        duration={6}\\n        delay={3}\\n        size={400}\\n        borderWidth={2}\\n        className=\\\"from-transparent via-blue-500 to-transparent\\\"\\n      />\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/border-beam-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"border-beam-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Border Beam Demo 3\",\n  \"description\": \"Example showing an animated border beam effect.\",\n  \"registryDependencies\": [\n    \"button\",\n    \"card\",\n    \"input\",\n    \"label\",\n    \"@magicui/border-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/border-beam-demo-3.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Input } from \\\"@/components/ui/input\\\"\\nimport { Label } from \\\"@/components/ui/label\\\"\\nimport { BorderBeam } from \\\"@/registry/magicui/border-beam\\\"\\n\\nexport default function LoginForm() {\\n  return (\\n    <Card className=\\\"relative w-[350px] overflow-hidden\\\">\\n      <CardHeader>\\n        <CardTitle>Login</CardTitle>\\n        <CardDescription>\\n          Enter your credentials to access your account.\\n        </CardDescription>\\n      </CardHeader>\\n      <CardContent>\\n        <form>\\n          <div className=\\\"grid w-full items-center gap-4\\\">\\n            <div className=\\\"flex flex-col space-y-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input id=\\\"email\\\" type=\\\"email\\\" placeholder=\\\"Enter your email\\\" />\\n            </div>\\n            <div className=\\\"flex flex-col space-y-1.5\\\">\\n              <Label htmlFor=\\\"password\\\">Password</Label>\\n              <Input\\n                id=\\\"password\\\"\\n                type=\\\"password\\\"\\n                placeholder=\\\"Enter your password\\\"\\n              />\\n            </div>\\n          </div>\\n        </form>\\n      </CardContent>\\n      <CardFooter className=\\\"flex justify-between\\\">\\n        <Button variant=\\\"outline\\\">Register</Button>\\n        <Button>Login</Button>\\n      </CardFooter>\\n      <BorderBeam\\n        duration={4}\\n        size={300}\\n        reverse\\n        className=\\\"from-transparent via-green-500 to-transparent\\\"\\n      />\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/border-beam-demo-4.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"border-beam-demo-4\",\n  \"type\": \"registry:example\",\n  \"title\": \"Border Beam Demo 4\",\n  \"description\": \"Example showing an animated border beam effect.\",\n  \"registryDependencies\": [\n    \"button\",\n    \"@magicui/border-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/border-beam-demo-4.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport { BorderBeam } from \\\"@/registry/magicui/border-beam\\\"\\n\\nexport default function Component() {\\n  return (\\n    <Button className=\\\"relative overflow-hidden\\\" size=\\\"lg\\\" variant=\\\"outline\\\">\\n      Buy Now\\n      <BorderBeam\\n        size={40}\\n        initialOffset={20}\\n        className=\\\"from-transparent via-yellow-500 to-transparent\\\"\\n        transition={{\\n          type: \\\"spring\\\",\\n          stiffness: 60,\\n          damping: 20,\\n        }}\\n      />\\n    </Button>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/border-beam-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"border-beam-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Border Beam Demo\",\n  \"description\": \"Example showing an animated border beam effect.\",\n  \"registryDependencies\": [\n    \"@magicui/border-beam\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/border-beam-demo.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Input } from \\\"@/components/ui/input\\\"\\nimport { Label } from \\\"@/components/ui/label\\\"\\nimport { BorderBeam } from \\\"@/registry/magicui/border-beam\\\"\\n\\nexport default function Component() {\\n  return (\\n    <Card className=\\\"relative w-[350px] overflow-hidden\\\">\\n      <CardHeader>\\n        <CardTitle>Login</CardTitle>\\n        <CardDescription>\\n          Enter your credentials to access your account.\\n        </CardDescription>\\n      </CardHeader>\\n      <CardContent>\\n        <form>\\n          <div className=\\\"grid w-full items-center gap-4\\\">\\n            <div className=\\\"flex flex-col space-y-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input id=\\\"email\\\" type=\\\"email\\\" placeholder=\\\"Enter your email\\\" />\\n            </div>\\n            <div className=\\\"flex flex-col space-y-1.5\\\">\\n              <Label htmlFor=\\\"password\\\">Password</Label>\\n              <Input\\n                id=\\\"password\\\"\\n                type=\\\"password\\\"\\n                placeholder=\\\"Enter your password\\\"\\n              />\\n            </div>\\n          </div>\\n        </form>\\n      </CardContent>\\n      <CardFooter className=\\\"flex justify-between\\\">\\n        <Button variant=\\\"outline\\\">Register</Button>\\n        <Button>Login</Button>\\n      </CardFooter>\\n      <BorderBeam duration={8} size={100} />\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/border-beam.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"border-beam\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Border Beam\",\n  \"description\": \"An animated beam of light which travels along the border of its container.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/border-beam.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { motion, MotionStyle, Transition } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface BorderBeamProps {\\n  /**\\n   * The size of the border beam.\\n   */\\n  size?: number\\n  /**\\n   * The duration of the border beam.\\n   */\\n  duration?: number\\n  /**\\n   * The delay of the border beam.\\n   */\\n  delay?: number\\n  /**\\n   * The color of the border beam from.\\n   */\\n  colorFrom?: string\\n  /**\\n   * The color of the border beam to.\\n   */\\n  colorTo?: string\\n  /**\\n   * The motion transition of the border beam.\\n   */\\n  transition?: Transition\\n  /**\\n   * The class name of the border beam.\\n   */\\n  className?: string\\n  /**\\n   * The style of the border beam.\\n   */\\n  style?: React.CSSProperties\\n  /**\\n   * Whether to reverse the animation direction.\\n   */\\n  reverse?: boolean\\n  /**\\n   * The initial offset position (0-100).\\n   */\\n  initialOffset?: number\\n  /**\\n   * The border width of the beam.\\n   */\\n  borderWidth?: number\\n}\\n\\nexport const BorderBeam = ({\\n  className,\\n  size = 50,\\n  delay = 0,\\n  duration = 6,\\n  colorFrom = \\\"#ffaa40\\\",\\n  colorTo = \\\"#9c40ff\\\",\\n  transition,\\n  style,\\n  reverse = false,\\n  initialOffset = 0,\\n  borderWidth = 1,\\n}: BorderBeamProps) => {\\n  return (\\n    <div\\n      className=\\\"pointer-events-none absolute inset-0 rounded-[inherit] border-(length:--border-beam-width) border-transparent mask-[linear-gradient(transparent,transparent),linear-gradient(#000,#000)] mask-intersect [mask-clip:padding-box,border-box]\\\"\\n      style={\\n        {\\n          \\\"--border-beam-width\\\": `${borderWidth}px`,\\n        } as React.CSSProperties\\n      }\\n    >\\n      <motion.div\\n        className={cn(\\n          \\\"absolute aspect-square\\\",\\n          \\\"bg-linear-to-l from-(--color-from) via-(--color-to) to-transparent\\\",\\n          className\\n        )}\\n        style={\\n          {\\n            width: size,\\n            offsetPath: `rect(0 auto auto 0 round ${size}px)`,\\n            \\\"--color-from\\\": colorFrom,\\n            \\\"--color-to\\\": colorTo,\\n            ...style,\\n          } as MotionStyle\\n        }\\n        initial={{ offsetDistance: `${initialOffset}%` }}\\n        animate={{\\n          offsetDistance: reverse\\n            ? [`${100 - initialOffset}%`, `${-initialOffset}%`]\\n            : [`${initialOffset}%`, `${100 + initialOffset}%`],\\n        }}\\n        transition={{\\n          repeat: Infinity,\\n          ease: \\\"linear\\\",\\n          duration,\\n          delay: -delay,\\n          ...transition,\\n        }}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/client-tweet-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"client-tweet-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Client Tweet Card\",\n  \"description\": \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n  \"dependencies\": [\n    \"react-tweet\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/client-tweet-card.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { TweetProps, useTweet } from \\\"react-tweet\\\"\\n\\nimport {\\n  MagicTweet,\\n  TweetNotFound,\\n  TweetSkeleton,\\n} from \\\"@/registry/magicui/tweet-card\\\"\\n\\nexport const ClientTweetCard = ({\\n  id,\\n  apiUrl,\\n  fallback = <TweetSkeleton />,\\n  components,\\n  fetchOptions,\\n  onError,\\n  ...props\\n}: TweetProps & { className?: string }) => {\\n  const { data, error, isLoading } = useTweet(id, apiUrl, fetchOptions)\\n\\n  if (isLoading) return fallback\\n  if (error || !data) {\\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\\n    return <NotFound error={onError ? onError(error) : error} />\\n  }\\n\\n  return <MagicTweet tweet={data} {...props} />\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/code-comparison-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"code-comparison-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Code Comparison Demo\",\n  \"description\": \"Example showing a component which compares two code snippets.\",\n  \"registryDependencies\": [\n    \"@magicui/code-comparison\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/code-comparison-demo.tsx\",\n      \"content\": \"import { CodeComparison } from \\\"@/registry/magicui/code-comparison\\\"\\n\\nconst beforeCode = `import { NextRequest } from 'next/server';\\n\\nexport const middleware = async (req: NextRequest) => {\\n  let user = undefined;\\n  let team = undefined;\\n  const token = req.headers.get('token'); \\n\\n  if(req.nextUrl.pathname.startsWith('/auth')) {\\n    user = await getUserByToken(token);\\n\\n    if(!user) {\\n      return NextResponse.redirect('/login');\\n    }\\n  }\\n\\n  if(req.nextUrl.pathname.startsWith('/team')) {\\n    user = await getUserByToken(token);\\n\\n    if(!user) {\\n      return NextResponse.redirect('/login');\\n    }\\n\\n    const slug = req.nextUrl.query.slug;\\n    team = await getTeamBySlug(slug); // [!code highlight]\\n\\n    if(!team) { // [!code highlight]\\n      return NextResponse.redirect('/'); // [!code highlight]\\n    } // [!code highlight]\\n  } // [!code highlight]\\n\\n  return NextResponse.next(); // [!code highlight]\\n}\\n\\nexport const config = {\\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\\\\\w-]+\\\\\\\\.\\\\\\\\w+).*)'], // [!code highlight]\\n};`\\n\\nconst afterCode = `import { createMiddleware, type MiddlewareFunctionProps } from '@app/(auth)/auth/_middleware';\\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code --]\\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code ++]\\nimport { team } from '@/app/(team)/team/_middleware';\\n\\nconst middlewares = {\\n  '/auth{/:path?}': auth,\\n  '/team{/:slug?}': [ auth, team ],\\n};\\n\\nexport const middleware = createMiddleware(middlewares); // [!code focus]\\n\\nexport const config = {\\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\\\\\w-]+\\\\\\\\.\\\\\\\\w+).*)'],\\n};`\\n\\nexport default function CodeComparisonDemo() {\\n  return (\\n    <CodeComparison\\n      beforeCode={beforeCode}\\n      afterCode={afterCode}\\n      language=\\\"typescript\\\"\\n      filename=\\\"middleware.ts\\\"\\n      lightTheme=\\\"github-light\\\"\\n      darkTheme=\\\"github-dark\\\"\\n      highlightColor=\\\"rgba(101, 117, 133, 0.16)\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/code-comparison.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"code-comparison\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Code Comparison\",\n  \"description\": \"A component which compares two code snippets.\",\n  \"dependencies\": [\n    \"shiki\",\n    \"next-themes\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/code-comparison.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useMemo, useState } from \\\"react\\\"\\nimport {\\n  transformerNotationDiff,\\n  transformerNotationFocus,\\n} from \\\"@shikijs/transformers\\\"\\nimport { FileIcon } from \\\"lucide-react\\\"\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface CodeComparisonProps {\\n  beforeCode: string\\n  afterCode: string\\n  language: string\\n  filename: string\\n  lightTheme: string\\n  darkTheme: string\\n  highlightColor?: string\\n}\\n\\nexport function CodeComparison({\\n  beforeCode,\\n  afterCode,\\n  language,\\n  filename,\\n  lightTheme,\\n  darkTheme,\\n  highlightColor = \\\"#ff3333\\\",\\n}: CodeComparisonProps) {\\n  const { theme, systemTheme } = useTheme()\\n  const [highlightedBefore, setHighlightedBefore] = useState(\\\"\\\")\\n  const [highlightedAfter, setHighlightedAfter] = useState(\\\"\\\")\\n  const [hasLeftFocus, setHasLeftFocus] = useState(false)\\n  const [hasRightFocus, setHasRightFocus] = useState(false)\\n\\n  const selectedTheme = useMemo(() => {\\n    const currentTheme = theme === \\\"system\\\" ? systemTheme : theme\\n    return currentTheme === \\\"dark\\\" ? darkTheme : lightTheme\\n  }, [theme, systemTheme, darkTheme, lightTheme])\\n\\n  useEffect(() => {\\n    if (highlightedBefore || highlightedAfter) {\\n      setHasLeftFocus(highlightedBefore.includes('class=\\\"line focused\\\"'))\\n      setHasRightFocus(highlightedAfter.includes('class=\\\"line focused\\\"'))\\n    }\\n  }, [highlightedBefore, highlightedAfter])\\n\\n  useEffect(() => {\\n    async function highlightCode() {\\n      try {\\n        const { codeToHtml } = await import(\\\"shiki\\\")\\n        const { transformerNotationHighlight } =\\n          await import(\\\"@shikijs/transformers\\\")\\n\\n        const before = await codeToHtml(beforeCode, {\\n          lang: language,\\n          theme: selectedTheme,\\n          transformers: [\\n            transformerNotationHighlight({ matchAlgorithm: \\\"v3\\\" }),\\n            transformerNotationDiff({ matchAlgorithm: \\\"v3\\\" }),\\n            transformerNotationFocus({ matchAlgorithm: \\\"v3\\\" }),\\n          ],\\n        })\\n        const after = await codeToHtml(afterCode, {\\n          lang: language,\\n          theme: selectedTheme,\\n          transformers: [\\n            transformerNotationHighlight({ matchAlgorithm: \\\"v3\\\" }),\\n            transformerNotationDiff({ matchAlgorithm: \\\"v3\\\" }),\\n            transformerNotationFocus({ matchAlgorithm: \\\"v3\\\" }),\\n          ],\\n        })\\n        setHighlightedBefore(before)\\n        setHighlightedAfter(after)\\n      } catch (error) {\\n        console.error(\\\"Error highlighting code:\\\", error)\\n        setHighlightedBefore(`<pre>${beforeCode}</pre>`)\\n        setHighlightedAfter(`<pre>${afterCode}</pre>`)\\n      }\\n    }\\n    highlightCode()\\n  }, [beforeCode, afterCode, language, selectedTheme])\\n\\n  const renderCode = (code: string, highlighted: string) => {\\n    if (highlighted) {\\n      return (\\n        <div\\n          style={{ \\\"--highlight-color\\\": highlightColor } as React.CSSProperties}\\n          className={cn(\\n            \\\"bg-background h-full w-full overflow-auto font-mono text-xs\\\",\\n            \\\"[&>pre]:h-full [&>pre]:w-screen! [&>pre]:py-2\\\",\\n            \\\"[&>pre>code]:inline-block! [&>pre>code]:w-full!\\\",\\n            \\\"[&>pre>code>span]:inline-block! [&>pre>code>span]:w-full [&>pre>code>span]:px-4 [&>pre>code>span]:py-0.5\\\",\\n            \\\"[&>pre>code>.highlighted]:inline-block [&>pre>code>.highlighted]:w-full [&>pre>code>.highlighted]:bg-(--highlight-color)!\\\",\\n            \\\"group-hover/left:[&>pre>code>:not(.focused)]:opacity-100! group-hover/left:[&>pre>code>:not(.focused)]:blur-none!\\\",\\n            \\\"group-hover/right:[&>pre>code>:not(.focused)]:opacity-100! group-hover/right:[&>pre>code>:not(.focused)]:blur-none!\\\",\\n            \\\"[&>pre>code>.add]:bg-[rgba(16,185,129,.16)] [&>pre>code>.remove]:bg-[rgba(244,63,94,.16)]\\\",\\n            \\\"group-hover/left:[&>pre>code>:not(.focused)]:transition-all group-hover/left:[&>pre>code>:not(.focused)]:duration-300\\\",\\n            \\\"group-hover/right:[&>pre>code>:not(.focused)]:transition-all group-hover/right:[&>pre>code>:not(.focused)]:duration-300\\\"\\n          )}\\n          dangerouslySetInnerHTML={{ __html: highlighted }}\\n        />\\n      )\\n    } else {\\n      return (\\n        <pre className=\\\"bg-background text-foreground h-full overflow-auto p-4 font-mono text-xs break-all\\\">\\n          {code}\\n        </pre>\\n      )\\n    }\\n  }\\n\\n  return (\\n    <div className=\\\"mx-auto w-full max-w-5xl\\\">\\n      <div className=\\\"group border-border relative w-full overflow-hidden rounded-md border\\\">\\n        <div className=\\\"relative grid md:grid-cols-2\\\">\\n          <div\\n            className={cn(\\n              \\\"leftside group/left border-primary/20 md:border-r\\\",\\n              hasLeftFocus &&\\n                \\\"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\\\",\\n              \\\"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\\\"\\n            )}\\n          >\\n            <div className=\\\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\\\">\\n              <FileIcon className=\\\"mr-2 h-4 w-4\\\" />\\n              {filename}\\n              <span className=\\\"ml-auto hidden md:block\\\">before</span>\\n            </div>\\n            {renderCode(beforeCode, highlightedBefore)}\\n          </div>\\n          <div\\n            className={cn(\\n              \\\"rightside group/right border-primary/20 border-t md:border-t-0\\\",\\n              hasRightFocus &&\\n                \\\"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\\\",\\n              \\\"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\\\"\\n            )}\\n          >\\n            <div className=\\\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\\\">\\n              <FileIcon className=\\\"mr-2 h-4 w-4\\\" />\\n              {filename}\\n              <span className=\\\"ml-auto hidden md:block\\\">after</span>\\n            </div>\\n            {renderCode(afterCode, highlightedAfter)}\\n          </div>\\n        </div>\\n        <div className=\\\"border-primary/20 bg-accent text-foreground absolute top-1/2 left-1/2 hidden h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-md border text-xs md:flex\\\">\\n          VS\\n        </div>\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/comic-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"comic-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Comic Text Demo\",\n  \"description\": \"Example showing comic text animation.\",\n  \"registryDependencies\": [\n    \"@magicui/comic-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/comic-text-demo.tsx\",\n      \"content\": \"import { ComicText } from \\\"@/registry/magicui/comic-text\\\"\\n\\nexport default function ComicTextDemo() {\\n  return (\\n    <div className=\\\"space-y-8 text-center\\\">\\n      <ComicText fontSize={5}>BOOM!</ComicText>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/comic-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"comic-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Comic Text\",\n  \"description\": \"Comic text animation\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/comic-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { CSSProperties } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ntype ComicTextProps = {\\n  children: string\\n  className?: string\\n  style?: CSSProperties\\n  fontSize?: number\\n}\\n\\nexport function ComicText({\\n  children,\\n  className,\\n  style,\\n  fontSize = 5,\\n}: ComicTextProps) {\\n  if (typeof children !== \\\"string\\\") {\\n    throw new Error(\\\"children must be a string\\\")\\n  }\\n\\n  const dotColor = \\\"#EF4444\\\"\\n  const backgroundColor = \\\"#FACC15\\\"\\n\\n  return (\\n    <motion.div\\n      className={cn(\\\"text-center select-none\\\", className)}\\n      style={{\\n        fontSize: `${fontSize}rem`,\\n        fontFamily: \\\"'Bangers', 'Comic Sans MS', 'Impact', sans-serif\\\",\\n        fontWeight: \\\"900\\\",\\n        WebkitTextStroke: `${fontSize * 0.35}px #000000`, // Thick black outline\\n        transform: \\\"skewX(-10deg)\\\",\\n        textTransform: \\\"uppercase\\\",\\n        filter: `\\n          drop-shadow(5px 5px 0px #000000) \\n          drop-shadow(3px 3px 0px ${dotColor})\\n        `,\\n        backgroundColor: backgroundColor,\\n        backgroundImage: `radial-gradient(circle at 1px 1px, ${dotColor} 1px, transparent 0)`,\\n        backgroundSize: \\\"8px 8px\\\",\\n        backgroundClip: \\\"text\\\",\\n        WebkitBackgroundClip: \\\"text\\\",\\n        WebkitTextFillColor: \\\"transparent\\\",\\n        ...style,\\n      }}\\n      initial={{ opacity: 0, scale: 0.8, rotate: -2 }}\\n      animate={{ opacity: 1, scale: 1, rotate: 0 }}\\n      transition={{\\n        duration: 0.6,\\n        ease: [0.175, 0.885, 0.32, 1.275],\\n        type: \\\"spring\\\",\\n      }}\\n    >\\n      {children}\\n    </motion.div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-basic-cannon.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-basic-cannon\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Basic Cannon\",\n  \"description\": \"Example showing basic confetti cannon animation.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-basic-cannon.tsx\",\n      \"content\": \"import { ConfettiButton } from \\\"@/registry/magicui/confetti\\\"\\n\\nexport default function ConfettiButtonDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <ConfettiButton>Confetti 🎉</ConfettiButton>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-custom-shapes.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-custom-shapes\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Custom Shapes\",\n  \"description\": \"Example showing confetti with custom shape particles.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-custom-shapes.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\nexport default function ConfettiCustomShapes() {\\n  const handleClick = () => {\\n    const scalar = 2\\n    const triangle = confetti.shapeFromPath({\\n      path: \\\"M0 10 L5 0 L10 10z\\\",\\n    })\\n    const square = confetti.shapeFromPath({\\n      path: \\\"M0 0 L10 0 L10 10 L0 10 Z\\\",\\n    })\\n    const coin = confetti.shapeFromPath({\\n      path: \\\"M5 0 A5 5 0 1 0 5 10 A5 5 0 1 0 5 0 Z\\\",\\n    })\\n    const tree = confetti.shapeFromPath({\\n      path: \\\"M5 0 L10 10 L0 10 Z\\\",\\n    })\\n\\n    const defaults = {\\n      spread: 360,\\n      ticks: 60,\\n      gravity: 0,\\n      decay: 0.96,\\n      startVelocity: 20,\\n      shapes: [triangle, square, coin, tree],\\n      scalar,\\n    }\\n\\n    const shoot = () => {\\n      confetti({\\n        ...defaults,\\n        particleCount: 30,\\n      })\\n\\n      confetti({\\n        ...defaults,\\n        particleCount: 5,\\n      })\\n\\n      confetti({\\n        ...defaults,\\n        particleCount: 15,\\n        scalar: scalar / 2,\\n        shapes: [\\\"circle\\\"],\\n      })\\n    }\\n\\n    setTimeout(shoot, 0)\\n    setTimeout(shoot, 100)\\n    setTimeout(shoot, 200)\\n  }\\n\\n  return (\\n    <div className=\\\"relative flex items-center justify-center\\\">\\n      <Button onClick={handleClick}>Trigger Shapes</Button>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Demo\",\n  \"description\": \"Example showing confetti animations for celebrations.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useRef } from \\\"react\\\"\\n\\nimport { Confetti, type ConfettiRef } from \\\"@/registry/magicui/confetti\\\"\\n\\nexport default function ConfettiDemo() {\\n  const confettiRef = useRef<ConfettiRef>(null)\\n\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <span className=\\\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\\\">\\n        Confetti\\n      </span>\\n\\n      <Confetti\\n        ref={confettiRef}\\n        className=\\\"absolute top-0 left-0 z-0 size-full\\\"\\n        onMouseEnter={() => {\\n          confettiRef.current?.fire({})\\n        }}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-emoji.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-emoji\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Emoji\",\n  \"description\": \"Example showing confetti with emoji particles.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-emoji.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\nexport default function ConfettiEmoji() {\\n  const handleClick = () => {\\n    const scalar = 2\\n    const unicorn = confetti.shapeFromText({ text: \\\"🦄\\\", scalar })\\n\\n    const defaults = {\\n      spread: 360,\\n      ticks: 60,\\n      gravity: 0,\\n      decay: 0.96,\\n      startVelocity: 20,\\n      shapes: [unicorn],\\n      scalar,\\n    }\\n\\n    const shoot = () => {\\n      confetti({\\n        ...defaults,\\n        particleCount: 30,\\n      })\\n\\n      confetti({\\n        ...defaults,\\n        particleCount: 5,\\n      })\\n\\n      confetti({\\n        ...defaults,\\n        particleCount: 15,\\n        scalar: scalar / 2,\\n        shapes: [\\\"circle\\\"],\\n      })\\n    }\\n\\n    setTimeout(shoot, 0)\\n    setTimeout(shoot, 100)\\n    setTimeout(shoot, 200)\\n  }\\n\\n  return (\\n    <div className=\\\"relative justify-center\\\">\\n      <Button onClick={handleClick}>Trigger Emoji</Button>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-fireworks.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-fireworks\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Fireworks\",\n  \"description\": \"Example showing fireworks-style confetti animation.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-fireworks.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\nexport default function ConfettiFireworks() {\\n  const handleClick = () => {\\n    const duration = 5 * 1000\\n    const animationEnd = Date.now() + duration\\n    const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 }\\n\\n    const randomInRange = (min: number, max: number) =>\\n      Math.random() * (max - min) + min\\n\\n    const interval = window.setInterval(() => {\\n      const timeLeft = animationEnd - Date.now()\\n\\n      if (timeLeft <= 0) {\\n        return clearInterval(interval)\\n      }\\n\\n      const particleCount = 50 * (timeLeft / duration)\\n      confetti({\\n        ...defaults,\\n        particleCount,\\n        origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\\n      })\\n      confetti({\\n        ...defaults,\\n        particleCount,\\n        origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\\n      })\\n    }, 250)\\n  }\\n\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Button onClick={handleClick}>Trigger Fireworks</Button>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-random-direction.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-random-direction\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Random Direction\",\n  \"description\": \"Example showing confetti with random directions.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-random-direction.tsx\",\n      \"content\": \"import { ConfettiButton } from \\\"@/registry/magicui/confetti\\\"\\n\\nexport default function ConfettiButtonDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <ConfettiButton\\n        options={{\\n          get angle() {\\n            return Math.random() * 360\\n          },\\n        }}\\n      >\\n        Random Confetti 🎉\\n      </ConfettiButton>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-side-cannons.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-side-cannons\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Side Cannons\",\n  \"description\": \"Example showing side-mounted confetti cannons.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-side-cannons.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\nexport default function ConfettiSideCannons() {\\n  const handleClick = () => {\\n    const end = Date.now() + 3 * 1000 // 3 seconds\\n    const colors = [\\\"#a786ff\\\", \\\"#fd8bbc\\\", \\\"#eca184\\\", \\\"#f8deb1\\\"]\\n\\n    const frame = () => {\\n      if (Date.now() > end) return\\n\\n      confetti({\\n        particleCount: 2,\\n        angle: 60,\\n        spread: 55,\\n        startVelocity: 60,\\n        origin: { x: 0, y: 0.5 },\\n        colors: colors,\\n      })\\n      confetti({\\n        particleCount: 2,\\n        angle: 120,\\n        spread: 55,\\n        startVelocity: 60,\\n        origin: { x: 1, y: 0.5 },\\n        colors: colors,\\n      })\\n\\n      requestAnimationFrame(frame)\\n    }\\n\\n    frame()\\n  }\\n\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Button onClick={handleClick}>Trigger Side Cannons</Button>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti-stars.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti-stars\",\n  \"type\": \"registry:example\",\n  \"title\": \"Confetti Stars\",\n  \"description\": \"Example showing star-shaped confetti animation.\",\n  \"registryDependencies\": [\n    \"@magicui/confetti\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/confetti-stars.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\nexport default function ConfettiStars() {\\n  const handleClick = () => {\\n    const defaults = {\\n      spread: 360,\\n      ticks: 50,\\n      gravity: 0,\\n      decay: 0.94,\\n      startVelocity: 30,\\n      colors: [\\\"#FFE400\\\", \\\"#FFBD00\\\", \\\"#E89400\\\", \\\"#FFCA6C\\\", \\\"#FDFFB8\\\"],\\n    }\\n\\n    const shoot = () => {\\n      confetti({\\n        ...defaults,\\n        particleCount: 40,\\n        scalar: 1.2,\\n        shapes: [\\\"star\\\"],\\n      })\\n\\n      confetti({\\n        ...defaults,\\n        particleCount: 10,\\n        scalar: 0.75,\\n        shapes: [\\\"circle\\\"],\\n      })\\n    }\\n\\n    setTimeout(shoot, 0)\\n    setTimeout(shoot, 100)\\n    setTimeout(shoot, 200)\\n  }\\n\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Button onClick={handleClick}>Trigger Stars</Button>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/confetti.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"confetti\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Confetti\",\n  \"description\": \"Confetti animations are best used to delight your users when something special happens\",\n  \"dependencies\": [\n    \"canvas-confetti\",\n    \"@types/canvas-confetti\"\n  ],\n  \"registryDependencies\": [\n    \"button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/confetti.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport type { ReactNode } from \\\"react\\\"\\nimport React, {\\n  createContext,\\n  forwardRef,\\n  useCallback,\\n  useEffect,\\n  useImperativeHandle,\\n  useMemo,\\n  useRef,\\n} from \\\"react\\\"\\nimport type {\\n  GlobalOptions as ConfettiGlobalOptions,\\n  CreateTypes as ConfettiInstance,\\n  Options as ConfettiOptions,\\n} from \\\"canvas-confetti\\\"\\nimport confetti from \\\"canvas-confetti\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\n\\ntype Api = {\\n  fire: (options?: ConfettiOptions) => void\\n}\\n\\ntype Props = React.ComponentPropsWithRef<\\\"canvas\\\"> & {\\n  options?: ConfettiOptions\\n  globalOptions?: ConfettiGlobalOptions\\n  manualstart?: boolean\\n  children?: ReactNode\\n}\\n\\nexport type ConfettiRef = Api | null\\n\\nconst ConfettiContext = createContext<Api>({} as Api)\\n\\n// Define component first\\nconst ConfettiComponent = forwardRef<ConfettiRef, Props>((props, ref) => {\\n  const {\\n    options,\\n    globalOptions = { resize: true, useWorker: true },\\n    manualstart = false,\\n    children,\\n    ...rest\\n  } = props\\n  const instanceRef = useRef<ConfettiInstance | null>(null)\\n\\n  const canvasRef = useCallback(\\n    (node: HTMLCanvasElement) => {\\n      if (node !== null) {\\n        if (instanceRef.current) return\\n        instanceRef.current = confetti.create(node, {\\n          ...globalOptions,\\n          resize: true,\\n        })\\n      } else {\\n        if (instanceRef.current) {\\n          instanceRef.current.reset()\\n          instanceRef.current = null\\n        }\\n      }\\n    },\\n    [globalOptions]\\n  )\\n\\n  const fire = useCallback(\\n    async (opts = {}) => {\\n      try {\\n        await instanceRef.current?.({ ...options, ...opts })\\n      } catch (error) {\\n        console.error(\\\"Confetti error:\\\", error)\\n      }\\n    },\\n    [options]\\n  )\\n\\n  const api = useMemo(\\n    () => ({\\n      fire,\\n    }),\\n    [fire]\\n  )\\n\\n  useImperativeHandle(ref, () => api, [api])\\n\\n  useEffect(() => {\\n    if (!manualstart) {\\n      ;(async () => {\\n        try {\\n          await fire()\\n        } catch (error) {\\n          console.error(\\\"Confetti effect error:\\\", error)\\n        }\\n      })()\\n    }\\n  }, [manualstart, fire])\\n\\n  return (\\n    <ConfettiContext.Provider value={api}>\\n      <canvas ref={canvasRef} {...rest} />\\n      {children}\\n    </ConfettiContext.Provider>\\n  )\\n})\\n\\n// Set display name immediately\\nConfettiComponent.displayName = \\\"Confetti\\\"\\n\\n// Export as Confetti\\nexport const Confetti = ConfettiComponent\\n\\ninterface ConfettiButtonProps extends React.ComponentProps<\\\"button\\\"> {\\n  options?: ConfettiOptions &\\n    ConfettiGlobalOptions & { canvas?: HTMLCanvasElement }\\n}\\n\\nconst ConfettiButtonComponent = ({\\n  options,\\n  children,\\n  ...props\\n}: ConfettiButtonProps) => {\\n  const handleClick = async (event: React.MouseEvent<HTMLButtonElement>) => {\\n    try {\\n      const rect = event.currentTarget.getBoundingClientRect()\\n      const x = rect.left + rect.width / 2\\n      const y = rect.top + rect.height / 2\\n      await confetti({\\n        ...options,\\n        origin: {\\n          x: x / window.innerWidth,\\n          y: y / window.innerHeight,\\n        },\\n      })\\n    } catch (error) {\\n      console.error(\\\"Confetti button error:\\\", error)\\n    }\\n  }\\n\\n  return (\\n    <Button onClick={handleClick} {...props}>\\n      {children}\\n    </Button>\\n  )\\n}\\n\\nConfettiButtonComponent.displayName = \\\"ConfettiButton\\\"\\n\\nexport const ConfettiButton = ConfettiButtonComponent\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/cool-mode-custom.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"cool-mode-custom\",\n  \"type\": \"registry:example\",\n  \"title\": \"Cool Mode Custom\",\n  \"description\": \"Example showing customized cool mode effects.\",\n  \"registryDependencies\": [\n    \"@magicui/cool-mode\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/cool-mode-custom.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport { CoolMode } from \\\"@/registry/magicui/cool-mode\\\"\\n\\nexport default function CoolModeCustom() {\\n  return (\\n    <div className=\\\"relative justify-center\\\">\\n      <CoolMode\\n        options={{\\n          particle:\\n            \\\"https://pbs.twimg.com/profile_images/1782811051504885763/YR5-kWOI_400x400.jpg\\\",\\n        }}\\n      >\\n        <Button>Click Me!</Button>\\n      </CoolMode>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/cool-mode-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"cool-mode-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Cool Mode Demo\",\n  \"description\": \"Example showing cool mode effect for buttons and links.\",\n  \"registryDependencies\": [\n    \"@magicui/cool-mode\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/cool-mode-demo.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport { CoolMode } from \\\"@/registry/magicui/cool-mode\\\"\\n\\nexport default function CoolModeDemo() {\\n  return (\\n    <div className=\\\"relative justify-center\\\">\\n      <CoolMode>\\n        <Button>Click Me!</Button>\\n      </CoolMode>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/cool-mode.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"cool-mode\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Cool Mode\",\n  \"description\": \"Cool mode effect for buttons, links, and other DOMs\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/cool-mode.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { ReactNode, useEffect, useRef } from \\\"react\\\"\\n\\nexport interface BaseParticle {\\n  element: HTMLElement | SVGSVGElement\\n  left: number\\n  size: number\\n  top: number\\n}\\n\\nexport interface BaseParticleOptions {\\n  particle?: string\\n  size?: number\\n}\\n\\nexport interface CoolParticle extends BaseParticle {\\n  direction: number\\n  speedHorz: number\\n  speedUp: number\\n  spinSpeed: number\\n  spinVal: number\\n}\\n\\nexport interface CoolParticleOptions extends BaseParticleOptions {\\n  particleCount?: number\\n  speedHorz?: number\\n  speedUp?: number\\n}\\n\\nconst getContainer = () => {\\n  const id = \\\"_coolMode_effect\\\"\\n  const existingContainer = document.getElementById(id)\\n\\n  if (existingContainer) {\\n    return existingContainer\\n  }\\n\\n  const container = document.createElement(\\\"div\\\")\\n  container.setAttribute(\\\"id\\\", id)\\n  container.setAttribute(\\n    \\\"style\\\",\\n    \\\"overflow:hidden; position:fixed; height:100%; top:0; left:0; right:0; bottom:0; pointer-events:none; z-index:2147483647\\\"\\n  )\\n\\n  document.body.appendChild(container)\\n\\n  return container\\n}\\n\\nlet instanceCounter = 0\\n\\nconst applyParticleEffect = (\\n  element: HTMLElement,\\n  options?: CoolParticleOptions\\n): (() => void) => {\\n  instanceCounter++\\n\\n  const defaultParticle = \\\"circle\\\"\\n  const particleType = options?.particle || defaultParticle\\n  const sizes = [15, 20, 25, 35, 45]\\n  const limit = 45\\n\\n  let particles: CoolParticle[] = []\\n  let autoAddParticle = false\\n  let mouseX = 0\\n  let mouseY = 0\\n\\n  const container = getContainer()\\n\\n  function generateParticle() {\\n    const size =\\n      options?.size || sizes[Math.floor(Math.random() * sizes.length)]\\n    const speedHorz = options?.speedHorz || Math.random() * 10\\n    const speedUp = options?.speedUp || Math.random() * 25\\n    const spinVal = Math.random() * 360\\n    const spinSpeed = Math.random() * 35 * (Math.random() <= 0.5 ? -1 : 1)\\n    const top = mouseY - size / 2\\n    const left = mouseX - size / 2\\n    const direction = Math.random() <= 0.5 ? -1 : 1\\n\\n    const particle = document.createElement(\\\"div\\\")\\n\\n    if (particleType === \\\"circle\\\") {\\n      const svgNS = \\\"http://www.w3.org/2000/svg\\\"\\n      const circleSVG = document.createElementNS(svgNS, \\\"svg\\\")\\n      const circle = document.createElementNS(svgNS, \\\"circle\\\")\\n      circle.setAttributeNS(null, \\\"cx\\\", (size / 2).toString())\\n      circle.setAttributeNS(null, \\\"cy\\\", (size / 2).toString())\\n      circle.setAttributeNS(null, \\\"r\\\", (size / 2).toString())\\n      circle.setAttributeNS(\\n        null,\\n        \\\"fill\\\",\\n        `hsl(${Math.random() * 360}, 70%, 50%)`\\n      )\\n\\n      circleSVG.appendChild(circle)\\n      circleSVG.setAttribute(\\\"width\\\", size.toString())\\n      circleSVG.setAttribute(\\\"height\\\", size.toString())\\n\\n      particle.appendChild(circleSVG)\\n    } else if (\\n      particleType.startsWith(\\\"http\\\") ||\\n      particleType.startsWith(\\\"/\\\")\\n    ) {\\n      // Handle URL-based images\\n      particle.innerHTML = `<img src=\\\"${particleType}\\\" width=\\\"${size}\\\" height=\\\"${size}\\\" style=\\\"border-radius: 50%\\\">`\\n    } else {\\n      // Handle emoji or text characters\\n      const fontSizeMultiplier = 3 // Make emojis 3x bigger\\n      const emojiSize = size * fontSizeMultiplier\\n      particle.innerHTML = `<div style=\\\"font-size: ${emojiSize}px; line-height: 1; text-align: center; width: ${size}px; height: ${size}px; display: flex; align-items: center; justify-content: center; transform: scale(${fontSizeMultiplier}); transform-origin: center;\\\">${particleType}</div>`\\n    }\\n\\n    particle.style.position = \\\"absolute\\\"\\n    particle.style.transform = `translate3d(${left}px, ${top}px, 0px) rotate(${spinVal}deg)`\\n\\n    container.appendChild(particle)\\n\\n    particles.push({\\n      direction,\\n      element: particle,\\n      left,\\n      size,\\n      speedHorz,\\n      speedUp,\\n      spinSpeed,\\n      spinVal,\\n      top,\\n    })\\n  }\\n\\n  function refreshParticles() {\\n    particles.forEach((p) => {\\n      p.left = p.left - p.speedHorz * p.direction\\n      p.top = p.top - p.speedUp\\n      p.speedUp = Math.min(p.size, p.speedUp - 1)\\n      p.spinVal = p.spinVal + p.spinSpeed\\n\\n      if (\\n        p.top >=\\n        Math.max(window.innerHeight, document.body.clientHeight) + p.size\\n      ) {\\n        particles = particles.filter((o) => o !== p)\\n        p.element.remove()\\n      }\\n\\n      p.element.setAttribute(\\n        \\\"style\\\",\\n        [\\n          \\\"position:absolute\\\",\\n          \\\"will-change:transform\\\",\\n          `top:${p.top}px`,\\n          `left:${p.left}px`,\\n          `transform:rotate(${p.spinVal}deg)`,\\n        ].join(\\\";\\\")\\n      )\\n    })\\n  }\\n\\n  let animationFrame: number | undefined\\n\\n  let lastParticleTimestamp = 0\\n  const particleGenerationDelay = 30\\n\\n  function loop() {\\n    const currentTime = performance.now()\\n    if (\\n      autoAddParticle &&\\n      particles.length < limit &&\\n      currentTime - lastParticleTimestamp > particleGenerationDelay\\n    ) {\\n      generateParticle()\\n      lastParticleTimestamp = currentTime\\n    }\\n\\n    refreshParticles()\\n    animationFrame = requestAnimationFrame(loop)\\n  }\\n\\n  loop()\\n\\n  const isTouchInteraction = \\\"ontouchstart\\\" in window\\n\\n  const tap = isTouchInteraction ? \\\"touchstart\\\" : \\\"mousedown\\\"\\n  const tapEnd = isTouchInteraction ? \\\"touchend\\\" : \\\"mouseup\\\"\\n  const move = isTouchInteraction ? \\\"touchmove\\\" : \\\"mousemove\\\"\\n\\n  const updateMousePosition = (e: MouseEvent | TouchEvent) => {\\n    if (\\\"touches\\\" in e) {\\n      mouseX = e.touches?.[0].clientX\\n      mouseY = e.touches?.[0].clientY\\n    } else {\\n      mouseX = e.clientX\\n      mouseY = e.clientY\\n    }\\n  }\\n\\n  const tapHandler = (e: MouseEvent | TouchEvent) => {\\n    updateMousePosition(e)\\n    autoAddParticle = true\\n  }\\n\\n  const disableAutoAddParticle = () => {\\n    autoAddParticle = false\\n  }\\n\\n  element.addEventListener(move, updateMousePosition, { passive: true })\\n  element.addEventListener(tap, tapHandler, { passive: true })\\n  element.addEventListener(tapEnd, disableAutoAddParticle, { passive: true })\\n  element.addEventListener(\\\"mouseleave\\\", disableAutoAddParticle, {\\n    passive: true,\\n  })\\n\\n  return () => {\\n    element.removeEventListener(move, updateMousePosition)\\n    element.removeEventListener(tap, tapHandler)\\n    element.removeEventListener(tapEnd, disableAutoAddParticle)\\n    element.removeEventListener(\\\"mouseleave\\\", disableAutoAddParticle)\\n\\n    const interval = setInterval(() => {\\n      if (animationFrame && particles.length === 0) {\\n        cancelAnimationFrame(animationFrame)\\n        clearInterval(interval)\\n\\n        if (--instanceCounter === 0) {\\n          container.remove()\\n        }\\n      }\\n    }, 500)\\n  }\\n}\\n\\ninterface CoolModeProps {\\n  children: ReactNode\\n  options?: CoolParticleOptions\\n}\\n\\nexport const CoolMode: React.FC<CoolModeProps> = ({ children, options }) => {\\n  const ref = useRef<HTMLSpanElement>(null)\\n\\n  useEffect(() => {\\n    const element = ref.current\\n    let cleanup: (() => void) | null = null\\n\\n    if (element) {\\n      cleanup = applyParticleEffect(element, options)\\n    }\\n\\n    return () => {\\n      if (cleanup) {\\n        cleanup()\\n      }\\n    }\\n  }, [options])\\n\\n  return <span ref={ref}>{children}</span>\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dock-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dock-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dock Demo 2\",\n  \"description\": \"Second example showing a MacOS-style dock implementation.\",\n  \"registryDependencies\": [\n    \"@magicui/dock\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dock-demo-2.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React from \\\"react\\\"\\n\\nimport { Dock, DockIcon } from \\\"@/registry/magicui/dock\\\"\\n\\nexport type IconProps = React.HTMLAttributes<SVGElement>\\n\\nexport default function DockDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Dock direction=\\\"middle\\\">\\n        <DockIcon>\\n          <Icons.gitHub className=\\\"size-6\\\" />\\n        </DockIcon>\\n        <DockIcon>\\n          <Icons.googleDrive className=\\\"size-6\\\" />\\n        </DockIcon>\\n        <DockIcon>\\n          <Icons.notion className=\\\"size-6\\\" />\\n        </DockIcon>\\n        <DockIcon>\\n          <Icons.whatsapp className=\\\"size-6\\\" />\\n        </DockIcon>\\n      </Dock>\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  gitHub: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 438.549 438.549\\\" {...props}>\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n      ></path>\\n    </svg>\\n  ),\\n  notion: (props: IconProps) => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      {...props}\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#fff\\\"\\n      />\\n      <path\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000\\\"\\n      />\\n    </svg>\\n  ),\\n  googleDrive: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 87.3 78\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" {...props}>\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: (props: IconProps) => (\\n    <svg\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      {...props}\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        fill=\\\"#b3b3b3\\\"\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        fill=\\\"#fff\\\"\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n      />\\n      <path\\n        fill=\\\"url(#linearGradient1780)\\\"\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n      />\\n      <path\\n        fill=\\\"url(#b)\\\"\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n      />\\n      <path\\n        fill=\\\"#fff\\\"\\n        fillRule=\\\"evenodd\\\"\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n      />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dock-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dock-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dock Demo 3\",\n  \"description\": \"Third example showing a MacOS-style dock implementation.\",\n  \"registryDependencies\": [\n    \"@magicui/dock\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dock-demo-3.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React from \\\"react\\\"\\n\\nimport { Dock, DockIcon } from \\\"@/registry/magicui/dock\\\"\\n\\nexport type IconProps = React.HTMLAttributes<SVGElement>\\n\\nexport default function DockDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <Dock iconMagnification={60} iconDistance={100}>\\n        <DockIcon className=\\\"bg-black/10 dark:bg-white/10\\\">\\n          <Icons.gitHub className=\\\"size-full\\\" />\\n        </DockIcon>\\n        <DockIcon className=\\\"bg-black/10 dark:bg-white/10\\\">\\n          <Icons.googleDrive className=\\\"size-full\\\" />\\n        </DockIcon>\\n        <DockIcon className=\\\"bg-black/10 dark:bg-white/10\\\">\\n          <Icons.notion className=\\\"size-full\\\" />\\n        </DockIcon>\\n        <DockIcon className=\\\"bg-black/10 dark:bg-white/10\\\">\\n          <Icons.whatsapp className=\\\"size-full\\\" />\\n        </DockIcon>\\n      </Dock>\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  gitHub: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 438.549 438.549\\\" {...props}>\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n      ></path>\\n    </svg>\\n  ),\\n  notion: (props: IconProps) => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      {...props}\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#fff\\\"\\n      />\\n      <path\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000\\\"\\n      />\\n    </svg>\\n  ),\\n  googleDrive: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 87.3 78\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" {...props}>\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: (props: IconProps) => (\\n    <svg\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      {...props}\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        fill=\\\"#b3b3b3\\\"\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        fill=\\\"#fff\\\"\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n      />\\n      <path\\n        fill=\\\"url(#linearGradient1780)\\\"\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n      />\\n      <path\\n        fill=\\\"url(#b)\\\"\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n      />\\n      <path\\n        fill=\\\"#fff\\\"\\n        fillRule=\\\"evenodd\\\"\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n      />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dock-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dock-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dock Demo\",\n  \"description\": \"Example showing a MacOS-style dock implementation.\",\n  \"dependencies\": [\n    \"next-themes\"\n  ],\n  \"registryDependencies\": [\n    \"button\",\n    \"@magicui/dock\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dock-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React from \\\"react\\\"\\nimport Link from \\\"next/link\\\"\\nimport { CalendarIcon, HomeIcon, MailIcon, PencilIcon } from \\\"lucide-react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { buttonVariants } from \\\"@/components/ui/button\\\"\\nimport { Separator } from \\\"@/components/ui/separator\\\"\\nimport {\\n  Tooltip,\\n  TooltipContent,\\n  TooltipProvider,\\n  TooltipTrigger,\\n} from \\\"@/components/ui/tooltip\\\"\\nimport { Dock, DockIcon } from \\\"@/registry/magicui/dock\\\"\\n\\nexport type IconProps = React.HTMLAttributes<SVGElement>\\n\\nconst Icons = {\\n  calendar: (props: IconProps) => <CalendarIcon {...props} />,\\n  email: (props: IconProps) => <MailIcon {...props} />,\\n  linkedin: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" {...props}>\\n      <title>LinkedIn</title>\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\\\"\\n      />\\n    </svg>\\n  ),\\n  x: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" {...props}>\\n      <title>X</title>\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\\\"\\n      />\\n    </svg>\\n  ),\\n  youtube: (props: IconProps) => (\\n    <svg\\n      width=\\\"32px\\\"\\n      height=\\\"32px\\\"\\n      viewBox=\\\"0 0 32 32\\\"\\n      fill=\\\"currentColor\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      {...props}\\n    >\\n      <title>youtube</title>\\n      <path d=\\\"M29.41,9.26a3.5,3.5,0,0,0-2.47-2.47C24.76,6.2,16,6.2,16,6.2s-8.76,0-10.94.59A3.5,3.5,0,0,0,2.59,9.26,36.13,36.13,0,0,0,2,16a36.13,36.13,0,0,0,.59,6.74,3.5,3.5,0,0,0,2.47,2.47C7.24,25.8,16,25.8,16,25.8s8.76,0,10.94-.59a3.5,3.5,0,0,0,2.47-2.47A36.13,36.13,0,0,0,30,16,36.13,36.13,0,0,0,29.41,9.26ZM13.2,20.2V11.8L20.47,16Z\\\" />\\n    </svg>\\n  ),\\n  github: (props: IconProps) => (\\n    <svg viewBox=\\\"0 0 438.549 438.549\\\" {...props}>\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n      ></path>\\n    </svg>\\n  ),\\n}\\n\\nconst DATA = {\\n  navbar: [\\n    { href: \\\"#\\\", icon: HomeIcon, label: \\\"Home\\\" },\\n    { href: \\\"#\\\", icon: PencilIcon, label: \\\"Blog\\\" },\\n  ],\\n  contact: {\\n    social: {\\n      GitHub: {\\n        name: \\\"GitHub\\\",\\n        url: \\\"#\\\",\\n        icon: Icons.github,\\n      },\\n      LinkedIn: {\\n        name: \\\"LinkedIn\\\",\\n        url: \\\"#\\\",\\n        icon: Icons.linkedin,\\n      },\\n      X: {\\n        name: \\\"X\\\",\\n        url: \\\"#\\\",\\n        icon: Icons.x,\\n      },\\n      email: {\\n        name: \\\"Send Email\\\",\\n        url: \\\"#\\\",\\n        icon: Icons.email,\\n      },\\n    },\\n  },\\n}\\n\\nexport default function DockDemo() {\\n  return (\\n    <div className=\\\"flex flex-col items-center justify-center\\\">\\n      <span className=\\\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\\\">\\n        Dock\\n      </span>\\n      <TooltipProvider>\\n        <Dock direction=\\\"middle\\\">\\n          {DATA.navbar.map((item) => (\\n            <DockIcon key={item.label}>\\n              <Tooltip>\\n                <TooltipTrigger asChild>\\n                  <Link\\n                    href={item.href}\\n                    aria-label={item.label}\\n                    className={cn(\\n                      buttonVariants({ variant: \\\"ghost\\\", size: \\\"icon\\\" }),\\n                      \\\"size-12 rounded-full\\\"\\n                    )}\\n                  >\\n                    <item.icon className=\\\"size-4\\\" />\\n                  </Link>\\n                </TooltipTrigger>\\n                <TooltipContent>\\n                  <p>{item.label}</p>\\n                </TooltipContent>\\n              </Tooltip>\\n            </DockIcon>\\n          ))}\\n          <Separator orientation=\\\"vertical\\\" className=\\\"h-full\\\" />\\n          {Object.entries(DATA.contact.social).map(([name, social]) => (\\n            <DockIcon key={name}>\\n              <Tooltip>\\n                <TooltipTrigger asChild>\\n                  <Link\\n                    href={social.url}\\n                    aria-label={social.name}\\n                    className={cn(\\n                      buttonVariants({ variant: \\\"ghost\\\", size: \\\"icon\\\" }),\\n                      \\\"size-12 rounded-full\\\"\\n                    )}\\n                  >\\n                    <social.icon className=\\\"size-4\\\" />\\n                  </Link>\\n                </TooltipTrigger>\\n                <TooltipContent>\\n                  <p>{name}</p>\\n                </TooltipContent>\\n              </Tooltip>\\n            </DockIcon>\\n          ))}\\n        </Dock>\\n      </TooltipProvider>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dock.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dock\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dock\",\n  \"description\": \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/dock.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { PropsWithChildren, useRef } from \\\"react\\\"\\nimport { cva, type VariantProps } from \\\"class-variance-authority\\\"\\nimport {\\n  motion,\\n  MotionValue,\\n  useMotionValue,\\n  useSpring,\\n  useTransform,\\n} from \\\"motion/react\\\"\\nimport type { MotionProps } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface DockProps extends VariantProps<typeof dockVariants> {\\n  className?: string\\n  iconSize?: number\\n  iconMagnification?: number\\n  disableMagnification?: boolean\\n  iconDistance?: number\\n  direction?: \\\"top\\\" | \\\"middle\\\" | \\\"bottom\\\"\\n  children: React.ReactNode\\n}\\n\\nconst DEFAULT_SIZE = 40\\nconst DEFAULT_MAGNIFICATION = 60\\nconst DEFAULT_DISTANCE = 140\\nconst DEFAULT_DISABLEMAGNIFICATION = false\\n\\nconst dockVariants = cva(\\n  \\\"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 mx-auto mt-8 flex h-[58px] w-max items-center justify-center gap-2 rounded-2xl border p-2 backdrop-blur-md\\\"\\n)\\n\\nconst Dock = React.forwardRef<HTMLDivElement, DockProps>(\\n  (\\n    {\\n      className,\\n      children,\\n      iconSize = DEFAULT_SIZE,\\n      iconMagnification = DEFAULT_MAGNIFICATION,\\n      disableMagnification = DEFAULT_DISABLEMAGNIFICATION,\\n      iconDistance = DEFAULT_DISTANCE,\\n      direction = \\\"middle\\\",\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    const mouseX = useMotionValue(Infinity)\\n\\n    const renderChildren = () => {\\n      return React.Children.map(children, (child) => {\\n        if (\\n          React.isValidElement<DockIconProps>(child) &&\\n          child.type === DockIcon\\n        ) {\\n          return React.cloneElement(child, {\\n            ...child.props,\\n            mouseX: mouseX,\\n            size: iconSize,\\n            magnification: iconMagnification,\\n            disableMagnification: disableMagnification,\\n            distance: iconDistance,\\n          })\\n        }\\n        return child\\n      })\\n    }\\n\\n    return (\\n      <motion.div\\n        ref={ref}\\n        onMouseMove={(e) => mouseX.set(e.pageX)}\\n        onMouseLeave={() => mouseX.set(Infinity)}\\n        {...props}\\n        className={cn(dockVariants({ className }), {\\n          \\\"items-start\\\": direction === \\\"top\\\",\\n          \\\"items-center\\\": direction === \\\"middle\\\",\\n          \\\"items-end\\\": direction === \\\"bottom\\\",\\n        })}\\n      >\\n        {renderChildren()}\\n      </motion.div>\\n    )\\n  }\\n)\\n\\nDock.displayName = \\\"Dock\\\"\\n\\nexport interface DockIconProps extends Omit<\\n  MotionProps & React.HTMLAttributes<HTMLDivElement>,\\n  \\\"children\\\"\\n> {\\n  size?: number\\n  magnification?: number\\n  disableMagnification?: boolean\\n  distance?: number\\n  mouseX?: MotionValue<number>\\n  className?: string\\n  children?: React.ReactNode\\n  props?: PropsWithChildren\\n}\\n\\nconst DockIcon = ({\\n  size = DEFAULT_SIZE,\\n  magnification = DEFAULT_MAGNIFICATION,\\n  disableMagnification,\\n  distance = DEFAULT_DISTANCE,\\n  mouseX,\\n  className,\\n  children,\\n  ...props\\n}: DockIconProps) => {\\n  const ref = useRef<HTMLDivElement>(null)\\n  const padding = Math.max(6, size * 0.2)\\n  const defaultMouseX = useMotionValue(Infinity)\\n\\n  const distanceCalc = useTransform(mouseX ?? defaultMouseX, (val: number) => {\\n    const bounds = ref.current?.getBoundingClientRect() ?? { x: 0, width: 0 }\\n    return val - bounds.x - bounds.width / 2\\n  })\\n\\n  const targetSize = disableMagnification ? size : magnification\\n\\n  const sizeTransform = useTransform(\\n    distanceCalc,\\n    [-distance, 0, distance],\\n    [size, targetSize, size]\\n  )\\n\\n  const scaleSize = useSpring(sizeTransform, {\\n    mass: 0.1,\\n    stiffness: 150,\\n    damping: 12,\\n  })\\n\\n  return (\\n    <motion.div\\n      ref={ref}\\n      style={{ width: scaleSize, height: scaleSize, padding }}\\n      className={cn(\\n        \\\"flex aspect-square cursor-pointer items-center justify-center rounded-full\\\",\\n        disableMagnification && \\\"hover:bg-muted-foreground transition-colors\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <div>{children}</div>\\n    </motion.div>\\n  )\\n}\\n\\nDockIcon.displayName = \\\"DockIcon\\\"\\n\\nexport { Dock, DockIcon, dockVariants }\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dot-pattern-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dot-pattern-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dot Pattern Demo\",\n  \"description\": \"Example showing a background dot pattern made with SVGs.\",\n  \"registryDependencies\": [\n    \"@magicui/dot-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dot-pattern-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { DotPattern } from \\\"@/registry/magicui/dot-pattern\\\"\\n\\nexport default function DotPatternDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <DotPattern\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dot-pattern-linear-gradient.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dot-pattern-linear-gradient\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dot Pattern Linear Gradient\",\n  \"description\": \"Example showing a dot pattern with linear gradient effects.\",\n  \"registryDependencies\": [\n    \"@magicui/dot-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dot-pattern-linear-gradient.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { DotPattern } from \\\"@/registry/magicui/dot-pattern\\\"\\n\\nexport default function DotPatternLinearGradient() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\\\">\\n      <DotPattern\\n        width={20}\\n        height={20}\\n        cx={1}\\n        cy={1}\\n        cr={1}\\n        className={cn(\\n          \\\"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dot-pattern-with-glow-effect.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dot-pattern-with-glow-effect\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dot Pattern with glow effect\",\n  \"description\": \"Example showing a dot pattern with glow effect\",\n  \"registryDependencies\": [\n    \"@magicui/dot-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dot-pattern-with-glow-effect.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { DotPattern } from \\\"@/registry/magicui/dot-pattern\\\"\\n\\nexport default function DotPatternWithGlowEffectDemo() {\\n  return (\\n    <div className=\\\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\\\">\\n      <DotPattern\\n        glow={true}\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dot-pattern.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dot-pattern\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dot Pattern\",\n  \"description\": \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/dot-pattern.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useEffect, useId, useRef, useState } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\n/**\\n *  DotPattern Component Props\\n *\\n * @param {number} [width=16] - The horizontal spacing between dots\\n * @param {number} [height=16] - The vertical spacing between dots\\n * @param {number} [x=0] - The x-offset of the entire pattern\\n * @param {number} [y=0] - The y-offset of the entire pattern\\n * @param {number} [cx=1] - The x-offset of individual dots\\n * @param {number} [cy=1] - The y-offset of individual dots\\n * @param {number} [cr=1] - The radius of each dot\\n * @param {string} [className] - Additional CSS classes to apply to the SVG container\\n * @param {boolean} [glow=false] - Whether dots should have a glowing animation effect\\n */\\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\\n  width?: number\\n  height?: number\\n  x?: number\\n  y?: number\\n  cx?: number\\n  cy?: number\\n  cr?: number\\n  className?: string\\n  glow?: boolean\\n  [key: string]: unknown\\n}\\n\\n/**\\n * DotPattern Component\\n *\\n * A React component that creates an animated or static dot pattern background using SVG.\\n * The pattern automatically adjusts to fill its container and can optionally display glowing dots.\\n *\\n * @component\\n *\\n * @see DotPatternProps for the props interface.\\n *\\n * @example\\n * // Basic usage\\n * <DotPattern />\\n *\\n * // With glowing effect and custom spacing\\n * <DotPattern\\n *   width={20}\\n *   height={20}\\n *   glow={true}\\n *   className=\\\"opacity-50\\\"\\n * />\\n *\\n * @notes\\n * - The component is client-side only (\\\"use client\\\")\\n * - Automatically responds to container size changes\\n * - When glow is enabled, dots will animate with random delays and durations\\n * - Uses Motion for animations\\n * - Dots color can be controlled via the text color utility classes\\n */\\n\\nexport function DotPattern({\\n  width = 16,\\n  height = 16,\\n  x = 0,\\n  y = 0,\\n  cx = 1,\\n  cy = 1,\\n  cr = 1,\\n  className,\\n  glow = false,\\n  ...props\\n}: DotPatternProps) {\\n  const id = useId()\\n  const containerRef = useRef<SVGSVGElement>(null)\\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\\n\\n  useEffect(() => {\\n    const updateDimensions = () => {\\n      if (containerRef.current) {\\n        const { width, height } = containerRef.current.getBoundingClientRect()\\n        setDimensions({ width, height })\\n      }\\n    }\\n\\n    updateDimensions()\\n    window.addEventListener(\\\"resize\\\", updateDimensions)\\n    return () => window.removeEventListener(\\\"resize\\\", updateDimensions)\\n  }, [])\\n\\n  const dots = Array.from(\\n    {\\n      length:\\n        Math.ceil(dimensions.width / width) *\\n        Math.ceil(dimensions.height / height),\\n    },\\n    (_, i) => {\\n      const col = i % Math.ceil(dimensions.width / width)\\n      const row = Math.floor(i / Math.ceil(dimensions.width / width))\\n      return {\\n        x: col * width + cx + x,\\n        y: row * height + cy + y,\\n        delay: Math.random() * 5,\\n        duration: Math.random() * 3 + 2,\\n      }\\n    }\\n  )\\n\\n  return (\\n    <svg\\n      ref={containerRef}\\n      aria-hidden=\\\"true\\\"\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 h-full w-full text-neutral-400/80\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <defs>\\n        <radialGradient id={`${id}-gradient`}>\\n          <stop offset=\\\"0%\\\" stopColor=\\\"currentColor\\\" stopOpacity=\\\"1\\\" />\\n          <stop offset=\\\"100%\\\" stopColor=\\\"currentColor\\\" stopOpacity=\\\"0\\\" />\\n        </radialGradient>\\n      </defs>\\n      {dots.map((dot) => (\\n        <motion.circle\\n          key={`${dot.x}-${dot.y}`}\\n          cx={dot.x}\\n          cy={dot.y}\\n          r={cr}\\n          fill={glow ? `url(#${id}-gradient)` : \\\"currentColor\\\"}\\n          initial={glow ? { opacity: 0.4, scale: 1 } : {}}\\n          animate={\\n            glow\\n              ? {\\n                  opacity: [0.4, 1, 0.4],\\n                  scale: [1, 1.5, 1],\\n                }\\n              : {}\\n          }\\n          transition={\\n            glow\\n              ? {\\n                  duration: dot.duration,\\n                  repeat: Infinity,\\n                  repeatType: \\\"reverse\\\",\\n                  delay: dot.delay,\\n                  ease: \\\"easeInOut\\\",\\n                }\\n              : {}\\n          }\\n        />\\n      ))}\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dotted-map-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dotted-map-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dotted Map Demo 2\",\n  \"description\": \"Example showing a dotted map.\",\n  \"registryDependencies\": [\n    \"@magicui/dotted-map\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dotted-map-demo-2.tsx\",\n      \"content\": \"import { DottedMap } from \\\"@/registry/magicui/dotted-map\\\"\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"relative h-[500px] w-full overflow-hidden rounded-lg border\\\">\\n      <DottedMap dotRadius={0.1} />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dotted-map-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dotted-map-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dotted Map Demo 3\",\n  \"description\": \"Example showing a dotted map with pulse animation.\",\n  \"registryDependencies\": [\n    \"@magicui/dotted-map\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dotted-map-demo-3.tsx\",\n      \"content\": \"import { DottedMap } from \\\"@/registry/magicui/dotted-map\\\"\\nimport type { Marker } from \\\"@/registry/magicui/dotted-map\\\"\\n\\nconst markers: Marker[] = [\\n  {\\n    lat: 37.5665,\\n    lng: 126.978,\\n    size: 0.3,\\n  },\\n  {\\n    lat: 40.7128,\\n    lng: -74.006,\\n    size: 0.3,\\n    pulse: false,\\n  },\\n]\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"relative h-[500px] w-full overflow-hidden rounded-lg border\\\">\\n      <div className=\\\"to-background absolute inset-0 bg-radial from-transparent to-200%\\\" />\\n      <DottedMap markers={markers} pulse />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dotted-map-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dotted-map-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Dotted Map Demo\",\n  \"description\": \"Example showing a dotted map.\",\n  \"dependencies\": [\n    \"countries-list\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/dotted-map\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/dotted-map-demo.tsx\",\n      \"content\": \"import * as React from \\\"react\\\"\\nimport type { TCountryCode } from \\\"countries-list\\\"\\n\\nimport { DottedMap } from \\\"@/registry/magicui/dotted-map\\\"\\nimport type { Marker } from \\\"@/registry/magicui/dotted-map\\\"\\n\\ntype CountryCode = Lowercase<TCountryCode>\\n\\ntype MyMarker = Marker & {\\n  overlay: {\\n    countryCode: CountryCode\\n    label: string\\n  }\\n}\\n\\nconst markers: MyMarker[] = [\\n  {\\n    lat: 37.5665,\\n    lng: 126.978,\\n    size: 2.8,\\n    overlay: { countryCode: \\\"kr\\\", label: \\\"Seoul\\\" },\\n  },\\n  {\\n    lat: 40.7128,\\n    lng: -74.006,\\n    size: 2.8,\\n    overlay: { countryCode: \\\"us\\\", label: \\\"NYC\\\" },\\n  },\\n]\\n\\nexport default function Component() {\\n  const id = React.useId()\\n  return (\\n    <div className=\\\"relative h-[500px] w-full overflow-hidden rounded-lg border\\\">\\n      <div className=\\\"to-background absolute inset-0 bg-radial from-transparent to-200%\\\" />\\n      <DottedMap<MyMarker>\\n        markers={markers}\\n        renderMarkerOverlay={({ marker, x, y, r, index }) => {\\n          const { countryCode, label } = marker.overlay\\n          const href = `https://flagcdn.com/w80/${countryCode}.webp` // FlagCDN  [oai_citation:7‡Flagpedia](https://flagpedia.net/download/api)\\n\\n          const clipId = `${id}-flag-clip-${index}`.replace(/:/g, \\\"-\\\")\\n          const imgR = r * 0.75\\n\\n          const fontSize = r * 0.9\\n          const pillH = r * 1.5\\n          const pillW = label.length * (fontSize * 0.62) + r * 1.4\\n          const pillX = x + r + r * 0.6\\n          const pillY = y - pillH / 2\\n\\n          return (\\n            <g style={{ pointerEvents: \\\"none\\\" }}>\\n              <clipPath id={clipId}>\\n                <circle cx={x} cy={y} r={imgR} />\\n              </clipPath>\\n\\n              <image\\n                href={href}\\n                x={x - imgR}\\n                y={y - imgR}\\n                width={imgR * 2}\\n                height={imgR * 2}\\n                preserveAspectRatio=\\\"xMidYMid slice\\\"\\n                clipPath={`url(#${clipId})`}\\n              />\\n\\n              <rect\\n                x={pillX}\\n                y={pillY}\\n                width={pillW}\\n                height={pillH}\\n                rx={pillH / 2}\\n                fill=\\\"rgba(0,0,0,0.55)\\\"\\n              />\\n              <text\\n                x={pillX + r * 0.7}\\n                y={y + fontSize * 0.35}\\n                fontSize={fontSize}\\n                fill=\\\"white\\\"\\n              >\\n                {label}\\n              </text>\\n            </g>\\n          )\\n        }}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/dotted-map.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dotted-map\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dotted Map\",\n  \"description\": \"A component with a dotted map.\",\n  \"dependencies\": [\n    \"svg-dotted-map\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/dotted-map.tsx\",\n      \"content\": \"import * as React from \\\"react\\\"\\nimport { createMap } from \\\"svg-dotted-map\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface Marker {\\n  lat: number\\n  lng: number\\n  size?: number\\n  pulse?: boolean\\n}\\n\\n/** addMarkers returns markers with lat/lng removed; only x, y and other props (e.g. size) remain */\\ntype MapMarker<M extends Marker> = Omit<M, \\\"lat\\\" | \\\"lng\\\"> & {\\n  x: number\\n  y: number\\n}\\n\\nexport interface DottedMapProps<\\n  M extends Marker = Marker,\\n> extends React.SVGProps<SVGSVGElement> {\\n  width?: number\\n  height?: number\\n  mapSamples?: number\\n  markers?: M[]\\n  dotColor?: string\\n  markerColor?: string\\n  dotRadius?: number\\n  stagger?: boolean\\n  pulse?: boolean\\n\\n  renderMarkerOverlay?: (args: {\\n    marker: MapMarker<M>\\n    index: number\\n    x: number\\n    y: number\\n    r: number\\n  }) => React.ReactNode\\n}\\n\\nexport function DottedMap<M extends Marker = Marker>({\\n  width = 150,\\n  height = 75,\\n  mapSamples = 5000,\\n  markers = [],\\n  dotColor = \\\"currentColor\\\",\\n  markerColor = \\\"#FF6900\\\",\\n  dotRadius = 0.2,\\n  stagger = true,\\n  pulse = false,\\n  renderMarkerOverlay,\\n  className,\\n  style,\\n  ...svgProps\\n}: DottedMapProps<M>) {\\n  const { points, addMarkers } = createMap({\\n    width,\\n    height,\\n    mapSamples,\\n  })\\n  const processedMarkers = addMarkers(markers)\\n\\n  // Compute stagger helpers in a single, simple pass\\n  const { xStep, yToRowIndex } = React.useMemo(() => {\\n    const sorted = [...points].sort((a, b) => a.y - b.y || a.x - b.x)\\n    const rowMap = new Map<number, number>()\\n    let step = 0\\n    let prevY = Number.NaN\\n    let prevXInRow = Number.NaN\\n\\n    for (const p of sorted) {\\n      if (p.y !== prevY) {\\n        // new row\\n        prevY = p.y\\n        prevXInRow = Number.NaN\\n        if (!rowMap.has(p.y)) rowMap.set(p.y, rowMap.size)\\n      }\\n      if (!Number.isNaN(prevXInRow)) {\\n        const delta = p.x - prevXInRow\\n        if (delta > 0) step = step === 0 ? delta : Math.min(step, delta)\\n      }\\n      prevXInRow = p.x\\n    }\\n\\n    return { xStep: step || 1, yToRowIndex: rowMap }\\n  }, [points])\\n\\n  return (\\n    <svg\\n      viewBox={`0 0 ${width} ${height}`}\\n      className={cn(\\\"text-gray-500 dark:text-gray-500\\\", className)}\\n      style={{ width: \\\"100%\\\", height: \\\"100%\\\", ...style }}\\n      {...svgProps}\\n    >\\n      {points.map((point, index) => {\\n        const rowIndex = yToRowIndex.get(point.y) ?? 0\\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\\n        return (\\n          <circle\\n            cx={point.x + offsetX}\\n            cy={point.y}\\n            r={dotRadius}\\n            fill={dotColor}\\n            key={`${point.x}-${point.y}-${index}`}\\n          />\\n        )\\n      })}\\n\\n      {processedMarkers.map((marker, index) => {\\n        const rowIndex = yToRowIndex.get(marker.y) ?? 0\\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\\n\\n        const x = marker.x + offsetX\\n        const y = marker.y\\n        const r = marker.size ?? dotRadius\\n        const shouldPulse = pulse\\n          ? marker.pulse !== false\\n          : marker.pulse === true\\n        const pulseTo = r * 2.8\\n\\n        return (\\n          <g key={`${marker.x}-${marker.y}-${index}`}>\\n            <circle cx={x} cy={y} r={r} fill={markerColor} />\\n\\n            {shouldPulse ? (\\n              <g pointerEvents=\\\"none\\\">\\n                <circle\\n                  cx={x}\\n                  cy={y}\\n                  r={r}\\n                  fill=\\\"none\\\"\\n                  stroke={markerColor}\\n                  strokeOpacity={1}\\n                  strokeWidth={0.35}\\n                >\\n                  <animate\\n                    attributeName=\\\"r\\\"\\n                    values={`${r};${pulseTo}`}\\n                    dur=\\\"1.4s\\\"\\n                    repeatCount=\\\"indefinite\\\"\\n                  />\\n                  <animate\\n                    attributeName=\\\"opacity\\\"\\n                    values=\\\"1;0\\\"\\n                    dur=\\\"1.4s\\\"\\n                    repeatCount=\\\"indefinite\\\"\\n                  />\\n                </circle>\\n                <circle\\n                  cx={x}\\n                  cy={y}\\n                  r={r}\\n                  fill=\\\"none\\\"\\n                  stroke={markerColor}\\n                  strokeOpacity={0.9}\\n                  strokeWidth={0.3}\\n                >\\n                  <animate\\n                    attributeName=\\\"r\\\"\\n                    values={`${r};${pulseTo}`}\\n                    dur=\\\"1.4s\\\"\\n                    begin=\\\"0.7s\\\"\\n                    repeatCount=\\\"indefinite\\\"\\n                  />\\n                  <animate\\n                    attributeName=\\\"opacity\\\"\\n                    values=\\\"0.9;0\\\"\\n                    dur=\\\"1.4s\\\"\\n                    begin=\\\"0.7s\\\"\\n                    repeatCount=\\\"indefinite\\\"\\n                  />\\n                </circle>\\n              </g>\\n            ) : null}\\n\\n            {renderMarkerOverlay?.({\\n              marker: { ...marker, x, y },\\n              index,\\n              x,\\n              y,\\n              r,\\n            })}\\n          </g>\\n        )\\n      })}\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/file-tree-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"file-tree-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"File Tree Demo\",\n  \"description\": \"Example showing a component that displays folder and file structure.\",\n  \"registryDependencies\": [\n    \"@magicui/file-tree\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/file-tree-demo.tsx\",\n      \"content\": \"import { Tree } from \\\"@/registry/magicui/file-tree\\\"\\nimport type { TreeViewElement } from \\\"@/registry/magicui/file-tree\\\"\\n\\nexport default function FileTreeDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[300px] w-full max-w-sm flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <Tree\\n        className=\\\"bg-background overflow-hidden rounded-md p-2\\\"\\n        initialSelectedId=\\\"button\\\"\\n        initialExpandedItems={[\\\"src\\\", \\\"app\\\", \\\"components\\\", \\\"ui\\\", \\\"lib\\\"]}\\n        elements={ELEMENTS}\\n      />\\n    </div>\\n  )\\n}\\n\\nconst ELEMENTS: TreeViewElement[] = [\\n  {\\n    id: \\\"src\\\",\\n    type: \\\"folder\\\",\\n    isSelectable: true,\\n    name: \\\"src\\\",\\n    children: [\\n      {\\n        id: \\\"lib\\\",\\n        type: \\\"folder\\\",\\n        isSelectable: true,\\n        name: \\\"lib\\\",\\n        children: [\\n          {\\n            id: \\\"utils\\\",\\n            isSelectable: true,\\n            name: \\\"utils.ts\\\",\\n          },\\n        ],\\n      },\\n      {\\n        id: \\\"app\\\",\\n        type: \\\"folder\\\",\\n        isSelectable: true,\\n        name: \\\"app\\\",\\n        children: [\\n          {\\n            id: \\\"page\\\",\\n            isSelectable: true,\\n            name: \\\"page.tsx\\\",\\n          },\\n          {\\n            id: \\\"layout\\\",\\n            isSelectable: true,\\n            name: \\\"layout.tsx\\\",\\n          },\\n        ],\\n      },\\n      {\\n        id: \\\"components\\\",\\n        type: \\\"folder\\\",\\n        isSelectable: true,\\n        name: \\\"components\\\",\\n        children: [\\n          {\\n            id: \\\"header\\\",\\n            isSelectable: true,\\n            name: \\\"header.tsx\\\",\\n          },\\n          {\\n            id: \\\"ui\\\",\\n            type: \\\"folder\\\",\\n            isSelectable: true,\\n            name: \\\"ui\\\",\\n            children: [\\n              {\\n                id: \\\"button\\\",\\n                isSelectable: true,\\n                name: \\\"button.tsx\\\",\\n              },\\n            ],\\n          },\\n          {\\n            id: \\\"footer\\\",\\n            isSelectable: true,\\n            name: \\\"footer.tsx\\\",\\n          },\\n        ],\\n      },\\n    ],\\n  },\\n]\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/file-tree.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"file-tree\",\n  \"type\": \"registry:ui\",\n  \"title\": \"File Tree\",\n  \"description\": \"A component used to showcase the folder and file structure of a directory.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/file-tree.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, {\\n  createContext,\\n  forwardRef,\\n  useCallback,\\n  useContext,\\n  useEffect,\\n  useState,\\n} from \\\"react\\\"\\nimport * as AccordionPrimitive from \\\"@radix-ui/react-accordion\\\"\\nimport { FileIcon, FolderIcon, FolderOpenIcon } from \\\"lucide-react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport { ScrollArea } from \\\"@/components/ui/scroll-area\\\"\\n\\ntype TreeViewElement = {\\n  id: string\\n  name: string\\n  type?: \\\"file\\\" | \\\"folder\\\"\\n  isSelectable?: boolean\\n  children?: TreeViewElement[]\\n}\\n\\ntype TreeSortMode =\\n  | \\\"default\\\"\\n  | \\\"none\\\"\\n  | ((a: TreeViewElement, b: TreeViewElement) => number)\\n\\ntype TreeContextProps = {\\n  selectedId: string | undefined\\n  expandedItems: string[] | undefined\\n  indicator: boolean\\n  handleExpand: (id: string) => void\\n  selectItem: (id: string) => void\\n  setExpandedItems?: React.Dispatch<React.SetStateAction<string[] | undefined>>\\n  openIcon?: React.ReactNode\\n  closeIcon?: React.ReactNode\\n  direction: \\\"rtl\\\" | \\\"ltr\\\"\\n}\\n\\nconst TreeContext = createContext<TreeContextProps | null>(null)\\n\\nconst useTree = () => {\\n  const context = useContext(TreeContext)\\n  if (!context) {\\n    throw new Error(\\\"useTree must be used within a TreeProvider\\\")\\n  }\\n  return context\\n}\\n\\ntype Direction = \\\"rtl\\\" | \\\"ltr\\\" | undefined\\n\\nconst isFolderElement = (element: TreeViewElement) => {\\n  if (element.type) {\\n    return element.type === \\\"folder\\\"\\n  }\\n\\n  return Array.isArray(element.children)\\n}\\n\\nconst mergeExpandedItems = (\\n  currentItems: string[] | undefined,\\n  nextItems: string[]\\n) => [...new Set([...(currentItems ?? []), ...nextItems])]\\n\\nconst treeCollator = new Intl.Collator(\\\"en\\\", {\\n  numeric: true,\\n  sensitivity: \\\"base\\\",\\n})\\n\\nconst defaultTreeComparator = (a: TreeViewElement, b: TreeViewElement) => {\\n  const aIsFolder = isFolderElement(a)\\n  const bIsFolder = isFolderElement(b)\\n\\n  if (aIsFolder !== bIsFolder) {\\n    return aIsFolder ? -1 : 1\\n  }\\n\\n  return treeCollator.compare(a.name, b.name)\\n}\\n\\nconst getTreeComparator = (sort: TreeSortMode) => {\\n  if (sort === \\\"none\\\") {\\n    return undefined\\n  }\\n\\n  if (sort === \\\"default\\\") {\\n    return defaultTreeComparator\\n  }\\n\\n  return sort\\n}\\n\\nconst sortTreeElements = (\\n  elements: TreeViewElement[],\\n  sort: TreeSortMode\\n): TreeViewElement[] => {\\n  const comparator = getTreeComparator(sort)\\n\\n  const nextElements = elements.map((element) => {\\n    if (!Array.isArray(element.children)) {\\n      return element\\n    }\\n\\n    return {\\n      ...element,\\n      children: sortTreeElements(element.children, sort),\\n    }\\n  })\\n\\n  if (!comparator) {\\n    return nextElements\\n  }\\n\\n  return [...nextElements].sort(comparator)\\n}\\n\\nconst renderTreeElements = (\\n  elements: TreeViewElement[],\\n  sort: TreeSortMode\\n): React.ReactNode =>\\n  sortTreeElements(elements, sort).map((element) => {\\n    if (isFolderElement(element)) {\\n      return (\\n        <Folder\\n          key={element.id}\\n          value={element.id}\\n          element={element.name}\\n          isSelectable={element.isSelectable}\\n        >\\n          {Array.isArray(element.children)\\n            ? renderTreeElements(element.children, sort)\\n            : null}\\n        </Folder>\\n      )\\n    }\\n\\n    return (\\n      <File\\n        key={element.id}\\n        value={element.id}\\n        isSelectable={element.isSelectable}\\n      >\\n        <span>{element.name}</span>\\n      </File>\\n    )\\n  })\\n\\ntype TreeViewProps = {\\n  initialSelectedId?: string\\n  indicator?: boolean\\n  elements?: TreeViewElement[]\\n  initialExpandedItems?: string[]\\n  openIcon?: React.ReactNode\\n  closeIcon?: React.ReactNode\\n  sort?: TreeSortMode\\n} & Omit<\\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\\n  \\\"defaultValue\\\" | \\\"onValueChange\\\" | \\\"type\\\" | \\\"value\\\"\\n>\\n\\nconst Tree = forwardRef<HTMLDivElement, TreeViewProps>(\\n  (\\n    {\\n      className,\\n      elements,\\n      initialSelectedId,\\n      initialExpandedItems,\\n      children,\\n      indicator = true,\\n      openIcon,\\n      closeIcon,\\n      sort = \\\"default\\\",\\n      dir,\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    const [selectedId, setSelectedId] = useState<string | undefined>(\\n      initialSelectedId\\n    )\\n    const [expandedItems, setExpandedItems] = useState<string[] | undefined>(\\n      initialExpandedItems\\n    )\\n\\n    const selectItem = useCallback((id: string) => {\\n      setSelectedId(id)\\n    }, [])\\n\\n    const handleExpand = useCallback((id: string) => {\\n      setExpandedItems((prev) => {\\n        if (prev?.includes(id)) {\\n          return prev.filter((item) => item !== id)\\n        }\\n        return [...(prev ?? []), id]\\n      })\\n    }, [])\\n\\n    const expandSpecificTargetedElements = useCallback(\\n      (elements?: TreeViewElement[], selectId?: string) => {\\n        if (!elements || !selectId) return\\n        const findParent = (\\n          currentElement: TreeViewElement,\\n          currentPath: string[] = []\\n        ) => {\\n          const isSelectable = currentElement.isSelectable ?? true\\n          const newPath = [...currentPath, currentElement.id]\\n          if (currentElement.id === selectId) {\\n            if (isSelectable) {\\n              setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\\n            } else {\\n              if (newPath.includes(currentElement.id)) {\\n                newPath.pop()\\n                setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\\n              }\\n            }\\n            return\\n          }\\n          if (\\n            Array.isArray(currentElement.children) &&\\n            currentElement.children.length > 0\\n          ) {\\n            currentElement.children.forEach((child) => {\\n              findParent(child, newPath)\\n            })\\n          }\\n        }\\n        elements.forEach((element) => {\\n          findParent(element)\\n        })\\n      },\\n      []\\n    )\\n\\n    useEffect(() => {\\n      if (initialSelectedId) {\\n        expandSpecificTargetedElements(elements, initialSelectedId)\\n      }\\n    }, [initialSelectedId, elements, expandSpecificTargetedElements])\\n\\n    const direction = dir === \\\"rtl\\\" ? \\\"rtl\\\" : \\\"ltr\\\"\\n    const treeChildren =\\n      children ?? (elements ? renderTreeElements(elements, sort) : null)\\n\\n    return (\\n      <TreeContext.Provider\\n        value={{\\n          selectedId,\\n          expandedItems,\\n          handleExpand,\\n          selectItem,\\n          setExpandedItems,\\n          indicator,\\n          openIcon,\\n          closeIcon,\\n          direction,\\n        }}\\n      >\\n        <div className={cn(\\\"size-full\\\", className)}>\\n          <ScrollArea\\n            ref={ref}\\n            className=\\\"relative h-full px-2\\\"\\n            dir={dir as Direction}\\n          >\\n            <AccordionPrimitive.Root\\n              {...props}\\n              type=\\\"multiple\\\"\\n              value={expandedItems}\\n              className=\\\"flex flex-col gap-1\\\"\\n              dir={dir as Direction}\\n            >\\n              {treeChildren}\\n            </AccordionPrimitive.Root>\\n          </ScrollArea>\\n        </div>\\n      </TreeContext.Provider>\\n    )\\n  }\\n)\\n\\nTree.displayName = \\\"Tree\\\"\\n\\nconst TreeIndicator = forwardRef<\\n  HTMLDivElement,\\n  React.HTMLAttributes<HTMLDivElement>\\n>(({ className, ...props }, ref) => {\\n  const { direction } = useTree()\\n\\n  return (\\n    <div\\n      dir={direction}\\n      ref={ref}\\n      className={cn(\\n        \\\"bg-muted absolute left-1.5 h-full w-px rounded-md py-3 duration-300 ease-in-out hover:bg-slate-300 rtl:right-1.5\\\",\\n        className\\n      )}\\n      {...props}\\n    />\\n  )\\n})\\n\\nTreeIndicator.displayName = \\\"TreeIndicator\\\"\\n\\ntype FolderProps = {\\n  expandedItems?: string[]\\n  element: string\\n  isSelectable?: boolean\\n  isSelect?: boolean\\n} & React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\\n\\nconst Folder = forwardRef<\\n  HTMLDivElement,\\n  FolderProps & React.HTMLAttributes<HTMLDivElement>\\n>(\\n  (\\n    {\\n      className,\\n      element,\\n      value,\\n      isSelectable = true,\\n      isSelect,\\n      children,\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    const {\\n      direction,\\n      handleExpand,\\n      expandedItems,\\n      indicator,\\n      selectedId,\\n      selectItem,\\n      openIcon,\\n      closeIcon,\\n    } = useTree()\\n    const isSelected = isSelect ?? selectedId === value\\n\\n    return (\\n      <AccordionPrimitive.Item\\n        ref={ref}\\n        {...props}\\n        value={value}\\n        className=\\\"relative h-full overflow-hidden\\\"\\n      >\\n        <AccordionPrimitive.Trigger\\n          className={cn(\\n            `flex items-center gap-1 rounded-md text-sm`,\\n            className,\\n            {\\n              \\\"bg-muted rounded-md\\\": isSelected && isSelectable,\\n              \\\"cursor-pointer\\\": isSelectable,\\n              \\\"cursor-not-allowed opacity-50\\\": !isSelectable,\\n            }\\n          )}\\n          disabled={!isSelectable}\\n          onClick={() => {\\n            selectItem(value)\\n            handleExpand(value)\\n          }}\\n        >\\n          {expandedItems?.includes(value)\\n            ? (openIcon ?? <FolderOpenIcon className=\\\"size-4\\\" />)\\n            : (closeIcon ?? <FolderIcon className=\\\"size-4\\\" />)}\\n          <span>{element}</span>\\n        </AccordionPrimitive.Trigger>\\n        <AccordionPrimitive.Content className=\\\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down relative h-full overflow-hidden text-sm\\\">\\n          {element && indicator && <TreeIndicator aria-hidden=\\\"true\\\" />}\\n          <AccordionPrimitive.Root\\n            dir={direction}\\n            type=\\\"multiple\\\"\\n            className=\\\"ml-5 flex flex-col gap-1 py-1 rtl:mr-5\\\"\\n            value={expandedItems}\\n          >\\n            {children}\\n          </AccordionPrimitive.Root>\\n        </AccordionPrimitive.Content>\\n      </AccordionPrimitive.Item>\\n    )\\n  }\\n)\\n\\nFolder.displayName = \\\"Folder\\\"\\n\\nconst File = forwardRef<\\n  HTMLButtonElement,\\n  {\\n    value: string\\n    handleSelect?: (id: string) => void\\n    isSelectable?: boolean\\n    isSelect?: boolean\\n    fileIcon?: React.ReactNode\\n  } & React.ButtonHTMLAttributes<HTMLButtonElement>\\n>(\\n  (\\n    {\\n      value,\\n      className,\\n      handleSelect,\\n      onClick,\\n      isSelectable = true,\\n      isSelect,\\n      fileIcon,\\n      children,\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    const { direction, selectedId, selectItem } = useTree()\\n    const isSelected = isSelect ?? selectedId === value\\n    return (\\n      <button\\n        ref={ref}\\n        type=\\\"button\\\"\\n        disabled={!isSelectable}\\n        className={cn(\\n          \\\"flex w-fit items-center gap-1 rounded-md pr-1 text-sm duration-200 ease-in-out rtl:pr-0 rtl:pl-1\\\",\\n          {\\n            \\\"bg-muted\\\": isSelected && isSelectable,\\n          },\\n          isSelectable ? \\\"cursor-pointer\\\" : \\\"cursor-not-allowed opacity-50\\\",\\n          direction === \\\"rtl\\\" ? \\\"rtl\\\" : \\\"ltr\\\",\\n          className\\n        )}\\n        onClick={(event) => {\\n          selectItem(value)\\n          handleSelect?.(value)\\n          onClick?.(event)\\n        }}\\n        {...props}\\n      >\\n        {fileIcon ?? <FileIcon className=\\\"size-4\\\" />}\\n        {children}\\n      </button>\\n    )\\n  }\\n)\\n\\nFile.displayName = \\\"File\\\"\\n\\nconst CollapseButton = forwardRef<\\n  HTMLButtonElement,\\n  {\\n    elements: TreeViewElement[]\\n    expandAll?: boolean\\n  } & React.HTMLAttributes<HTMLButtonElement>\\n>(({ className, elements, expandAll = false, children, ...props }, ref) => {\\n  const { expandedItems, setExpandedItems } = useTree()\\n\\n  const expendAllTree = useCallback((elements: TreeViewElement[]) => {\\n    const expandedElementIds: string[] = []\\n\\n    const expandTree = (element: TreeViewElement) => {\\n      const isSelectable = element.isSelectable ?? true\\n      if (isSelectable && element.children && element.children.length > 0) {\\n        expandedElementIds.push(element.id)\\n        for (const child of element.children) {\\n          expandTree(child)\\n        }\\n      }\\n    }\\n\\n    for (const element of elements) {\\n      expandTree(element)\\n    }\\n\\n    return [...new Set(expandedElementIds)]\\n  }, [])\\n\\n  const closeAll = useCallback(() => {\\n    setExpandedItems?.([])\\n  }, [setExpandedItems])\\n\\n  useEffect(() => {\\n    if (expandAll) {\\n      setExpandedItems?.(expendAllTree(elements))\\n    }\\n  }, [expandAll, elements, expendAllTree, setExpandedItems])\\n\\n  return (\\n    <Button\\n      variant={\\\"ghost\\\"}\\n      className={cn(\\\"absolute right-2 bottom-1 h-8 w-fit p-1\\\", className)}\\n      onClick={\\n        expandedItems && expandedItems.length > 0\\n          ? closeAll\\n          : () => setExpandedItems?.(expendAllTree(elements))\\n      }\\n      ref={ref}\\n      {...props}\\n    >\\n      {children}\\n      <span className=\\\"sr-only\\\">Toggle</span>\\n    </Button>\\n  )\\n})\\n\\nCollapseButton.displayName = \\\"CollapseButton\\\"\\n\\nexport { CollapseButton, File, Folder, Tree, type TreeViewElement }\\nexport type { TreeSortMode }\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/flickering-grid-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"flickering-grid-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Flickering Grid Demo\",\n  \"description\": \"Example showing a flickering grid background.\",\n  \"registryDependencies\": [\n    \"@magicui/flickering-grid\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/flickering-grid-demo.tsx\",\n      \"content\": \"import { FlickeringGrid } from \\\"@/registry/magicui/flickering-grid\\\"\\n\\nexport default function FlickeringGridDemo() {\\n  return (\\n    <div className=\\\"bg-background relative h-[500px] w-full overflow-hidden rounded-lg border\\\">\\n      <FlickeringGrid\\n        className=\\\"absolute inset-0 z-0 size-full\\\"\\n        squareSize={4}\\n        gridGap={6}\\n        color=\\\"#6B7280\\\"\\n        maxOpacity={0.5}\\n        flickerChance={0.1}\\n        height={800}\\n        width={800}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/flickering-grid-rounded-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"flickering-grid-rounded-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Flickering Grid Rounded Demo\",\n  \"description\": \"Example showing a flickering grid background with rounded corners.\",\n  \"registryDependencies\": [\n    \"@magicui/flickering-grid\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/flickering-grid-rounded-demo.tsx\",\n      \"content\": \"import { FlickeringGrid } from \\\"@/registry/magicui/flickering-grid\\\"\\n\\nexport default function FlickeringGridRoundedDemo() {\\n  return (\\n    <div className=\\\"bg-background relative size-[600px] w-full overflow-hidden rounded-lg border\\\">\\n      <FlickeringGrid\\n        className=\\\"relative inset-0 z-0 [mask-image:radial-gradient(450px_circle_at_center,white,transparent)]\\\"\\n        squareSize={4}\\n        gridGap={6}\\n        color=\\\"#60A5FA\\\"\\n        maxOpacity={0.5}\\n        flickerChance={0.1}\\n        height={800}\\n        width={800}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/flickering-grid.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"flickering-grid\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Flickering Grid\",\n  \"description\": \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/flickering-grid.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface FlickeringGridProps extends React.HTMLAttributes<HTMLDivElement> {\\n  squareSize?: number\\n  gridGap?: number\\n  flickerChance?: number\\n  color?: string\\n  width?: number\\n  height?: number\\n  className?: string\\n  maxOpacity?: number\\n}\\n\\nexport const FlickeringGrid: React.FC<FlickeringGridProps> = ({\\n  squareSize = 4,\\n  gridGap = 6,\\n  flickerChance = 0.3,\\n  color = \\\"rgb(0, 0, 0)\\\",\\n  width,\\n  height,\\n  className,\\n  maxOpacity = 0.3,\\n  ...props\\n}) => {\\n  const canvasRef = useRef<HTMLCanvasElement>(null)\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const [isInView, setIsInView] = useState(false)\\n  const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0 })\\n\\n  const memoizedColor = useMemo(() => {\\n    const toRGBA = (color: string) => {\\n      if (typeof window === \\\"undefined\\\") {\\n        return `rgba(0, 0, 0,`\\n      }\\n      const canvas = document.createElement(\\\"canvas\\\")\\n      canvas.width = canvas.height = 1\\n      const ctx = canvas.getContext(\\\"2d\\\")\\n      if (!ctx) return \\\"rgba(255, 0, 0,\\\"\\n      ctx.fillStyle = color\\n      ctx.fillRect(0, 0, 1, 1)\\n      const [r, g, b] = Array.from(ctx.getImageData(0, 0, 1, 1).data)\\n      return `rgba(${r}, ${g}, ${b},`\\n    }\\n    return toRGBA(color)\\n  }, [color])\\n\\n  const setupCanvas = useCallback(\\n    (canvas: HTMLCanvasElement, width: number, height: number) => {\\n      const dpr = window.devicePixelRatio || 1\\n      canvas.width = width * dpr\\n      canvas.height = height * dpr\\n      canvas.style.width = `${width}px`\\n      canvas.style.height = `${height}px`\\n      const cols = Math.ceil(width / (squareSize + gridGap))\\n      const rows = Math.ceil(height / (squareSize + gridGap))\\n\\n      const squares = new Float32Array(cols * rows)\\n      for (let i = 0; i < squares.length; i++) {\\n        squares[i] = Math.random() * maxOpacity\\n      }\\n\\n      return { cols, rows, squares, dpr }\\n    },\\n    [squareSize, gridGap, maxOpacity]\\n  )\\n\\n  const updateSquares = useCallback(\\n    (squares: Float32Array, deltaTime: number) => {\\n      for (let i = 0; i < squares.length; i++) {\\n        if (Math.random() < flickerChance * deltaTime) {\\n          squares[i] = Math.random() * maxOpacity\\n        }\\n      }\\n    },\\n    [flickerChance, maxOpacity]\\n  )\\n\\n  const drawGrid = useCallback(\\n    (\\n      ctx: CanvasRenderingContext2D,\\n      width: number,\\n      height: number,\\n      cols: number,\\n      rows: number,\\n      squares: Float32Array,\\n      dpr: number\\n    ) => {\\n      ctx.clearRect(0, 0, width, height)\\n      ctx.fillStyle = \\\"transparent\\\"\\n      ctx.fillRect(0, 0, width, height)\\n\\n      for (let i = 0; i < cols; i++) {\\n        for (let j = 0; j < rows; j++) {\\n          const opacity = squares[i * rows + j]\\n          ctx.fillStyle = `${memoizedColor}${opacity})`\\n          ctx.fillRect(\\n            i * (squareSize + gridGap) * dpr,\\n            j * (squareSize + gridGap) * dpr,\\n            squareSize * dpr,\\n            squareSize * dpr\\n          )\\n        }\\n      }\\n    },\\n    [memoizedColor, squareSize, gridGap]\\n  )\\n\\n  useEffect(() => {\\n    const canvas = canvasRef.current\\n    const container = containerRef.current\\n    const ctx = canvas?.getContext(\\\"2d\\\") ?? null\\n    let animationFrameId: number | null = null\\n    let resizeObserver: ResizeObserver | null = null\\n    let intersectionObserver: IntersectionObserver | null = null\\n    let gridParams: ReturnType<typeof setupCanvas> | null = null\\n\\n    if (canvas && container && ctx) {\\n      const updateCanvasSize = () => {\\n        const newWidth = width || container.clientWidth\\n        const newHeight = height || container.clientHeight\\n        setCanvasSize({ width: newWidth, height: newHeight })\\n        gridParams = setupCanvas(canvas, newWidth, newHeight)\\n      }\\n\\n      updateCanvasSize()\\n\\n      let lastTime = 0\\n      const animate = (time: number) => {\\n        if (!isInView || !gridParams) return\\n\\n        const deltaTime = (time - lastTime) / 1000\\n        lastTime = time\\n\\n        updateSquares(gridParams.squares, deltaTime)\\n        drawGrid(\\n          ctx,\\n          canvas.width,\\n          canvas.height,\\n          gridParams.cols,\\n          gridParams.rows,\\n          gridParams.squares,\\n          gridParams.dpr\\n        )\\n        animationFrameId = requestAnimationFrame(animate)\\n      }\\n\\n      resizeObserver = new ResizeObserver(() => {\\n        updateCanvasSize()\\n      })\\n      resizeObserver.observe(container)\\n\\n      intersectionObserver = new IntersectionObserver(\\n        ([entry]) => {\\n          setIsInView(entry.isIntersecting)\\n        },\\n        { threshold: 0 }\\n      )\\n      intersectionObserver.observe(canvas)\\n\\n      if (isInView) {\\n        animationFrameId = requestAnimationFrame(animate)\\n      }\\n    }\\n\\n    return () => {\\n      if (animationFrameId !== null) {\\n        cancelAnimationFrame(animationFrameId)\\n      }\\n      if (resizeObserver) {\\n        resizeObserver.disconnect()\\n      }\\n      if (intersectionObserver) {\\n        intersectionObserver.disconnect()\\n      }\\n    }\\n  }, [setupCanvas, updateSquares, drawGrid, width, height, isInView])\\n\\n  return (\\n    <div\\n      ref={containerRef}\\n      className={cn(`h-full w-full ${className}`)}\\n      {...props}\\n    >\\n      <canvas\\n        ref={canvasRef}\\n        className=\\\"pointer-events-none\\\"\\n        style={{\\n          width: canvasSize.width,\\n          height: canvasSize.height,\\n        }}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/globe-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"globe-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Globe Demo\",\n  \"description\": \"Example showing an autorotating, interactive WebGL globe.\",\n  \"registryDependencies\": [\n    \"@magicui/globe\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/globe-demo.tsx\",\n      \"content\": \"import { Globe } from \\\"@/registry/magicui/globe\\\"\\n\\nexport default function GlobeDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border px-40 pt-8 pb-40 md:pb-60\\\">\\n      <span className=\\\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\\\">\\n        Globe\\n      </span>\\n      <Globe className=\\\"top-28\\\" />\\n      <div className=\\\"pointer-events-none absolute inset-0 h-full bg-[radial-gradient(circle_at_50%_200%,rgba(0,0,0,0.2),rgba(255,255,255,0))]\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/globe.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"globe\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Globe\",\n  \"description\": \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n  \"dependencies\": [\n    \"cobe\",\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/globe.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useRef } from \\\"react\\\"\\nimport createGlobe, { type COBEOptions } from \\\"cobe\\\"\\nimport { useMotionValue, useSpring } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst MOVEMENT_DAMPING = 1400\\n\\nconst GLOBE_CONFIG: COBEOptions = {\\n  width: 800,\\n  height: 800,\\n  onRender: () => {},\\n  devicePixelRatio: 2,\\n  phi: 0,\\n  theta: 0.3,\\n  dark: 0,\\n  diffuse: 0.4,\\n  mapSamples: 16000,\\n  mapBrightness: 1.2,\\n  baseColor: [1, 1, 1],\\n  markerColor: [251 / 255, 100 / 255, 21 / 255],\\n  glowColor: [1, 1, 1],\\n  markers: [\\n    { location: [14.5995, 120.9842], size: 0.03 },\\n    { location: [19.076, 72.8777], size: 0.1 },\\n    { location: [23.8103, 90.4125], size: 0.05 },\\n    { location: [30.0444, 31.2357], size: 0.07 },\\n    { location: [39.9042, 116.4074], size: 0.08 },\\n    { location: [-23.5505, -46.6333], size: 0.1 },\\n    { location: [19.4326, -99.1332], size: 0.1 },\\n    { location: [40.7128, -74.006], size: 0.1 },\\n    { location: [34.6937, 135.5022], size: 0.05 },\\n    { location: [41.0082, 28.9784], size: 0.06 },\\n  ],\\n}\\n\\nexport function Globe({\\n  className,\\n  config = GLOBE_CONFIG,\\n}: {\\n  className?: string\\n  config?: COBEOptions\\n}) {\\n  const canvasRef = useRef<HTMLCanvasElement>(null)\\n  const phiRef = useRef(0)\\n  const widthRef = useRef(0)\\n  const pointerInteracting = useRef<number | null>(null)\\n  const pointerInteractionMovement = useRef(0)\\n\\n  const r = useMotionValue(0)\\n  const rs = useSpring(r, {\\n    mass: 1,\\n    damping: 30,\\n    stiffness: 100,\\n  })\\n\\n  const updatePointerInteraction = (value: number | null) => {\\n    pointerInteracting.current = value\\n    if (canvasRef.current) {\\n      canvasRef.current.style.cursor = value !== null ? \\\"grabbing\\\" : \\\"grab\\\"\\n    }\\n  }\\n\\n  const updateMovement = (clientX: number) => {\\n    if (pointerInteracting.current !== null) {\\n      const delta = clientX - pointerInteracting.current\\n      pointerInteractionMovement.current = delta\\n      r.set(r.get() + delta / MOVEMENT_DAMPING)\\n    }\\n  }\\n\\n  useEffect(() => {\\n    const onResize = () => {\\n      if (canvasRef.current) {\\n        widthRef.current = canvasRef.current.offsetWidth\\n      }\\n    }\\n\\n    window.addEventListener(\\\"resize\\\", onResize)\\n    onResize()\\n\\n    const globe = createGlobe(canvasRef.current!, {\\n      ...config,\\n      width: widthRef.current * 2,\\n      height: widthRef.current * 2,\\n      onRender: (state) => {\\n        if (!pointerInteracting.current) phiRef.current += 0.005\\n        state.phi = phiRef.current + rs.get()\\n        state.width = widthRef.current * 2\\n        state.height = widthRef.current * 2\\n      },\\n    })\\n\\n    setTimeout(() => (canvasRef.current!.style.opacity = \\\"1\\\"), 0)\\n    return () => {\\n      globe.destroy()\\n      window.removeEventListener(\\\"resize\\\", onResize)\\n    }\\n  }, [rs, config])\\n\\n  return (\\n    <div\\n      className={cn(\\n        \\\"absolute inset-0 mx-auto aspect-square w-full max-w-150\\\",\\n        className\\n      )}\\n    >\\n      <canvas\\n        className={cn(\\n          \\\"size-full opacity-0 transition-opacity duration-500 contain-[layout_paint_size]\\\"\\n        )}\\n        ref={canvasRef}\\n        onPointerDown={(e) => {\\n          pointerInteracting.current = e.clientX\\n          updatePointerInteraction(e.clientX)\\n        }}\\n        onPointerUp={() => updatePointerInteraction(null)}\\n        onPointerOut={() => updatePointerInteraction(null)}\\n        onMouseMove={(e) => updateMovement(e.clientX)}\\n        onTouchMove={(e) =>\\n          e.touches[0] && updateMovement(e.touches[0].clientX)\\n        }\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/grid-pattern-dashed.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"grid-pattern-dashed\",\n  \"type\": \"registry:example\",\n  \"title\": \"Grid Pattern Dashed\",\n  \"description\": \"Example showing a dashed grid pattern.\",\n  \"registryDependencies\": [\n    \"@magicui/grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/grid-pattern-dashed.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { GridPattern } from \\\"@/registry/magicui/grid-pattern\\\"\\n\\nexport default function GridPatternDashed() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\\\">\\n      <GridPattern\\n        width={30}\\n        height={30}\\n        x={-1}\\n        y={-1}\\n        strokeDasharray={\\\"4 2\\\"}\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/grid-pattern-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"grid-pattern-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Grid Pattern Demo\",\n  \"description\": \"Example showing a background grid pattern made with SVGs.\",\n  \"registryDependencies\": [\n    \"@magicui/grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/grid-pattern-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { GridPattern } from \\\"@/registry/magicui/grid-pattern\\\"\\n\\nexport default function GridPatternDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <GridPattern\\n        squares={[\\n          [4, 4],\\n          [5, 1],\\n          [8, 2],\\n          [5, 3],\\n          [5, 5],\\n          [10, 10],\\n          [12, 15],\\n          [15, 10],\\n          [10, 15],\\n          [15, 10],\\n          [10, 15],\\n          [15, 10],\\n        ]}\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\\\",\\n          \\\"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/grid-pattern-linear-gradient.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"grid-pattern-linear-gradient\",\n  \"type\": \"registry:example\",\n  \"title\": \"Grid Pattern Linear Gradient\",\n  \"description\": \"Example showing a grid pattern with linear gradient effects.\",\n  \"registryDependencies\": [\n    \"@magicui/grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/grid-pattern-linear-gradient.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { GridPattern } from \\\"@/registry/magicui/grid-pattern\\\"\\n\\nexport default function GridPatternLinearGradient() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\\\">\\n      <GridPattern\\n        width={20}\\n        height={20}\\n        x={-1}\\n        y={-1}\\n        className={cn(\\n          \\\"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/grid-pattern.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"grid-pattern\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Grid Pattern\",\n  \"description\": \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/grid-pattern.tsx\",\n      \"content\": \"import { useId } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface GridPatternProps extends React.SVGProps<SVGSVGElement> {\\n  width?: number\\n  height?: number\\n  x?: number\\n  y?: number\\n  squares?: Array<[x: number, y: number]>\\n  strokeDasharray?: string\\n  className?: string\\n  [key: string]: unknown\\n}\\n\\nexport function GridPattern({\\n  width = 40,\\n  height = 40,\\n  x = -1,\\n  y = -1,\\n  strokeDasharray = \\\"0\\\",\\n  squares,\\n  className,\\n  ...props\\n}: GridPatternProps) {\\n  const id = useId()\\n\\n  return (\\n    <svg\\n      aria-hidden=\\\"true\\\"\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <defs>\\n        <pattern\\n          id={id}\\n          width={width}\\n          height={height}\\n          patternUnits=\\\"userSpaceOnUse\\\"\\n          x={x}\\n          y={y}\\n        >\\n          <path\\n            d={`M.5 ${height}V.5H${width}`}\\n            fill=\\\"none\\\"\\n            strokeDasharray={strokeDasharray}\\n          />\\n        </pattern>\\n      </defs>\\n      <rect width=\\\"100%\\\" height=\\\"100%\\\" strokeWidth={0} fill={`url(#${id})`} />\\n      {squares && (\\n        <svg x={x} y={y} className=\\\"overflow-visible\\\">\\n          {squares.map(([x, y]) => (\\n            <rect\\n              strokeWidth=\\\"0\\\"\\n              key={`${x}-${y}`}\\n              width={width - 1}\\n              height={height - 1}\\n              x={x * width + 1}\\n              y={y * height + 1}\\n            />\\n          ))}\\n        </svg>\\n      )}\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/hero-video-dialog-demo-top-in-bottom-out.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hero-video-dialog-demo-top-in-bottom-out\",\n  \"type\": \"registry:example\",\n  \"title\": \"Hero Video Dialog Top In Bottom Out Demo\",\n  \"description\": \"Example showing a hero video dialog with top-in bottom-out animation.\",\n  \"registryDependencies\": [\n    \"@magicui/hero-video-dialog\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n      \"content\": \"import { HeroVideoDialog } from \\\"@/registry/magicui/hero-video-dialog\\\"\\n\\nexport default function HeroVideoDialogDemoTopInBottomOut() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <HeroVideoDialog\\n        className=\\\"block dark:hidden\\\"\\n        animationStyle=\\\"top-in-bottom-out\\\"\\n        videoSrc=\\\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\\\"\\n        thumbnailSrc=\\\"https://startup-template-sage.vercel.app/hero-light.png\\\"\\n        thumbnailAlt=\\\"Hero Video\\\"\\n      />\\n      <HeroVideoDialog\\n        className=\\\"hidden dark:block\\\"\\n        animationStyle=\\\"top-in-bottom-out\\\"\\n        videoSrc=\\\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\\\"\\n        thumbnailSrc=\\\"https://startup-template-sage.vercel.app/hero-dark.png\\\"\\n        thumbnailAlt=\\\"Hero Video\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/hero-video-dialog-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hero-video-dialog-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Hero Video Dialog Demo\",\n  \"description\": \"Example showing a hero video dialog component.\",\n  \"registryDependencies\": [\n    \"@magicui/hero-video-dialog\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/hero-video-dialog-demo.tsx\",\n      \"content\": \"import { HeroVideoDialog } from \\\"@/registry/magicui/hero-video-dialog\\\"\\n\\nexport default function HeroVideoDialogDemo() {\\n  return (\\n    <div className=\\\"relative\\\">\\n      <HeroVideoDialog\\n        className=\\\"block dark:hidden\\\"\\n        animationStyle=\\\"from-center\\\"\\n        videoSrc=\\\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\\\"\\n        thumbnailSrc=\\\"https://startup-template-sage.vercel.app/hero-light.png\\\"\\n        thumbnailAlt=\\\"Hero Video\\\"\\n      />\\n      <HeroVideoDialog\\n        className=\\\"hidden dark:block\\\"\\n        animationStyle=\\\"from-center\\\"\\n        videoSrc=\\\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\\\"\\n        thumbnailSrc=\\\"https://startup-template-sage.vercel.app/hero-dark.png\\\"\\n        thumbnailAlt=\\\"Hero Video\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/hero-video-dialog.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hero-video-dialog\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Hero Video Dialog\",\n  \"description\": \"A hero video dialog component.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/hero-video-dialog.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useState } from \\\"react\\\"\\nimport { Play, XIcon } from \\\"lucide-react\\\"\\nimport { AnimatePresence, motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ntype AnimationStyle =\\n  | \\\"from-bottom\\\"\\n  | \\\"from-center\\\"\\n  | \\\"from-top\\\"\\n  | \\\"from-left\\\"\\n  | \\\"from-right\\\"\\n  | \\\"fade\\\"\\n  | \\\"top-in-bottom-out\\\"\\n  | \\\"left-in-right-out\\\"\\n\\ninterface HeroVideoProps {\\n  animationStyle?: AnimationStyle\\n  videoSrc: string\\n  thumbnailSrc: string\\n  thumbnailAlt?: string\\n  className?: string\\n}\\n\\nconst animationVariants = {\\n  \\\"from-bottom\\\": {\\n    initial: { y: \\\"100%\\\", opacity: 0 },\\n    animate: { y: 0, opacity: 1 },\\n    exit: { y: \\\"100%\\\", opacity: 0 },\\n  },\\n  \\\"from-center\\\": {\\n    initial: { scale: 0.5, opacity: 0 },\\n    animate: { scale: 1, opacity: 1 },\\n    exit: { scale: 0.5, opacity: 0 },\\n  },\\n  \\\"from-top\\\": {\\n    initial: { y: \\\"-100%\\\", opacity: 0 },\\n    animate: { y: 0, opacity: 1 },\\n    exit: { y: \\\"-100%\\\", opacity: 0 },\\n  },\\n  \\\"from-left\\\": {\\n    initial: { x: \\\"-100%\\\", opacity: 0 },\\n    animate: { x: 0, opacity: 1 },\\n    exit: { x: \\\"-100%\\\", opacity: 0 },\\n  },\\n  \\\"from-right\\\": {\\n    initial: { x: \\\"100%\\\", opacity: 0 },\\n    animate: { x: 0, opacity: 1 },\\n    exit: { x: \\\"100%\\\", opacity: 0 },\\n  },\\n  fade: {\\n    initial: { opacity: 0 },\\n    animate: { opacity: 1 },\\n    exit: { opacity: 0 },\\n  },\\n  \\\"top-in-bottom-out\\\": {\\n    initial: { y: \\\"-100%\\\", opacity: 0 },\\n    animate: { y: 0, opacity: 1 },\\n    exit: { y: \\\"100%\\\", opacity: 0 },\\n  },\\n  \\\"left-in-right-out\\\": {\\n    initial: { x: \\\"-100%\\\", opacity: 0 },\\n    animate: { x: 0, opacity: 1 },\\n    exit: { x: \\\"100%\\\", opacity: 0 },\\n  },\\n}\\n\\nexport function HeroVideoDialog({\\n  animationStyle = \\\"from-center\\\",\\n  videoSrc,\\n  thumbnailSrc,\\n  thumbnailAlt = \\\"Video thumbnail\\\",\\n  className,\\n}: HeroVideoProps) {\\n  const [isVideoOpen, setIsVideoOpen] = useState(false)\\n  const selectedAnimation = animationVariants[animationStyle]\\n\\n  return (\\n    <div className={cn(\\\"relative\\\", className)}>\\n      <button\\n        type=\\\"button\\\"\\n        aria-label=\\\"Play video\\\"\\n        className=\\\"group relative cursor-pointer border-0 bg-transparent p-0\\\"\\n        onClick={() => setIsVideoOpen(true)}\\n      >\\n        <img\\n          src={thumbnailSrc}\\n          alt={thumbnailAlt}\\n          width={1920}\\n          height={1080}\\n          className=\\\"w-full rounded-md border shadow-lg transition-all duration-200 ease-out group-hover:brightness-[0.8]\\\"\\n        />\\n        <div className=\\\"absolute inset-0 flex scale-[0.9] items-center justify-center rounded-2xl transition-all duration-200 ease-out group-hover:scale-100\\\">\\n          <div className=\\\"bg-primary/10 flex size-28 items-center justify-center rounded-full backdrop-blur-md\\\">\\n            <div\\n              className={`from-primary/30 to-primary relative flex size-20 scale-100 items-center justify-center rounded-full bg-linear-to-b shadow-md transition-all duration-200 ease-out group-hover:scale-[1.2]`}\\n            >\\n              <Play\\n                className=\\\"size-8 scale-100 fill-white text-white transition-transform duration-200 ease-out group-hover:scale-105\\\"\\n                style={{\\n                  filter:\\n                    \\\"drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06))\\\",\\n                }}\\n              />\\n            </div>\\n          </div>\\n        </div>\\n      </button>\\n      <AnimatePresence>\\n        {isVideoOpen && (\\n          <motion.div\\n            initial={{ opacity: 0 }}\\n            animate={{ opacity: 1 }}\\n            role=\\\"button\\\"\\n            tabIndex={0}\\n            onKeyDown={(e) => {\\n              if (e.key === \\\"Escape\\\" || e.key === \\\"Enter\\\" || e.key === \\\" \\\") {\\n                setIsVideoOpen(false)\\n              }\\n            }}\\n            onClick={() => setIsVideoOpen(false)}\\n            exit={{ opacity: 0 }}\\n            className=\\\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md\\\"\\n          >\\n            <motion.div\\n              {...selectedAnimation}\\n              transition={{ type: \\\"spring\\\", damping: 30, stiffness: 300 }}\\n              className=\\\"relative mx-4 aspect-video w-full max-w-4xl md:mx-0\\\"\\n            >\\n              <motion.button className=\\\"absolute -top-16 right-0 rounded-full bg-neutral-900/50 p-2 text-xl text-white ring-1 backdrop-blur-md dark:bg-neutral-100/50 dark:text-black\\\">\\n                <XIcon className=\\\"size-5\\\" />\\n              </motion.button>\\n              <div className=\\\"relative isolate z-1 size-full overflow-hidden rounded-2xl border-2 border-white\\\">\\n                <iframe\\n                  src={videoSrc}\\n                  title=\\\"Hero Video player\\\"\\n                  className=\\\"mt-0 size-full rounded-2xl\\\"\\n                  allowFullScreen\\n                  allow=\\\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\\\"\\n                ></iframe>\\n              </div>\\n            </motion.div>\\n          </motion.div>\\n        )}\\n      </AnimatePresence>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/highlighter-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"highlighter-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Highlighter Demo\",\n  \"description\": \"Example showing the demo of a Highlighter\",\n  \"dependencies\": [\n    \"rough-notation\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/highlighter\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/highlighter-demo.tsx\",\n      \"content\": \"import { Highlighter } from \\\"@/registry/magicui/highlighter\\\"\\n\\nexport default function HighlighterDemo() {\\n  return (\\n    <div className=\\\"text-center\\\">\\n      <p className=\\\"leading-relaxed\\\">\\n        The{\\\" \\\"}\\n        <Highlighter action=\\\"underline\\\" color=\\\"#FF9800\\\">\\n          Magic UI Highlighter\\n        </Highlighter>{\\\" \\\"}\\n        makes important{\\\" \\\"}\\n        <Highlighter action=\\\"highlight\\\" color=\\\"#87CEFA\\\">\\n          text stand out\\n        </Highlighter>{\\\" \\\"}\\n        effortlessly.\\n      </p>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    },\n    {\n      \"path\": \"registry/magicui/highlighter.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useLayoutEffect, useRef } from \\\"react\\\"\\nimport type React from \\\"react\\\"\\nimport { useInView } from \\\"motion/react\\\"\\nimport { annotate } from \\\"rough-notation\\\"\\nimport { type RoughAnnotation } from \\\"rough-notation/lib/model\\\"\\n\\ntype AnnotationAction =\\n  | \\\"highlight\\\"\\n  | \\\"underline\\\"\\n  | \\\"box\\\"\\n  | \\\"circle\\\"\\n  | \\\"strike-through\\\"\\n  | \\\"crossed-off\\\"\\n  | \\\"bracket\\\"\\n\\ninterface HighlighterProps {\\n  children: React.ReactNode\\n  action?: AnnotationAction\\n  color?: string\\n  strokeWidth?: number\\n  animationDuration?: number\\n  iterations?: number\\n  padding?: number\\n  multiline?: boolean\\n  isView?: boolean\\n}\\n\\nexport function Highlighter({\\n  children,\\n  action = \\\"highlight\\\",\\n  color = \\\"#ffd1dc\\\",\\n  strokeWidth = 1.5,\\n  animationDuration = 600,\\n  iterations = 2,\\n  padding = 2,\\n  multiline = true,\\n  isView = false,\\n}: HighlighterProps) {\\n  const elementRef = useRef<HTMLSpanElement>(null)\\n\\n  const isInView = useInView(elementRef, {\\n    once: true,\\n    margin: \\\"-10%\\\",\\n  })\\n\\n  // If isView is false, always show. If isView is true, wait for inView\\n  const shouldShow = !isView || isInView\\n\\n  useLayoutEffect(() => {\\n    const element = elementRef.current\\n    let annotation: RoughAnnotation | null = null\\n    let resizeObserver: ResizeObserver | null = null\\n\\n    if (shouldShow && element) {\\n      const annotationConfig = {\\n        type: action,\\n        color,\\n        strokeWidth,\\n        animationDuration,\\n        iterations,\\n        padding,\\n        multiline,\\n      }\\n\\n      const currentAnnotation = annotate(element, annotationConfig)\\n      annotation = currentAnnotation\\n      currentAnnotation.show()\\n\\n      resizeObserver = new ResizeObserver(() => {\\n        currentAnnotation.hide()\\n        currentAnnotation.show()\\n      })\\n\\n      resizeObserver.observe(element)\\n      resizeObserver.observe(document.body)\\n    }\\n\\n    return () => {\\n      annotation?.remove()\\n      if (resizeObserver) {\\n        resizeObserver.disconnect()\\n      }\\n    }\\n  }, [\\n    shouldShow,\\n    action,\\n    color,\\n    strokeWidth,\\n    animationDuration,\\n    iterations,\\n    padding,\\n    multiline,\\n  ])\\n\\n  return (\\n    <span ref={elementRef} className=\\\"relative inline-block bg-transparent\\\">\\n      {children}\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/highlighter.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"highlighter\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Highlighter\",\n  \"description\": \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n  \"dependencies\": [\n    \"rough-notation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/highlighter.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useLayoutEffect, useRef } from \\\"react\\\"\\nimport type React from \\\"react\\\"\\nimport { useInView } from \\\"motion/react\\\"\\nimport { annotate } from \\\"rough-notation\\\"\\nimport { type RoughAnnotation } from \\\"rough-notation/lib/model\\\"\\n\\ntype AnnotationAction =\\n  | \\\"highlight\\\"\\n  | \\\"underline\\\"\\n  | \\\"box\\\"\\n  | \\\"circle\\\"\\n  | \\\"strike-through\\\"\\n  | \\\"crossed-off\\\"\\n  | \\\"bracket\\\"\\n\\ninterface HighlighterProps {\\n  children: React.ReactNode\\n  action?: AnnotationAction\\n  color?: string\\n  strokeWidth?: number\\n  animationDuration?: number\\n  iterations?: number\\n  padding?: number\\n  multiline?: boolean\\n  isView?: boolean\\n}\\n\\nexport function Highlighter({\\n  children,\\n  action = \\\"highlight\\\",\\n  color = \\\"#ffd1dc\\\",\\n  strokeWidth = 1.5,\\n  animationDuration = 600,\\n  iterations = 2,\\n  padding = 2,\\n  multiline = true,\\n  isView = false,\\n}: HighlighterProps) {\\n  const elementRef = useRef<HTMLSpanElement>(null)\\n\\n  const isInView = useInView(elementRef, {\\n    once: true,\\n    margin: \\\"-10%\\\",\\n  })\\n\\n  // If isView is false, always show. If isView is true, wait for inView\\n  const shouldShow = !isView || isInView\\n\\n  useLayoutEffect(() => {\\n    const element = elementRef.current\\n    let annotation: RoughAnnotation | null = null\\n    let resizeObserver: ResizeObserver | null = null\\n\\n    if (shouldShow && element) {\\n      const annotationConfig = {\\n        type: action,\\n        color,\\n        strokeWidth,\\n        animationDuration,\\n        iterations,\\n        padding,\\n        multiline,\\n      }\\n\\n      const currentAnnotation = annotate(element, annotationConfig)\\n      annotation = currentAnnotation\\n      currentAnnotation.show()\\n\\n      resizeObserver = new ResizeObserver(() => {\\n        currentAnnotation.hide()\\n        currentAnnotation.show()\\n      })\\n\\n      resizeObserver.observe(element)\\n      resizeObserver.observe(document.body)\\n    }\\n\\n    return () => {\\n      annotation?.remove()\\n      if (resizeObserver) {\\n        resizeObserver.disconnect()\\n      }\\n    }\\n  }, [\\n    shouldShow,\\n    action,\\n    color,\\n    strokeWidth,\\n    animationDuration,\\n    iterations,\\n    padding,\\n    multiline,\\n  ])\\n\\n  return (\\n    <span ref={elementRef} className=\\\"relative inline-block bg-transparent\\\">\\n      {children}\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/hyper-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hyper-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Hyper Text Demo\",\n  \"description\": \"Example showing text with scrambling letter animations.\",\n  \"registryDependencies\": [\n    \"@magicui/hyper-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/hyper-text-demo.tsx\",\n      \"content\": \"import { HyperText } from \\\"@/registry/magicui/hyper-text\\\"\\n\\nexport default function HyperTextDemo() {\\n  return <HyperText>Hover Me!</HyperText>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/hyper-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hyper-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Hyper Text\",\n  \"description\": \"A text animation that scrambles letters before revealing the final text.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/hyper-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  useEffect,\\n  useRef,\\n  useState,\\n  type ComponentType,\\n  type RefAttributes,\\n} from \\\"react\\\"\\nimport {\\n  AnimatePresence,\\n  motion,\\n  type DOMMotionComponents,\\n  type HTMLMotionProps,\\n  type MotionProps,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ntype CharacterSet = string[] | readonly string[]\\n\\nconst motionElements = {\\n  article: motion.article,\\n  div: motion.div,\\n  h1: motion.h1,\\n  h2: motion.h2,\\n  h3: motion.h3,\\n  h4: motion.h4,\\n  h5: motion.h5,\\n  h6: motion.h6,\\n  li: motion.li,\\n  p: motion.p,\\n  section: motion.section,\\n  span: motion.span,\\n} as const\\n\\ntype MotionElementType = Extract<\\n  keyof DOMMotionComponents,\\n  keyof typeof motionElements\\n>\\ntype HyperTextMotionComponent = ComponentType<\\n  Omit<HTMLMotionProps<\\\"div\\\">, \\\"ref\\\"> & RefAttributes<HTMLElement>\\n>\\n\\ninterface HyperTextProps extends Omit<MotionProps, \\\"children\\\"> {\\n  /** The text content to be animated */\\n  children: string\\n  /** Optional className for styling */\\n  className?: string\\n  /** Duration of the animation in milliseconds */\\n  duration?: number\\n  /** Delay before animation starts in milliseconds */\\n  delay?: number\\n  /** Component to render as - defaults to div */\\n  as?: MotionElementType\\n  /** Whether to start animation when element comes into view */\\n  startOnView?: boolean\\n  /** Whether to trigger animation on hover */\\n  animateOnHover?: boolean\\n  /** Custom character set for scramble effect. Defaults to uppercase alphabet */\\n  characterSet?: CharacterSet\\n}\\n\\nconst DEFAULT_CHARACTER_SET = Object.freeze(\\n  \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\".split(\\\"\\\")\\n) as readonly string[]\\n\\nconst getRandomInt = (max: number): number => Math.floor(Math.random() * max)\\n\\nexport function HyperText({\\n  children,\\n  className,\\n  duration = 800,\\n  delay = 0,\\n  as: Component = \\\"div\\\",\\n  startOnView = false,\\n  animateOnHover = true,\\n  characterSet = DEFAULT_CHARACTER_SET,\\n  ...props\\n}: HyperTextProps) {\\n  const MotionComponent = motionElements[Component] as HyperTextMotionComponent\\n\\n  const [displayText, setDisplayText] = useState<string[]>(() =>\\n    children.split(\\\"\\\")\\n  )\\n  const [isAnimating, setIsAnimating] = useState(false)\\n  const iterationCount = useRef(0)\\n  const elementRef = useRef<HTMLElement | null>(null)\\n\\n  const handleAnimationTrigger = () => {\\n    if (animateOnHover && !isAnimating) {\\n      iterationCount.current = 0\\n      setIsAnimating(true)\\n    }\\n  }\\n\\n  // Handle animation start based on view or delay\\n  useEffect(() => {\\n    if (!startOnView) {\\n      const startTimeout = setTimeout(() => {\\n        setIsAnimating(true)\\n      }, delay)\\n      return () => clearTimeout(startTimeout)\\n    }\\n\\n    const observer = new IntersectionObserver(\\n      ([entry]) => {\\n        if (entry.isIntersecting) {\\n          setTimeout(() => {\\n            setIsAnimating(true)\\n          }, delay)\\n          observer.disconnect()\\n        }\\n      },\\n      { threshold: 0.1, rootMargin: \\\"-30% 0px -30% 0px\\\" }\\n    )\\n\\n    if (elementRef.current) {\\n      observer.observe(elementRef.current)\\n    }\\n\\n    return () => observer.disconnect()\\n  }, [delay, startOnView])\\n\\n  // Handle scramble animation\\n  useEffect(() => {\\n    let animationFrameId: number | null = null\\n\\n    if (isAnimating) {\\n      const maxIterations = children.length\\n      const startTime = performance.now()\\n\\n      const animate = (currentTime: number) => {\\n        const elapsed = currentTime - startTime\\n        const progress = Math.min(elapsed / duration, 1)\\n\\n        iterationCount.current = progress * maxIterations\\n\\n        setDisplayText((currentText) =>\\n          currentText.map((letter, index) =>\\n            letter === \\\" \\\"\\n              ? letter\\n              : index <= iterationCount.current\\n                ? children[index]\\n                : characterSet[getRandomInt(characterSet.length)]\\n          )\\n        )\\n\\n        if (progress < 1) {\\n          animationFrameId = requestAnimationFrame(animate)\\n        } else {\\n          setIsAnimating(false)\\n        }\\n      }\\n\\n      animationFrameId = requestAnimationFrame(animate)\\n    }\\n\\n    return () => {\\n      if (animationFrameId !== null) {\\n        cancelAnimationFrame(animationFrameId)\\n      }\\n    }\\n  }, [children, duration, isAnimating, characterSet])\\n\\n  return (\\n    <MotionComponent\\n      ref={elementRef}\\n      className={cn(\\\"overflow-hidden py-2 text-4xl font-bold\\\", className)}\\n      onMouseEnter={handleAnimationTrigger}\\n      {...props}\\n    >\\n      <AnimatePresence>\\n        {displayText.map((letter, index) => (\\n          <motion.span\\n            key={index}\\n            className={cn(\\\"font-mono\\\", letter === \\\" \\\" ? \\\"w-3\\\" : \\\"\\\")}\\n          >\\n            {letter.toUpperCase()}\\n          </motion.span>\\n        ))}\\n      </AnimatePresence>\\n    </MotionComponent>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/icon-cloud-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon-cloud-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Icon Cloud Demo 2\",\n  \"description\": \"Second example showing an interactive 3D icon cloud.\",\n  \"registryDependencies\": [\n    \"@magicui/icon-cloud\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/icon-cloud-demo-2.tsx\",\n      \"content\": \"import { IconCloud } from \\\"@/registry/magicui/icon-cloud\\\"\\n\\nconst images = [\\n  \\\"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n]\\n\\nexport default function IconCloudDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <IconCloud images={images} />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/icon-cloud-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon-cloud-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Icon Cloud Demo 3\",\n  \"description\": \"Third example showing an interactive 3D icon cloud.\",\n  \"registryDependencies\": [\n    \"@magicui/icon-cloud\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/icon-cloud-demo-3.tsx\",\n      \"content\": \"import { IconCloud } from \\\"@/registry/magicui/icon-cloud\\\"\\n\\nconst Icons = {\\n  gitHub: () => (\\n    <svg width=\\\"100\\\" height=\\\"100\\\" viewBox=\\\"0 0 438.549 438.549\\\">\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n      />\\n    </svg>\\n  ),\\n  notion: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000000\\\"\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  openai: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      className=\\\"fill-black dark:fill-white\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  googleDrive: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 87.3 78\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        fill=\\\"#b3b3b3\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n        fill=\\\"url(#linearGradient1780)\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n        fill=\\\"url(#b)\\\"\\n      />\\n      <path\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n        fill=\\\"#ffffff\\\"\\n        fillRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n}\\n\\nexport default function IconCloudDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <IconCloud\\n        icons={[\\n          <Icons.gitHub key=\\\"github\\\" />,\\n          <Icons.notion key=\\\"notion\\\" />,\\n          <Icons.openai key=\\\"openai\\\" />,\\n          <Icons.googleDrive key=\\\"gdrive\\\" />,\\n          <Icons.whatsapp key=\\\"whatsapp\\\" />,\\n          <Icons.gitHub key=\\\"github2\\\" />,\\n          <Icons.notion key=\\\"notion2\\\" />,\\n          <Icons.openai key=\\\"openai2\\\" />,\\n          <Icons.googleDrive key=\\\"gdrive2\\\" />,\\n          <Icons.whatsapp key=\\\"whatsapp2\\\" />,\\n          <Icons.gitHub key=\\\"github3\\\" />,\\n          <Icons.notion key=\\\"notion3\\\" />,\\n          <Icons.openai key=\\\"openai3\\\" />,\\n          <Icons.googleDrive key=\\\"gdrive3\\\" />,\\n          <Icons.whatsapp key=\\\"whatsapp3\\\" />,\\n          <Icons.gitHub key=\\\"github4\\\" />,\\n          <Icons.notion key=\\\"notion4\\\" />,\\n          <Icons.openai key=\\\"openai4\\\" />,\\n          <Icons.googleDrive key=\\\"gdrive4\\\" />,\\n          <Icons.whatsapp key=\\\"whatsapp4\\\" />,\\n          <Icons.notion key=\\\"notion4\\\" />,\\n          <Icons.openai key=\\\"openai4\\\" />,\\n          <Icons.googleDrive key=\\\"gdrive4\\\" />,\\n          <Icons.whatsapp key=\\\"whatsapp4\\\" />,\\n        ]}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/icon-cloud-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon-cloud-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Icon Cloud Demo\",\n  \"description\": \"Example showing an interactive 3D icon cloud.\",\n  \"registryDependencies\": [\n    \"@magicui/icon-cloud\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/icon-cloud-demo.tsx\",\n      \"content\": \"import { IconCloud } from \\\"@/registry/magicui/icon-cloud\\\"\\n\\nconst slugs = [\\n  \\\"typescript\\\",\\n  \\\"javascript\\\",\\n  \\\"dart\\\",\\n  \\\"java\\\",\\n  \\\"react\\\",\\n  \\\"flutter\\\",\\n  \\\"android\\\",\\n  \\\"html5\\\",\\n  \\\"css3\\\",\\n  \\\"nodedotjs\\\",\\n  \\\"express\\\",\\n  \\\"nextdotjs\\\",\\n  \\\"prisma\\\",\\n  \\\"amazonaws\\\",\\n  \\\"postgresql\\\",\\n  \\\"firebase\\\",\\n  \\\"nginx\\\",\\n  \\\"vercel\\\",\\n  \\\"testinglibrary\\\",\\n  \\\"jest\\\",\\n  \\\"cypress\\\",\\n  \\\"docker\\\",\\n  \\\"git\\\",\\n  \\\"jira\\\",\\n  \\\"github\\\",\\n  \\\"gitlab\\\",\\n  \\\"visualstudiocode\\\",\\n  \\\"androidstudio\\\",\\n  \\\"sonarqube\\\",\\n  \\\"figma\\\",\\n]\\n\\nexport default function IconCloudDemo() {\\n  const images = slugs.map(\\n    (slug) => `https://cdn.simpleicons.org/${slug}/${slug}`\\n  )\\n\\n  return (\\n    <div className=\\\"relative flex size-full items-center justify-center overflow-hidden\\\">\\n      <IconCloud images={images} />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/icon-cloud.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon-cloud\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Icon Cloud\",\n  \"description\": \"An interactive 3D tag cloud component\",\n  \"dependencies\": [],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/icon-cloud.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useEffect, useRef, useState } from \\\"react\\\"\\nimport { renderToString } from \\\"react-dom/server\\\"\\n\\ninterface Icon {\\n  x: number\\n  y: number\\n  z: number\\n  scale: number\\n  opacity: number\\n  id: number\\n}\\n\\ninterface IconCloudProps {\\n  icons?: React.ReactNode[]\\n  images?: string[]\\n}\\n\\nfunction easeOutCubic(t: number): number {\\n  return 1 - Math.pow(1 - t, 3)\\n}\\n\\nexport function IconCloud({ icons, images }: IconCloudProps) {\\n  const canvasRef = useRef<HTMLCanvasElement>(null)\\n  const [iconPositions, setIconPositions] = useState<Icon[]>([])\\n  const [isDragging, setIsDragging] = useState(false)\\n  const [lastMousePos, setLastMousePos] = useState({ x: 0, y: 0 })\\n  const [mousePos, setMousePos] = useState({ x: 0, y: 0 })\\n  const [targetRotation, setTargetRotation] = useState<{\\n    x: number\\n    y: number\\n    startX: number\\n    startY: number\\n    distance: number\\n    startTime: number\\n    duration: number\\n  } | null>(null)\\n  const animationFrameRef = useRef<number>(0)\\n  const rotationRef = useRef({ x: 0, y: 0 })\\n  const iconCanvasesRef = useRef<HTMLCanvasElement[]>([])\\n  const imagesLoadedRef = useRef<boolean[]>([])\\n\\n  // Create icon canvases once when icons/images change\\n  useEffect(() => {\\n    if (!icons && !images) return\\n\\n    const items = icons ?? images ?? []\\n    imagesLoadedRef.current = new Array(items.length).fill(false)\\n\\n    const newIconCanvases = items.map((item, index) => {\\n      const offscreen = document.createElement(\\\"canvas\\\")\\n      offscreen.width = 40\\n      offscreen.height = 40\\n      const offCtx = offscreen.getContext(\\\"2d\\\")\\n\\n      if (offCtx) {\\n        if (images) {\\n          // Handle image URLs directly\\n          const img = new Image()\\n          img.crossOrigin = \\\"anonymous\\\"\\n          img.src = items[index] as string\\n          img.onload = () => {\\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\\n\\n            // Create circular clipping path\\n            offCtx.beginPath()\\n            offCtx.arc(20, 20, 20, 0, Math.PI * 2)\\n            offCtx.closePath()\\n            offCtx.clip()\\n\\n            // Draw the image\\n            offCtx.drawImage(img, 0, 0, 40, 40)\\n\\n            imagesLoadedRef.current[index] = true\\n          }\\n        } else {\\n          // Handle SVG icons\\n          offCtx.scale(0.4, 0.4)\\n          const svgString = renderToString(item as React.ReactElement)\\n          const img = new Image()\\n          img.src = \\\"data:image/svg+xml;base64,\\\" + btoa(svgString)\\n          img.onload = () => {\\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\\n            offCtx.drawImage(img, 0, 0)\\n            imagesLoadedRef.current[index] = true\\n          }\\n        }\\n      }\\n      return offscreen\\n    })\\n\\n    iconCanvasesRef.current = newIconCanvases\\n  }, [icons, images])\\n\\n  // Generate initial icon positions on a sphere\\n  useEffect(() => {\\n    const items = icons ?? images ?? []\\n    const newIcons: Icon[] = []\\n    const numIcons = items.length || 20\\n\\n    // Fibonacci sphere parameters\\n    const offset = 2 / numIcons\\n    const increment = Math.PI * (3 - Math.sqrt(5))\\n\\n    for (let i = 0; i < numIcons; i++) {\\n      const y = i * offset - 1 + offset / 2\\n      const r = Math.sqrt(1 - y * y)\\n      const phi = i * increment\\n\\n      const x = Math.cos(phi) * r\\n      const z = Math.sin(phi) * r\\n\\n      newIcons.push({\\n        x: x * 100,\\n        y: y * 100,\\n        z: z * 100,\\n        scale: 1,\\n        opacity: 1,\\n        id: i,\\n      })\\n    }\\n    setIconPositions(newIcons)\\n  }, [icons, images])\\n\\n  // Handle mouse events\\n  const handleMouseDown = (e: React.MouseEvent<HTMLCanvasElement>) => {\\n    const rect = canvasRef.current?.getBoundingClientRect()\\n    if (!rect || !canvasRef.current) return\\n\\n    const x = e.clientX - rect.left\\n    const y = e.clientY - rect.top\\n\\n    const ctx = canvasRef.current.getContext(\\\"2d\\\")\\n    if (!ctx) return\\n\\n    iconPositions.forEach((icon) => {\\n      const cosX = Math.cos(rotationRef.current.x)\\n      const sinX = Math.sin(rotationRef.current.x)\\n      const cosY = Math.cos(rotationRef.current.y)\\n      const sinY = Math.sin(rotationRef.current.y)\\n\\n      const rotatedX = icon.x * cosY - icon.z * sinY\\n      const rotatedZ = icon.x * sinY + icon.z * cosY\\n      const rotatedY = icon.y * cosX + rotatedZ * sinX\\n\\n      const screenX = canvasRef.current!.width / 2 + rotatedX\\n      const screenY = canvasRef.current!.height / 2 + rotatedY\\n\\n      const scale = (rotatedZ + 200) / 300\\n      const radius = 20 * scale\\n      const dx = x - screenX\\n      const dy = y - screenY\\n\\n      if (dx * dx + dy * dy < radius * radius) {\\n        const targetX = -Math.atan2(\\n          icon.y,\\n          Math.sqrt(icon.x * icon.x + icon.z * icon.z)\\n        )\\n        const targetY = Math.atan2(icon.x, icon.z)\\n\\n        const currentX = rotationRef.current.x\\n        const currentY = rotationRef.current.y\\n        const distance = Math.sqrt(\\n          Math.pow(targetX - currentX, 2) + Math.pow(targetY - currentY, 2)\\n        )\\n\\n        const duration = Math.min(2000, Math.max(800, distance * 1000))\\n\\n        setTargetRotation({\\n          x: targetX,\\n          y: targetY,\\n          startX: currentX,\\n          startY: currentY,\\n          distance,\\n          startTime: performance.now(),\\n          duration,\\n        })\\n        return\\n      }\\n    })\\n\\n    setIsDragging(true)\\n    setLastMousePos({ x: e.clientX, y: e.clientY })\\n  }\\n\\n  const handleMouseMove = (e: React.MouseEvent<HTMLCanvasElement>) => {\\n    const rect = canvasRef.current?.getBoundingClientRect()\\n    if (rect) {\\n      const x = e.clientX - rect.left\\n      const y = e.clientY - rect.top\\n      setMousePos({ x, y })\\n    }\\n\\n    if (isDragging) {\\n      const deltaX = e.clientX - lastMousePos.x\\n      const deltaY = e.clientY - lastMousePos.y\\n\\n      rotationRef.current = {\\n        x: rotationRef.current.x + deltaY * 0.002,\\n        y: rotationRef.current.y + deltaX * 0.002,\\n      }\\n\\n      setLastMousePos({ x: e.clientX, y: e.clientY })\\n    }\\n  }\\n\\n  const handleMouseUp = () => {\\n    setIsDragging(false)\\n  }\\n\\n  // Animation and rendering\\n  useEffect(() => {\\n    const canvas = canvasRef.current\\n    const ctx = canvas?.getContext(\\\"2d\\\")\\n    if (canvas && ctx) {\\n      const animate = () => {\\n        ctx.clearRect(0, 0, canvas.width, canvas.height)\\n\\n        const centerX = canvas.width / 2\\n        const centerY = canvas.height / 2\\n        const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY)\\n        const dx = mousePos.x - centerX\\n        const dy = mousePos.y - centerY\\n        const distance = Math.sqrt(dx * dx + dy * dy)\\n        const speed = 0.003 + (distance / maxDistance) * 0.01\\n\\n        if (targetRotation) {\\n          const elapsed = performance.now() - targetRotation.startTime\\n          const progress = Math.min(1, elapsed / targetRotation.duration)\\n          const easedProgress = easeOutCubic(progress)\\n\\n          rotationRef.current = {\\n            x:\\n              targetRotation.startX +\\n              (targetRotation.x - targetRotation.startX) * easedProgress,\\n            y:\\n              targetRotation.startY +\\n              (targetRotation.y - targetRotation.startY) * easedProgress,\\n          }\\n\\n          if (progress >= 1) {\\n            setTargetRotation(null)\\n          }\\n        } else if (!isDragging) {\\n          rotationRef.current = {\\n            x: rotationRef.current.x + (dy / canvas.height) * speed,\\n            y: rotationRef.current.y + (dx / canvas.width) * speed,\\n          }\\n        }\\n\\n        iconPositions.forEach((icon, index) => {\\n          const cosX = Math.cos(rotationRef.current.x)\\n          const sinX = Math.sin(rotationRef.current.x)\\n          const cosY = Math.cos(rotationRef.current.y)\\n          const sinY = Math.sin(rotationRef.current.y)\\n\\n          const rotatedX = icon.x * cosY - icon.z * sinY\\n          const rotatedZ = icon.x * sinY + icon.z * cosY\\n          const rotatedY = icon.y * cosX + rotatedZ * sinX\\n\\n          const scale = (rotatedZ + 200) / 300\\n          const opacity = Math.max(0.2, Math.min(1, (rotatedZ + 150) / 200))\\n\\n          ctx.save()\\n          ctx.translate(\\n            canvas.width / 2 + rotatedX,\\n            canvas.height / 2 + rotatedY\\n          )\\n          ctx.scale(scale, scale)\\n          ctx.globalAlpha = opacity\\n\\n          if (icons || images) {\\n            // Only try to render icons/images if they exist\\n            if (\\n              iconCanvasesRef.current[index] &&\\n              imagesLoadedRef.current[index]\\n            ) {\\n              ctx.drawImage(iconCanvasesRef.current[index], -20, -20, 40, 40)\\n            }\\n          } else {\\n            // Show numbered circles if no icons/images are provided\\n            ctx.beginPath()\\n            ctx.arc(0, 0, 20, 0, Math.PI * 2)\\n            ctx.fillStyle = \\\"#4444ff\\\"\\n            ctx.fill()\\n            ctx.fillStyle = \\\"white\\\"\\n            ctx.textAlign = \\\"center\\\"\\n            ctx.textBaseline = \\\"middle\\\"\\n            ctx.font = \\\"16px Arial\\\"\\n            ctx.fillText(`${icon.id + 1}`, 0, 0)\\n          }\\n\\n          ctx.restore()\\n        })\\n        animationFrameRef.current = requestAnimationFrame(animate)\\n      }\\n\\n      animate()\\n    }\\n\\n    return () => {\\n      if (animationFrameRef.current) {\\n        cancelAnimationFrame(animationFrameRef.current)\\n      }\\n    }\\n  }, [icons, images, iconPositions, isDragging, mousePos, targetRotation])\\n\\n  return (\\n    <canvas\\n      ref={canvasRef}\\n      width={400}\\n      height={400}\\n      onMouseDown={handleMouseDown}\\n      onMouseMove={handleMouseMove}\\n      onMouseUp={handleMouseUp}\\n      onMouseLeave={handleMouseUp}\\n      className=\\\"rounded-lg\\\"\\n      aria-label=\\\"Interactive 3D Icon Cloud\\\"\\n      role=\\\"img\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/index.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"index\",\n  \"type\": \"registry:style\",\n  \"dependencies\": [\n    \"class-variance-authority\",\n    \"lucide-react\"\n  ],\n  \"devDependencies\": [\n    \"tw-animate-css\"\n  ],\n  \"registryDependencies\": [\n    \"utils\"\n  ],\n  \"files\": [],\n  \"cssVars\": {}\n}"
  },
  {
    "path": "apps/www/public/r/interactive-grid-pattern-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"interactive-grid-pattern-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Interactive Grid Pattern Demo 2\",\n  \"description\": \"Second example showing an interactive grid pattern background.\",\n  \"registryDependencies\": [\n    \"@magicui/interactive-grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { InteractiveGridPattern } from \\\"@/registry/magicui/interactive-grid-pattern\\\"\\n\\nexport default function InteractiveGridPatternDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <InteractiveGridPattern\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\\\"\\n        )}\\n        width={20}\\n        height={20}\\n        squares={[80, 80]}\\n        squaresClassName=\\\"hover:fill-blue-500\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/interactive-grid-pattern-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"interactive-grid-pattern-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Interactive Grid Pattern Demo\",\n  \"description\": \"Example showing an interactive grid pattern background.\",\n  \"registryDependencies\": [\n    \"@magicui/interactive-grid-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/interactive-grid-pattern-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\nimport { InteractiveGridPattern } from \\\"@/registry/magicui/interactive-grid-pattern\\\"\\n\\nexport default function InteractiveGridPatternDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <InteractiveGridPattern\\n        className={cn(\\n          \\\"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\\\",\\n          \\\"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\\\"\\n        )}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/interactive-grid-pattern.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"interactive-grid-pattern\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Interactive Grid Pattern\",\n  \"description\": \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/interactive-grid-pattern.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\n/**\\n * InteractiveGridPattern is a component that renders a grid pattern with interactive squares.\\n *\\n * @param width - The width of each square.\\n * @param height - The height of each square.\\n * @param squares - The number of squares in the grid. The first element is the number of horizontal squares, and the second element is the number of vertical squares.\\n * @param className - The class name of the grid.\\n * @param squaresClassName - The class name of the squares.\\n */\\ninterface InteractiveGridPatternProps extends React.SVGProps<SVGSVGElement> {\\n  width?: number\\n  height?: number\\n  squares?: [number, number] // [horizontal, vertical]\\n  className?: string\\n  squaresClassName?: string\\n}\\n\\n/**\\n * The InteractiveGridPattern component.\\n *\\n * @see InteractiveGridPatternProps for the props interface.\\n * @returns A React component.\\n */\\nexport function InteractiveGridPattern({\\n  width = 40,\\n  height = 40,\\n  squares = [24, 24],\\n  className,\\n  squaresClassName,\\n  ...props\\n}: InteractiveGridPatternProps) {\\n  const [horizontal, vertical] = squares\\n  const [hoveredSquare, setHoveredSquare] = useState<number | null>(null)\\n\\n  return (\\n    <svg\\n      width={width * horizontal}\\n      height={height * vertical}\\n      className={cn(\\n        \\\"absolute inset-0 h-full w-full border border-gray-400/30\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      {Array.from({ length: horizontal * vertical }).map((_, index) => {\\n        const x = (index % horizontal) * width\\n        const y = Math.floor(index / horizontal) * height\\n        return (\\n          <rect\\n            key={index}\\n            x={x}\\n            y={y}\\n            width={width}\\n            height={height}\\n            className={cn(\\n              \\\"stroke-gray-400/30 transition-all duration-100 ease-in-out not-[&:hover]:duration-1000\\\",\\n              hoveredSquare === index ? \\\"fill-gray-300/30\\\" : \\\"fill-transparent\\\",\\n              squaresClassName\\n            )}\\n            onMouseEnter={() => setHoveredSquare(index)}\\n            onMouseLeave={() => setHoveredSquare(null)}\\n          />\\n        )\\n      })}\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/interactive-hover-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"interactive-hover-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Interactive Hover Button Demo\",\n  \"description\": \"Example showing an interactive button with hover effects.\",\n  \"registryDependencies\": [\n    \"@magicui/interactive-hover-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/interactive-hover-button-demo.tsx\",\n      \"content\": \"import { InteractiveHoverButton } from \\\"@/registry/magicui/interactive-hover-button\\\"\\n\\nexport default function InteractiveHoverButtonDemo() {\\n  return <InteractiveHoverButton>Hover Me</InteractiveHoverButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/interactive-hover-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"interactive-hover-button\",\n  \"type\": \"registry:ui\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/interactive-hover-button.tsx\",\n      \"content\": \"import { ArrowRight } from \\\"lucide-react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport function InteractiveHoverButton({\\n  children,\\n  className,\\n  ...props\\n}: React.ButtonHTMLAttributes<HTMLButtonElement>) {\\n  return (\\n    <button\\n      className={cn(\\n        \\\"group bg-background relative w-auto cursor-pointer overflow-hidden rounded-full border p-2 px-6 text-center font-semibold\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <div className=\\\"flex items-center justify-center gap-2\\\">\\n        <div className=\\\"bg-primary h-2 w-2 rounded-full transition-all duration-300 group-hover:scale-[100.8]\\\"></div>\\n        <span className=\\\"inline-block transition-all duration-300 group-hover:translate-x-12 group-hover:opacity-0\\\">\\n          {children}\\n        </span>\\n      </div>\\n      <div className=\\\"text-primary-foreground absolute top-0 z-10 flex h-full w-full translate-x-12 items-center justify-center gap-2 opacity-0 transition-all duration-300 group-hover:-translate-x-5 group-hover:opacity-100\\\">\\n        <span>{children}</span>\\n        <ArrowRight />\\n      </div>\\n    </button>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/iphone-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"iphone-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"iPhone Demo 2\",\n  \"description\": \"Second example showing an iPhone mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/iphone\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/iphone-demo-2.tsx\",\n      \"content\": \"import { Iphone } from \\\"@/registry/magicui/iphone\\\"\\n\\nexport default function Demo() {\\n  return (\\n    <div className=\\\"w-[434px]\\\">\\n      <Iphone src=\\\"https://placehold.co/900x1600?text=Hello+World\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/iphone-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"iphone-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"iPhone Demo 3\",\n  \"description\": \"Third example showing an iPhone mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/iphone\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/iphone-demo-3.tsx\",\n      \"content\": \"import { Iphone } from \\\"@/registry/magicui/iphone\\\"\\n\\nexport default function Demo() {\\n  return (\\n    <div className=\\\"w-[434px]\\\">\\n      <Iphone videoSrc=\\\"https://videos.pexels.com/video-files/8946986/8946986-uhd_1440_2732_25fps.mp4\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/iphone-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"iphone-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"iPhone Demo\",\n  \"description\": \"Example showing an iPhone mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/iphone\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/iphone-demo.tsx\",\n      \"content\": \"import { Iphone } from \\\"@/registry/magicui/iphone\\\"\\n\\nexport default function Demo() {\\n  return (\\n    <div className=\\\"w-[434px]\\\">\\n      <Iphone />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/iphone.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"iphone\",\n  \"type\": \"registry:ui\",\n  \"title\": \"iPhone\",\n  \"description\": \"A mockup of the iPhone\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/iphone.tsx\",\n      \"content\": \"import type { HTMLAttributes } from \\\"react\\\"\\n\\nconst PHONE_WIDTH = 433\\nconst PHONE_HEIGHT = 882\\nconst SCREEN_X = 21.25\\nconst SCREEN_Y = 19.25\\nconst SCREEN_WIDTH = 389.5\\nconst SCREEN_HEIGHT = 843.5\\nconst SCREEN_RADIUS = 55.75\\n\\n// Calculated percentages\\nconst LEFT_PCT = (SCREEN_X / PHONE_WIDTH) * 100\\nconst TOP_PCT = (SCREEN_Y / PHONE_HEIGHT) * 100\\nconst WIDTH_PCT = (SCREEN_WIDTH / PHONE_WIDTH) * 100\\nconst HEIGHT_PCT = (SCREEN_HEIGHT / PHONE_HEIGHT) * 100\\nconst RADIUS_H = (SCREEN_RADIUS / SCREEN_WIDTH) * 100\\nconst RADIUS_V = (SCREEN_RADIUS / SCREEN_HEIGHT) * 100\\n\\nexport interface IphoneProps extends HTMLAttributes<HTMLDivElement> {\\n  src?: string\\n  videoSrc?: string\\n}\\n\\nexport function Iphone({\\n  src,\\n  videoSrc,\\n  className,\\n  style,\\n  ...props\\n}: IphoneProps) {\\n  const hasVideo = !!videoSrc\\n  const hasMedia = hasVideo || !!src\\n\\n  return (\\n    <div\\n      className={`relative inline-block w-full align-middle leading-none ${className}`}\\n      style={{\\n        aspectRatio: `${PHONE_WIDTH}/${PHONE_HEIGHT}`,\\n        ...style,\\n      }}\\n      {...props}\\n    >\\n      {hasVideo && (\\n        <div\\n          className=\\\"pointer-events-none absolute z-0 overflow-hidden\\\"\\n          style={{\\n            left: `${LEFT_PCT}%`,\\n            top: `${TOP_PCT}%`,\\n            width: `${WIDTH_PCT}%`,\\n            height: `${HEIGHT_PCT}%`,\\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\\n          }}\\n        >\\n          <video\\n            className=\\\"block size-full object-cover\\\"\\n            src={videoSrc}\\n            autoPlay\\n            loop\\n            muted\\n            playsInline\\n            preload=\\\"metadata\\\"\\n          />\\n        </div>\\n      )}\\n\\n      {!hasVideo && src && (\\n        <div\\n          className=\\\"pointer-events-none absolute z-0 overflow-hidden\\\"\\n          style={{\\n            left: `${LEFT_PCT}%`,\\n            top: `${TOP_PCT}%`,\\n            width: `${WIDTH_PCT}%`,\\n            height: `${HEIGHT_PCT}%`,\\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\\n          }}\\n        >\\n          <img\\n            src={src}\\n            alt=\\\"\\\"\\n            className=\\\"block size-full object-cover object-top\\\"\\n          />\\n        </div>\\n      )}\\n\\n      <svg\\n        viewBox={`0 0 ${PHONE_WIDTH} ${PHONE_HEIGHT}`}\\n        fill=\\\"none\\\"\\n        xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n        className=\\\"absolute inset-0 size-full\\\"\\n        style={{ transform: \\\"translateZ(0)\\\" }}\\n      >\\n        <g mask={hasMedia ? \\\"url(#screenPunch)\\\" : undefined}>\\n          <path\\n            d=\\\"M2 73C2 32.6832 34.6832 0 75 0H357C397.317 0 430 32.6832 430 73V809C430 849.317 397.317 882 357 882H75C34.6832 882 2 849.317 2 809V73Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M0 171C0 170.448 0.447715 170 1 170H3V204H1C0.447715 204 0 203.552 0 203V171Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M1 234C1 233.448 1.44772 233 2 233H3.5V300H2C1.44772 300 1 299.552 1 299V234Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M1 319C1 318.448 1.44772 318 2 318H3.5V385H2C1.44772 385 1 384.552 1 384V319Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M430 279H432C432.552 279 433 279.448 433 280V384C433 384.552 432.552 385 432 385H430V279Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M6 74C6 35.3401 37.3401 4 76 4H356C394.66 4 426 35.3401 426 74V808C426 846.66 394.66 878 356 878H76C37.3401 878 6 846.66 6 808V74Z\\\"\\n            className=\\\"fill-white dark:fill-[#262626]\\\"\\n          />\\n        </g>\\n\\n        <path\\n          opacity=\\\"0.5\\\"\\n          d=\\\"M174 5H258V5.5C258 6.60457 257.105 7.5 256 7.5H176C174.895 7.5 174 6.60457 174 5.5V5Z\\\"\\n          className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n        />\\n\\n        <path\\n          d={`M${SCREEN_X} 75C${SCREEN_X} 44.2101 46.2101 ${SCREEN_Y} 77 ${SCREEN_Y}H355C385.79 ${SCREEN_Y} 410.75 44.2101 410.75 75V807C410.75 837.79 385.79 862.75 355 862.75H77C46.2101 862.75 ${SCREEN_X} 837.79 ${SCREEN_X} 807V75Z`}\\n          className=\\\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\\\"\\n          mask={hasMedia ? \\\"url(#screenPunch)\\\" : undefined}\\n        />\\n\\n        <path\\n          d=\\\"M154 48.5C154 38.2827 162.283 30 172.5 30H259.5C269.717 30 278 38.2827 278 48.5C278 58.7173 269.717 67 259.5 67H172.5C162.283 67 154 58.7173 154 48.5Z\\\"\\n          className=\\\"fill-[#F5F5F5] dark:fill-[#262626]\\\"\\n        />\\n        <path\\n          d=\\\"M249 48.5C249 42.701 253.701 38 259.5 38C265.299 38 270 42.701 270 48.5C270 54.299 265.299 59 259.5 59C253.701 59 249 54.299 249 48.5Z\\\"\\n          className=\\\"fill-[#F5F5F5] dark:fill-[#262626]\\\"\\n        />\\n        <path\\n          d=\\\"M254 48.5C254 45.4624 256.462 43 259.5 43C262.538 43 265 45.4624 265 48.5C265 51.5376 262.538 54 259.5 54C256.462 54 254 51.5376 254 48.5Z\\\"\\n          className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n        />\\n\\n        <defs>\\n          <mask id=\\\"screenPunch\\\" maskUnits=\\\"userSpaceOnUse\\\">\\n            <rect\\n              x=\\\"0\\\"\\n              y=\\\"0\\\"\\n              width={PHONE_WIDTH}\\n              height={PHONE_HEIGHT}\\n              fill=\\\"white\\\"\\n            />\\n            <rect\\n              x={SCREEN_X}\\n              y={SCREEN_Y}\\n              width={SCREEN_WIDTH}\\n              height={SCREEN_HEIGHT}\\n              rx={SCREEN_RADIUS}\\n              ry={SCREEN_RADIUS}\\n              fill=\\\"black\\\"\\n            />\\n          </mask>\\n          <clipPath id=\\\"roundedCorners\\\">\\n            <rect\\n              x={SCREEN_X}\\n              y={SCREEN_Y}\\n              width={SCREEN_WIDTH}\\n              height={SCREEN_HEIGHT}\\n              rx={SCREEN_RADIUS}\\n              ry={SCREEN_RADIUS}\\n            />\\n          </clipPath>\\n        </defs>\\n      </svg>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/lens-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"lens-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Lens Demo 2\",\n  \"description\": \"Second example showing a lens effect component\",\n  \"registryDependencies\": [\n    \"button\",\n    \"card\",\n    \"@magicui/lens\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/lens-demo-2.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Lens } from \\\"@/registry/magicui/lens\\\"\\n\\nexport default function LensDemo() {\\n  return (\\n    <Card className=\\\"relative max-w-md shadow-none\\\">\\n      <CardHeader>\\n        <Lens isStatic position={{ x: 260, y: 150 }}>\\n          <img\\n            src=\\\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\"\\n            alt=\\\"image placeholder\\\"\\n            width={500}\\n            height={500}\\n          />\\n        </Lens>\\n      </CardHeader>\\n      <CardContent>\\n        <CardTitle className=\\\"text-2xl\\\">Your next camp</CardTitle>\\n        <CardDescription>\\n          See our latest and best camp destinations all across the five\\n          continents of the globe.\\n        </CardDescription>\\n      </CardContent>\\n      <CardFooter className=\\\"space-x-4\\\">\\n        <Button>Let&apos;s go</Button>\\n        <Button variant=\\\"secondary\\\">Another time</Button>\\n      </CardFooter>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/lens-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"lens-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Lens Demo 3\",\n  \"description\": \"Third example showing a lens effect component\",\n  \"registryDependencies\": [\n    \"button\",\n    \"card\",\n    \"@magicui/lens\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/lens-demo-3.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Lens } from \\\"@/registry/magicui/lens\\\"\\n\\nexport default function LensDemo() {\\n  return (\\n    <Card className=\\\"relative max-w-md shadow-none\\\">\\n      <CardHeader>\\n        <Lens defaultPosition={{ x: 260, y: 150 }}>\\n          <img\\n            src=\\\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\"\\n            alt=\\\"image placeholder\\\"\\n            width={500}\\n            height={500}\\n          />\\n        </Lens>\\n      </CardHeader>\\n      <CardContent>\\n        <CardTitle className=\\\"text-2xl\\\">Your next camp</CardTitle>\\n        <CardDescription>\\n          See our latest and best camp destinations all across the five\\n          continents of the globe.\\n        </CardDescription>\\n      </CardContent>\\n      <CardFooter className=\\\"space-x-4\\\">\\n        <Button>Let&apos;s go</Button>\\n        <Button variant=\\\"secondary\\\">Another time</Button>\\n      </CardFooter>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/lens-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"lens-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Lens Demo\",\n  \"description\": \"Example showing a lens effect component\",\n  \"registryDependencies\": [\n    \"button\",\n    \"card\",\n    \"@magicui/lens\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/lens-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Lens } from \\\"@/registry/magicui/lens\\\"\\n\\nexport default function LensDemo() {\\n  return (\\n    <Card className=\\\"relative max-w-md shadow-none\\\">\\n      <CardHeader>\\n        <Lens\\n          zoomFactor={2}\\n          lensSize={150}\\n          isStatic={false}\\n          ariaLabel=\\\"Zoom Area\\\"\\n        >\\n          <img\\n            src=\\\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\"\\n            alt=\\\"image placeholder\\\"\\n            width={500}\\n            height={500}\\n          />\\n        </Lens>\\n      </CardHeader>\\n      <CardContent>\\n        <CardTitle className=\\\"text-2xl\\\">Your next camp</CardTitle>\\n        <CardDescription>\\n          See our latest and best camp destinations all across the five\\n          continents of the globe.\\n        </CardDescription>\\n      </CardContent>\\n      <CardFooter className=\\\"space-x-4\\\">\\n        <Button>Let&apos;s go</Button>\\n        <Button variant=\\\"secondary\\\">Another time</Button>\\n      </CardFooter>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/lens.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"lens\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Lens\",\n  \"description\": \"A interactive component that enables zooming into images, videos and other elements.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/lens.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useCallback, useMemo, useRef, useState } from \\\"react\\\"\\nimport { AnimatePresence, motion, useMotionTemplate } from \\\"motion/react\\\"\\n\\ninterface Position {\\n  /** The x coordinate of the lens */\\n  x: number\\n  /** The y coordinate of the lens */\\n  y: number\\n}\\n\\ninterface LensProps {\\n  /** The children of the lens */\\n  children: React.ReactNode\\n  /** The zoom factor of the lens */\\n  zoomFactor?: number\\n  /** The size of the lens */\\n  lensSize?: number\\n  /** The position of the lens */\\n  position?: Position\\n  /** The default position of the lens */\\n  defaultPosition?: Position\\n  /** Whether the lens is static */\\n  isStatic?: boolean\\n  /** The duration of the animation */\\n  duration?: number\\n  /** The color of the lens */\\n  lensColor?: string\\n  /** The aria label of the lens */\\n  ariaLabel?: string\\n}\\n\\nexport function Lens({\\n  children,\\n  zoomFactor = 1.3,\\n  lensSize = 170,\\n  isStatic = false,\\n  position = { x: 0, y: 0 },\\n  defaultPosition,\\n  duration = 0.1,\\n  lensColor = \\\"black\\\",\\n  ariaLabel = \\\"Zoom Area\\\",\\n}: LensProps) {\\n  if (zoomFactor < 1) {\\n    throw new Error(\\\"zoomFactor must be greater than 1\\\")\\n  }\\n  if (lensSize < 0) {\\n    throw new Error(\\\"lensSize must be greater than 0\\\")\\n  }\\n\\n  const [isHovering, setIsHovering] = useState(false)\\n  const [mousePosition, setMousePosition] = useState<Position>(position)\\n  const containerRef = useRef<HTMLDivElement>(null)\\n\\n  const currentPosition = useMemo(() => {\\n    if (isStatic) return position\\n    if (defaultPosition && !isHovering) return defaultPosition\\n    return mousePosition\\n  }, [isStatic, position, defaultPosition, isHovering, mousePosition])\\n\\n  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\\n    const rect = e.currentTarget.getBoundingClientRect()\\n    setMousePosition({\\n      x: e.clientX - rect.left,\\n      y: e.clientY - rect.top,\\n    })\\n  }, [])\\n\\n  const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\\n    if (e.key === \\\"Escape\\\") setIsHovering(false)\\n  }, [])\\n\\n  const maskImage = useMotionTemplate`radial-gradient(circle ${\\n    lensSize / 2\\n  }px at ${currentPosition.x}px ${\\n    currentPosition.y\\n  }px, ${lensColor} 100%, transparent 100%)`\\n\\n  const LensContent = useMemo(() => {\\n    const { x, y } = currentPosition\\n\\n    return (\\n      <motion.div\\n        initial={{ opacity: 0, scale: 0.58 }}\\n        animate={{ opacity: 1, scale: 1 }}\\n        exit={{ opacity: 0, scale: 0.8 }}\\n        transition={{ duration }}\\n        className=\\\"absolute inset-0 overflow-hidden\\\"\\n        style={{\\n          maskImage,\\n          WebkitMaskImage: maskImage,\\n          transformOrigin: `${x}px ${y}px`,\\n          zIndex: 50,\\n        }}\\n      >\\n        <div\\n          className=\\\"absolute inset-0\\\"\\n          style={{\\n            transform: `scale(${zoomFactor})`,\\n            transformOrigin: `${x}px ${y}px`,\\n          }}\\n        >\\n          {children}\\n        </div>\\n      </motion.div>\\n    )\\n  }, [currentPosition, maskImage, zoomFactor, children, duration])\\n\\n  return (\\n    <div\\n      ref={containerRef}\\n      className=\\\"relative z-20 overflow-hidden rounded-xl\\\"\\n      onMouseEnter={() => setIsHovering(true)}\\n      onMouseLeave={() => setIsHovering(false)}\\n      onMouseMove={handleMouseMove}\\n      onKeyDown={handleKeyDown}\\n      role=\\\"region\\\"\\n      aria-label={ariaLabel}\\n      tabIndex={0}\\n    >\\n      {children}\\n      {isStatic || defaultPosition ? (\\n        LensContent\\n      ) : (\\n        <AnimatePresence mode=\\\"popLayout\\\">\\n          {isHovering && LensContent}\\n        </AnimatePresence>\\n      )}\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/light-rays-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"light-rays-demo\",\n  \"type\": \"registry:example\",\n  \"description\": \"Demo of the light-rays component showcasing animated light rays\",\n  \"registryDependencies\": [\n    \"@magicui/light-rays\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/light-rays-demo.tsx\",\n      \"content\": \"import { LightRays } from \\\"@/registry/magicui/light-rays\\\"\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"relative h-[500px] w-full overflow-hidden rounded-lg border\\\">\\n      <div className=\\\"relative z-10 flex h-full flex-col items-center justify-center gap-4 px-6 text-center\\\">\\n        <span className=\\\"text-xs font-semibold tracking-[0.35em] text-slate-800/60 uppercase dark:text-slate-200/60\\\">\\n          Ambient glow\\n        </span>\\n        <h1 className=\\\"text-foreground text-4xl font-bold md:text-5xl\\\">\\n          Light Rays\\n        </h1>\\n        <p className=\\\"max-w-md text-sm text-slate-800/80 md:text-base dark:text-slate-200/80\\\">\\n          Drop this component into any container and it will fill the space with\\n          softly animated light rays shining from above.\\n        </p>\\n      </div>\\n      <LightRays />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/light-rays.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"light-rays\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Light Rays\",\n  \"description\": \"A component with animated light rays which shine down from above.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/light-rays.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useState, type CSSProperties } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface LightRaysProps extends React.HTMLAttributes<HTMLDivElement> {\\n  ref?: React.Ref<HTMLDivElement>\\n  count?: number\\n  color?: string\\n  blur?: number\\n  speed?: number\\n  length?: string\\n}\\n\\ntype LightRay = {\\n  id: string\\n  left: number\\n  rotate: number\\n  width: number\\n  swing: number\\n  delay: number\\n  duration: number\\n  intensity: number\\n}\\n\\nconst createRays = (count: number, cycle: number): LightRay[] => {\\n  if (count <= 0) return []\\n\\n  return Array.from({ length: count }, (_, index) => {\\n    const left = 8 + Math.random() * 84\\n    const rotate = -28 + Math.random() * 56\\n    const width = 160 + Math.random() * 160\\n    const swing = 0.8 + Math.random() * 1.8\\n    const delay = Math.random() * cycle\\n    const duration = cycle * (0.75 + Math.random() * 0.5)\\n    const intensity = 0.6 + Math.random() * 0.5\\n\\n    return {\\n      id: `${index}-${Math.round(left * 10)}`,\\n      left,\\n      rotate,\\n      width,\\n      swing,\\n      delay,\\n      duration,\\n      intensity,\\n    }\\n  })\\n}\\n\\nconst Ray = ({\\n  left,\\n  rotate,\\n  width,\\n  swing,\\n  delay,\\n  duration,\\n  intensity,\\n}: LightRay) => {\\n  return (\\n    <motion.div\\n      className=\\\"pointer-events-none absolute -top-[12%] left-[var(--ray-left)] h-[var(--light-rays-length)] w-[var(--ray-width)] origin-top -translate-x-1/2 rounded-full bg-linear-to-b from-[color-mix(in_srgb,var(--light-rays-color)_70%,transparent)] to-transparent opacity-0 mix-blend-screen blur-[var(--light-rays-blur)]\\\"\\n      style={\\n        {\\n          \\\"--ray-left\\\": `${left}%`,\\n          \\\"--ray-width\\\": `${width}px`,\\n        } as CSSProperties\\n      }\\n      initial={{ rotate: rotate }}\\n      animate={{\\n        opacity: [0, intensity, 0],\\n        rotate: [rotate - swing, rotate + swing, rotate - swing],\\n      }}\\n      transition={{\\n        duration: duration,\\n        repeat: Infinity,\\n        ease: \\\"easeInOut\\\",\\n        delay: delay,\\n        repeatDelay: duration * 0.1,\\n      }}\\n    />\\n  )\\n}\\n\\nexport function LightRays({\\n  className,\\n  style,\\n  count = 7,\\n  color = \\\"rgba(160, 210, 255, 0.2)\\\",\\n  blur = 36,\\n  speed = 14,\\n  length = \\\"70vh\\\",\\n  ref,\\n  ...props\\n}: LightRaysProps) {\\n  const [rays, setRays] = useState<LightRay[]>([])\\n  const cycleDuration = Math.max(speed, 0.1)\\n\\n  useEffect(() => {\\n    setRays(createRays(count, cycleDuration))\\n  }, [count, cycleDuration])\\n\\n  return (\\n    <div\\n      ref={ref}\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 isolate overflow-hidden rounded-[inherit]\\\",\\n        className\\n      )}\\n      style={\\n        {\\n          \\\"--light-rays-color\\\": color,\\n          \\\"--light-rays-blur\\\": `${blur}px`,\\n          \\\"--light-rays-length\\\": length,\\n          ...style,\\n        } as CSSProperties\\n      }\\n      {...props}\\n    >\\n      <div className=\\\"absolute inset-0 overflow-hidden\\\">\\n        <div\\n          aria-hidden\\n          className=\\\"absolute inset-0 opacity-60\\\"\\n          style={\\n            {\\n              background:\\n                \\\"radial-gradient(circle at 20% 15%, color-mix(in srgb, var(--light-rays-color) 45%, transparent), transparent 70%)\\\",\\n            } as CSSProperties\\n          }\\n        />\\n        <div\\n          aria-hidden\\n          className=\\\"absolute inset-0 opacity-60\\\"\\n          style={\\n            {\\n              background:\\n                \\\"radial-gradient(circle at 80% 10%, color-mix(in srgb, var(--light-rays-color) 35%, transparent), transparent 75%)\\\",\\n            } as CSSProperties\\n          }\\n        />\\n        {rays.map((ray) => (\\n          <Ray key={ray.id} {...ray} />\\n        ))}\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/line-shadow-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"line-shadow-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Line Shadow Text Demo\",\n  \"description\": \"Example showing a text component with a moving line shadow.\",\n  \"registryDependencies\": [\n    \"@magicui/line-shadow-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/line-shadow-text-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { LineShadowText } from \\\"@/registry/magicui/line-shadow-text\\\"\\n\\nexport default function LineShadowTextDemo() {\\n  const theme = useTheme()\\n  const shadowColor = theme.resolvedTheme === \\\"dark\\\" ? \\\"white\\\" : \\\"black\\\"\\n  return (\\n    <h1 className=\\\"text-5xl leading-none font-semibold tracking-tighter text-balance sm:text-6xl md:text-7xl lg:text-8xl\\\">\\n      Ship\\n      <LineShadowText className=\\\"italic\\\" shadowColor={shadowColor}>\\n        Fast\\n      </LineShadowText>\\n    </h1>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/line-shadow-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"line-shadow-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Line Shadow Text\",\n  \"description\": \"A text component with a moving line shadow.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/line-shadow-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { type CSSProperties, type HTMLAttributes } from \\\"react\\\"\\nimport {\\n  motion,\\n  type DOMMotionComponents,\\n  type MotionProps,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst motionElements = {\\n  article: motion.article,\\n  div: motion.div,\\n  h1: motion.h1,\\n  h2: motion.h2,\\n  h3: motion.h3,\\n  h4: motion.h4,\\n  h5: motion.h5,\\n  h6: motion.h6,\\n  li: motion.li,\\n  p: motion.p,\\n  section: motion.section,\\n  span: motion.span,\\n} as const\\n\\ntype MotionElementType = Extract<\\n  keyof DOMMotionComponents,\\n  keyof typeof motionElements\\n>\\n\\ninterface LineShadowTextProps\\n  extends Omit<HTMLAttributes<HTMLElement>, keyof MotionProps>, MotionProps {\\n  children: string\\n  shadowColor?: string\\n  as?: MotionElementType\\n}\\n\\nexport function LineShadowText({\\n  children,\\n  shadowColor = \\\"black\\\",\\n  className,\\n  as: Component = \\\"span\\\",\\n  ...props\\n}: LineShadowTextProps) {\\n  const MotionComponent = motionElements[Component]\\n\\n  return (\\n    <MotionComponent\\n      style={{ \\\"--shadow-color\\\": shadowColor } as CSSProperties}\\n      className={cn(\\n        \\\"relative z-0 inline-flex\\\",\\n        \\\"after:absolute after:top-[0.04em] after:left-[0.04em] after:content-[attr(data-text)]\\\",\\n        \\\"after:bg-[linear-gradient(45deg,transparent_45%,var(--shadow-color)_45%,var(--shadow-color)_55%,transparent_0)]\\\",\\n        \\\"after:-z-10 after:bg-size-[0.06em_0.06em] after:bg-clip-text after:text-transparent\\\",\\n        \\\"after:animate-line-shadow\\\",\\n        className\\n      )}\\n      data-text={children}\\n      {...props}\\n    >\\n      {children}\\n    </MotionComponent>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-line-shadow\": \"line-shadow 15s linear infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes line-shadow\": {\n      \"0%\": {\n        \"background-position\": \"0 0\"\n      },\n      \"100%\": {\n        \"background-position\": \"100% -100%\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/magic-card-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"magic-card-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Magic Card Demo 2\",\n  \"description\": \"Example showing a magic card with an orb effect.\",\n  \"registryDependencies\": [\n    \"@magicui/magic-card\",\n    \"@magicui/avatar-circles\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/magic-card-demo2.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useState } from \\\"react\\\"\\nimport Link from \\\"next/link\\\"\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { AvatarCircles } from \\\"@/registry/magicui/avatar-circles\\\"\\nimport { MagicCard } from \\\"@/registry/magicui/magic-card\\\"\\n\\nexport default function MagicCardDemo() {\\n  const { theme, systemTheme } = useTheme()\\n  const [mounted, setMounted] = useState(false)\\n\\n  useEffect(() => {\\n    setMounted(true)\\n  }, [])\\n\\n  const isDark = mounted\\n    ? (theme === \\\"system\\\" ? systemTheme : theme) === \\\"dark\\\"\\n    : true\\n\\n  return (\\n    <Card className=\\\"w-full max-w-sm border-none p-0 shadow-none\\\">\\n      <MagicCard\\n        mode=\\\"orb\\\"\\n        glowFrom={isDark ? \\\"#ee4f27\\\" : \\\"#E9D5FF\\\"}\\n        glowTo={isDark ? \\\"#6b21ef\\\" : \\\"#FBCFE8\\\"}\\n        className=\\\"p-0\\\"\\n      >\\n        <CardHeader className=\\\"border-border border-b p-4 [.border-b]:pb-4\\\">\\n          <div className=\\\"flex items-center gap-3\\\">\\n            <AvatarCircles\\n              avatarUrls={[\\n                {\\n                  imageUrl: \\\"https://avatars.githubusercontent.com/u/81306489\\\",\\n                  profileUrl: \\\"https://github.com/Yeom-JinHo\\\",\\n                },\\n              ]}\\n            />\\n            <div className=\\\"flex-1\\\">\\n              <CardTitle>Yeom JinHo</CardTitle>\\n              <CardDescription className=\\\"mt-1\\\">\\n                Frontend Developer\\n              </CardDescription>\\n            </div>\\n          </div>\\n        </CardHeader>\\n        <CardContent className=\\\"space-y-2 p-4\\\">\\n          <p className=\\\"text-sm font-medium\\\">\\n            Frontend Developer focused on Interactive UI &amp; Performance\\n          </p>\\n          <p className=\\\"text-muted-foreground text-sm leading-relaxed\\\">\\n            I&apos;m passionate about visual presentation and currently focusing\\n            on interactive UI.\\n          </p>\\n        </CardContent>\\n        <CardFooter className=\\\"border-border border-t p-4 [.border-t]:pt-4\\\">\\n          <Button asChild className=\\\"w-full\\\">\\n            <Link\\n              href=\\\"https://github.com/Yeom-JinHo\\\"\\n              target=\\\"_blank\\\"\\n              rel=\\\"noopener noreferrer\\\"\\n              className=\\\"flex items-center justify-center gap-2\\\"\\n            >\\n              <svg viewBox=\\\"0 0 438.549 438.549\\\" className=\\\"size-4\\\">\\n                <path\\n                  fill=\\\"currentColor\\\"\\n                  d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n                ></path>\\n              </svg>\\n              View on GitHub\\n            </Link>\\n          </Button>\\n        </CardFooter>\\n      </MagicCard>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/magic-card-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"magic-card-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Magic Card Demo\",\n  \"description\": \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n  \"registryDependencies\": [\n    \"@magicui/magic-card\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/magic-card-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Input } from \\\"@/components/ui/input\\\"\\nimport { Label } from \\\"@/components/ui/label\\\"\\nimport { MagicCard } from \\\"@/registry/magicui/magic-card\\\"\\n\\nexport default function MagicCardDemo() {\\n  const { theme } = useTheme()\\n  return (\\n    <Card className=\\\"w-full max-w-sm border-none p-0 shadow-none\\\">\\n      <MagicCard\\n        gradientColor={theme === \\\"dark\\\" ? \\\"#262626\\\" : \\\"#D9D9D955\\\"}\\n        className=\\\"p-0\\\"\\n      >\\n        <CardHeader className=\\\"border-border border-b p-4 [.border-b]:pb-4\\\">\\n          <CardTitle>Login</CardTitle>\\n          <CardDescription>\\n            Enter your credentials to access your account\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"p-4\\\">\\n          <form>\\n            <div className=\\\"grid gap-4\\\">\\n              <div className=\\\"grid gap-2\\\">\\n                <Label htmlFor=\\\"email\\\">Email</Label>\\n                <Input id=\\\"email\\\" type=\\\"email\\\" placeholder=\\\"name@example.com\\\" />\\n              </div>\\n              <div className=\\\"grid gap-2\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n                <Input id=\\\"password\\\" type=\\\"password\\\" />\\n              </div>\\n            </div>\\n          </form>\\n        </CardContent>\\n        <CardFooter className=\\\"border-border border-t p-4 [.border-t]:pt-4\\\">\\n          <Button className=\\\"w-full\\\">Sign In</Button>\\n        </CardFooter>\\n      </MagicCard>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/magic-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"magic-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Magic Card\",\n  \"description\": \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n  \"dependencies\": [\n    \"motion\",\n    \"next-themes\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/magic-card.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \\\"react\\\"\\nimport {\\n  motion,\\n  useMotionTemplate,\\n  useMotionValue,\\n  useSpring,\\n} from \\\"motion/react\\\"\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface MagicCardBaseProps {\\n  children?: React.ReactNode\\n  className?: string\\n  gradientSize?: number\\n  gradientFrom?: string\\n  gradientTo?: string\\n}\\n\\ninterface MagicCardGradientProps extends MagicCardBaseProps {\\n  mode?: \\\"gradient\\\"\\n\\n  gradientColor?: string\\n  gradientOpacity?: number\\n\\n  glowFrom?: never\\n  glowTo?: never\\n  glowAngle?: never\\n  glowSize?: never\\n  glowBlur?: never\\n  glowOpacity?: never\\n}\\n\\ninterface MagicCardOrbProps extends MagicCardBaseProps {\\n  mode: \\\"orb\\\"\\n\\n  glowFrom?: string\\n  glowTo?: string\\n  glowAngle?: number\\n  glowSize?: number\\n  glowBlur?: number\\n  glowOpacity?: number\\n\\n  gradientColor?: never\\n  gradientOpacity?: never\\n}\\n\\ntype MagicCardProps = MagicCardGradientProps | MagicCardOrbProps\\ntype ResetReason = \\\"enter\\\" | \\\"leave\\\" | \\\"global\\\" | \\\"init\\\"\\n\\nfunction isOrbMode(props: MagicCardProps): props is MagicCardOrbProps {\\n  return props.mode === \\\"orb\\\"\\n}\\n\\nexport function MagicCard(props: MagicCardProps) {\\n  const {\\n    children,\\n    className,\\n    gradientSize = 200,\\n    gradientColor = \\\"#262626\\\",\\n    gradientOpacity = 0.8,\\n    gradientFrom = \\\"#9E7AFF\\\",\\n    gradientTo = \\\"#FE8BBB\\\",\\n    mode = \\\"gradient\\\",\\n  } = props\\n\\n  const glowFrom = isOrbMode(props) ? (props.glowFrom ?? \\\"#ee4f27\\\") : \\\"#ee4f27\\\"\\n  const glowTo = isOrbMode(props) ? (props.glowTo ?? \\\"#6b21ef\\\") : \\\"#6b21ef\\\"\\n  const glowAngle = isOrbMode(props) ? (props.glowAngle ?? 90) : 90\\n  const glowSize = isOrbMode(props) ? (props.glowSize ?? 420) : 420\\n  const glowBlur = isOrbMode(props) ? (props.glowBlur ?? 60) : 60\\n  const glowOpacity = isOrbMode(props) ? (props.glowOpacity ?? 0.9) : 0.9\\n  const { theme, systemTheme } = useTheme()\\n  const [mounted, setMounted] = useState(false)\\n\\n  useEffect(() => setMounted(true), [])\\n\\n  const isDarkTheme = useMemo(() => {\\n    if (!mounted) return true\\n    const currentTheme = theme === \\\"system\\\" ? systemTheme : theme\\n    return currentTheme === \\\"dark\\\"\\n  }, [theme, systemTheme, mounted])\\n\\n  const mouseX = useMotionValue(-gradientSize)\\n  const mouseY = useMotionValue(-gradientSize)\\n\\n  const orbX = useSpring(mouseX, { stiffness: 250, damping: 30, mass: 0.6 })\\n  const orbY = useSpring(mouseY, { stiffness: 250, damping: 30, mass: 0.6 })\\n  const orbVisible = useSpring(0, { stiffness: 300, damping: 35 })\\n\\n  const modeRef = useRef(mode)\\n  const glowOpacityRef = useRef(glowOpacity)\\n  const gradientSizeRef = useRef(gradientSize)\\n\\n  useEffect(() => {\\n    modeRef.current = mode\\n  }, [mode])\\n\\n  useEffect(() => {\\n    glowOpacityRef.current = glowOpacity\\n  }, [glowOpacity])\\n\\n  useEffect(() => {\\n    gradientSizeRef.current = gradientSize\\n  }, [gradientSize])\\n\\n  const reset = useCallback(\\n    (reason: ResetReason = \\\"leave\\\") => {\\n      const currentMode = modeRef.current\\n\\n      if (currentMode === \\\"orb\\\") {\\n        if (reason === \\\"enter\\\") orbVisible.set(glowOpacityRef.current)\\n        else orbVisible.set(0)\\n        return\\n      }\\n\\n      const off = -gradientSizeRef.current\\n      mouseX.set(off)\\n      mouseY.set(off)\\n    },\\n    [mouseX, mouseY, orbVisible]\\n  )\\n\\n  const handlePointerMove = useCallback(\\n    (e: React.PointerEvent<HTMLDivElement>) => {\\n      const rect = e.currentTarget.getBoundingClientRect()\\n      mouseX.set(e.clientX - rect.left)\\n      mouseY.set(e.clientY - rect.top)\\n    },\\n    [mouseX, mouseY]\\n  )\\n\\n  useEffect(() => {\\n    reset(\\\"init\\\")\\n  }, [reset])\\n\\n  useEffect(() => {\\n    const handleGlobalPointerOut = (e: PointerEvent) => {\\n      if (!e.relatedTarget) reset(\\\"global\\\")\\n    }\\n    const handleBlur = () => reset(\\\"global\\\")\\n    const handleVisibility = () => {\\n      if (document.visibilityState !== \\\"visible\\\") reset(\\\"global\\\")\\n    }\\n\\n    window.addEventListener(\\\"pointerout\\\", handleGlobalPointerOut)\\n    window.addEventListener(\\\"blur\\\", handleBlur)\\n    document.addEventListener(\\\"visibilitychange\\\", handleVisibility)\\n\\n    return () => {\\n      window.removeEventListener(\\\"pointerout\\\", handleGlobalPointerOut)\\n      window.removeEventListener(\\\"blur\\\", handleBlur)\\n      document.removeEventListener(\\\"visibilitychange\\\", handleVisibility)\\n    }\\n  }, [reset])\\n\\n  return (\\n    <motion.div\\n      className={cn(\\n        \\\"group relative isolate overflow-hidden rounded-[inherit] border border-transparent\\\",\\n        className\\n      )}\\n      onPointerMove={handlePointerMove}\\n      onPointerLeave={() => reset(\\\"leave\\\")}\\n      onPointerEnter={() => reset(\\\"enter\\\")}\\n      style={{\\n        background: useMotionTemplate`\\n          linear-gradient(var(--color-background) 0 0) padding-box,\\n          radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\\n            ${gradientFrom},\\n            ${gradientTo},\\n            var(--color-border) 100%\\n          ) border-box\\n        `,\\n      }}\\n    >\\n      <div className=\\\"bg-background absolute inset-px z-20 rounded-[inherit]\\\" />\\n\\n      {mode === \\\"gradient\\\" && (\\n        <motion.div\\n          suppressHydrationWarning\\n          className=\\\"pointer-events-none absolute inset-px z-30 rounded-[inherit] opacity-0 transition-opacity duration-300 group-hover:opacity-100\\\"\\n          style={{\\n            background: useMotionTemplate`\\n              radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\\n                ${gradientColor},\\n                transparent 100%\\n              )\\n            `,\\n            opacity: gradientOpacity,\\n          }}\\n        />\\n      )}\\n\\n      {mode === \\\"orb\\\" && (\\n        <motion.div\\n          suppressHydrationWarning\\n          aria-hidden=\\\"true\\\"\\n          className=\\\"pointer-events-none absolute z-30\\\"\\n          style={{\\n            width: glowSize,\\n            height: glowSize,\\n            x: orbX,\\n            y: orbY,\\n            translateX: \\\"-50%\\\",\\n            translateY: \\\"-50%\\\",\\n            borderRadius: 9999,\\n            filter: `blur(${glowBlur}px)`,\\n            opacity: orbVisible,\\n            background: `linear-gradient(${glowAngle}deg, ${glowFrom}, ${glowTo})`,\\n\\n            mixBlendMode: isDarkTheme ? \\\"screen\\\" : \\\"multiply\\\",\\n            willChange: \\\"transform, opacity\\\",\\n          }}\\n        />\\n      )}\\n      <div className=\\\"relative z-40\\\">{children}</div>\\n    </motion.div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/marquee-3d.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"marquee-3d\",\n  \"type\": \"registry:example\",\n  \"title\": \"Marquee 3D\",\n  \"description\": \"Example showing a 3D infinite scrolling component.\",\n  \"registryDependencies\": [\n    \"@magicui/marquee\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/marquee-3d.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\nimport { Marquee } from \\\"@/registry/magicui/marquee\\\"\\n\\nconst reviews = [\\n  {\\n    name: \\\"Jack\\\",\\n    username: \\\"@jack\\\",\\n    body: \\\"I've never seen anything like this before. It's amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/jack\\\",\\n  },\\n  {\\n    name: \\\"Jill\\\",\\n    username: \\\"@jill\\\",\\n    body: \\\"I don't know what to say. I'm speechless. This is amazing.\\\",\\n    img: \\\"https://avatar.vercel.sh/jill\\\",\\n  },\\n  {\\n    name: \\\"John\\\",\\n    username: \\\"@john\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/john\\\",\\n  },\\n]\\n\\nconst firstRow = reviews.slice(0, reviews.length / 2)\\nconst secondRow = reviews.slice(reviews.length / 2)\\nconst thirdRow = reviews.slice(0, reviews.length / 2)\\nconst fourthRow = reviews.slice(reviews.length / 2)\\n\\nconst ReviewCard = ({\\n  img,\\n  name,\\n  username,\\n  body,\\n}: {\\n  img: string\\n  name: string\\n  username: string\\n  body: string\\n}) => {\\n  return (\\n    <figure\\n      className={cn(\\n        \\\"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\\\",\\n        // light styles\\n        \\\"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\\\",\\n        // dark styles\\n        \\\"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\\\"\\n      )}\\n    >\\n      <div className=\\\"flex flex-row items-center gap-2\\\">\\n        <img className=\\\"rounded-full\\\" width=\\\"32\\\" height=\\\"32\\\" alt=\\\"\\\" src={img} />\\n        <div className=\\\"flex flex-col\\\">\\n          <figcaption className=\\\"text-sm font-medium dark:text-white\\\">\\n            {name}\\n          </figcaption>\\n          <p className=\\\"text-xs font-medium dark:text-white/40\\\">{username}</p>\\n        </div>\\n      </div>\\n      <blockquote className=\\\"mt-2 text-sm\\\">{body}</blockquote>\\n    </figure>\\n  )\\n}\\n\\nexport default function Marquee3D() {\\n  return (\\n    <div className=\\\"relative flex h-96 w-full flex-row items-center justify-center gap-4 overflow-hidden [perspective:300px]\\\">\\n      <div\\n        className=\\\"flex flex-row items-center gap-4\\\"\\n        style={{\\n          transform:\\n            \\\"translateX(-100px) translateY(0px) translateZ(-100px) rotateX(20deg) rotateY(-10deg) rotateZ(20deg)\\\",\\n        }}\\n      >\\n        <Marquee pauseOnHover vertical className=\\\"[--duration:20s]\\\">\\n          {firstRow.map((review) => (\\n            <ReviewCard key={review.username} {...review} />\\n          ))}\\n        </Marquee>\\n        <Marquee reverse pauseOnHover className=\\\"[--duration:20s]\\\" vertical>\\n          {secondRow.map((review) => (\\n            <ReviewCard key={review.username} {...review} />\\n          ))}\\n        </Marquee>\\n        <Marquee reverse pauseOnHover className=\\\"[--duration:20s]\\\" vertical>\\n          {thirdRow.map((review) => (\\n            <ReviewCard key={review.username} {...review} />\\n          ))}\\n        </Marquee>\\n        <Marquee pauseOnHover className=\\\"[--duration:20s]\\\" vertical>\\n          {fourthRow.map((review) => (\\n            <ReviewCard key={review.username} {...review} />\\n          ))}\\n        </Marquee>\\n      </div>\\n\\n      <div className=\\\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/marquee-demo-vertical.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"marquee-demo-vertical\",\n  \"type\": \"registry:example\",\n  \"title\": \"Marquee Vertical Demo\",\n  \"description\": \"Example showing a vertical infinite scrolling component.\",\n  \"registryDependencies\": [\n    \"@magicui/marquee\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/marquee-demo-vertical.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\nimport { Marquee } from \\\"@/registry/magicui/marquee\\\"\\n\\nconst reviews = [\\n  {\\n    name: \\\"Jack\\\",\\n    username: \\\"@jack\\\",\\n    body: \\\"I've never seen anything like this before. It's amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/jack\\\",\\n  },\\n  {\\n    name: \\\"Jill\\\",\\n    username: \\\"@jill\\\",\\n    body: \\\"I don't know what to say. I'm speechless. This is amazing.\\\",\\n    img: \\\"https://avatar.vercel.sh/jill\\\",\\n  },\\n  {\\n    name: \\\"John\\\",\\n    username: \\\"@john\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/john\\\",\\n  },\\n]\\n\\nconst firstRow = reviews.slice(0, reviews.length / 2)\\nconst secondRow = reviews.slice(reviews.length / 2)\\n\\nconst ReviewCard = ({\\n  img,\\n  name,\\n  username,\\n  body,\\n}: {\\n  img: string\\n  name: string\\n  username: string\\n  body: string\\n}) => {\\n  return (\\n    <figure\\n      className={cn(\\n        \\\"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\\\",\\n        // light styles\\n        \\\"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\\\",\\n        // dark styles\\n        \\\"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\\\"\\n      )}\\n    >\\n      <div className=\\\"flex flex-row items-center gap-2\\\">\\n        <img className=\\\"rounded-full\\\" width=\\\"32\\\" height=\\\"32\\\" alt=\\\"\\\" src={img} />\\n        <div className=\\\"flex flex-col\\\">\\n          <figcaption className=\\\"text-sm font-medium dark:text-white\\\">\\n            {name}\\n          </figcaption>\\n          <p className=\\\"text-xs font-medium dark:text-white/40\\\">{username}</p>\\n        </div>\\n      </div>\\n      <blockquote className=\\\"mt-2 text-sm\\\">{body}</blockquote>\\n    </figure>\\n  )\\n}\\n\\nexport default function MarqueeDemoVertical() {\\n  return (\\n    <div className=\\\"relative flex h-[500px] w-full flex-row items-center justify-center overflow-hidden\\\">\\n      <Marquee pauseOnHover vertical className=\\\"[--duration:20s]\\\">\\n        {firstRow.map((review) => (\\n          <ReviewCard key={review.username} {...review} />\\n        ))}\\n      </Marquee>\\n      <Marquee reverse pauseOnHover vertical className=\\\"[--duration:20s]\\\">\\n        {secondRow.map((review) => (\\n          <ReviewCard key={review.username} {...review} />\\n        ))}\\n      </Marquee>\\n      <div className=\\\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/marquee-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"marquee-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Marquee Demo\",\n  \"description\": \"Example showing an infinite scrolling component.\",\n  \"registryDependencies\": [\n    \"@magicui/marquee\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/marquee-demo.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\nimport { Marquee } from \\\"@/registry/magicui/marquee\\\"\\n\\nconst reviews = [\\n  {\\n    name: \\\"Jack\\\",\\n    username: \\\"@jack\\\",\\n    body: \\\"I've never seen anything like this before. It's amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/jack\\\",\\n  },\\n  {\\n    name: \\\"Jill\\\",\\n    username: \\\"@jill\\\",\\n    body: \\\"I don't know what to say. I'm speechless. This is amazing.\\\",\\n    img: \\\"https://avatar.vercel.sh/jill\\\",\\n  },\\n  {\\n    name: \\\"John\\\",\\n    username: \\\"@john\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/john\\\",\\n  },\\n  {\\n    name: \\\"Jane\\\",\\n    username: \\\"@jane\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/jane\\\",\\n  },\\n  {\\n    name: \\\"Jenny\\\",\\n    username: \\\"@jenny\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/jenny\\\",\\n  },\\n  {\\n    name: \\\"James\\\",\\n    username: \\\"@james\\\",\\n    body: \\\"I'm at a loss for words. This is amazing. I love it.\\\",\\n    img: \\\"https://avatar.vercel.sh/james\\\",\\n  },\\n]\\n\\nconst firstRow = reviews.slice(0, reviews.length / 2)\\nconst secondRow = reviews.slice(reviews.length / 2)\\n\\nconst ReviewCard = ({\\n  img,\\n  name,\\n  username,\\n  body,\\n}: {\\n  img: string\\n  name: string\\n  username: string\\n  body: string\\n}) => {\\n  return (\\n    <figure\\n      className={cn(\\n        \\\"relative h-full w-64 cursor-pointer overflow-hidden rounded-xl border p-4\\\",\\n        // light styles\\n        \\\"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\\\",\\n        // dark styles\\n        \\\"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\\\"\\n      )}\\n    >\\n      <div className=\\\"flex flex-row items-center gap-2\\\">\\n        <img className=\\\"rounded-full\\\" width=\\\"32\\\" height=\\\"32\\\" alt=\\\"\\\" src={img} />\\n        <div className=\\\"flex flex-col\\\">\\n          <figcaption className=\\\"text-sm font-medium dark:text-white\\\">\\n            {name}\\n          </figcaption>\\n          <p className=\\\"text-xs font-medium dark:text-white/40\\\">{username}</p>\\n        </div>\\n      </div>\\n      <blockquote className=\\\"mt-2 text-sm\\\">{body}</blockquote>\\n    </figure>\\n  )\\n}\\n\\nexport default function MarqueeDemo() {\\n  return (\\n    <div className=\\\"relative flex w-full flex-col items-center justify-center overflow-hidden\\\">\\n      <Marquee pauseOnHover className=\\\"[--duration:20s]\\\">\\n        {firstRow.map((review) => (\\n          <ReviewCard key={review.username} {...review} />\\n        ))}\\n      </Marquee>\\n      <Marquee reverse pauseOnHover className=\\\"[--duration:20s]\\\">\\n        {secondRow.map((review) => (\\n          <ReviewCard key={review.username} {...review} />\\n        ))}\\n      </Marquee>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/marquee-logos.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"marquee-logos\",\n  \"type\": \"registry:example\",\n  \"title\": \"Marquee Logos\",\n  \"description\": \"Example showing an infinite scrolling logo carousel.\",\n  \"registryDependencies\": [\n    \"@magicui/marquee\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/marquee-logos.tsx\",\n      \"content\": \"import { cn } from \\\"@/lib/utils\\\"\\nimport { Marquee } from \\\"@/registry/magicui/marquee\\\"\\n\\nconst logos = [\\n  {\\n    name: \\\"Microsoft\\\",\\n    img: \\\"https://cdn.simpleicons.org/microsoft/000/fff\\\",\\n  },\\n  {\\n    name: \\\"Apple\\\",\\n    img: \\\"https://cdn.simpleicons.org/apple/000/fff\\\",\\n  },\\n  {\\n    name: \\\"Google\\\",\\n    img: \\\"https://cdn.simpleicons.org/google/000/fff\\\",\\n  },\\n  {\\n    name: \\\"Facebook\\\",\\n    img: \\\"https://cdn.simpleicons.org/facebook/000/fff\\\",\\n  },\\n  {\\n    name: \\\"LinkedIn\\\",\\n    img: \\\"https://cdn.simpleicons.org/linkedin/000/fff\\\",\\n  },\\n  {\\n    name: \\\"Twitter\\\",\\n    img: \\\"https://cdn.simpleicons.org/twitter/000/fff\\\",\\n  },\\n]\\n\\nconst Logo = ({ name, img }: { name: string; img: string }) => {\\n  return (\\n    <div className={cn(\\\"size-12 cursor-pointer\\\")}>\\n      <img src={img} alt={name} />\\n    </div>\\n  )\\n}\\n\\nexport default function MarqueeLogos() {\\n  return (\\n    <div className=\\\"bg-background relative flex size-full flex-col items-center justify-center gap-4 overflow-hidden rounded-lg border py-20 md:shadow-xl\\\">\\n      <Marquee className=\\\"[--gap:3rem]\\\">\\n        {logos.map((logo, idx) => (\\n          <Logo key={idx} {...logo} />\\n        ))}\\n      </Marquee>\\n      <div className=\\\"dark:from-background pointer-events-none absolute inset-y-0 left-0 w-1/3 bg-gradient-to-r from-white\\\"></div>\\n      <div className=\\\"dark:from-background pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/marquee.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"marquee\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Marquee\",\n  \"description\": \"An infinite scrolling component that can be used to display text, images, or videos.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/marquee.tsx\",\n      \"content\": \"import { type ComponentPropsWithoutRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface MarqueeProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  /**\\n   * Optional CSS class name to apply custom styles\\n   */\\n  className?: string\\n  /**\\n   * Whether to reverse the animation direction\\n   * @default false\\n   */\\n  reverse?: boolean\\n  /**\\n   * Whether to pause the animation on hover\\n   * @default false\\n   */\\n  pauseOnHover?: boolean\\n  /**\\n   * Content to be displayed in the marquee\\n   */\\n  children: React.ReactNode\\n  /**\\n   * Whether to animate vertically instead of horizontally\\n   * @default false\\n   */\\n  vertical?: boolean\\n  /**\\n   * Number of times to repeat the content\\n   * @default 4\\n   */\\n  repeat?: number\\n}\\n\\nexport function Marquee({\\n  className,\\n  reverse = false,\\n  pauseOnHover = false,\\n  children,\\n  vertical = false,\\n  repeat = 4,\\n  ...props\\n}: MarqueeProps) {\\n  return (\\n    <div\\n      {...props}\\n      className={cn(\\n        \\\"group flex gap-(--gap) overflow-hidden p-2 [--duration:40s] [--gap:1rem]\\\",\\n        {\\n          \\\"flex-row\\\": !vertical,\\n          \\\"flex-col\\\": vertical,\\n        },\\n        className\\n      )}\\n    >\\n      {Array(repeat)\\n        .fill(0)\\n        .map((_, i) => (\\n          <div\\n            key={i}\\n            className={cn(\\\"flex shrink-0 justify-around gap-(--gap)\\\", {\\n              \\\"animate-marquee flex-row\\\": !vertical,\\n              \\\"animate-marquee-vertical flex-col\\\": vertical,\\n              \\\"group-hover:[animation-play-state:paused]\\\": pauseOnHover,\\n              \\\"[animation-direction:reverse]\\\": reverse,\\n            })}\\n          >\\n            {children}\\n          </div>\\n        ))}\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n      \"animate-marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes marquee\": {\n      \"from\": {\n        \"transform\": \"translateX(0)\"\n      },\n      \"to\": {\n        \"transform\": \"translateX(calc(-100% - var(--gap)))\"\n      }\n    },\n    \"@keyframes marquee-vertical\": {\n      \"from\": {\n        \"transform\": \"translateY(0)\"\n      },\n      \"to\": {\n        \"transform\": \"translateY(calc(-100% - var(--gap)))\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/meteors-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"meteors-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Meteors Demo\",\n  \"description\": \"Example showing a meteor shower effect.\",\n  \"registryDependencies\": [\n    \"@magicui/meteors\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/meteors-demo.tsx\",\n      \"content\": \"import { Meteors } from \\\"@/registry/magicui/meteors\\\"\\n\\nexport default function MeteorDemo() {\\n  return (\\n    <div className=\\\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <Meteors number={30} />\\n      <span className=\\\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\\\">\\n        Meteors\\n      </span>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/meteors.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"meteors\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Meteors\",\n  \"description\": \"A meteor shower effect.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/meteors.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useEffect, useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface MeteorsProps {\\n  number?: number\\n  minDelay?: number\\n  maxDelay?: number\\n  minDuration?: number\\n  maxDuration?: number\\n  angle?: number\\n  className?: string\\n}\\n\\nexport const Meteors = ({\\n  number = 20,\\n  minDelay = 0.2,\\n  maxDelay = 1.2,\\n  minDuration = 2,\\n  maxDuration = 10,\\n  angle = 215,\\n  className,\\n}: MeteorsProps) => {\\n  const [meteorStyles, setMeteorStyles] = useState<Array<React.CSSProperties>>(\\n    []\\n  )\\n\\n  useEffect(() => {\\n    const styles = [...new Array(number)].map(() => ({\\n      \\\"--angle\\\": -angle + \\\"deg\\\",\\n      top: \\\"-5%\\\",\\n      left: `calc(0% + ${Math.floor(Math.random() * window.innerWidth)}px)`,\\n      animationDelay: Math.random() * (maxDelay - minDelay) + minDelay + \\\"s\\\",\\n      animationDuration:\\n        Math.floor(Math.random() * (maxDuration - minDuration) + minDuration) +\\n        \\\"s\\\",\\n    }))\\n    setMeteorStyles(styles)\\n  }, [number, minDelay, maxDelay, minDuration, maxDuration, angle])\\n\\n  return (\\n    <>\\n      {[...meteorStyles].map((style, idx) => (\\n        // Meteor Head\\n        <span\\n          key={idx}\\n          style={{ ...style }}\\n          className={cn(\\n            \\\"animate-meteor pointer-events-none absolute size-0.5 rotate-(--angle) rounded-full bg-zinc-500 shadow-[0_0_0_1px_#ffffff10]\\\",\\n            className\\n          )}\\n        >\\n          {/* Meteor Tail */}\\n          <div className=\\\"pointer-events-none absolute top-1/2 -z-10 h-px w-12.5 -translate-y-1/2 bg-linear-to-r from-zinc-500 to-transparent\\\" />\\n        </span>\\n      ))}\\n    </>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-meteor\": \"meteor 5s linear infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes meteor\": {\n      \"0%\": {\n        \"transform\": \"rotate(var(--angle)) translateX(0)\",\n        \"opacity\": \"1\"\n      },\n      \"70%\": {\n        \"opacity\": \"1\"\n      },\n      \"100%\": {\n        \"transform\": \"rotate(var(--angle)) translateX(-500px)\",\n        \"opacity\": \"0\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/morphing-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"morphing-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Morphing Text Demo\",\n  \"description\": \"Example showing a dynamic text morphing component.\",\n  \"registryDependencies\": [\n    \"@magicui/morphing-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/morphing-text-demo.tsx\",\n      \"content\": \"import { MorphingText } from \\\"@/registry/magicui/morphing-text\\\"\\n\\nconst texts = [\\n  \\\"Hello\\\",\\n  \\\"Morphing\\\",\\n  \\\"Text\\\",\\n  \\\"Animation\\\",\\n  \\\"React\\\",\\n  \\\"Component\\\",\\n  \\\"Smooth\\\",\\n  \\\"Transition\\\",\\n  \\\"Engaging\\\",\\n]\\n\\nexport default function MorphingTextDemo() {\\n  return <MorphingText texts={texts} />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/morphing-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"morphing-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Morphing Text\",\n  \"description\": \"A dynamic text morphing component for Magic UI.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/morphing-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useCallback, useEffect, useRef } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst morphTime = 1.5\\nconst cooldownTime = 0.5\\n\\nconst useMorphingText = (texts: string[]) => {\\n  const textIndexRef = useRef(0)\\n  const morphRef = useRef(0)\\n  const cooldownRef = useRef(0)\\n  const timeRef = useRef(new Date())\\n\\n  const text1Ref = useRef<HTMLSpanElement>(null)\\n  const text2Ref = useRef<HTMLSpanElement>(null)\\n\\n  const setStyles = useCallback(\\n    (fraction: number) => {\\n      const [current1, current2] = [text1Ref.current, text2Ref.current]\\n      if (!current1 || !current2) return\\n\\n      current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`\\n      current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`\\n\\n      const invertedFraction = 1 - fraction\\n      current1.style.filter = `blur(${Math.min(\\n        8 / invertedFraction - 8,\\n        100\\n      )}px)`\\n      current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`\\n\\n      current1.textContent = texts[textIndexRef.current % texts.length]\\n      current2.textContent = texts[(textIndexRef.current + 1) % texts.length]\\n    },\\n    [texts]\\n  )\\n\\n  const doMorph = useCallback(() => {\\n    morphRef.current -= cooldownRef.current\\n    cooldownRef.current = 0\\n\\n    let fraction = morphRef.current / morphTime\\n\\n    if (fraction > 1) {\\n      cooldownRef.current = cooldownTime\\n      fraction = 1\\n    }\\n\\n    setStyles(fraction)\\n\\n    if (fraction === 1) {\\n      textIndexRef.current++\\n    }\\n  }, [setStyles])\\n\\n  const doCooldown = useCallback(() => {\\n    morphRef.current = 0\\n    const [current1, current2] = [text1Ref.current, text2Ref.current]\\n    if (current1 && current2) {\\n      current2.style.filter = \\\"none\\\"\\n      current2.style.opacity = \\\"100%\\\"\\n      current1.style.filter = \\\"none\\\"\\n      current1.style.opacity = \\\"0%\\\"\\n    }\\n  }, [])\\n\\n  useEffect(() => {\\n    let animationFrameId: number\\n\\n    const animate = () => {\\n      animationFrameId = requestAnimationFrame(animate)\\n\\n      const newTime = new Date()\\n      const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000\\n      timeRef.current = newTime\\n\\n      cooldownRef.current -= dt\\n\\n      if (cooldownRef.current <= 0) doMorph()\\n      else doCooldown()\\n    }\\n\\n    animate()\\n    return () => {\\n      cancelAnimationFrame(animationFrameId)\\n    }\\n  }, [doMorph, doCooldown])\\n\\n  return { text1Ref, text2Ref }\\n}\\n\\ninterface MorphingTextProps {\\n  className?: string\\n  texts: string[]\\n}\\n\\nconst Texts: React.FC<Pick<MorphingTextProps, \\\"texts\\\">> = ({ texts }) => {\\n  const { text1Ref, text2Ref } = useMorphingText(texts)\\n  return (\\n    <>\\n      <span\\n        className=\\\"absolute inset-x-0 top-0 m-auto inline-block w-full\\\"\\n        ref={text1Ref}\\n      />\\n      <span\\n        className=\\\"absolute inset-x-0 top-0 m-auto inline-block w-full\\\"\\n        ref={text2Ref}\\n      />\\n    </>\\n  )\\n}\\n\\nconst SvgFilters: React.FC = () => (\\n  <svg\\n    id=\\\"filters\\\"\\n    className=\\\"fixed h-0 w-0\\\"\\n    preserveAspectRatio=\\\"xMidYMid slice\\\"\\n  >\\n    <defs>\\n      <filter id=\\\"threshold\\\">\\n        <feColorMatrix\\n          in=\\\"SourceGraphic\\\"\\n          type=\\\"matrix\\\"\\n          values=\\\"1 0 0 0 0\\n                  0 1 0 0 0\\n                  0 0 1 0 0\\n                  0 0 0 255 -140\\\"\\n        />\\n      </filter>\\n    </defs>\\n  </svg>\\n)\\n\\nexport const MorphingText: React.FC<MorphingTextProps> = ({\\n  texts,\\n  className,\\n}) => (\\n  <div\\n    className={cn(\\n      \\\"relative mx-auto h-16 w-full max-w-3xl text-center font-sans text-[40pt] leading-none font-bold filter-[url(#threshold)_blur(0.6px)] md:h-24 lg:text-[6rem]\\\",\\n      className\\n    )}\\n  >\\n    <Texts texts={texts} />\\n    <SvgFilters />\\n  </div>\\n)\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/neon-gradient-card-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"neon-gradient-card-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Neon Gradient Card Demo\",\n  \"description\": \"Example showing a beautiful neon card effect.\",\n  \"registryDependencies\": [\n    \"@magicui/neon-gradient-card\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/neon-gradient-card-demo.tsx\",\n      \"content\": \"import { NeonGradientCard } from \\\"@/registry/magicui/neon-gradient-card\\\"\\n\\nexport default function NeonGradientCardDemo() {\\n  return (\\n    <NeonGradientCard className=\\\"max-w-sm items-center justify-center text-center\\\">\\n      <span className=\\\"pointer-events-none z-10 h-full bg-linear-to-br from-[#ff2975] from-35% to-[#00FFF1] bg-clip-text text-center text-3xl leading-none font-bold tracking-tighter text-balance whitespace-pre-wrap text-transparent md:text-5xl xl:text-6xl dark:drop-shadow-[0_5px_5px_rgba(0,0,0,0.8)]\\\">\\n        Neon Gradient Card\\n      </span>\\n    </NeonGradientCard>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/neon-gradient-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"neon-gradient-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Neon Gradient Card\",\n  \"description\": \"A beautiful neon card effect\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/neon-gradient-card.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  CSSProperties,\\n  ReactElement,\\n  ReactNode,\\n  useEffect,\\n  useRef,\\n  useState,\\n} from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface NeonColorsProps {\\n  firstColor: string\\n  secondColor: string\\n}\\n\\ninterface NeonGradientCardProps extends React.HTMLAttributes<HTMLDivElement> {\\n  /**\\n   * @default <div />\\n   * @type ReactElement\\n   * @description\\n   * The component to be rendered as the card\\n   * */\\n  as?: ReactElement\\n  /**\\n   * @default \\\"\\\"\\n   * @type string\\n   * @description\\n   * The className of the card\\n   */\\n  className?: string\\n\\n  /**\\n   * @default \\\"\\\"\\n   * @type ReactNode\\n   * @description\\n   * The children of the card\\n   * */\\n  children?: ReactNode\\n\\n  /**\\n   * @default 5\\n   * @type number\\n   * @description\\n   * The size of the border in pixels\\n   * */\\n  borderSize?: number\\n\\n  /**\\n   * @default 20\\n   * @type number\\n   * @description\\n   * The size of the radius in pixels\\n   * */\\n  borderRadius?: number\\n\\n  /**\\n   * @default \\\"{ firstColor: '#ff00aa', secondColor: '#00FFF1' }\\\"\\n   * @type string\\n   * @description\\n   * The colors of the neon gradient\\n   * */\\n  neonColors?: NeonColorsProps\\n}\\n\\nexport const NeonGradientCard: React.FC<NeonGradientCardProps> = ({\\n  className,\\n  children,\\n  borderSize = 2,\\n  borderRadius = 20,\\n  neonColors = {\\n    firstColor: \\\"#ff00aa\\\",\\n    secondColor: \\\"#00FFF1\\\",\\n  },\\n  ...props\\n}) => {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\\n\\n  useEffect(() => {\\n    const updateDimensions = () => {\\n      if (containerRef.current) {\\n        const { offsetWidth, offsetHeight } = containerRef.current\\n        setDimensions({ width: offsetWidth, height: offsetHeight })\\n      }\\n    }\\n\\n    updateDimensions()\\n    window.addEventListener(\\\"resize\\\", updateDimensions)\\n\\n    return () => {\\n      window.removeEventListener(\\\"resize\\\", updateDimensions)\\n    }\\n  }, [])\\n\\n  useEffect(() => {\\n    if (containerRef.current) {\\n      const { offsetWidth, offsetHeight } = containerRef.current\\n      setDimensions({ width: offsetWidth, height: offsetHeight })\\n    }\\n  }, [children])\\n\\n  return (\\n    <div\\n      ref={containerRef}\\n      style={\\n        {\\n          \\\"--border-size\\\": `${borderSize}px`,\\n          \\\"--border-radius\\\": `${borderRadius}px`,\\n          \\\"--neon-first-color\\\": neonColors.firstColor,\\n          \\\"--neon-second-color\\\": neonColors.secondColor,\\n          \\\"--card-width\\\": `${dimensions.width}px`,\\n          \\\"--card-height\\\": `${dimensions.height}px`,\\n          \\\"--card-content-radius\\\": `${borderRadius - borderSize}px`,\\n          \\\"--pseudo-element-background-image\\\": `linear-gradient(0deg, ${neonColors.firstColor}, ${neonColors.secondColor})`,\\n          \\\"--pseudo-element-width\\\": `${dimensions.width + borderSize * 2}px`,\\n          \\\"--pseudo-element-height\\\": `${dimensions.height + borderSize * 2}px`,\\n          \\\"--after-blur\\\": `${dimensions.width / 3}px`,\\n        } as CSSProperties\\n      }\\n      className={cn(\\n        \\\"relative z-10 size-full rounded-(--border-radius)\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <div\\n        className={cn(\\n          \\\"relative size-full min-h-[inherit] rounded-(--card-content-radius) bg-gray-100 p-6\\\",\\n          \\\"before:absolute before:-top-(--border-size) before:-left-(--border-size) before:-z-10 before:block\\\",\\n          \\\"before:h-(--pseudo-element-height) before:w-(--pseudo-element-width) before:rounded-(--border-radius) before:content-['']\\\",\\n          \\\"before:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] before:bg-size-[100%_200%]\\\",\\n          \\\"before:animate-background-position-spin\\\",\\n          \\\"after:absolute after:-top-(--border-size) after:-left-(--border-size) after:-z-10 after:block\\\",\\n          \\\"after:h-(--pseudo-element-height) after:w-(--pseudo-element-width) after:rounded-(--border-radius) after:blur-(--after-blur) after:content-['']\\\",\\n          \\\"after:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] after:bg-size-[100%_200%] after:opacity-80\\\",\\n          \\\"after:animate-background-position-spin\\\",\\n          \\\"dark:bg-neutral-900\\\",\\n          \\\"wrap-break-word\\\"\\n        )}\\n      >\\n        {children}\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-background-position-spin\": \"background-position-spin 3000ms infinite alternate\"\n    }\n  },\n  \"css\": {\n    \"@keyframes background-position-spin\": {\n      \"0%\": {\n        \"background-position\": \"top center\"\n      },\n      \"100%\": {\n        \"background-position\": \"bottom center\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/number-ticker-decimal-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"number-ticker-decimal-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Number Ticker Decimal Demo\",\n  \"description\": \"Example showing animated counting decimal numbers.\",\n  \"registryDependencies\": [\n    \"@magicui/number-ticker\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/number-ticker-decimal-demo.tsx\",\n      \"content\": \"import { NumberTicker } from \\\"@/registry/magicui/number-ticker\\\"\\n\\nexport default function NumberTickerDemo() {\\n  return (\\n    <NumberTicker\\n      value={5.67}\\n      decimalPlaces={2}\\n      className=\\\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/number-ticker-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"number-ticker-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Number Ticker Demo 2\",\n  \"description\": \"Example showing animated counting numbers.\",\n  \"registryDependencies\": [\n    \"@magicui/number-ticker\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/number-ticker-demo-2.tsx\",\n      \"content\": \"import { NumberTicker } from \\\"@/registry/magicui/number-ticker\\\"\\n\\nexport default function NumberTickerDemo() {\\n  return (\\n    <NumberTicker\\n      value={100}\\n      startValue={80}\\n      className=\\\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/number-ticker-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"number-ticker-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Number Ticker Demo\",\n  \"description\": \"Example showing animated counting numbers.\",\n  \"registryDependencies\": [\n    \"@magicui/number-ticker\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/number-ticker-demo.tsx\",\n      \"content\": \"import { NumberTicker } from \\\"@/registry/magicui/number-ticker\\\"\\n\\nexport default function NumberTickerDemo() {\\n  return (\\n    <NumberTicker\\n      value={100}\\n      className=\\\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\\\"\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/number-ticker.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"number-ticker\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Number Ticker\",\n  \"description\": \"Animate numbers to count up or down to a target number\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/number-ticker.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useRef, type ComponentPropsWithoutRef } from \\\"react\\\"\\nimport { useInView, useMotionValue, useSpring } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface NumberTickerProps extends ComponentPropsWithoutRef<\\\"span\\\"> {\\n  value: number\\n  startValue?: number\\n  direction?: \\\"up\\\" | \\\"down\\\"\\n  delay?: number\\n  decimalPlaces?: number\\n}\\n\\nexport function NumberTicker({\\n  value,\\n  startValue = 0,\\n  direction = \\\"up\\\",\\n  delay = 0,\\n  className,\\n  decimalPlaces = 0,\\n  ...props\\n}: NumberTickerProps) {\\n  const ref = useRef<HTMLSpanElement>(null)\\n  const motionValue = useMotionValue(direction === \\\"down\\\" ? value : startValue)\\n  const springValue = useSpring(motionValue, {\\n    damping: 60,\\n    stiffness: 100,\\n  })\\n  const isInView = useInView(ref, { once: true, margin: \\\"0px\\\" })\\n\\n  useEffect(() => {\\n    let timer: ReturnType<typeof setTimeout> | null = null\\n\\n    if (isInView) {\\n      timer = setTimeout(() => {\\n        motionValue.set(direction === \\\"down\\\" ? startValue : value)\\n      }, delay * 1000)\\n    }\\n\\n    return () => {\\n      if (timer !== null) {\\n        clearTimeout(timer)\\n      }\\n    }\\n  }, [motionValue, isInView, delay, value, direction, startValue])\\n\\n  useEffect(\\n    () =>\\n      springValue.on(\\\"change\\\", (latest) => {\\n        if (ref.current) {\\n          ref.current.textContent = Intl.NumberFormat(\\\"en-US\\\", {\\n            minimumFractionDigits: decimalPlaces,\\n            maximumFractionDigits: decimalPlaces,\\n          }).format(Number(latest.toFixed(decimalPlaces)))\\n        }\\n      }),\\n    [springValue, decimalPlaces]\\n  )\\n\\n  return (\\n    <span\\n      ref={ref}\\n      className={cn(\\n        \\\"inline-block tracking-wider text-black tabular-nums dark:text-white\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      {startValue}\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/orbiting-circles-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"orbiting-circles-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Orbiting Circles Demo\",\n  \"description\": \"Example showing circles moving in orbital paths.\",\n  \"dependencies\": [\n    \"@radix-ui/react-icons\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/orbiting-circles\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/orbiting-circles-demo.tsx\",\n      \"content\": \"import { OrbitingCircles } from \\\"@/registry/magicui/orbiting-circles\\\"\\n\\nexport default function OrbitingCirclesDemo() {\\n  return (\\n    <div className=\\\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\\\">\\n      <OrbitingCircles iconSize={40}>\\n        <Icons.whatsapp />\\n        <Icons.notion />\\n        <Icons.openai />\\n        <Icons.googleDrive />\\n        <Icons.whatsapp />\\n      </OrbitingCircles>\\n      <OrbitingCircles iconSize={30} radius={100} reverse speed={2}>\\n        <Icons.whatsapp />\\n        <Icons.notion />\\n        <Icons.openai />\\n        <Icons.googleDrive />\\n      </OrbitingCircles>\\n    </div>\\n  )\\n}\\n\\nconst Icons = {\\n  gitHub: () => (\\n    <svg width=\\\"100\\\" height=\\\"100\\\" viewBox=\\\"0 0 438.549 438.549\\\">\\n      <path\\n        fill=\\\"currentColor\\\"\\n        d=\\\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\\\"\\n      />\\n    </svg>\\n  ),\\n  notion: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 100 100\\\"\\n      fill=\\\"none\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\\\"\\n        fill=\\\"#000000\\\"\\n        fillRule=\\\"evenodd\\\"\\n        clipRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n  openai: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      className=\\\"fill-black dark:fill-white\\\"\\n    >\\n      <path d=\\\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\\\" />\\n    </svg>\\n  ),\\n  googleDrive: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 87.3 78\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <path\\n        d=\\\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\\\"\\n        fill=\\\"#0066da\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\\\"\\n        fill=\\\"#00ac47\\\"\\n      />\\n      <path\\n        d=\\\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\\\"\\n        fill=\\\"#ea4335\\\"\\n      />\\n      <path\\n        d=\\\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\\\"\\n        fill=\\\"#00832d\\\"\\n      />\\n      <path\\n        d=\\\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\\\"\\n        fill=\\\"#2684fc\\\"\\n      />\\n      <path\\n        d=\\\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\\\"\\n        fill=\\\"#ffba00\\\"\\n      />\\n    </svg>\\n  ),\\n  whatsapp: () => (\\n    <svg\\n      width=\\\"100\\\"\\n      height=\\\"100\\\"\\n      viewBox=\\\"0 0 175.216 175.552\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    >\\n      <defs>\\n        <linearGradient\\n          id=\\\"b\\\"\\n          x1=\\\"85.915\\\"\\n          x2=\\\"86.535\\\"\\n          y1=\\\"32.567\\\"\\n          y2=\\\"137.092\\\"\\n          gradientUnits=\\\"userSpaceOnUse\\\"\\n        >\\n          <stop offset=\\\"0\\\" stopColor=\\\"#57d163\\\" />\\n          <stop offset=\\\"1\\\" stopColor=\\\"#23b33a\\\" />\\n        </linearGradient>\\n        <filter\\n          id=\\\"a\\\"\\n          width=\\\"1.115\\\"\\n          height=\\\"1.114\\\"\\n          x=\\\"-.057\\\"\\n          y=\\\"-.057\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feGaussianBlur stdDeviation=\\\"3.531\\\" />\\n        </filter>\\n      </defs>\\n      <path\\n        d=\\\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\\\"\\n        fill=\\\"#b3b3b3\\\"\\n        filter=\\\"url(#a)\\\"\\n      />\\n      <path\\n        d=\\\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\\\"\\n        fill=\\\"#ffffff\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\\\"\\n        fill=\\\"url(#linearGradient1780)\\\"\\n      />\\n      <path\\n        d=\\\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\\\"\\n        fill=\\\"url(#b)\\\"\\n      />\\n      <path\\n        d=\\\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\\\"\\n        fill=\\\"#ffffff\\\"\\n        fillRule=\\\"evenodd\\\"\\n      />\\n    </svg>\\n  ),\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/orbiting-circles.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"orbiting-circles\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Orbiting Circles\",\n  \"description\": \"A collection of circles which move in orbit along a circular path\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/orbiting-circles.tsx\",\n      \"content\": \"import React from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface OrbitingCirclesProps extends React.HTMLAttributes<HTMLDivElement> {\\n  className?: string\\n  children?: React.ReactNode\\n  reverse?: boolean\\n  duration?: number\\n  delay?: number\\n  radius?: number\\n  path?: boolean\\n  iconSize?: number\\n  speed?: number\\n}\\n\\nexport function OrbitingCircles({\\n  className,\\n  children,\\n  reverse,\\n  duration = 20,\\n  radius = 160,\\n  path = true,\\n  iconSize = 30,\\n  speed = 1,\\n  ...props\\n}: OrbitingCirclesProps) {\\n  const calculatedDuration = duration / speed\\n  return (\\n    <>\\n      {path && (\\n        <svg\\n          xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n          version=\\\"1.1\\\"\\n          className=\\\"pointer-events-none absolute inset-0 size-full\\\"\\n        >\\n          <circle\\n            className=\\\"stroke-black/10 stroke-1 dark:stroke-white/10\\\"\\n            cx=\\\"50%\\\"\\n            cy=\\\"50%\\\"\\n            r={radius}\\n            fill=\\\"none\\\"\\n          />\\n        </svg>\\n      )}\\n      {React.Children.map(children, (child, index) => {\\n        const angle = (360 / React.Children.count(children)) * index\\n        return (\\n          <div\\n            style={\\n              {\\n                \\\"--duration\\\": calculatedDuration,\\n                \\\"--radius\\\": radius,\\n                \\\"--angle\\\": angle,\\n                \\\"--icon-size\\\": `${iconSize}px`,\\n              } as React.CSSProperties\\n            }\\n            className={cn(\\n              `animate-orbit absolute flex size-(--icon-size) transform-gpu items-center justify-center rounded-full`,\\n              { \\\"[animation-direction:reverse]\\\": reverse },\\n              className\\n            )}\\n            {...props}\\n          >\\n            {child}\\n          </div>\\n        )\\n      })}\\n    </>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes orbit\": {\n      \"0%\": {\n        \"transform\": \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\"\n      },\n      \"100%\": {\n        \"transform\": \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/particles-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"particles-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Particles Demo\",\n  \"description\": \"Example showing interactive particle effects.\",\n  \"dependencies\": [\n    \"next-themes\"\n  ],\n  \"registryDependencies\": [\n    \"@magicui/particles\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/particles-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useState } from \\\"react\\\"\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { Particles } from \\\"@/registry/magicui/particles\\\"\\n\\nexport default function ParticlesDemo() {\\n  const { resolvedTheme } = useTheme()\\n  const [color, setColor] = useState(\\\"#ffffff\\\")\\n\\n  useEffect(() => {\\n    setColor(resolvedTheme === \\\"dark\\\" ? \\\"#ffffff\\\" : \\\"#000000\\\")\\n  }, [resolvedTheme])\\n\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <span className=\\\"pointer-events-none z-10 text-center text-8xl leading-none font-semibold whitespace-pre-wrap\\\">\\n        Particles\\n      </span>\\n      <Particles\\n        className=\\\"absolute inset-0 z-0\\\"\\n        quantity={100}\\n        ease={80}\\n        color={color}\\n        refresh\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/particles.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"particles\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Particles\",\n  \"description\": \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/particles.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, {\\n  useEffect,\\n  useRef,\\n  useState,\\n  type ComponentPropsWithoutRef,\\n} from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface MousePosition {\\n  x: number\\n  y: number\\n}\\n\\nfunction MousePosition(): MousePosition {\\n  const [mousePosition, setMousePosition] = useState<MousePosition>({\\n    x: 0,\\n    y: 0,\\n  })\\n\\n  useEffect(() => {\\n    const handleMouseMove = (event: MouseEvent) => {\\n      setMousePosition({ x: event.clientX, y: event.clientY })\\n    }\\n\\n    window.addEventListener(\\\"mousemove\\\", handleMouseMove)\\n\\n    return () => {\\n      window.removeEventListener(\\\"mousemove\\\", handleMouseMove)\\n    }\\n  }, [])\\n\\n  return mousePosition\\n}\\n\\ninterface ParticlesProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  className?: string\\n  quantity?: number\\n  staticity?: number\\n  ease?: number\\n  size?: number\\n  refresh?: boolean\\n  color?: string\\n  vx?: number\\n  vy?: number\\n}\\n\\nfunction hexToRgb(hex: string): number[] {\\n  hex = hex.replace(\\\"#\\\", \\\"\\\")\\n\\n  if (hex.length === 3) {\\n    hex = hex\\n      .split(\\\"\\\")\\n      .map((char) => char + char)\\n      .join(\\\"\\\")\\n  }\\n\\n  const hexInt = parseInt(hex, 16)\\n  const red = (hexInt >> 16) & 255\\n  const green = (hexInt >> 8) & 255\\n  const blue = hexInt & 255\\n  return [red, green, blue]\\n}\\n\\ntype Circle = {\\n  x: number\\n  y: number\\n  translateX: number\\n  translateY: number\\n  size: number\\n  alpha: number\\n  targetAlpha: number\\n  dx: number\\n  dy: number\\n  magnetism: number\\n}\\n\\nexport const Particles: React.FC<ParticlesProps> = ({\\n  className = \\\"\\\",\\n  quantity = 100,\\n  staticity = 50,\\n  ease = 50,\\n  size = 0.4,\\n  refresh = false,\\n  color = \\\"#ffffff\\\",\\n  vx = 0,\\n  vy = 0,\\n  ...props\\n}) => {\\n  const canvasRef = useRef<HTMLCanvasElement>(null)\\n  const canvasContainerRef = useRef<HTMLDivElement>(null)\\n  const context = useRef<CanvasRenderingContext2D | null>(null)\\n  const circles = useRef<Circle[]>([])\\n  const mousePosition = MousePosition()\\n  const mouse = useRef<{ x: number; y: number }>({ x: 0, y: 0 })\\n  const canvasSize = useRef<{ w: number; h: number }>({ w: 0, h: 0 })\\n  const dpr = typeof window !== \\\"undefined\\\" ? window.devicePixelRatio : 1\\n  const rafID = useRef<number | null>(null)\\n  const resizeTimeout = useRef<NodeJS.Timeout | null>(null)\\n  const initCanvasRef = useRef<() => void>(() => {})\\n  const onMouseMoveRef = useRef<() => void>(() => {})\\n  const animateRef = useRef<() => void>(() => {})\\n\\n  useEffect(() => {\\n    if (canvasRef.current) {\\n      context.current = canvasRef.current.getContext(\\\"2d\\\")\\n    }\\n    initCanvasRef.current()\\n    animateRef.current()\\n\\n    const handleResize = () => {\\n      if (resizeTimeout.current) {\\n        clearTimeout(resizeTimeout.current)\\n      }\\n      resizeTimeout.current = setTimeout(() => {\\n        initCanvasRef.current()\\n      }, 200)\\n    }\\n\\n    window.addEventListener(\\\"resize\\\", handleResize)\\n\\n    return () => {\\n      if (rafID.current != null) {\\n        window.cancelAnimationFrame(rafID.current)\\n      }\\n      if (resizeTimeout.current) {\\n        clearTimeout(resizeTimeout.current)\\n      }\\n      window.removeEventListener(\\\"resize\\\", handleResize)\\n    }\\n  }, [color])\\n\\n  useEffect(() => {\\n    onMouseMoveRef.current()\\n  }, [mousePosition.x, mousePosition.y])\\n\\n  useEffect(() => {\\n    initCanvasRef.current()\\n  }, [refresh])\\n\\n  const initCanvas = () => {\\n    resizeCanvas()\\n    drawParticles()\\n  }\\n\\n  const onMouseMove = () => {\\n    if (canvasRef.current) {\\n      const rect = canvasRef.current.getBoundingClientRect()\\n      const { w, h } = canvasSize.current\\n      const x = mousePosition.x - rect.left - w / 2\\n      const y = mousePosition.y - rect.top - h / 2\\n      const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2\\n      if (inside) {\\n        mouse.current.x = x\\n        mouse.current.y = y\\n      }\\n    }\\n  }\\n\\n  const resizeCanvas = () => {\\n    if (canvasContainerRef.current && canvasRef.current && context.current) {\\n      canvasSize.current.w = canvasContainerRef.current.offsetWidth\\n      canvasSize.current.h = canvasContainerRef.current.offsetHeight\\n\\n      canvasRef.current.width = canvasSize.current.w * dpr\\n      canvasRef.current.height = canvasSize.current.h * dpr\\n      canvasRef.current.style.width = `${canvasSize.current.w}px`\\n      canvasRef.current.style.height = `${canvasSize.current.h}px`\\n      context.current.scale(dpr, dpr)\\n\\n      // Clear existing particles and create new ones with exact quantity\\n      circles.current = []\\n      for (let i = 0; i < quantity; i++) {\\n        const circle = circleParams()\\n        drawCircle(circle)\\n      }\\n    }\\n  }\\n\\n  const circleParams = (): Circle => {\\n    const x = Math.floor(Math.random() * canvasSize.current.w)\\n    const y = Math.floor(Math.random() * canvasSize.current.h)\\n    const translateX = 0\\n    const translateY = 0\\n    const pSize = Math.floor(Math.random() * 2) + size\\n    const alpha = 0\\n    const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1))\\n    const dx = (Math.random() - 0.5) * 0.1\\n    const dy = (Math.random() - 0.5) * 0.1\\n    const magnetism = 0.1 + Math.random() * 4\\n    return {\\n      x,\\n      y,\\n      translateX,\\n      translateY,\\n      size: pSize,\\n      alpha,\\n      targetAlpha,\\n      dx,\\n      dy,\\n      magnetism,\\n    }\\n  }\\n\\n  const rgb = hexToRgb(color)\\n\\n  const drawCircle = (circle: Circle, update = false) => {\\n    if (context.current) {\\n      const { x, y, translateX, translateY, size, alpha } = circle\\n      context.current.translate(translateX, translateY)\\n      context.current.beginPath()\\n      context.current.arc(x, y, size, 0, 2 * Math.PI)\\n      context.current.fillStyle = `rgba(${rgb.join(\\\", \\\")}, ${alpha})`\\n      context.current.fill()\\n      context.current.setTransform(dpr, 0, 0, dpr, 0, 0)\\n\\n      if (!update) {\\n        circles.current.push(circle)\\n      }\\n    }\\n  }\\n\\n  const clearContext = () => {\\n    if (context.current) {\\n      context.current.clearRect(\\n        0,\\n        0,\\n        canvasSize.current.w,\\n        canvasSize.current.h\\n      )\\n    }\\n  }\\n\\n  const drawParticles = () => {\\n    clearContext()\\n    const particleCount = quantity\\n    for (let i = 0; i < particleCount; i++) {\\n      const circle = circleParams()\\n      drawCircle(circle)\\n    }\\n  }\\n\\n  const remapValue = (\\n    value: number,\\n    start1: number,\\n    end1: number,\\n    start2: number,\\n    end2: number\\n  ): number => {\\n    const remapped =\\n      ((value - start1) * (end2 - start2)) / (end1 - start1) + start2\\n    return remapped > 0 ? remapped : 0\\n  }\\n\\n  const animate = () => {\\n    clearContext()\\n    circles.current.forEach((circle: Circle, i: number) => {\\n      // Handle the alpha value\\n      const edge = [\\n        circle.x + circle.translateX - circle.size, // distance from left edge\\n        canvasSize.current.w - circle.x - circle.translateX - circle.size, // distance from right edge\\n        circle.y + circle.translateY - circle.size, // distance from top edge\\n        canvasSize.current.h - circle.y - circle.translateY - circle.size, // distance from bottom edge\\n      ]\\n      const closestEdge = edge.reduce((a, b) => Math.min(a, b))\\n      const remapClosestEdge = parseFloat(\\n        remapValue(closestEdge, 0, 20, 0, 1).toFixed(2)\\n      )\\n      if (remapClosestEdge > 1) {\\n        circle.alpha += 0.02\\n        if (circle.alpha > circle.targetAlpha) {\\n          circle.alpha = circle.targetAlpha\\n        }\\n      } else {\\n        circle.alpha = circle.targetAlpha * remapClosestEdge\\n      }\\n      circle.x += circle.dx + vx\\n      circle.y += circle.dy + vy\\n      circle.translateX +=\\n        (mouse.current.x / (staticity / circle.magnetism) - circle.translateX) /\\n        ease\\n      circle.translateY +=\\n        (mouse.current.y / (staticity / circle.magnetism) - circle.translateY) /\\n        ease\\n\\n      drawCircle(circle, true)\\n\\n      // circle gets out of the canvas\\n      if (\\n        circle.x < -circle.size ||\\n        circle.x > canvasSize.current.w + circle.size ||\\n        circle.y < -circle.size ||\\n        circle.y > canvasSize.current.h + circle.size\\n      ) {\\n        // remove the circle from the array\\n        circles.current.splice(i, 1)\\n        // create a new circle\\n        const newCircle = circleParams()\\n        drawCircle(newCircle)\\n      }\\n    })\\n    rafID.current = window.requestAnimationFrame(animateRef.current)\\n  }\\n\\n  initCanvasRef.current = initCanvas\\n  onMouseMoveRef.current = onMouseMove\\n  animateRef.current = animate\\n\\n  return (\\n    <div\\n      className={cn(\\\"pointer-events-none\\\", className)}\\n      ref={canvasContainerRef}\\n      aria-hidden=\\\"true\\\"\\n      {...props}\\n    >\\n      <canvas ref={canvasRef} className=\\\"size-full\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pixel-image-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pixel-image-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Pixel Image Demo\",\n  \"description\": \"Example showing a pixelated image effect.\",\n  \"registryDependencies\": [\n    \"@magicui/pixel-image\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/pixel-image-demo.tsx\",\n      \"content\": \"import { PixelImage } from \\\"@/registry/magicui/pixel-image\\\"\\n\\nexport default function Home() {\\n  return (\\n    <PixelImage\\n      src=\\\"/pixel-image-demo.jpg\\\"\\n      customGrid={{ rows: 4, cols: 6 }}\\n      grayscaleAnimation\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pixel-image.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pixel-image\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Pixel Image\",\n  \"description\": \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/pixel-image.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useMemo, useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ntype Grid = {\\n  rows: number\\n  cols: number\\n}\\n\\nconst DEFAULT_GRIDS: Record<string, Grid> = {\\n  \\\"6x4\\\": { rows: 4, cols: 6 },\\n  \\\"8x8\\\": { rows: 8, cols: 8 },\\n  \\\"8x3\\\": { rows: 3, cols: 8 },\\n  \\\"4x6\\\": { rows: 6, cols: 4 },\\n  \\\"3x8\\\": { rows: 8, cols: 3 },\\n}\\n\\ntype PredefinedGridKey = keyof typeof DEFAULT_GRIDS\\n\\ninterface PixelImageProps {\\n  src: string\\n  grid?: PredefinedGridKey\\n  customGrid?: Grid\\n  grayscaleAnimation?: boolean\\n  pixelFadeInDuration?: number // in ms\\n  maxAnimationDelay?: number // in ms\\n  colorRevealDelay?: number // in ms\\n}\\n\\nexport const PixelImage = ({\\n  src,\\n  grid = \\\"6x4\\\",\\n  grayscaleAnimation = true,\\n  pixelFadeInDuration = 1000,\\n  maxAnimationDelay = 1200,\\n  colorRevealDelay = 1300,\\n  customGrid,\\n}: PixelImageProps) => {\\n  const [isVisible, setIsVisible] = useState(false)\\n  const [showColor, setShowColor] = useState(false)\\n\\n  const MIN_GRID = 1\\n  const MAX_GRID = 16\\n\\n  const { rows, cols } = useMemo(() => {\\n    const isValidGrid = (grid?: Grid) => {\\n      if (!grid) return false\\n      const { rows, cols } = grid\\n      return (\\n        Number.isInteger(rows) &&\\n        Number.isInteger(cols) &&\\n        rows >= MIN_GRID &&\\n        cols >= MIN_GRID &&\\n        rows <= MAX_GRID &&\\n        cols <= MAX_GRID\\n      )\\n    }\\n\\n    return isValidGrid(customGrid) ? customGrid! : DEFAULT_GRIDS[grid]\\n  }, [customGrid, grid])\\n\\n  useEffect(() => {\\n    setIsVisible(true)\\n    const colorTimeout = setTimeout(() => {\\n      setShowColor(true)\\n    }, colorRevealDelay)\\n    return () => clearTimeout(colorTimeout)\\n  }, [colorRevealDelay])\\n\\n  const pieces = useMemo(() => {\\n    const total = rows * cols\\n    return Array.from({ length: total }, (_, index) => {\\n      const row = Math.floor(index / cols)\\n      const col = index % cols\\n\\n      const clipPath = `polygon(\\n        ${col * (100 / cols)}% ${row * (100 / rows)}%,\\n        ${(col + 1) * (100 / cols)}% ${row * (100 / rows)}%,\\n        ${(col + 1) * (100 / cols)}% ${(row + 1) * (100 / rows)}%,\\n        ${col * (100 / cols)}% ${(row + 1) * (100 / rows)}%\\n      )`\\n\\n      const delay = Math.random() * maxAnimationDelay\\n      return {\\n        clipPath,\\n        delay,\\n      }\\n    })\\n  }, [rows, cols, maxAnimationDelay])\\n\\n  return (\\n    <div className=\\\"relative h-72 w-72 select-none md:h-96 md:w-96\\\">\\n      {pieces.map((piece, index) => (\\n        <div\\n          key={index}\\n          className={cn(\\n            \\\"absolute inset-0 transition-all ease-out\\\",\\n            isVisible ? \\\"opacity-100\\\" : \\\"opacity-0\\\"\\n          )}\\n          style={{\\n            clipPath: piece.clipPath,\\n            transitionDelay: `${piece.delay}ms`,\\n            transitionDuration: `${pixelFadeInDuration}ms`,\\n          }}\\n        >\\n          <img\\n            src={src}\\n            alt={`Pixel image piece ${index + 1}`}\\n            className={cn(\\n              \\\"z-1 rounded-[2.5rem] object-cover\\\",\\n              grayscaleAnimation && (showColor ? \\\"grayscale-0\\\" : \\\"grayscale\\\")\\n            )}\\n            style={{\\n              transition: grayscaleAnimation\\n                ? `filter ${pixelFadeInDuration}ms cubic-bezier(0.4, 0, 0.2, 1)`\\n                : \\\"none\\\",\\n            }}\\n            draggable={false}\\n          />\\n        </div>\\n      ))}\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pointer-demo-1.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pointer-demo-1\",\n  \"type\": \"registry:example\",\n  \"title\": \"Pointer Demo 1\",\n  \"description\": \"Example showing a pointer effect component\",\n  \"registryDependencies\": [\n    \"@magicui/pointer\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/pointer-demo-1.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { Pointer } from \\\"@/registry/magicui/pointer\\\"\\n\\nexport default function PointerDemo1() {\\n  return (\\n    <div className=\\\"grid grid-cols-1 gap-6 md:grid-cols-2 md:grid-rows-2\\\">\\n      <div className=\\\"border-border rounded-lg border p-4\\\">\\n        <div className=\\\"relative flex h-40 flex-col items-center justify-center\\\">\\n          <h3 className=\\\"text-xl font-semibold\\\">Animated Pointer</h3>\\n          <p className=\\\"text-muted-foreground text-sm\\\">Animated pointer</p>\\n        </div>\\n        <Pointer>\\n          <motion.div\\n            animate={{\\n              scale: [0.8, 1, 0.8],\\n              rotate: [0, 5, -5, 0],\\n            }}\\n            transition={{\\n              duration: 1.5,\\n              repeat: Infinity,\\n              ease: \\\"easeInOut\\\",\\n            }}\\n          >\\n            <svg\\n              width=\\\"40\\\"\\n              height=\\\"40\\\"\\n              viewBox=\\\"0 0 40 40\\\"\\n              fill=\\\"none\\\"\\n              xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n              className=\\\"text-pink-600\\\"\\n            >\\n              <motion.path\\n                d=\\\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\\\"\\n                fill=\\\"currentColor\\\"\\n                animate={{ scale: [1, 1.2, 1] }}\\n                transition={{\\n                  duration: 0.8,\\n                  repeat: Infinity,\\n                  ease: \\\"easeInOut\\\",\\n                }}\\n              />\\n            </svg>\\n          </motion.div>\\n        </Pointer>\\n      </div>\\n\\n      <div className=\\\"border-border rounded-lg border p-4\\\">\\n        <div className=\\\"relative flex h-40 flex-col items-center justify-center\\\">\\n          <h3 className=\\\"text-xl font-semibold\\\">Colored Pointer</h3>\\n          <p className=\\\"text-muted-foreground text-sm\\\">\\n            A custom pointer with different color\\n          </p>\\n        </div>\\n        <Pointer className=\\\"fill-blue-500\\\" />\\n      </div>\\n\\n      <div className=\\\"border-border rounded-lg border p-4\\\">\\n        <div className=\\\"relative flex h-40 flex-col items-center justify-center\\\">\\n          <h3 className=\\\"text-xl font-semibold\\\">Custom Shape</h3>\\n          <p className=\\\"text-muted-foreground text-sm\\\">\\n            A pointer with a custom SVG shape\\n          </p>\\n        </div>\\n        <Pointer>\\n          <svg\\n            width=\\\"24\\\"\\n            height=\\\"24\\\"\\n            viewBox=\\\"0 0 24 24\\\"\\n            fill=\\\"none\\\"\\n            xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n          >\\n            <circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\" className=\\\"fill-purple-500\\\" />\\n            <circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"5\\\" className=\\\"fill-white\\\" />\\n          </svg>\\n        </Pointer>\\n      </div>\\n\\n      <div className=\\\"border-border rounded-lg border p-4\\\">\\n        <div className=\\\"relative flex h-40 flex-col items-center justify-center\\\">\\n          <h3 className=\\\"text-xl font-semibold\\\">Emoji Pointer</h3>\\n          <p className=\\\"text-muted-foreground text-sm\\\">\\n            Using an emoji as a custom pointer\\n          </p>\\n        </div>\\n        <Pointer>\\n          <div className=\\\"text-2xl\\\">👆</div>\\n        </Pointer>\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pointer.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pointer\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Pointer\",\n  \"description\": \"A component that displays a pointer when hovering over an element\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/pointer.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useRef, useState } from \\\"react\\\"\\nimport {\\n  AnimatePresence,\\n  HTMLMotionProps,\\n  motion,\\n  useMotionValue,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\n/**\\n * A custom pointer component that displays an animated cursor.\\n * Add this as a child to any component to enable a custom pointer when hovering.\\n * You can pass custom children to render as the pointer.\\n *\\n * @component\\n * @param {HTMLMotionProps<\\\"div\\\">} props - The component props\\n */\\nexport function Pointer({\\n  className,\\n  style,\\n  children,\\n  ...props\\n}: HTMLMotionProps<\\\"div\\\">): React.ReactNode {\\n  const x = useMotionValue(0)\\n  const y = useMotionValue(0)\\n  const [isActive, setIsActive] = useState<boolean>(false)\\n  const containerRef = useRef<HTMLDivElement>(null)\\n\\n  useEffect(() => {\\n    const parentElement =\\n      typeof window !== \\\"undefined\\\"\\n        ? (containerRef.current?.parentElement ?? null)\\n        : null\\n\\n    const handleMouseMove = (e: MouseEvent) => {\\n      x.set(e.clientX)\\n      y.set(e.clientY)\\n      setIsActive(true)\\n    }\\n\\n    const handleMouseEnter = (e: MouseEvent) => {\\n      x.set(e.clientX)\\n      y.set(e.clientY)\\n      setIsActive(true)\\n    }\\n\\n    const handleMouseLeave = () => {\\n      setIsActive(false)\\n    }\\n\\n    if (parentElement) {\\n      parentElement.style.cursor = \\\"none\\\"\\n      parentElement.addEventListener(\\\"mousemove\\\", handleMouseMove)\\n      parentElement.addEventListener(\\\"mouseenter\\\", handleMouseEnter)\\n      parentElement.addEventListener(\\\"mouseleave\\\", handleMouseLeave)\\n    }\\n\\n    return () => {\\n      if (parentElement) {\\n        parentElement.style.cursor = \\\"\\\"\\n        parentElement.removeEventListener(\\\"mousemove\\\", handleMouseMove)\\n        parentElement.removeEventListener(\\\"mouseenter\\\", handleMouseEnter)\\n        parentElement.removeEventListener(\\\"mouseleave\\\", handleMouseLeave)\\n      }\\n    }\\n  }, [x, y])\\n\\n  return (\\n    <>\\n      <div ref={containerRef} />\\n      <AnimatePresence>\\n        {isActive && (\\n          <motion.div\\n            className=\\\"pointer-events-none fixed z-50 transform-[translate(-50%,-50%)]\\\"\\n            style={{\\n              top: y,\\n              left: x,\\n              ...style,\\n            }}\\n            initial={{\\n              scale: 0,\\n              opacity: 0,\\n            }}\\n            animate={{\\n              scale: 1,\\n              opacity: 1,\\n            }}\\n            exit={{\\n              scale: 0,\\n              opacity: 0,\\n            }}\\n            {...props}\\n          >\\n            {children || (\\n              <svg\\n                stroke=\\\"currentColor\\\"\\n                fill=\\\"currentColor\\\"\\n                strokeWidth=\\\"1\\\"\\n                viewBox=\\\"0 0 16 16\\\"\\n                height=\\\"24\\\"\\n                width=\\\"24\\\"\\n                xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n                className={cn(\\n                  \\\"rotate-[-70deg] stroke-white text-black\\\",\\n                  className\\n                )}\\n              >\\n                <path d=\\\"M14.082 2.182a.5.5 0 0 1 .103.557L8.528 15.467a.5.5 0 0 1-.917-.007L5.57 10.694.803 8.652a.5.5 0 0 1-.006-.916l12.728-5.657a.5.5 0 0 1 .556.103z\\\" />\\n              </svg>\\n            )}\\n          </motion.div>\\n        )}\\n      </AnimatePresence>\\n    </>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/progressive-blur-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"progressive-blur-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Progressive Blur Demo\",\n  \"description\": \"Example showing progressive blur effect for scrollable content.\",\n  \"registryDependencies\": [\n    \"@magicui/progressive-blur\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/progressive-blur-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { ScrollArea } from \\\"@/components/ui/scroll-area\\\"\\nimport { ProgressiveBlur } from \\\"@/registry/magicui/progressive-blur\\\"\\n\\nexport default function ProgressiveBlurDemo() {\\n  return (\\n    <div className=\\\"relative w-full rounded-xl border\\\">\\n      <ScrollArea className=\\\"relative h-[400px] overflow-hidden\\\">\\n        <div className=\\\"flex flex-col gap-2 p-4\\\">\\n          {Array.from({ length: 20 }).map((_, index) => (\\n            <div\\n              key={index}\\n              className=\\\"bg-card flex h-20 w-full items-center justify-center rounded-xl border\\\"\\n            >\\n              {index}\\n            </div>\\n          ))}\\n        </div>\\n        <ProgressiveBlur position=\\\"bottom\\\" height=\\\"40%\\\" />\\n      </ScrollArea>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/progressive-blur.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"progressive-blur\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Progressive Blur\",\n  \"description\": \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/progressive-blur.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface ProgressiveBlurProps {\\n  className?: string\\n  height?: string\\n  position?: \\\"top\\\" | \\\"bottom\\\" | \\\"both\\\"\\n  blurLevels?: number[]\\n  children?: React.ReactNode\\n}\\n\\nexport function ProgressiveBlur({\\n  className,\\n  height = \\\"30%\\\",\\n  position = \\\"bottom\\\",\\n  blurLevels = [0.5, 1, 2, 4, 8, 16, 32, 64],\\n}: ProgressiveBlurProps) {\\n  // Create array with length equal to blurLevels.length - 2 (for before/after pseudo elements)\\n  const divElements = Array(blurLevels.length - 2).fill(null)\\n\\n  return (\\n    <div\\n      className={cn(\\n        \\\"gradient-blur pointer-events-none absolute inset-x-0 z-10\\\",\\n        className,\\n        position === \\\"top\\\"\\n          ? \\\"top-0\\\"\\n          : position === \\\"bottom\\\"\\n            ? \\\"bottom-0\\\"\\n            : \\\"inset-y-0\\\"\\n      )}\\n      style={{\\n        height: position === \\\"both\\\" ? \\\"100%\\\" : height,\\n      }}\\n    >\\n      {/* First blur layer (pseudo element) */}\\n      <div\\n        className=\\\"absolute inset-0\\\"\\n        style={{\\n          zIndex: 1,\\n          backdropFilter: `blur(${blurLevels[0]}px)`,\\n          WebkitBackdropFilter: `blur(${blurLevels[0]}px)`,\\n          maskImage:\\n            position === \\\"bottom\\\"\\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\\n              : position === \\\"top\\\"\\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\\n          WebkitMaskImage:\\n            position === \\\"bottom\\\"\\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\\n              : position === \\\"top\\\"\\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\\n        }}\\n      />\\n\\n      {/* Middle blur layers */}\\n      {divElements.map((_, index) => {\\n        const blurIndex = index + 1\\n        const startPercent = blurIndex * 12.5\\n        const midPercent = (blurIndex + 1) * 12.5\\n        const endPercent = (blurIndex + 2) * 12.5\\n\\n        const maskGradient =\\n          position === \\\"bottom\\\"\\n            ? `linear-gradient(to bottom, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\\n            : position === \\\"top\\\"\\n              ? `linear-gradient(to top, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\\n              : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`\\n\\n        return (\\n          <div\\n            key={`blur-${index}`}\\n            className=\\\"absolute inset-0\\\"\\n            style={{\\n              zIndex: index + 2,\\n              backdropFilter: `blur(${blurLevels[blurIndex]}px)`,\\n              WebkitBackdropFilter: `blur(${blurLevels[blurIndex]}px)`,\\n              maskImage: maskGradient,\\n              WebkitMaskImage: maskGradient,\\n            }}\\n          />\\n        )\\n      })}\\n\\n      {/* Last blur layer (pseudo element) */}\\n      <div\\n        className=\\\"absolute inset-0\\\"\\n        style={{\\n          zIndex: blurLevels.length,\\n          backdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\\n          WebkitBackdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\\n          maskImage:\\n            position === \\\"bottom\\\"\\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\\n              : position === \\\"top\\\"\\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\\n          WebkitMaskImage:\\n            position === \\\"bottom\\\"\\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\\n              : position === \\\"top\\\"\\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\\n        }}\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pulsating-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pulsating-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Pulsating Button Demo\",\n  \"description\": \"Example showing an animated pulsating button.\",\n  \"registryDependencies\": [\n    \"@magicui/pulsating-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/pulsating-button-demo.tsx\",\n      \"content\": \"import { PulsatingButton } from \\\"@/registry/magicui/pulsating-button\\\"\\n\\nexport default function PulsatingButtonDemo() {\\n  return <PulsatingButton>Join Affiliate Program</PulsatingButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/pulsating-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"pulsating-button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Pulsating Button\",\n  \"description\": \"An animated pulsating button useful for capturing attention of users.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/pulsating-button.tsx\",\n      \"content\": \"import React from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface PulsatingButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n  pulseColor?: string\\n  duration?: string\\n}\\n\\nexport const PulsatingButton = React.forwardRef<\\n  HTMLButtonElement,\\n  PulsatingButtonProps\\n>(\\n  (\\n    {\\n      className,\\n      children,\\n      pulseColor = \\\"#808080\\\",\\n      duration = \\\"1.5s\\\",\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    return (\\n      <button\\n        ref={ref}\\n        className={cn(\\n          \\\"bg-primary text-primary-foreground relative flex cursor-pointer items-center justify-center rounded-lg px-4 py-2 text-center\\\",\\n          className\\n        )}\\n        style={\\n          {\\n            \\\"--pulse-color\\\": pulseColor,\\n            \\\"--duration\\\": duration,\\n          } as React.CSSProperties\\n        }\\n        {...props}\\n      >\\n        <div className=\\\"relative z-10\\\">{children}</div>\\n        <div className=\\\"absolute top-1/2 left-1/2 size-full -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-lg bg-inherit\\\" />\\n      </button>\\n    )\\n  }\\n)\\n\\nPulsatingButton.displayName = \\\"PulsatingButton\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-pulse\": \"pulse var(--duration) ease-out infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes pulse\": {\n      \"0%, 100%\": {\n        \"boxShadow\": \"0 0 0 0 var(--pulse-color)\"\n      },\n      \"50%\": {\n        \"boxShadow\": \"0 0 0 8px var(--pulse-color)\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/rainbow-button-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"rainbow-button-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Rainbow Button Demo 2\",\n  \"description\": \"Example showing an animated button with rainbow effect.\",\n  \"registryDependencies\": [\n    \"@magicui/rainbow-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/rainbow-button-demo-2.tsx\",\n      \"content\": \"import { RainbowButton } from \\\"@/registry/magicui/rainbow-button\\\"\\n\\nexport default function RainbowButtonDemo() {\\n  return <RainbowButton variant=\\\"outline\\\">Get Unlimited Access</RainbowButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/rainbow-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"rainbow-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Rainbow Button Demo\",\n  \"description\": \"Example showing an animated button with rainbow effect.\",\n  \"registryDependencies\": [\n    \"@magicui/rainbow-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/rainbow-button-demo.tsx\",\n      \"content\": \"import { RainbowButton } from \\\"@/registry/magicui/rainbow-button\\\"\\n\\nexport default function RainbowButtonDemo() {\\n  return <RainbowButton>Get Unlimited Access</RainbowButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/rainbow-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"rainbow-button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Rainbow Button\",\n  \"description\": \"An animated button with a rainbow effect.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/rainbow-button.tsx\",\n      \"content\": \"import React from \\\"react\\\"\\nimport { Slot } from \\\"@radix-ui/react-slot\\\"\\nimport { cva, VariantProps } from \\\"class-variance-authority\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst rainbowButtonVariants = cva(\\n  cn(\\n    \\\"relative cursor-pointer group transition-all animate-rainbow\\\",\\n    \\\"inline-flex items-center justify-center gap-2 shrink-0\\\",\\n    \\\"rounded-sm outline-none focus-visible:ring-[3px] aria-invalid:border-destructive\\\",\\n    \\\"text-sm font-medium whitespace-nowrap\\\",\\n    \\\"disabled:pointer-events-none disabled:opacity-50\\\",\\n    \\\"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0\\\"\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default:\\n          \\\"border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.125rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\\\",\\n        outline:\\n          \\\"border border-input border-b-transparent bg-[linear-gradient(#ffffff,#ffffff),linear-gradient(#ffffff_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-accent-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\\\",\\n      },\\n      size: {\\n        default: \\\"h-9 px-4 py-2\\\",\\n        sm: \\\"h-8 rounded-xl px-3 text-xs\\\",\\n        lg: \\\"h-11 rounded-xl px-8\\\",\\n        icon: \\\"size-9\\\",\\n      },\\n    },\\n    defaultVariants: {\\n      variant: \\\"default\\\",\\n      size: \\\"default\\\",\\n    },\\n  }\\n)\\n\\ninterface RainbowButtonProps\\n  extends\\n    React.ButtonHTMLAttributes<HTMLButtonElement>,\\n    VariantProps<typeof rainbowButtonVariants> {\\n  asChild?: boolean\\n}\\n\\nconst RainbowButton = React.forwardRef<HTMLButtonElement, RainbowButtonProps>(\\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\\n    const Comp = asChild ? Slot : \\\"button\\\"\\n    return (\\n      <Comp\\n        data-slot=\\\"button\\\"\\n        className={cn(rainbowButtonVariants({ variant, size, className }))}\\n        ref={ref}\\n        {...props}\\n      />\\n    )\\n  }\\n)\\n\\nRainbowButton.displayName = \\\"RainbowButton\\\"\\n\\nexport { RainbowButton, rainbowButtonVariants, type RainbowButtonProps }\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\"\n    },\n    \"light\": {\n      \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n      \"color-2\": \"oklch(60.4% 0.26 302)\",\n      \"color-3\": \"oklch(69.6% 0.165 251)\",\n      \"color-4\": \"oklch(80.2% 0.134 225)\",\n      \"color-5\": \"oklch(90.7% 0.231 133)\"\n    },\n    \"dark\": {\n      \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n      \"color-2\": \"oklch(60.4% 0.26 302)\",\n      \"color-3\": \"oklch(69.6% 0.165 251)\",\n      \"color-4\": \"oklch(80.2% 0.134 225)\",\n      \"color-5\": \"oklch(90.7% 0.231 133)\"\n    }\n  },\n  \"css\": {\n    \"@keyframes rainbow\": {\n      \"0%\": {\n        \"background-position\": \"0%\"\n      },\n      \"100%\": {\n        \"background-position\": \"200%\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/registry.json",
    "content": "{\n  \"name\": \"magicui\",\n  \"homepage\": \"https://magicui.design\",\n  \"items\": [\n    {\n      \"name\": \"index\",\n      \"type\": \"registry:style\",\n      \"dependencies\": [\n        \"class-variance-authority\",\n        \"lucide-react\"\n      ],\n      \"devDependencies\": [\n        \"tw-animate-css\"\n      ],\n      \"registryDependencies\": [\n        \"utils\"\n      ],\n      \"files\": [],\n      \"cssVars\": {}\n    },\n    {\n      \"name\": \"magic-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Magic Card\",\n      \"description\": \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"dependencies\": [\n        \"motion\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/magic-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Android\",\n      \"description\": \"A mockup of an Android device.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/android.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Warp Background\",\n      \"description\": \"A card with a time warping background effect.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/warp-background.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Line Shadow Text\",\n      \"description\": \"A text component with a moving line shadow.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/line-shadow-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-line-shadow\": \"line-shadow 15s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes line-shadow\": {\n          \"0%\": {\n            \"background-position\": \"0 0\"\n          },\n          \"100%\": {\n            \"background-position\": \"100% -100%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"aurora-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aurora Text\",\n      \"description\": \"A beautiful aurora text effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/aurora-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes aurora\": {\n          \"0%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          },\n          \"25%\": {\n            \"background-position\": \"50% 100%\",\n            \"transform\": \"rotate(5deg) scale(1.1)\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 50%\",\n            \"transform\": \"rotate(-3deg) scale(0.95)\"\n          },\n          \"75%\": {\n            \"background-position\": \"50% 0%\",\n            \"transform\": \"rotate(3deg) scale(1.05)\"\n          },\n          \"100%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"morphing-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Morphing Text\",\n      \"description\": \"A dynamic text morphing component for Magic UI.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/morphing-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Progress\",\n      \"description\": \"Animated Scroll Progress for your pages\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-progress.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Lens\",\n      \"description\": \"A interactive component that enables zooming into images, videos and other elements.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/lens.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pointer\",\n      \"description\": \"A component that displays a pointer when hovering over an element\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pointer.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor\",\n      \"type\": \"registry:ui\",\n      \"description\": \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n      \"dependencies\": [\n        \"framer-motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/smooth-cursor.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progressive Blur\",\n      \"description\": \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/progressive-blur.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Neon Gradient Card\",\n      \"description\": \"A beautiful neon card effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/neon-gradient-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-background-position-spin\": \"background-position-spin 3000ms infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes background-position-spin\": {\n          \"0%\": {\n            \"background-position\": \"top center\"\n          },\n          \"100%\": {\n            \"background-position\": \"bottom center\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"meteors\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Meteors\",\n      \"description\": \"A meteor shower effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/meteors.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-meteor\": \"meteor 5s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes meteor\": {\n          \"0%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(0)\",\n            \"opacity\": \"1\"\n          },\n          \"70%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(-500px)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Grid Pattern\",\n      \"description\": \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Striped Pattern\",\n      \"description\": \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/striped-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/striped-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Interactive Grid Pattern\",\n      \"description\": \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dot Pattern\",\n      \"description\": \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dot-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Flickering Grid\",\n      \"description\": \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/flickering-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hero Video Dialog\",\n      \"description\": \"A hero video dialog component.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hero-video-dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Code Comparison\",\n      \"description\": \"A component which compares two code snippets.\",\n      \"dependencies\": [\n        \"shiki\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/code-comparison.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Marquee\",\n      \"description\": \"An infinite scrolling component that can be used to display text, images, or videos.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/marquee.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n          \"animate-marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes marquee\": {\n          \"from\": {\n            \"transform\": \"translateX(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateX(calc(-100% - var(--gap)))\"\n          }\n        },\n        \"@keyframes marquee-vertical\": {\n          \"from\": {\n            \"transform\": \"translateY(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateY(calc(-100% - var(--gap)))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"globe\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Globe\",\n      \"description\": \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n      \"dependencies\": [\n        \"cobe\",\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/globe.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shimmer Button\",\n      \"description\": \"A button with a shimmering light which travels around the perimeter.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shimmer-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shimmer-slide\": \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n          \"animate-spin-around\": \"spin-around calc(var(--speed) * 2) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shimmer-slide\": {\n          \"to\": {\n            \"transform\": \"translate(calc(100cqw - 100%), 0)\"\n          }\n        },\n        \"@keyframes spin-around\": {\n          \"0%\": {\n            \"transform\": \"translateZ(0) rotate(0)\"\n          },\n          \"15%, 35%\": {\n            \"transform\": \"translateZ(0) rotate(90deg)\"\n          },\n          \"65%, 85%\": {\n            \"transform\": \"translateZ(0) rotate(270deg)\"\n          },\n          \"100%\": {\n            \"transform\": \"translateZ(0) rotate(360deg)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tweet Card\",\n      \"description\": \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"client-tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Client Tweet Card\",\n      \"description\": \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/client-tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Bento Grid\",\n      \"description\": \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/bento-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Particles\",\n      \"description\": \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/particles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Number Ticker\",\n      \"description\": \"Animate numbers to count up or down to a target number\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/number-ticker.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple\",\n      \"description\": \"An animated ripple effect typically used behind elements to emphasize them.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-ripple\": \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes ripple\": {\n          \"0%, 100%\": {\n            \"transform\": \"translate(-50%, -50%) scale(1)\"\n          },\n          \"50%\": {\n            \"transform\": \"translate(-50%, -50%) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"retro-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Retro Grid\",\n      \"description\": \"An animated scrolling retro grid effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/retro-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated List\",\n      \"description\": \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-list.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Shiny Text\",\n      \"description\": \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-shiny-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shiny-text\": \"shiny-text 8s infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shiny-text\": {\n          \"0%, 90%, 100%\": {\n            \"background-position\": \"calc(-100% - var(--shiny-width)) 0\"\n          },\n          \"30%, 60%\": {\n            \"background-position\": \"calc(100% + var(--shiny-width)) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Grid Pattern\",\n      \"description\": \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Border Beam\",\n      \"description\": \"An animated beam of light which travels along the border of its container.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/border-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Beam\",\n      \"description\": \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Reveal\",\n      \"description\": \"Fade in text as you scroll down the page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-reveal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hyper Text\",\n      \"description\": \"A text animation that scrambles letters before revealing the final text.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hyper-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Gradient Text\",\n      \"description\": \"An animated gradient background which transitions between colors for text.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-gradient-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-gradient\": \"gradient 8s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes gradient\": {\n          \"to\": {\n            \"background-position\": \"var(--bg-size, 300%) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"orbiting-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Orbiting Circles\",\n      \"description\": \"A collection of circles which move in orbit along a circular path\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/orbiting-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes orbit\": {\n          \"0%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"dock\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dock\",\n      \"description\": \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dock.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Word Rotate\",\n      \"description\": \"A vertical rotation of words\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/word-rotate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar Circles\",\n      \"description\": \"Overlapping circles of avatars.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/avatar-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Typing Animation\",\n      \"description\": \"Characters appearing in typed animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/typing-animation.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-blink-cursor\": \"blink-cursor 1.2s step-end infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes blink-cursor\": {\n          \"0%, 49%\": {\n            \"opacity\": \"1\"\n          },\n          \"50%, 100%\": {\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"sparkles-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Sparkles Text\",\n      \"description\": \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/sparkles-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Spinning Text\",\n      \"description\": \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/spinning-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Comic Text\",\n      \"description\": \"Comic text animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/comic-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon Cloud\",\n      \"description\": \"An interactive 3D tag cloud component\",\n      \"dependencies\": [],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/icon-cloud.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Animate\",\n      \"description\": \"A text animation component that animates text using a variety of different animations.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-animate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Based Velocity\",\n      \"description\": \"Scrolling text whose speed changes based on scroll speed\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-based-velocity.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shiny Button\",\n      \"description\": \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shiny-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shine Border\",\n      \"description\": \"Shine border is an animated background border effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shine-border.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shine\": \"shine var(--duration) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shine\": {\n          \"0%\": {\n            \"background-position\": \"0% 0%\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 100%\"\n          },\n          \"to\": {\n            \"background-position\": \"0% 0%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-circular-progress-bar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Circular Progress Bar\",\n      \"description\": \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-circular-progress-bar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Confetti\",\n      \"description\": \"Confetti animations are best used to delight your users when something special happens\",\n      \"dependencies\": [\n        \"canvas-confetti\",\n        \"@types/canvas-confetti\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/confetti.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Cool Mode\",\n      \"description\": \"Cool mode effect for buttons, links, and other DOMs\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/cool-mode.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pulsating Button\",\n      \"description\": \"An animated pulsating button useful for capturing attention of users.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pulsating-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-pulse\": \"pulse var(--duration) ease-out infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes pulse\": {\n          \"0%, 100%\": {\n            \"boxShadow\": \"0 0 0 0 var(--pulse-color)\"\n          },\n          \"50%\": {\n            \"boxShadow\": \"0 0 0 8px var(--pulse-color)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"ripple-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple Button\",\n      \"description\": \"An animated button with ripple useful for user engagement.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rippling\": \"rippling var(--duration) ease-out\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rippling\": {\n          \"0%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"scale(2)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"file-tree\",\n      \"type\": \"registry:ui\",\n      \"title\": \"File Tree\",\n      \"description\": \"A component used to showcase the folder and file structure of a directory.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/file-tree.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Blur Fade\",\n      \"description\": \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/blur-fade.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Safari\",\n      \"description\": \"A safari browser mockup to showcase your website.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/safari.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone\",\n      \"type\": \"registry:ui\",\n      \"title\": \"iPhone\",\n      \"description\": \"A mockup of the iPhone\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/iphone.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Rainbow Button\",\n      \"description\": \"An animated button with a rainbow effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/rainbow-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\"\n        },\n        \"light\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        },\n        \"dark\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rainbow\": {\n          \"0%\": {\n            \"background-position\": \"0%\"\n          },\n          \"100%\": {\n            \"background-position\": \"200%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"interactive-hover-button\",\n      \"type\": \"registry:ui\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-hover-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Terminal\",\n      \"description\": \"A terminal component\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/terminal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Video Text\",\n      \"description\": \"A component that displays text with a video playing in the background.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/video-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pixel Image\",\n      \"description\": \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pixel-image.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Highlighter\",\n      \"description\": \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Theme Toggler\",\n      \"description\": \"A component for theme changing animation.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-theme-toggler.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"css\": {\n        \"::view-transition-old(root), ::view-transition-new(root)\": {\n          \"animation\": \"none\",\n          \"mix-blend-mode\": \"normal\"\n        }\n      }\n    },\n    {\n      \"name\": \"light-rays\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Light Rays\",\n      \"description\": \"A component with animated light rays which shine down from above.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/light-rays.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dotted Map\",\n      \"description\": \"A component with a dotted map.\",\n      \"dependencies\": [\n        \"svg-dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dotted-map.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo\",\n      \"description\": \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo 2\",\n      \"description\": \"Example showing a magic card with an orb effect.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\",\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo\",\n      \"description\": \"Example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 2\",\n      \"description\": \"Second example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 3\",\n      \"description\": \"Third example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Warp Background Demo\",\n      \"description\": \"Example showing a card with a time warping background effect.\",\n      \"registryDependencies\": [\n        \"@magicui/warp-background\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/warp-background-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Line Shadow Text Demo\",\n      \"description\": \"Example showing a text component with a moving line shadow.\",\n      \"registryDependencies\": [\n        \"@magicui/line-shadow-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/line-shadow-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"aurora-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Aurora Text Demo\",\n      \"description\": \"Example showing a beautiful aurora text effect.\",\n      \"registryDependencies\": [\n        \"@magicui/aurora-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/aurora-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"morphing-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Morphing Text Demo\",\n      \"description\": \"Example showing a dynamic text morphing component.\",\n      \"registryDependencies\": [\n        \"@magicui/morphing-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/morphing-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Progress Demo\",\n      \"description\": \"Example showing animated scroll progress for your pages.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-progress\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-progress-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo\",\n      \"description\": \"Example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 2\",\n      \"description\": \"Second example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 3\",\n      \"description\": \"Third example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer-demo-1\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pointer Demo 1\",\n      \"description\": \"Example showing a pointer effect component\",\n      \"registryDependencies\": [\n        \"@magicui/pointer\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pointer-demo-1.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Basic smooth cursor example\",\n      \"registryDependencies\": [\n        \"@magicui/smooth-cursor\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/smooth-cursor-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Progressive Blur Demo\",\n      \"description\": \"Example showing progressive blur effect for scrollable content.\",\n      \"registryDependencies\": [\n        \"@magicui/progressive-blur\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/progressive-blur-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Neon Gradient Card Demo\",\n      \"description\": \"Example showing a beautiful neon card effect.\",\n      \"registryDependencies\": [\n        \"@magicui/neon-gradient-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/neon-gradient-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"meteors-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Meteors Demo\",\n      \"description\": \"Example showing a meteor shower effect.\",\n      \"registryDependencies\": [\n        \"@magicui/meteors\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/meteors-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Demo\",\n      \"description\": \"Example showing a background grid pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern Demo\",\n      \"description\": \"Example showing a background striped pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Dashed)\",\n      \"description\": \"Example showing a background striped pattern with a dashed stroke.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-dashed.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-dashed.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-right\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Right)\",\n      \"description\": \"Example showing a background striped pattern slanting to the right using SVG.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-right.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-right.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Linear Gradient\",\n      \"description\": \"Example showing a grid pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Dashed\",\n      \"description\": \"Example showing a dashed grid pattern.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-dashed.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Demo\",\n      \"description\": \"Example showing a background dot pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Linear Gradient\",\n      \"description\": \"Example showing a dot pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-with-glow-effect\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern with glow effect\",\n      \"description\": \"Example showing a dot pattern with glow effect\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-with-glow-effect.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Demo\",\n      \"description\": \"Example showing a flickering grid background.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-rounded-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Rounded Demo\",\n      \"description\": \"Example showing a flickering grid background with rounded corners.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-rounded-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Demo\",\n      \"description\": \"Example showing a hero video dialog component.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo-top-in-bottom-out\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Top In Bottom Out Demo\",\n      \"description\": \"Example showing a hero video dialog with top-in bottom-out animation.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Code Comparison Demo\",\n      \"description\": \"Example showing a component which compares two code snippets.\",\n      \"registryDependencies\": [\n        \"@magicui/code-comparison\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/code-comparison-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Demo\",\n      \"description\": \"Example showing an infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Vertical Demo\",\n      \"description\": \"Example showing a vertical infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-logos\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Logos\",\n      \"description\": \"Example showing an infinite scrolling logo carousel.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-logos.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-3d\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee 3D\",\n      \"description\": \"Example showing a 3D infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-3d.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"globe-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Globe Demo\",\n      \"description\": \"Example showing an autorotating, interactive WebGL globe.\",\n      \"registryDependencies\": [\n        \"@magicui/globe\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/globe-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Demo\",\n      \"description\": \"Example showing a tweet card with author info.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-images\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Images\",\n      \"description\": \"Example showing a tweet card with images.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-images.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-meta-preview\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Meta Preview\",\n      \"description\": \"Example showing a tweet card with meta preview.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-meta-preview.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shimmer Button Demo\",\n      \"description\": \"Example showing a button with a shimmering light effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shimmer-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shimmer-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Demo\",\n      \"description\": \"Example showing a bento grid layout for showcasing features.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"calendar\",\n        \"@magicui/marquee\",\n        \"@magicui/bento-grid\",\n        \"@magicui/animated-beam\",\n        \"@magicui/animated-list\",\n        \"@magicui/animated-beam-multiple-outputs\",\n        \"@magicui/animated-list-demo\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Vertical Demo\",\n      \"description\": \"Example showing a vertical bento grid layout.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/bento-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo 2\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-decimal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Decimal Demo\",\n      \"description\": \"Example showing animated counting decimal numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-decimal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Demo\",\n      \"description\": \"Example showing an animated ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"retro-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Retro Grid Demo\",\n      \"description\": \"Example showing an animated scrolling retro grid effect.\",\n      \"registryDependencies\": [\n        \"@magicui/retro-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/retro-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated List Demo\",\n      \"description\": \"Example showing a list with sequenced item animations.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-list\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-list-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Shiny Text Demo\",\n      \"description\": \"Example showing text with a shimmering light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-shiny-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-shiny-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Particles Demo\",\n      \"description\": \"Example showing interactive particle effects.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/particles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/particles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Grid Pattern Demo\",\n      \"description\": \"Example showing an animated grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo\",\n      \"description\": \"Example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo 2\",\n      \"description\": \"Second example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 3\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"input\",\n        \"label\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 4\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Demo\",\n      \"description\": \"Example showing an animated beam of light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-unidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Unidirectional\",\n      \"description\": \"Example showing a unidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-unidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-bidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Bidirectional\",\n      \"description\": \"Example showing a bidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-bidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-inputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Inputs\",\n      \"description\": \"Example showing animated beams with multiple input points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-inputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-outputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Outputs\",\n      \"description\": \"Example showing animated beams with multiple output points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-outputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Reveal Demo\",\n      \"description\": \"Example showing text that fades in on scroll.\",\n      \"registryDependencies\": [\n        \"@magicui/text-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-reveal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo\",\n      \"description\": \"Example showing text with animated gradient backgrounds.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo 2\",\n      \"description\": \"Second example showing text with animated gradient backgrounds.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"orbiting-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Orbiting Circles Demo\",\n      \"description\": \"Example showing circles moving in orbital paths.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/orbiting-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/orbiting-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo\",\n      \"description\": \"Example showing a MacOS-style dock implementation.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 2\",\n      \"description\": \"Second example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 3\",\n      \"description\": \"Third example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Word Rotate Demo\",\n      \"description\": \"Example showing vertical word rotation animation.\",\n      \"registryDependencies\": [\n        \"@magicui/word-rotate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/word-rotate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hyper Text Demo\",\n      \"description\": \"Example showing text with scrambling letter animations.\",\n      \"registryDependencies\": [\n        \"@magicui/hyper-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hyper-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Avatar Circles Demo\",\n      \"description\": \"Example showing overlapping avatar circles.\",\n      \"registryDependencies\": [\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/avatar-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Demo\",\n      \"description\": \"Example showing typed character animations.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Multiple Words\",\n      \"description\": \"Example showing multiple words with looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Custom Speed\",\n      \"description\": \"Example showing custom typing and deleting speeds.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Start on View\",\n      \"description\": \"Example showing animation that starts when in viewport.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Without Cursor\",\n      \"description\": \"Example showing typing animation without cursor.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Single Play\",\n      \"description\": \"Example showing single play without looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Blinking\",\n      \"description\": \"Example showing cursor blinking control.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Styles\",\n      \"description\": \"Example showing different cursor styles (line, block, underscore).\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Demo\",\n      \"description\": \"Example showing text speed changes based on scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-images-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Images\",\n      \"description\": \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-images-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkles-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Sparkles Text Demo\",\n      \"description\": \"Example showing text with animated sparkle effects.\",\n      \"registryDependencies\": [\n        \"@magicui/sparkles-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/sparkles-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo 2\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Comic Text Demo\",\n      \"description\": \"Example showing comic text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/comic-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/comic-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo\",\n      \"description\": \"Example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 2\",\n      \"description\": \"Second example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 3\",\n      \"description\": \"Third example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo\",\n      \"description\": \"Example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 2\",\n      \"description\": \"Second example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 3\",\n      \"description\": \"Third example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 4\",\n      \"description\": \"Fourth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 5\",\n      \"description\": \"Fifth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 6\",\n      \"description\": \"Sixth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 7\",\n      \"description\": \"Seventh example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 8\",\n      \"description\": \"Eighth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-9\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 9\",\n      \"description\": \"Ninth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-9.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shiny Button Demo\",\n      \"description\": \"Example showing a shiny button with dynamic styles.\",\n      \"registryDependencies\": [\n        \"@magicui/shiny-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shiny-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-circular-progress-bar-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Circular Progress Bar Demo\",\n      \"description\": \"Example showing an animated circular progress gauge.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-circular-progress-bar\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-circular-progress-bar-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo\",\n      \"description\": \"Example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo 2\",\n      \"description\": \"Second example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Demo\",\n      \"description\": \"Example showing confetti animations for celebrations.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-basic-cannon\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Basic Cannon\",\n      \"description\": \"Example showing basic confetti cannon animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-basic-cannon.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-random-direction\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Random Direction\",\n      \"description\": \"Example showing confetti with random directions.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-random-direction.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-fireworks\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Fireworks\",\n      \"description\": \"Example showing fireworks-style confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-fireworks.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-stars\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Stars\",\n      \"description\": \"Example showing star-shaped confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-stars.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-side-cannons\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Side Cannons\",\n      \"description\": \"Example showing side-mounted confetti cannons.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-side-cannons.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-custom-shapes\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Custom Shapes\",\n      \"description\": \"Example showing confetti with custom shape particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-custom-shapes.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-emoji\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Emoji\",\n      \"description\": \"Example showing confetti with emoji particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-emoji.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Demo\",\n      \"description\": \"Example showing cool mode effect for buttons and links.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-custom\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Custom\",\n      \"description\": \"Example showing customized cool mode effects.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-custom.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pulsating Button Demo\",\n      \"description\": \"Example showing an animated pulsating button.\",\n      \"registryDependencies\": [\n        \"@magicui/pulsating-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pulsating-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Button Demo\",\n      \"description\": \"Example showing an animated button with ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"file-tree-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"File Tree Demo\",\n      \"description\": \"Example showing a component that displays folder and file structure.\",\n      \"registryDependencies\": [\n        \"@magicui/file-tree\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/file-tree-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Demo\",\n      \"description\": \"Example showing blur fade in and out animations.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Text Demo\",\n      \"description\": \"Example showing blur fade animations with text.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo\",\n      \"description\": \"Example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 2\",\n      \"description\": \"Second example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 3\",\n      \"description\": \"Third example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 4\",\n      \"description\": \"Fourth example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo\",\n      \"description\": \"Example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 2\",\n      \"description\": \"Second example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 3\",\n      \"description\": \"Third example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo 2\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-hover-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Hover Button Demo\",\n      \"description\": \"Example showing an interactive button with hover effects.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-hover-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-hover-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text.\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text and custom delays\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Video Text Demo\",\n      \"description\": \"Example showing text with a video background.\",\n      \"registryDependencies\": [\n        \"@magicui/video-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/video-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pixel Image Demo\",\n      \"description\": \"Example showing a pixelated image effect.\",\n      \"registryDependencies\": [\n        \"@magicui/pixel-image\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pixel-image-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Highlighter Demo\",\n      \"description\": \"Example showing the demo of a Highlighter\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/highlighter\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/highlighter-demo.tsx\",\n          \"type\": \"registry:example\"\n        },\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Theme Toggler Demo\",\n      \"description\": \"Example showing animation while changing the theme.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-theme-toggler\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"light-rays-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Demo of the light-rays component showcasing animated light rays\",\n      \"registryDependencies\": [\n        \"@magicui/light-rays\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/light-rays-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo\",\n      \"description\": \"Example showing a dotted map.\",\n      \"dependencies\": [\n        \"countries-list\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 2\",\n      \"description\": \"Example showing a dotted map.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 3\",\n      \"description\": \"Example showing a dotted map with pulse animation.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"utils\",\n      \"type\": \"registry:lib\",\n      \"dependencies\": [\n        \"clsx\",\n        \"tailwind-merge\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/lib/utils.ts\",\n          \"type\": \"registry:lib\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/retro-grid-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"retro-grid-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Retro Grid Demo\",\n  \"description\": \"Example showing an animated scrolling retro grid effect.\",\n  \"registryDependencies\": [\n    \"@magicui/retro-grid\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/retro-grid-demo.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { RetroGrid } from \\\"@/registry/magicui/retro-grid\\\"\\n\\nexport default function RetroGridDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <span className=\\\"pointer-events-none z-10 bg-linear-to-b from-[#ffd319] via-[#ff2975] to-[#8c1eff] bg-clip-text text-center text-7xl leading-none font-bold tracking-tighter whitespace-pre-wrap text-transparent\\\">\\n        Retro Grid\\n      </span>\\n\\n      <RetroGrid />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/retro-grid.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"retro-grid\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Retro Grid\",\n  \"description\": \"An animated scrolling retro grid effect\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/retro-grid.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useRef, useState } from \\\"react\\\"\\nimport type { CSSProperties, HTMLAttributes } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst ANIMATION_DURATION_SECONDS = 15\\nconst GRID_HEIGHT_RATIO = 3\\nconst GRID_LINE_ALIGNMENT_OFFSET_PX = 0.5\\nconst GRID_LINE_ANTIALIAS_MULTIPLIER = 0.9\\nconst GRID_LINE_WIDTH_PX = 0.92\\nconst GRID_START_OFFSET_RATIO = -0.5\\nconst GRID_WIDTH_RATIO = 6\\nconst GRID_X_OFFSET_RATIO = -2\\nconst MAX_ANGLE = 89\\nconst MAX_DEVICE_PIXEL_RATIO = 2\\nconst MIN_ANGLE = 1\\nconst PERSPECTIVE_PX = 200\\nconst FALLBACK_ANIMATION_NAME = \\\"retro-grid-fallback-scroll\\\"\\nconst FALLBACK_STYLES = `\\n@keyframes ${FALLBACK_ANIMATION_NAME} {\\n  from {\\n    transform: translateY(-50%);\\n  }\\n\\n  to {\\n    transform: translateY(0);\\n  }\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  [data-retro-grid-scroll=\\\"true\\\"] {\\n    animation: none !important;\\n    transform: translateY(-50%) !important;\\n  }\\n}\\n`\\n\\nconst VERTEX_SHADER_SOURCE = `\\nattribute vec2 a_position;\\n\\nvoid main() {\\n  gl_Position = vec4(a_position, 0.0, 1.0);\\n}\\n`\\n\\nconst FRAGMENT_SHADER_SOURCE = `\\n#extension GL_OES_standard_derivatives : enable\\nprecision highp float;\\n\\nuniform vec2 u_container_size;\\nuniform vec2 u_viewport_size;\\nuniform vec4 u_line_color;\\nuniform float u_angle;\\nuniform float u_cell_size;\\nuniform float u_device_pixel_ratio;\\nuniform float u_time;\\n\\nconst float animationDurationSeconds = ${ANIMATION_DURATION_SECONDS.toFixed(1)};\\nconst float gridHeightRatio = ${GRID_HEIGHT_RATIO.toFixed(1)};\\nconst float gridStartOffsetRatio = ${GRID_START_OFFSET_RATIO.toFixed(1)};\\nconst float gridWidthRatio = ${GRID_WIDTH_RATIO.toFixed(1)};\\nconst float gridXOffsetRatio = ${GRID_X_OFFSET_RATIO.toFixed(1)};\\nconst float gridLineAlignmentOffsetPx = ${GRID_LINE_ALIGNMENT_OFFSET_PX.toFixed(1)};\\nconst float gridLineAntialiasMultiplier = ${GRID_LINE_ANTIALIAS_MULTIPLIER.toFixed(1)};\\nconst float horizontalLodLevelOneEndPx = 5.6;\\nconst float horizontalLodLevelOneStartPx = 2.8;\\nconst float horizontalLodLevelTwoEndPx = 3.0;\\nconst float horizontalLodLevelTwoStartPx = 1.4;\\nconst float horizontalCompressionEndPx = 2.8;\\nconst float horizontalCompressionStartPx = 1.2;\\nconst float lineWidthPx = ${GRID_LINE_WIDTH_PX.toFixed(2)};\\nconst float perspectivePx = ${PERSPECTIVE_PX.toFixed(1)};\\nconst float gridTravelRatio = 0.5;\\nconst float verticalCompressionEndPx = 2.6;\\nconst float verticalCompressionStartPx = 1.0;\\nconst float verticalEdgeCompressionEnd = 0.95;\\nconst float verticalEdgeCompressionStart = 0.45;\\nconst float verticalLodLevelEnd = 0.64;\\nconst float verticalLodLevelStart = 0.22;\\nconst float verticalTopCompressionEndCells = 6.0;\\nconst float verticalTopCompressionStartCells = 2.0;\\n\\nfloat renderGridLine(\\n  float wrappedCoord,\\n  float antiAliasWidth,\\n  float softnessBoost\\n) {\\n  return 1.0 - smoothstep(\\n    lineWidthPx,\\n    lineWidthPx + (antiAliasWidth * (1.5 + softnessBoost)),\\n    wrappedCoord\\n  );\\n}\\n\\nvoid main() {\\n  float angle = radians(clamp(u_angle, 1.0, 89.0));\\n  float sinAngle = sin(angle);\\n  float cosAngle = cos(angle);\\n  vec2 screen = vec2(\\n    (gl_FragCoord.x / u_device_pixel_ratio) - (u_container_size.x * 0.5),\\n    (u_container_size.y * 0.5) - (gl_FragCoord.y / u_device_pixel_ratio)\\n  );\\n\\n  vec3 rayOrigin = vec3(0.0, 0.0, perspectivePx);\\n  vec3 rayDirection = normalize(vec3(screen, -perspectivePx));\\n  vec3 planeXAxis = vec3(1.0, 0.0, 0.0);\\n  vec3 planeYAxis = vec3(0.0, cosAngle, sinAngle);\\n  vec3 planeNormal = normalize(cross(planeXAxis, planeYAxis));\\n  float denominator = dot(rayDirection, planeNormal);\\n\\n  if (abs(denominator) < 0.0001) {\\n    discard;\\n  }\\n\\n  float distanceToPlane = dot(-rayOrigin, planeNormal) / denominator;\\n\\n  if (distanceToPlane <= 0.0) {\\n    discard;\\n  }\\n\\n  vec3 hitPoint = rayOrigin + (rayDirection * distanceToPlane);\\n  float localX = hitPoint.x;\\n  float localY = dot(hitPoint, planeYAxis);\\n  float gridWidth = u_viewport_size.x * gridWidthRatio;\\n  float gridHeight = u_viewport_size.y * gridHeightRatio;\\n  float gridScrollSpeed = (gridHeight * gridTravelRatio) / animationDurationSeconds;\\n  float patternOffsetY = u_time * gridScrollSpeed;\\n  float gridLeft = (-0.5 * u_container_size.x) + (gridXOffsetRatio * u_container_size.x);\\n  float gridTop = (-0.5 * u_container_size.y) + (gridStartOffsetRatio * gridHeight);\\n  vec2 planePosition = vec2(localX - gridLeft, localY - gridTop);\\n\\n  if (\\n    planePosition.x < 0.0 ||\\n    planePosition.y < 0.0 ||\\n    planePosition.x > gridWidth ||\\n    planePosition.y > gridHeight\\n  ) {\\n    discard;\\n  }\\n\\n  vec2 patternPosition = vec2(planePosition.x, planePosition.y - patternOffsetY);\\n  vec2 wrapped = mod(\\n    patternPosition + vec2(gridLineAlignmentOffsetPx),\\n    u_cell_size\\n  );\\n  vec2 patternDerivative = max(fwidth(patternPosition), vec2(0.0001));\\n  vec2 antiAliasWidth = patternDerivative * gridLineAntialiasMultiplier;\\n  float horizontalCellSpanPx = u_cell_size / patternDerivative.y;\\n  float horizontalCompression = 1.0 - smoothstep(\\n    horizontalCompressionStartPx,\\n    horizontalCompressionEndPx,\\n    horizontalCellSpanPx\\n  );\\n  float verticalCellSpanPx = u_cell_size / patternDerivative.x;\\n  float sideDistance = abs((planePosition.x / gridWidth) * 2.0 - 1.0);\\n  float verticalEdgeCompression = smoothstep(\\n    verticalEdgeCompressionStart,\\n    verticalEdgeCompressionEnd,\\n    sideDistance\\n  );\\n  float verticalTopCompression = 1.0 - smoothstep(\\n    u_cell_size * verticalTopCompressionStartCells,\\n    u_cell_size * verticalTopCompressionEndCells,\\n    planePosition.y\\n  );\\n  float verticalCompression =\\n    (1.0 - smoothstep(\\n      verticalCompressionStartPx,\\n      verticalCompressionEndPx,\\n      verticalCellSpanPx\\n    )) * verticalEdgeCompression * verticalTopCompression;\\n  float horizontalSoftnessBoost = 1.0 + (horizontalCompression * 3.0);\\n  float verticalSoftnessBoost = 1.0 + (verticalCompression * 3.5);\\n  float verticalLod = smoothstep(\\n    verticalLodLevelStart,\\n    verticalLodLevelEnd,\\n    verticalCompression\\n  );\\n  float verticalLineFine = renderGridLine(\\n    wrapped.x,\\n    antiAliasWidth.x,\\n    verticalSoftnessBoost\\n  );\\n  float verticalWrappedLod = mod(\\n    patternPosition.x + gridLineAlignmentOffsetPx,\\n    u_cell_size * 2.0\\n  );\\n  float verticalLineCoarse = renderGridLine(\\n    verticalWrappedLod,\\n    antiAliasWidth.x,\\n    verticalSoftnessBoost + verticalLod\\n  );\\n  float verticalLine = max(\\n    verticalLineFine * (1.0 - verticalLod),\\n    verticalLineCoarse * verticalLod\\n  );\\n  float horizontalLodLevelOne = 1.0 - smoothstep(\\n    horizontalLodLevelOneStartPx,\\n    horizontalLodLevelOneEndPx,\\n    horizontalCellSpanPx\\n  );\\n  float horizontalLodLevelTwo = 1.0 - smoothstep(\\n    horizontalLodLevelTwoStartPx,\\n    horizontalLodLevelTwoEndPx,\\n    horizontalCellSpanPx\\n  );\\n  float horizontalLineFine = renderGridLine(\\n    wrapped.y,\\n    antiAliasWidth.y,\\n    horizontalSoftnessBoost\\n  );\\n  float horizontalWrappedLodOne = mod(\\n    patternPosition.y + gridLineAlignmentOffsetPx,\\n    u_cell_size * 2.0\\n  );\\n  float horizontalWrappedLodTwo = mod(\\n    patternPosition.y + gridLineAlignmentOffsetPx,\\n    u_cell_size * 4.0\\n  );\\n  float horizontalLineCoarse = renderGridLine(\\n    horizontalWrappedLodOne,\\n    antiAliasWidth.y,\\n    horizontalSoftnessBoost + horizontalLodLevelOne\\n  );\\n  float horizontalLineExtraCoarse = renderGridLine(\\n    horizontalWrappedLodTwo,\\n    antiAliasWidth.y,\\n    horizontalSoftnessBoost + horizontalLodLevelOne + horizontalLodLevelTwo\\n  );\\n  float horizontalLineReduced = max(\\n    horizontalLineFine * (1.0 - horizontalLodLevelOne),\\n    horizontalLineCoarse * horizontalLodLevelOne\\n  );\\n  float horizontalLine = max(\\n    horizontalLineReduced * (1.0 - horizontalLodLevelTwo),\\n    horizontalLineExtraCoarse * horizontalLodLevelTwo\\n  );\\n  float line = max(verticalLine, horizontalLine);\\n\\n  if (line <= 0.001) {\\n    discard;\\n  }\\n\\n  float alpha = u_line_color.a * line;\\n  gl_FragColor = vec4(u_line_color.rgb * alpha, alpha);\\n}\\n`\\n\\ninterface RetroGridProps extends HTMLAttributes<HTMLDivElement> {\\n  /**\\n   * Additional CSS classes to apply to the grid container\\n   */\\n  className?: string\\n  /**\\n   * Rotation angle of the grid in degrees\\n   * @default 65\\n   */\\n  angle?: number\\n  /**\\n   * Grid cell size in pixels\\n   * @default 60\\n   */\\n  cellSize?: number\\n  /**\\n   * Grid opacity value between 0 and 1\\n   * @default 0.5\\n   */\\n  opacity?: number\\n  /**\\n   * Grid line color in light mode\\n   * @default \\\"gray\\\"\\n   */\\n  lightLineColor?: string\\n  /**\\n   * Grid line color in dark mode\\n   * @default \\\"gray\\\"\\n   */\\n  darkLineColor?: string\\n}\\n\\ninterface ProgramInfo {\\n  attributeLocation: number\\n  program: WebGLProgram\\n  uniforms: {\\n    angle: WebGLUniformLocation\\n    cellSize: WebGLUniformLocation\\n    containerSize: WebGLUniformLocation\\n    devicePixelRatio: WebGLUniformLocation\\n    lineColor: WebGLUniformLocation\\n    time: WebGLUniformLocation\\n    viewportSize: WebGLUniformLocation\\n  }\\n}\\n\\nlet colorResolveContext: CanvasRenderingContext2D | null | undefined\\n\\nfunction clamp(value: number, min: number, max: number) {\\n  return Math.min(Math.max(value, min), max)\\n}\\n\\nfunction createShader(gl: WebGLRenderingContext, type: number, source: string) {\\n  const shader = gl.createShader(type)\\n\\n  if (!shader) {\\n    return null\\n  }\\n\\n  gl.shaderSource(shader, source)\\n  gl.compileShader(shader)\\n\\n  if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\\n    return shader\\n  }\\n\\n  gl.deleteShader(shader)\\n  return null\\n}\\n\\nfunction createProgram(gl: WebGLRenderingContext) {\\n  const vertexShader = createShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER_SOURCE)\\n  const fragmentShader = createShader(\\n    gl,\\n    gl.FRAGMENT_SHADER,\\n    FRAGMENT_SHADER_SOURCE\\n  )\\n\\n  if (!vertexShader || !fragmentShader) {\\n    return null\\n  }\\n\\n  const program = gl.createProgram()\\n\\n  if (!program) {\\n    gl.deleteShader(vertexShader)\\n    gl.deleteShader(fragmentShader)\\n    return null\\n  }\\n\\n  gl.attachShader(program, vertexShader)\\n  gl.attachShader(program, fragmentShader)\\n  gl.linkProgram(program)\\n  gl.deleteShader(vertexShader)\\n  gl.deleteShader(fragmentShader)\\n\\n  if (gl.getProgramParameter(program, gl.LINK_STATUS)) {\\n    return program\\n  }\\n\\n  gl.deleteProgram(program)\\n  return null\\n}\\n\\nfunction getProgramInfo(\\n  gl: WebGLRenderingContext,\\n  program: WebGLProgram\\n): ProgramInfo | null {\\n  const attributeLocation = gl.getAttribLocation(program, \\\"a_position\\\")\\n  const angle = gl.getUniformLocation(program, \\\"u_angle\\\")\\n  const cellSize = gl.getUniformLocation(program, \\\"u_cell_size\\\")\\n  const containerSize = gl.getUniformLocation(program, \\\"u_container_size\\\")\\n  const devicePixelRatio = gl.getUniformLocation(\\n    program,\\n    \\\"u_device_pixel_ratio\\\"\\n  )\\n  const lineColor = gl.getUniformLocation(program, \\\"u_line_color\\\")\\n  const time = gl.getUniformLocation(program, \\\"u_time\\\")\\n  const viewportSize = gl.getUniformLocation(program, \\\"u_viewport_size\\\")\\n\\n  if (\\n    attributeLocation < 0 ||\\n    !angle ||\\n    !cellSize ||\\n    !containerSize ||\\n    !devicePixelRatio ||\\n    !lineColor ||\\n    !time ||\\n    !viewportSize\\n  ) {\\n    return null\\n  }\\n\\n  return {\\n    attributeLocation,\\n    program,\\n    uniforms: {\\n      angle,\\n      cellSize,\\n      containerSize,\\n      devicePixelRatio,\\n      lineColor,\\n      time,\\n      viewportSize,\\n    },\\n  }\\n}\\n\\nfunction isDarkMode(colorScheme: MediaQueryList) {\\n  const root = document.documentElement\\n\\n  if (root.classList.contains(\\\"dark\\\")) {\\n    return true\\n  }\\n\\n  if (root.classList.contains(\\\"light\\\")) {\\n    return false\\n  }\\n\\n  return colorScheme.matches\\n}\\n\\nfunction getColorResolveContext() {\\n  if (colorResolveContext !== undefined) {\\n    return colorResolveContext\\n  }\\n\\n  const canvas = document.createElement(\\\"canvas\\\")\\n  canvas.width = 1\\n  canvas.height = 1\\n  colorResolveContext = canvas.getContext(\\\"2d\\\", {\\n    willReadFrequently: true,\\n  })\\n\\n  return colorResolveContext\\n}\\n\\nfunction resolveLineColor(color: string, element: HTMLElement) {\\n  const resolver = document.createElement(\\\"span\\\")\\n  resolver.style.color = color\\n  resolver.style.opacity = \\\"0\\\"\\n  resolver.style.pointerEvents = \\\"none\\\"\\n  resolver.style.position = \\\"absolute\\\"\\n  element.appendChild(resolver)\\n\\n  const resolvedColor = getComputedStyle(resolver).color\\n  resolver.remove()\\n  const context = getColorResolveContext()\\n\\n  if (!context) {\\n    return new Float32Array([0.5, 0.5, 0.5, 1])\\n  }\\n\\n  context.clearRect(0, 0, 1, 1)\\n  context.fillStyle = resolvedColor\\n  context.fillRect(0, 0, 1, 1)\\n  const pixel = context.getImageData(0, 0, 1, 1).data\\n\\n  return new Float32Array([\\n    pixel[0] / 255,\\n    pixel[1] / 255,\\n    pixel[2] / 255,\\n    pixel[3] / 255,\\n  ])\\n}\\n\\nfunction createFallbackGridStyle(\\n  cellSize: number,\\n  lineColor: string\\n): CSSProperties {\\n  return {\\n    animation: `${FALLBACK_ANIMATION_NAME} ${ANIMATION_DURATION_SECONDS}s linear infinite`,\\n    backgroundImage: `linear-gradient(to right, ${lineColor} 1px, transparent 0), linear-gradient(to bottom, ${lineColor} 1px, transparent 0)`,\\n    backgroundRepeat: \\\"repeat\\\",\\n    backgroundSize: `${cellSize}px ${cellSize}px`,\\n    transform: \\\"translateY(-50%)\\\",\\n  }\\n}\\n\\nexport function RetroGrid({\\n  className,\\n  angle = 65,\\n  cellSize = 60,\\n  opacity = 0.5,\\n  lightLineColor = \\\"gray\\\",\\n  darkLineColor = \\\"gray\\\",\\n  style,\\n  ...props\\n}: RetroGridProps) {\\n  const canvasRef = useRef<HTMLCanvasElement>(null)\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const [isWebGlReady, setIsWebGlReady] = useState(false)\\n  const angleRef = useRef(angle)\\n  const cellSizeRef = useRef(cellSize)\\n  const darkLineColorRef = useRef(darkLineColor)\\n  const lightLineColorRef = useRef(lightLineColor)\\n  const syncSceneRef = useRef<(() => void) | null>(null)\\n\\n  useEffect(() => {\\n    angleRef.current = angle\\n    cellSizeRef.current = cellSize\\n    darkLineColorRef.current = darkLineColor\\n    lightLineColorRef.current = lightLineColor\\n    syncSceneRef.current?.()\\n  }, [angle, cellSize, darkLineColor, lightLineColor])\\n\\n  useEffect(() => {\\n    const canvas = canvasRef.current\\n    const container = containerRef.current\\n\\n    if (!canvas || !container) {\\n      return\\n    }\\n\\n    const reducedMotion = window.matchMedia(\\\"(prefers-reduced-motion: reduce)\\\")\\n    const colorScheme = window.matchMedia(\\\"(prefers-color-scheme: dark)\\\")\\n\\n    let animationFrameId: number | null = null\\n    let currentWidth = 0\\n    let currentHeight = 0\\n    let currentDevicePixelRatio = 1\\n    let gl: WebGLRenderingContext | null = null\\n    let isVisible = true\\n    let isContextLost = false\\n    let lineColor = resolveLineColor(lightLineColorRef.current, container)\\n    let positionBuffer: WebGLBuffer | null = null\\n    let programInfo: ProgramInfo | null = null\\n\\n    const getContext = () => {\\n      const nextGl = canvas.getContext(\\\"webgl\\\", {\\n        alpha: true,\\n        antialias: true,\\n        premultipliedAlpha: true,\\n      })\\n\\n      if (!nextGl || !nextGl.getExtension(\\\"OES_standard_derivatives\\\")) {\\n        return null\\n      }\\n\\n      return nextGl\\n    }\\n\\n    const releasePipeline = (shouldDeleteResources: boolean) => {\\n      if (shouldDeleteResources && gl) {\\n        if (positionBuffer) {\\n          gl.deleteBuffer(positionBuffer)\\n        }\\n\\n        if (programInfo) {\\n          gl.deleteProgram(programInfo.program)\\n        }\\n      }\\n\\n      positionBuffer = null\\n      programInfo = null\\n\\n      if (shouldDeleteResources) {\\n        gl = null\\n      }\\n    }\\n\\n    const initializePipeline = () => {\\n      const nextGl = getContext()\\n\\n      if (!nextGl) {\\n        releasePipeline(false)\\n        return false\\n      }\\n\\n      gl = nextGl\\n      releasePipeline(true)\\n      gl = nextGl\\n\\n      const program = createProgram(nextGl)\\n\\n      if (!program) {\\n        return false\\n      }\\n\\n      const nextProgramInfo = getProgramInfo(nextGl, program)\\n\\n      if (!nextProgramInfo) {\\n        nextGl.deleteProgram(program)\\n        return false\\n      }\\n\\n      const nextPositionBuffer = nextGl.createBuffer()\\n\\n      if (!nextPositionBuffer) {\\n        nextGl.deleteProgram(program)\\n        return false\\n      }\\n\\n      nextGl.bindBuffer(nextGl.ARRAY_BUFFER, nextPositionBuffer)\\n      nextGl.bufferData(\\n        nextGl.ARRAY_BUFFER,\\n        new Float32Array([-1, -1, 3, -1, -1, 3]),\\n        nextGl.STATIC_DRAW\\n      )\\n\\n      positionBuffer = nextPositionBuffer\\n      programInfo = nextProgramInfo\\n\\n      return true\\n    }\\n\\n    const updateLineColor = () => {\\n      const activeColor = isDarkMode(colorScheme)\\n        ? darkLineColorRef.current\\n        : lightLineColorRef.current\\n      lineColor = resolveLineColor(activeColor, container)\\n    }\\n\\n    const resizeCanvas = () => {\\n      currentWidth = Math.floor(container.clientWidth)\\n      currentHeight = Math.floor(container.clientHeight)\\n\\n      if (currentWidth === 0 || currentHeight === 0 || !gl) {\\n        return\\n      }\\n\\n      currentDevicePixelRatio = Math.min(\\n        window.devicePixelRatio || 1,\\n        MAX_DEVICE_PIXEL_RATIO\\n      )\\n\\n      canvas.width = Math.floor(currentWidth * currentDevicePixelRatio)\\n      canvas.height = Math.floor(currentHeight * currentDevicePixelRatio)\\n      canvas.style.width = `${currentWidth}px`\\n      canvas.style.height = `${currentHeight}px`\\n      gl.viewport(0, 0, canvas.width, canvas.height)\\n    }\\n\\n    const draw = (timestamp: number) => {\\n      if (\\n        currentWidth === 0 ||\\n        currentHeight === 0 ||\\n        !gl ||\\n        !positionBuffer ||\\n        !programInfo ||\\n        isContextLost\\n      ) {\\n        return\\n      }\\n\\n      gl.useProgram(programInfo.program)\\n      gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\\n      gl.enableVertexAttribArray(programInfo.attributeLocation)\\n      gl.vertexAttribPointer(\\n        programInfo.attributeLocation,\\n        2,\\n        gl.FLOAT,\\n        false,\\n        0,\\n        0\\n      )\\n      gl.clearColor(0, 0, 0, 0)\\n      gl.clear(gl.COLOR_BUFFER_BIT)\\n      gl.uniform1f(\\n        programInfo.uniforms.angle,\\n        clamp(angleRef.current, MIN_ANGLE, MAX_ANGLE)\\n      )\\n      gl.uniform1f(\\n        programInfo.uniforms.cellSize,\\n        Math.max(cellSizeRef.current, 1)\\n      )\\n      gl.uniform2f(\\n        programInfo.uniforms.containerSize,\\n        currentWidth,\\n        currentHeight\\n      )\\n      gl.uniform1f(\\n        programInfo.uniforms.devicePixelRatio,\\n        currentDevicePixelRatio\\n      )\\n      gl.uniform4fv(programInfo.uniforms.lineColor, lineColor)\\n      gl.uniform1f(\\n        programInfo.uniforms.time,\\n        reducedMotion.matches ? 0 : timestamp / 1000\\n      )\\n      gl.uniform2f(\\n        programInfo.uniforms.viewportSize,\\n        window.innerWidth,\\n        window.innerHeight\\n      )\\n      gl.drawArrays(gl.TRIANGLES, 0, 3)\\n    }\\n\\n    const stopAnimation = () => {\\n      if (animationFrameId !== null) {\\n        cancelAnimationFrame(animationFrameId)\\n        animationFrameId = null\\n      }\\n    }\\n\\n    const frame = (timestamp: number) => {\\n      draw(timestamp)\\n\\n      if (!reducedMotion.matches && isVisible) {\\n        animationFrameId = requestAnimationFrame(frame)\\n        return\\n      }\\n\\n      animationFrameId = null\\n    }\\n\\n    const syncScene = () => {\\n      if (isContextLost) {\\n        stopAnimation()\\n        setIsWebGlReady(false)\\n        return\\n      }\\n\\n      if (!gl || !positionBuffer || !programInfo) {\\n        if (!initializePipeline()) {\\n          stopAnimation()\\n          setIsWebGlReady(false)\\n          return\\n        }\\n      }\\n\\n      resizeCanvas()\\n\\n      if (currentWidth === 0 || currentHeight === 0) {\\n        stopAnimation()\\n        return\\n      }\\n\\n      updateLineColor()\\n      draw(performance.now())\\n      setIsWebGlReady(true)\\n\\n      if (reducedMotion.matches || !isVisible) {\\n        stopAnimation()\\n        return\\n      }\\n\\n      if (animationFrameId === null) {\\n        animationFrameId = requestAnimationFrame(frame)\\n      }\\n    }\\n\\n    syncSceneRef.current = syncScene\\n\\n    const resizeObserver = new ResizeObserver(() => {\\n      syncScene()\\n    })\\n    resizeObserver.observe(container)\\n\\n    const handleWindowResize = () => {\\n      syncScene()\\n    }\\n\\n    const intersectionObserver = new IntersectionObserver(([entry]) => {\\n      isVisible = entry?.isIntersecting ?? false\\n\\n      if (isVisible) {\\n        syncScene()\\n        return\\n      }\\n\\n      stopAnimation()\\n    })\\n    intersectionObserver.observe(container)\\n\\n    const themeObserver = new MutationObserver(() => {\\n      syncScene()\\n    })\\n    themeObserver.observe(document.documentElement, {\\n      attributeFilter: [\\\"class\\\"],\\n      attributes: true,\\n    })\\n\\n    const handleMotionChange = () => {\\n      syncScene()\\n    }\\n\\n    const handleColorSchemeChange = () => {\\n      syncScene()\\n    }\\n\\n    const handleContextLost = (event: Event) => {\\n      event.preventDefault()\\n      isContextLost = true\\n      stopAnimation()\\n      releasePipeline(false)\\n      setIsWebGlReady(false)\\n    }\\n\\n    const handleContextRestored = () => {\\n      isContextLost = false\\n      syncScene()\\n    }\\n\\n    reducedMotion.addEventListener(\\\"change\\\", handleMotionChange)\\n    colorScheme.addEventListener(\\\"change\\\", handleColorSchemeChange)\\n    window.addEventListener(\\\"resize\\\", handleWindowResize)\\n    canvas.addEventListener(\\\"webglcontextlost\\\", handleContextLost)\\n    canvas.addEventListener(\\\"webglcontextrestored\\\", handleContextRestored)\\n\\n    syncScene()\\n\\n    return () => {\\n      stopAnimation()\\n      resizeObserver.disconnect()\\n      intersectionObserver.disconnect()\\n      themeObserver.disconnect()\\n      reducedMotion.removeEventListener(\\\"change\\\", handleMotionChange)\\n      colorScheme.removeEventListener(\\\"change\\\", handleColorSchemeChange)\\n      window.removeEventListener(\\\"resize\\\", handleWindowResize)\\n      canvas.removeEventListener(\\\"webglcontextlost\\\", handleContextLost)\\n      canvas.removeEventListener(\\\"webglcontextrestored\\\", handleContextRestored)\\n      syncSceneRef.current = null\\n      releasePipeline(!isContextLost)\\n    }\\n  }, [])\\n\\n  const gridStyles = {\\n    ...style,\\n    opacity,\\n  } as CSSProperties\\n  const normalizedAngle = clamp(angle, MIN_ANGLE, MAX_ANGLE)\\n  const normalizedCellSize = Math.max(cellSize, 1)\\n  const fallbackProjectionStyles = {\\n    perspective: `${PERSPECTIVE_PX}px`,\\n  } as CSSProperties\\n  const fallbackRotationStyles = {\\n    transform: `rotateX(${normalizedAngle}deg)`,\\n  } as CSSProperties\\n  const lightFallbackGridStyles = createFallbackGridStyle(\\n    normalizedCellSize,\\n    lightLineColor\\n  )\\n  const darkFallbackGridStyles = createFallbackGridStyle(\\n    normalizedCellSize,\\n    darkLineColor\\n  )\\n\\n  return (\\n    <div\\n      ref={containerRef}\\n      className={cn(\\n        \\\"pointer-events-none absolute size-full overflow-hidden\\\",\\n        className\\n      )}\\n      style={gridStyles}\\n      {...props}\\n    >\\n      <style>{FALLBACK_STYLES}</style>\\n      {!isWebGlReady ? (\\n        <div className=\\\"absolute inset-0\\\" style={fallbackProjectionStyles}>\\n          <div className=\\\"absolute inset-0\\\" style={fallbackRotationStyles}>\\n            <div\\n              data-retro-grid-scroll=\\\"true\\\"\\n              className=\\\"absolute inset-[0%_0px] ml-[-200%] h-[300vh] w-[600vw] origin-[100%_0_0] dark:hidden\\\"\\n              style={lightFallbackGridStyles}\\n            />\\n            <div\\n              data-retro-grid-scroll=\\\"true\\\"\\n              className=\\\"absolute inset-[0%_0px] ml-[-200%] hidden h-[300vh] w-[600vw] origin-[100%_0_0] dark:block\\\"\\n              style={darkFallbackGridStyles}\\n            />\\n          </div>\\n        </div>\\n      ) : null}\\n      <canvas\\n        ref={canvasRef}\\n        className={cn(\\n          \\\"absolute inset-0 size-full\\\",\\n          isWebGlReady ? \\\"opacity-100\\\" : \\\"opacity-0\\\"\\n        )}\\n      />\\n      <div className=\\\"absolute inset-0 bg-linear-to-t from-white to-transparent to-90% dark:from-black\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/ripple-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"ripple-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Ripple Button Demo\",\n  \"description\": \"Example showing an animated button with ripple effect.\",\n  \"registryDependencies\": [\n    \"@magicui/ripple-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/ripple-button-demo.tsx\",\n      \"content\": \"import { RippleButton } from \\\"@/registry/magicui/ripple-button\\\"\\n\\nexport default function RippleButtonDemo() {\\n  return <RippleButton rippleColor=\\\"#ADD8E6\\\">Click me</RippleButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/ripple-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"ripple-button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Ripple Button\",\n  \"description\": \"An animated button with ripple useful for user engagement.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/ripple-button.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { MouseEvent, useEffect, useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface RippleButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n  rippleColor?: string\\n  duration?: string\\n}\\n\\nexport const RippleButton = React.forwardRef<\\n  HTMLButtonElement,\\n  RippleButtonProps\\n>(\\n  (\\n    {\\n      className,\\n      children,\\n      rippleColor = \\\"#ffffff\\\",\\n      duration = \\\"600ms\\\",\\n      onClick,\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    const [buttonRipples, setButtonRipples] = useState<\\n      Array<{ x: number; y: number; size: number; key: number }>\\n    >([])\\n\\n    const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\\n      createRipple(event)\\n      onClick?.(event)\\n    }\\n\\n    const createRipple = (event: MouseEvent<HTMLButtonElement>) => {\\n      const button = event.currentTarget\\n      const rect = button.getBoundingClientRect()\\n      const size = Math.max(rect.width, rect.height)\\n      const x = event.clientX - rect.left - size / 2\\n      const y = event.clientY - rect.top - size / 2\\n\\n      const newRipple = { x, y, size, key: Date.now() }\\n      setButtonRipples((prevRipples) => [...prevRipples, newRipple])\\n    }\\n\\n    useEffect(() => {\\n      let timeout: ReturnType<typeof setTimeout> | null = null\\n\\n      if (buttonRipples.length > 0) {\\n        const lastRipple = buttonRipples[buttonRipples.length - 1]\\n        timeout = setTimeout(() => {\\n          setButtonRipples((prevRipples) =>\\n            prevRipples.filter((ripple) => ripple.key !== lastRipple.key)\\n          )\\n        }, parseInt(duration))\\n      }\\n\\n      return () => {\\n        if (timeout !== null) {\\n          clearTimeout(timeout)\\n        }\\n      }\\n    }, [buttonRipples, duration])\\n\\n    return (\\n      <button\\n        className={cn(\\n          \\\"bg-background text-primary relative flex cursor-pointer items-center justify-center overflow-hidden rounded-lg border-2 px-4 py-2 text-center\\\",\\n          className\\n        )}\\n        onClick={handleClick}\\n        ref={ref}\\n        {...props}\\n      >\\n        <div className=\\\"relative z-10\\\">{children}</div>\\n        <span className=\\\"pointer-events-none absolute inset-0\\\">\\n          {buttonRipples.map((ripple) => (\\n            <span\\n              className=\\\"animate-rippling bg-background absolute rounded-full opacity-30\\\"\\n              key={ripple.key}\\n              style={\\n                {\\n                  width: `${ripple.size}px`,\\n                  height: `${ripple.size}px`,\\n                  top: `${ripple.y}px`,\\n                  left: `${ripple.x}px`,\\n                  backgroundColor: rippleColor,\\n                  transform: `scale(0)`,\\n                  \\\"--duration\\\": duration,\\n                } as React.CSSProperties\\n              }\\n            />\\n          ))}\\n        </span>\\n      </button>\\n    )\\n  }\\n)\\n\\nRippleButton.displayName = \\\"RippleButton\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-rippling\": \"rippling var(--duration) ease-out\"\n    }\n  },\n  \"css\": {\n    \"@keyframes rippling\": {\n      \"0%\": {\n        \"opacity\": \"1\"\n      },\n      \"100%\": {\n        \"transform\": \"scale(2)\",\n        \"opacity\": \"0\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/ripple-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"ripple-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Ripple Demo\",\n  \"description\": \"Example showing an animated ripple effect.\",\n  \"registryDependencies\": [\n    \"@magicui/ripple\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/ripple-demo.tsx\",\n      \"content\": \"import { Ripple } from \\\"@/registry/magicui/ripple\\\"\\n\\nexport default function RippleDemo() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <p className=\\\"z-10 text-center text-5xl font-medium tracking-tighter whitespace-pre-wrap text-white\\\">\\n        Ripple\\n      </p>\\n      <Ripple />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/ripple.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"ripple\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Ripple\",\n  \"description\": \"An animated ripple effect typically used behind elements to emphasize them.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/ripple.tsx\",\n      \"content\": \"import React, { type ComponentPropsWithoutRef, type CSSProperties } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface RippleProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  mainCircleSize?: number\\n  mainCircleOpacity?: number\\n  numCircles?: number\\n}\\n\\nexport const Ripple = React.memo(function Ripple({\\n  mainCircleSize = 210,\\n  mainCircleOpacity = 0.24,\\n  numCircles = 8,\\n  className,\\n  ...props\\n}: RippleProps) {\\n  return (\\n    <div\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 mask-[linear-gradient(to_bottom,white,transparent)] select-none\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      {Array.from({ length: numCircles }, (_, i) => {\\n        const size = mainCircleSize + i * 70\\n        const opacity = mainCircleOpacity - i * 0.03\\n        const animationDelay = `${i * 0.06}s`\\n        const borderStyle = \\\"solid\\\"\\n\\n        return (\\n          <div\\n            key={i}\\n            className={`animate-ripple bg-foreground/25 absolute rounded-full border shadow-xl`}\\n            style={\\n              {\\n                \\\"--i\\\": i,\\n                width: `${size}px`,\\n                height: `${size}px`,\\n                opacity,\\n                animationDelay,\\n                borderStyle,\\n                borderWidth: \\\"1px\\\",\\n                borderColor: `var(--foreground)`,\\n                top: \\\"50%\\\",\\n                left: \\\"50%\\\",\\n                transform: \\\"translate(-50%, -50%) scale(1)\\\",\\n              } as CSSProperties\\n            }\\n          />\\n        )\\n      })}\\n    </div>\\n  )\\n})\\n\\nRipple.displayName = \\\"Ripple\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-ripple\": \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes ripple\": {\n      \"0%, 100%\": {\n        \"transform\": \"translate(-50%, -50%) scale(1)\"\n      },\n      \"50%\": {\n        \"transform\": \"translate(-50%, -50%) scale(0.9)\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/safari-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"safari-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Safari Demo 2\",\n  \"description\": \"Second example showing a Safari browser mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/safari\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/safari-demo-2.tsx\",\n      \"content\": \"import { Safari } from \\\"@/registry/magicui/safari\\\"\\n\\nexport default function SafariDemo() {\\n  return (\\n    <div className=\\\"w-[1203px]\\\">\\n      <Safari\\n        url=\\\"magicui.design\\\"\\n        imageSrc=\\\"https://placehold.co/1200x750?text=Hello+World\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/safari-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"safari-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Safari Demo 3\",\n  \"description\": \"Third example showing a Safari browser mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/safari\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/safari-demo-3.tsx\",\n      \"content\": \"import { Safari } from \\\"@/registry/magicui/safari\\\"\\n\\nexport default function SafariDemo() {\\n  return (\\n    <div className=\\\"w-[1203px]\\\">\\n      <Safari\\n        url=\\\"magicui.design\\\"\\n        videoSrc=\\\"https://videos.pexels.com/video-files/27180348/12091515_2560_1440_50fps.mp4\\\"\\n      />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/safari-demo-4.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"safari-demo-4\",\n  \"type\": \"registry:example\",\n  \"title\": \"Safari Demo 4\",\n  \"description\": \"Fourth example showing a Safari browser mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/safari\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/safari-demo-4.tsx\",\n      \"content\": \"import { Safari } from \\\"@/registry/magicui/safari\\\"\\n\\nexport default function SafariDemo() {\\n  return (\\n    <div className=\\\"w-[1203px]\\\">\\n      <Safari url=\\\"magicui.design\\\" mode=\\\"simple\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/safari-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"safari-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Safari Demo\",\n  \"description\": \"Example showing a Safari browser mockup.\",\n  \"registryDependencies\": [\n    \"@magicui/safari\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/safari-demo.tsx\",\n      \"content\": \"import { Safari } from \\\"@/registry/magicui/safari\\\"\\n\\nexport default function SafariDemo() {\\n  return (\\n    <div className=\\\"w-[1203px]\\\">\\n      <Safari url=\\\"magicui.design\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/safari.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"safari\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Safari\",\n  \"description\": \"A safari browser mockup to showcase your website.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/safari.tsx\",\n      \"content\": \"import type { HTMLAttributes } from \\\"react\\\"\\n\\nconst SAFARI_WIDTH = 1203\\nconst SAFARI_HEIGHT = 753\\nconst SCREEN_X = 1\\nconst SCREEN_Y = 52\\nconst SCREEN_WIDTH = 1200\\nconst SCREEN_HEIGHT = 700\\n\\n// Calculated percentages\\nconst LEFT_PCT = (SCREEN_X / SAFARI_WIDTH) * 100\\nconst TOP_PCT = (SCREEN_Y / SAFARI_HEIGHT) * 100\\nconst WIDTH_PCT = (SCREEN_WIDTH / SAFARI_WIDTH) * 100\\nconst HEIGHT_PCT = (SCREEN_HEIGHT / SAFARI_HEIGHT) * 100\\n\\ntype SafariMode = \\\"default\\\" | \\\"simple\\\"\\n\\nexport interface SafariProps extends HTMLAttributes<HTMLDivElement> {\\n  url?: string\\n  imageSrc?: string\\n  videoSrc?: string\\n  mode?: SafariMode\\n}\\n\\nexport function Safari({\\n  imageSrc,\\n  videoSrc,\\n  url,\\n  mode = \\\"default\\\",\\n  className,\\n  style,\\n  ...props\\n}: SafariProps) {\\n  const hasVideo = !!videoSrc\\n  const hasMedia = hasVideo || !!imageSrc\\n\\n  return (\\n    <div\\n      className={`relative inline-block w-full align-middle leading-none ${className ?? \\\"\\\"}`}\\n      style={{\\n        aspectRatio: `${SAFARI_WIDTH}/${SAFARI_HEIGHT}`,\\n        ...style,\\n      }}\\n      {...props}\\n    >\\n      {hasVideo && (\\n        <div\\n          className=\\\"pointer-events-none absolute z-0 overflow-hidden\\\"\\n          style={{\\n            left: `${LEFT_PCT}%`,\\n            top: `${TOP_PCT}%`,\\n            width: `${WIDTH_PCT}%`,\\n            height: `${HEIGHT_PCT}%`,\\n          }}\\n        >\\n          <video\\n            className=\\\"block size-full object-cover\\\"\\n            src={videoSrc}\\n            autoPlay\\n            loop\\n            muted\\n            playsInline\\n            preload=\\\"metadata\\\"\\n          />\\n        </div>\\n      )}\\n\\n      {!hasVideo && imageSrc && (\\n        <div\\n          className=\\\"pointer-events-none absolute z-0 overflow-hidden\\\"\\n          style={{\\n            left: `${LEFT_PCT}%`,\\n            top: `${TOP_PCT}%`,\\n            width: `${WIDTH_PCT}%`,\\n            height: `${HEIGHT_PCT}%`,\\n            borderRadius: \\\"0 0 11px 11px\\\",\\n          }}\\n        >\\n          <img\\n            src={imageSrc}\\n            alt=\\\"\\\"\\n            className=\\\"block size-full object-cover object-top\\\"\\n          />\\n        </div>\\n      )}\\n\\n      <svg\\n        viewBox={`0 0 ${SAFARI_WIDTH} ${SAFARI_HEIGHT}`}\\n        fill=\\\"none\\\"\\n        xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n        className=\\\"absolute inset-0 z-10 size-full\\\"\\n        style={{ transform: \\\"translateZ(0)\\\" }}\\n      >\\n        <defs>\\n          <mask id=\\\"safariPunch\\\" maskUnits=\\\"userSpaceOnUse\\\">\\n            <rect\\n              x=\\\"0\\\"\\n              y=\\\"0\\\"\\n              width={SAFARI_WIDTH}\\n              height={SAFARI_HEIGHT}\\n              fill=\\\"white\\\"\\n            />\\n            <path\\n              d=\\\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\\\"\\n              fill=\\\"black\\\"\\n            />\\n          </mask>\\n\\n          <clipPath id=\\\"path0\\\">\\n            <rect width={SAFARI_WIDTH} height={SAFARI_HEIGHT} fill=\\\"white\\\" />\\n          </clipPath>\\n\\n          <clipPath id=\\\"roundedBottom\\\">\\n            <path\\n              d=\\\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\\\"\\n              fill=\\\"white\\\"\\n            />\\n          </clipPath>\\n        </defs>\\n\\n        <g\\n          clipPath=\\\"url(#path0)\\\"\\n          mask={hasMedia ? \\\"url(#safariPunch)\\\" : undefined}\\n        >\\n          <path\\n            d=\\\"M0 52H1202V741C1202 747.627 1196.63 753 1190 753H12C5.37258 753 0 747.627 0 741V52Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            fillRule=\\\"evenodd\\\"\\n            clipRule=\\\"evenodd\\\"\\n            d=\\\"M0 12C0 5.37258 5.37258 0 12 0H1190C1196.63 0 1202 5.37258 1202 12V52H0L0 12Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            fillRule=\\\"evenodd\\\"\\n            clipRule=\\\"evenodd\\\"\\n            d=\\\"M1.06738 12C1.06738 5.92487 5.99225 1 12.0674 1H1189.93C1196.01 1 1200.93 5.92487 1200.93 12V51H1.06738V12Z\\\"\\n            className=\\\"fill-white dark:fill-[#262626]\\\"\\n          />\\n          <circle\\n            cx=\\\"27\\\"\\n            cy=\\\"25\\\"\\n            r=\\\"6\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <circle\\n            cx=\\\"47\\\"\\n            cy=\\\"25\\\"\\n            r=\\\"6\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <circle\\n            cx=\\\"67\\\"\\n            cy=\\\"25\\\"\\n            r=\\\"6\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <path\\n            d=\\\"M286 17C286 13.6863 288.686 11 292 11H946C949.314 11 952 13.6863 952 17V35C952 38.3137 949.314 41 946 41H292C288.686 41 286 38.3137 286 35V17Z\\\"\\n            className=\\\"fill-[#E5E5E5] dark:fill-[#404040]\\\"\\n          />\\n          <g className=\\\"mix-blend-luminosity\\\">\\n            <path\\n              d=\\\"M566.269 32.0852H572.426C573.277 32.0852 573.696 31.6663 573.696 30.7395V25.9851C573.696 25.1472 573.353 24.7219 572.642 24.6521V23.0842C572.642 20.6721 571.036 19.5105 569.348 19.5105C567.659 19.5105 566.053 20.6721 566.053 23.0842V24.6711C565.393 24.7727 565 25.1917 565 25.9851V30.7395C565 31.6663 565.418 32.0852 566.269 32.0852ZM567.272 22.97C567.272 21.491 568.211 20.6785 569.348 20.6785C570.478 20.6785 571.423 21.491 571.423 22.97V24.6394L567.272 24.6458V22.97Z\\\"\\n              fill=\\\"#A3A3A3\\\"\\n            />\\n          </g>\\n\\n          <g className=\\\"mix-blend-luminosity\\\">\\n            <text\\n              x=\\\"580\\\"\\n              y=\\\"30\\\"\\n              fill=\\\"#A3A3A3\\\"\\n              fontSize=\\\"12\\\"\\n              fontFamily=\\\"Arial, sans-serif\\\"\\n            >\\n              {url}\\n            </text>\\n          </g>\\n\\n          {mode === \\\"default\\\" ? (\\n            <>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M265.5 33.8984C265.641 33.8984 265.852 33.8516 266.047 33.7422C270.547 31.2969 272.109 30.1641 272.109 27.3203V21.4219C272.109 20.4844 271.742 20.1484 270.961 19.8125C270.094 19.4453 267.18 18.4297 266.328 18.1406C266.07 18.0547 265.766 18 265.5 18C265.234 18 264.93 18.0703 264.672 18.1406C263.82 18.3828 260.906 19.4531 260.039 19.8125C259.258 20.1406 258.891 20.4844 258.891 21.4219V27.3203C258.891 30.1641 260.461 31.2812 264.945 33.7422C265.148 33.8516 265.359 33.8984 265.5 33.8984ZM265.922 19.5781C266.945 19.9766 269.172 20.7656 270.344 21.1875C270.562 21.2656 270.617 21.3828 270.617 21.6641V27.0234C270.617 29.3125 269.469 29.9375 265.945 32.0625C265.727 32.1875 265.617 32.2344 265.508 32.2344V19.4844C265.617 19.4844 265.734 19.5156 265.922 19.5781Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M936.273 24.9766C936.5 24.9766 936.68 24.9062 936.82 24.7578L940.023 21.5312C940.195 21.3594 940.273 21.1719 940.273 20.9531C940.273 20.7422 940.188 20.5391 940.023 20.3828L936.82 17.125C936.68 16.9688 936.5 16.8906 936.273 16.8906C935.852 16.8906 935.516 17.2422 935.516 17.6719C935.516 17.8828 935.594 18.0547 935.727 18.2031L937.594 20.0312C937.227 19.9766 936.852 19.9453 936.477 19.9453C932.609 19.9453 929.516 23.0391 929.516 26.9141C929.516 30.7891 932.633 33.9062 936.5 33.9062C940.375 33.9062 943.484 30.7891 943.484 26.9141C943.484 26.4453 943.156 26.1094 942.688 26.1094C942.234 26.1094 941.93 26.4453 941.93 26.9141C941.93 29.9297 939.516 32.3516 936.5 32.3516C933.492 32.3516 931.07 29.9297 931.07 26.9141C931.07 23.875 933.469 21.4688 936.477 21.4688C936.984 21.4688 937.453 21.5078 937.867 21.5781L935.734 23.6875C935.594 23.8281 935.516 24 935.516 24.2109C935.516 24.6406 935.852 24.9766 936.273 24.9766Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M1134 33.0156C1134.49 33.0156 1134.89 32.6094 1134.89 32.1484V27.2578H1139.66C1140.13 27.2578 1140.54 26.8594 1140.54 26.3672C1140.54 25.8828 1140.13 25.4766 1139.66 25.4766H1134.89V20.5859C1134.89 20.1172 1134.49 19.7188 1134 19.7188C1133.52 19.7188 1133.11 20.1172 1133.11 20.5859V25.4766H1128.34C1127.88 25.4766 1127.46 25.8828 1127.46 26.3672C1127.46 26.8594 1127.88 27.2578 1128.34 27.2578H1133.11V32.1484C1133.11 32.6094 1133.52 33.0156 1134 33.0156Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M1161.8 31.0703H1163.23V32.375C1163.23 34.0547 1164.12 34.9219 1165.81 34.9219H1174.2C1175.89 34.9219 1176.77 34.0547 1176.77 32.3828V24.0469C1176.77 22.375 1175.89 21.5 1174.2 21.5H1172.77V20.2578C1172.77 18.5859 1171.88 17.7109 1170.19 17.7109H1161.8C1160.1 17.7109 1159.23 18.5781 1159.23 20.2578V28.5234C1159.23 30.1953 1160.1 31.0703 1161.8 31.0703ZM1161.9 29.5078C1161.18 29.5078 1160.78 29.1328 1160.78 28.3828V20.3984C1160.78 19.6406 1161.18 19.2656 1161.9 19.2656H1170.09C1170.8 19.2656 1171.2 19.6406 1171.2 20.3984V21.5H1165.81C1164.12 21.5 1163.23 22.375 1163.23 24.0469V29.5078H1161.9ZM1165.91 33.3672C1165.19 33.3672 1164.8 32.9922 1164.8 32.2422V24.1875C1164.8 23.4297 1165.19 23.0625 1165.91 23.0625H1174.1C1174.81 23.0625 1175.21 23.4297 1175.21 24.1875V32.2422C1175.21 32.9922 1174.81 33.3672 1174.1 33.3672H1165.91Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M1099.51 28.4141C1099.91 28.4141 1100.24 28.0859 1100.24 27.6953V19.8359L1100.18 18.6797L1100.66 19.25L1101.75 20.4141C1101.88 20.5547 1102.06 20.625 1102.24 20.625C1102.6 20.625 1102.9 20.3672 1102.9 20C1102.9 19.8047 1102.82 19.6641 1102.69 19.5312L1100.06 17.0078C1099.88 16.8203 1099.7 16.7578 1099.51 16.7578C1099.32 16.7578 1099.14 16.8203 1098.95 17.0078L1096.33 19.5312C1096.2 19.6641 1096.12 19.8047 1096.12 20C1096.12 20.3672 1096.41 20.625 1096.77 20.625C1096.95 20.625 1097.14 20.5547 1097.27 20.4141L1098.35 19.25L1098.84 18.6719L1098.78 19.8359V27.6953C1098.78 28.0859 1099.11 28.4141 1099.51 28.4141ZM1095 34.6562H1104C1105.7 34.6562 1106.57 33.7812 1106.57 32.1094V24.4297C1106.57 22.7578 1105.7 21.8828 1104 21.8828H1101.89V23.4375H1103.9C1104.61 23.4375 1105.02 23.8125 1105.02 24.5625V31.9688C1105.02 32.7188 1104.61 33.0938 1103.9 33.0938H1095.1C1094.38 33.0938 1093.98 32.7188 1093.98 31.9688V24.5625C1093.98 23.8125 1094.38 23.4375 1095.1 23.4375H1097.13V21.8828H1095C1093.31 21.8828 1092.43 22.75 1092.43 24.4297V32.1094C1092.43 33.7812 1093.31 34.6562 1095 34.6562Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M99.5703 33.6016H112.938C114.633 33.6016 115.516 32.7266 115.516 31.0547V21.5469C115.516 19.875 114.633 19 112.938 19H99.5703C97.8828 19 97 19.8672 97 21.5469V31.0547C97 32.7266 97.8828 33.6016 99.5703 33.6016ZM99.6719 32.0469C98.9531 32.0469 98.5547 31.6719 98.5547 30.9141V21.6875C98.5547 20.9297 98.9531 20.5547 99.6719 20.5547H103.234V32.0469H99.6719ZM112.836 20.5547C113.555 20.5547 113.953 20.9297 113.953 21.6875V30.9141C113.953 31.6719 113.555 32.0469 112.836 32.0469H104.711V20.5547H112.836ZM101.703 23.4141C101.984 23.4141 102.219 23.1719 102.219 22.9062C102.219 22.6406 101.984 22.4062 101.703 22.4062H100.102C99.8203 22.4062 99.5859 22.6406 99.5859 22.9062C99.5859 23.1719 99.8203 23.4141 100.102 23.4141H101.703ZM101.703 25.5156C101.984 25.5156 102.219 25.2812 102.219 25.0078C102.219 24.7422 101.984 24.5078 101.703 24.5078H100.102C99.8203 24.5078 99.5859 24.7422 99.5859 25.0078C99.5859 25.2812 99.8203 25.5156 100.102 25.5156H101.703ZM101.703 27.6094C101.984 27.6094 102.219 27.3828 102.219 27.1094C102.219 26.8438 101.984 26.6172 101.703 26.6172H100.102C99.8203 26.6172 99.5859 26.8438 99.5859 27.1094C99.5859 27.3828 99.8203 27.6094 100.102 27.6094H101.703Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M143.914 32.5938C144.094 32.7656 144.312 32.8594 144.562 32.8594C145.086 32.8594 145.492 32.4531 145.492 31.9375C145.492 31.6797 145.391 31.4453 145.211 31.2656L139.742 25.9219L145.211 20.5938C145.391 20.4141 145.492 20.1719 145.492 19.9219C145.492 19.4062 145.086 19 144.562 19C144.312 19 144.094 19.0938 143.922 19.2656L137.844 25.2031C137.625 25.4062 137.516 25.6562 137.516 25.9297C137.516 26.2031 137.625 26.4375 137.836 26.6484L143.914 32.5938Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n              <g className=\\\"mix-blend-luminosity\\\">\\n                <path\\n                  d=\\\"M168.422 32.8594C168.68 32.8594 168.891 32.7656 169.07 32.5938L175.148 26.6562C175.359 26.4375 175.469 26.2109 175.469 25.9297C175.469 25.6562 175.367 25.4141 175.148 25.2109L169.07 19.2656C168.891 19.0938 168.68 19 168.422 19C167.898 19 167.492 19.4062 167.492 19.9219C167.492 20.1719 167.602 20.4141 167.773 20.5938L173.25 25.9375L167.773 31.2656C167.594 31.4531 167.492 31.6797 167.492 31.9375C167.492 32.4531 167.898 32.8594 168.422 32.8594Z\\\"\\n                  fill=\\\"#A3A3A3\\\"\\n                />\\n              </g>\\n            </>\\n          ) : null}\\n        </g>\\n      </svg>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/scroll-based-velocity-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"scroll-based-velocity-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Scroll Based Velocity Demo\",\n  \"description\": \"Example showing text speed changes based on scroll velocity.\",\n  \"registryDependencies\": [\n    \"@magicui/scroll-based-velocity\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/scroll-based-velocity-demo.tsx\",\n      \"content\": \"import {\\n  ScrollVelocityContainer,\\n  ScrollVelocityRow,\\n} from \\\"@/registry/magicui/scroll-based-velocity\\\"\\n\\nexport default function ScrollBasedVelocityDemo() {\\n  return (\\n    <div className=\\\"relative flex w-full flex-col items-center justify-center overflow-hidden\\\">\\n      <ScrollVelocityContainer className=\\\"text-4xl font-bold tracking-[-0.02em] md:text-7xl md:leading-20\\\">\\n        <ScrollVelocityRow baseVelocity={20} direction={1}>\\n          Velocity Scroll\\n        </ScrollVelocityRow>\\n        <ScrollVelocityRow baseVelocity={20} direction={-1}>\\n          Velocity Scroll\\n        </ScrollVelocityRow>\\n      </ScrollVelocityContainer>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/scroll-based-velocity-images-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"scroll-based-velocity-images-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Scroll Based Velocity Images\",\n  \"description\": \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n  \"registryDependencies\": [\n    \"@magicui/scroll-based-velocity\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/scroll-based-velocity-images-demo.tsx\",\n      \"content\": \"import {\\n  ScrollVelocityContainer,\\n  ScrollVelocityRow,\\n} from \\\"@/registry/magicui/scroll-based-velocity\\\"\\n\\nconst IMAGES_ROW_A = [\\n  \\\"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n]\\n\\nconst IMAGES_ROW_B = [\\n  \\\"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n  \\\"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\\\",\\n]\\n\\nexport default function ScrollBasedVelocityImagesDemo() {\\n  return (\\n    <div className=\\\"relative flex w-full flex-col items-center justify-center overflow-hidden py-8\\\">\\n      <ScrollVelocityContainer className=\\\"w-full\\\">\\n        <ScrollVelocityRow baseVelocity={6} direction={1} className=\\\"py-4\\\">\\n          {IMAGES_ROW_A.map((src, idx) => (\\n            <img\\n              key={idx}\\n              src={`${src}&ixlib=rb-4.0.3`}\\n              alt=\\\"Unsplash sample\\\"\\n              width={240}\\n              height={160}\\n              loading=\\\"lazy\\\"\\n              decoding=\\\"async\\\"\\n              className=\\\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\\\"\\n            />\\n          ))}\\n        </ScrollVelocityRow>\\n        <ScrollVelocityRow baseVelocity={6} direction={-1} className=\\\"py-4\\\">\\n          {IMAGES_ROW_B.map((src, idx) => (\\n            <img\\n              key={idx}\\n              src={`${src}&ixlib=rb-4.0.3`}\\n              alt=\\\"Unsplash sample\\\"\\n              width={240}\\n              height={160}\\n              loading=\\\"lazy\\\"\\n              decoding=\\\"async\\\"\\n              className=\\\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\\\"\\n            />\\n          ))}\\n        </ScrollVelocityRow>\\n      </ScrollVelocityContainer>\\n\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\\\"></div>\\n      <div className=\\\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\\\"></div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/scroll-based-velocity.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"scroll-based-velocity\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Scroll Based Velocity\",\n  \"description\": \"Scrolling text whose speed changes based on scroll speed\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/scroll-based-velocity.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { useContext, useEffect, useRef, useState } from \\\"react\\\"\\nimport {\\n  motion,\\n  useAnimationFrame,\\n  useMotionValue,\\n  useScroll,\\n  useSpring,\\n  useTransform,\\n  useVelocity,\\n} from \\\"motion/react\\\"\\nimport type { MotionValue } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface ScrollVelocityRowProps extends React.HTMLAttributes<HTMLDivElement> {\\n  children: React.ReactNode\\n  baseVelocity?: number\\n  direction?: 1 | -1\\n  scrollReactivity?: boolean\\n}\\n\\nexport const wrap = (min: number, max: number, v: number) => {\\n  const rangeSize = max - min\\n  return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min\\n}\\n\\nconst ScrollVelocityContext = React.createContext<MotionValue<number> | null>(\\n  null\\n)\\n\\nexport function ScrollVelocityContainer({\\n  children,\\n  className,\\n  ...props\\n}: React.HTMLAttributes<HTMLDivElement>) {\\n  const { scrollY } = useScroll()\\n  const scrollVelocity = useVelocity(scrollY)\\n  const smoothVelocity = useSpring(scrollVelocity, {\\n    damping: 50,\\n    stiffness: 400,\\n  })\\n  const velocityFactor = useTransform(smoothVelocity, (v) => {\\n    const sign = v < 0 ? -1 : 1\\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\\n    return sign * magnitude\\n  })\\n\\n  return (\\n    <ScrollVelocityContext.Provider value={velocityFactor}>\\n      <div className={cn(\\\"relative w-full\\\", className)} {...props}>\\n        {children}\\n      </div>\\n    </ScrollVelocityContext.Provider>\\n  )\\n}\\n\\nexport function ScrollVelocityRow(props: ScrollVelocityRowProps) {\\n  const sharedVelocityFactor = useContext(ScrollVelocityContext)\\n  if (sharedVelocityFactor) {\\n    return (\\n      <ScrollVelocityRowImpl {...props} velocityFactor={sharedVelocityFactor} />\\n    )\\n  }\\n  return <ScrollVelocityRowLocal {...props} />\\n}\\n\\ninterface ScrollVelocityRowImplProps extends ScrollVelocityRowProps {\\n  velocityFactor: MotionValue<number>\\n}\\n\\nfunction ScrollVelocityRowImpl({\\n  children,\\n  baseVelocity = 5,\\n  direction = 1,\\n  className,\\n  velocityFactor,\\n  scrollReactivity = true,\\n  ...props\\n}: ScrollVelocityRowImplProps) {\\n  const containerRef = useRef<HTMLDivElement>(null)\\n  const blockRef = useRef<HTMLDivElement>(null)\\n  const [numCopies, setNumCopies] = useState(1)\\n\\n  const baseX = useMotionValue(0)\\n  const baseDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\\n  const currentDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\\n  const unitWidth = useMotionValue(0)\\n\\n  const isInViewRef = useRef(true)\\n  const isPageVisibleRef = useRef(true)\\n  const prefersReducedMotionRef = useRef(false)\\n\\n  useEffect(() => {\\n    const container = containerRef.current\\n    const block = blockRef.current\\n    let ro: ResizeObserver | null = null\\n    let io: IntersectionObserver | null = null\\n    let mq: MediaQueryList | null = null\\n    const handleVisibility = () => {\\n      isPageVisibleRef.current = document.visibilityState === \\\"visible\\\"\\n    }\\n    const handlePRM = () => {\\n      if (mq) {\\n        prefersReducedMotionRef.current = mq.matches\\n      }\\n    }\\n\\n    if (container && block) {\\n      const updateSizes = () => {\\n        const cw = container.offsetWidth || 0\\n        const bw = block.scrollWidth || 0\\n        unitWidth.set(bw)\\n        const nextCopies = bw > 0 ? Math.max(3, Math.ceil(cw / bw) + 2) : 1\\n        setNumCopies((prev) => (prev === nextCopies ? prev : nextCopies))\\n      }\\n\\n      updateSizes()\\n\\n      ro = new ResizeObserver(updateSizes)\\n      ro.observe(container)\\n      ro.observe(block)\\n\\n      io = new IntersectionObserver(([entry]) => {\\n        isInViewRef.current = entry.isIntersecting\\n      })\\n      io.observe(container)\\n\\n      document.addEventListener(\\\"visibilitychange\\\", handleVisibility, {\\n        passive: true,\\n      })\\n      handleVisibility()\\n\\n      mq = window.matchMedia(\\\"(prefers-reduced-motion: reduce)\\\")\\n      mq.addEventListener(\\\"change\\\", handlePRM)\\n      handlePRM()\\n    }\\n\\n    return () => {\\n      if (ro) {\\n        ro.disconnect()\\n      }\\n      if (io) {\\n        io.disconnect()\\n      }\\n      document.removeEventListener(\\\"visibilitychange\\\", handleVisibility)\\n      if (mq) {\\n        mq.removeEventListener(\\\"change\\\", handlePRM)\\n      }\\n    }\\n  }, [children, unitWidth])\\n\\n  const x = useTransform([baseX, unitWidth], ([v, bw]) => {\\n    const width = Number(bw) || 1\\n    const offset = Number(v) || 0\\n    return `${-wrap(0, width, offset)}px`\\n  })\\n\\n  useAnimationFrame((_, delta) => {\\n    if (!isInViewRef.current || !isPageVisibleRef.current) return\\n    const dt = delta / 1000\\n    const vf = scrollReactivity ? velocityFactor.get() : 0\\n    const absVf = Math.min(5, Math.abs(vf))\\n    const speedMultiplier = prefersReducedMotionRef.current ? 1 : 1 + absVf\\n\\n    if (absVf > 0.1) {\\n      const scrollDirection = vf >= 0 ? 1 : -1\\n      currentDirectionRef.current = baseDirectionRef.current * scrollDirection\\n    }\\n\\n    const bw = unitWidth.get() || 0\\n    if (bw <= 0) return\\n    const pixelsPerSecond = (bw * baseVelocity) / 100\\n    const moveBy =\\n      currentDirectionRef.current * pixelsPerSecond * speedMultiplier * dt\\n    baseX.set(baseX.get() + moveBy)\\n  })\\n\\n  return (\\n    <div\\n      ref={containerRef}\\n      className={cn(\\\"w-full overflow-hidden whitespace-nowrap\\\", className)}\\n      {...props}\\n    >\\n      <motion.div\\n        className=\\\"inline-flex transform-gpu items-center will-change-transform select-none\\\"\\n        style={{ x }}\\n      >\\n        {Array.from({ length: numCopies }).map((_, i) => (\\n          <div\\n            key={i}\\n            ref={i === 0 ? blockRef : null}\\n            aria-hidden={i !== 0}\\n            className=\\\"inline-flex shrink-0 items-center\\\"\\n          >\\n            {children}\\n          </div>\\n        ))}\\n      </motion.div>\\n    </div>\\n  )\\n}\\n\\nfunction ScrollVelocityRowLocal(props: ScrollVelocityRowProps) {\\n  const { scrollY } = useScroll()\\n  const localVelocity = useVelocity(scrollY)\\n  const localSmoothVelocity = useSpring(localVelocity, {\\n    damping: 50,\\n    stiffness: 400,\\n  })\\n  const localVelocityFactor = useTransform(localSmoothVelocity, (v) => {\\n    const sign = v < 0 ? -1 : 1\\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\\n    return sign * magnitude\\n  })\\n  return (\\n    <ScrollVelocityRowImpl {...props} velocityFactor={localVelocityFactor} />\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/scroll-progress-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"scroll-progress-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Scroll Progress Demo\",\n  \"description\": \"Example showing animated scroll progress for your pages.\",\n  \"registryDependencies\": [\n    \"@magicui/scroll-progress\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/scroll-progress-demo.tsx\",\n      \"content\": \"import { ScrollProgress } from \\\"@/registry/magicui/scroll-progress\\\"\\n\\nexport default function ScrollProgressDemo() {\\n  return (\\n    <div className=\\\"z-10 rounded-lg p-4\\\">\\n      <ScrollProgress className=\\\"top-[65px]\\\" />\\n      <h2 className=\\\"pb-4 font-bold\\\">\\n        Note: The scroll progress is shown below the navbar of the page.\\n      </h2>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/scroll-progress.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"scroll-progress\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Scroll Progress\",\n  \"description\": \"Animated Scroll Progress for your pages\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/scroll-progress.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { motion, useScroll, type MotionProps } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface ScrollProgressProps extends Omit<\\n  React.HTMLAttributes<HTMLElement>,\\n  keyof MotionProps\\n> {\\n  ref?: React.Ref<HTMLDivElement>\\n}\\n\\nexport function ScrollProgress({\\n  className,\\n  ref,\\n  ...props\\n}: ScrollProgressProps) {\\n  const { scrollYProgress } = useScroll()\\n\\n  return (\\n    <motion.div\\n      ref={ref}\\n      className={cn(\\n        \\\"fixed inset-x-0 top-0 z-50 h-px origin-left bg-linear-to-r from-[#A97CF8] via-[#F38CB8] to-[#FDCC92]\\\",\\n        className\\n      )}\\n      style={{\\n        scaleX: scrollYProgress,\\n      }}\\n      {...props}\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/shimmer-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shimmer-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Shimmer Button Demo\",\n  \"description\": \"Example showing a button with a shimmering light effect.\",\n  \"registryDependencies\": [\n    \"@magicui/shimmer-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/shimmer-button-demo.tsx\",\n      \"content\": \"import { ShimmerButton } from \\\"@/registry/magicui/shimmer-button\\\"\\n\\nexport default function ShimmerButtonDemo() {\\n  return (\\n    <ShimmerButton className=\\\"shadow-2xl\\\">\\n      <span className=\\\"text-center text-sm leading-none font-medium tracking-tight whitespace-pre-wrap text-white lg:text-lg dark:from-white dark:to-slate-900/10\\\">\\n        Shimmer Button\\n      </span>\\n    </ShimmerButton>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/shimmer-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shimmer-button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Shimmer Button\",\n  \"description\": \"A button with a shimmering light which travels around the perimeter.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/shimmer-button.tsx\",\n      \"content\": \"import React, { type ComponentPropsWithoutRef, type CSSProperties } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface ShimmerButtonProps extends ComponentPropsWithoutRef<\\\"button\\\"> {\\n  shimmerColor?: string\\n  shimmerSize?: string\\n  borderRadius?: string\\n  shimmerDuration?: string\\n  background?: string\\n  className?: string\\n  children?: React.ReactNode\\n}\\n\\nexport const ShimmerButton = React.forwardRef<\\n  HTMLButtonElement,\\n  ShimmerButtonProps\\n>(\\n  (\\n    {\\n      shimmerColor = \\\"#ffffff\\\",\\n      shimmerSize = \\\"0.05em\\\",\\n      shimmerDuration = \\\"3s\\\",\\n      borderRadius = \\\"100px\\\",\\n      background = \\\"rgba(0, 0, 0, 1)\\\",\\n      className,\\n      children,\\n      ...props\\n    },\\n    ref\\n  ) => {\\n    return (\\n      <button\\n        style={\\n          {\\n            \\\"--spread\\\": \\\"90deg\\\",\\n            \\\"--shimmer-color\\\": shimmerColor,\\n            \\\"--radius\\\": borderRadius,\\n            \\\"--speed\\\": shimmerDuration,\\n            \\\"--cut\\\": shimmerSize,\\n            \\\"--bg\\\": background,\\n          } as CSSProperties\\n        }\\n        className={cn(\\n          \\\"group relative z-0 flex cursor-pointer items-center justify-center overflow-hidden [border-radius:var(--radius)] border border-white/10 px-6 py-3 whitespace-nowrap text-white [background:var(--bg)]\\\",\\n          \\\"transform-gpu transition-transform duration-300 ease-in-out active:translate-y-px\\\",\\n          className\\n        )}\\n        ref={ref}\\n        {...props}\\n      >\\n        {/* spark container */}\\n        <div\\n          className={cn(\\n            \\\"-z-30 blur-[2px]\\\",\\n            \\\"@container-[size] absolute inset-0 overflow-visible\\\"\\n          )}\\n        >\\n          {/* spark */}\\n          <div className=\\\"animate-shimmer-slide absolute inset-0 aspect-[1] h-[100cqh] rounded-none [mask:none]\\\">\\n            {/* spark before */}\\n            <div className=\\\"animate-spin-around absolute -inset-full w-auto [translate:0_0] rotate-0 [background:conic-gradient(from_calc(270deg-(var(--spread)*0.5)),transparent_0,var(--shimmer-color)_var(--spread),transparent_var(--spread))]\\\" />\\n          </div>\\n        </div>\\n        {children}\\n\\n        {/* Highlight */}\\n        <div\\n          className={cn(\\n            \\\"absolute inset-0 size-full\\\",\\n\\n            \\\"rounded-2xl px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#ffffff1f]\\\",\\n\\n            // transition\\n            \\\"transform-gpu transition-all duration-300 ease-in-out\\\",\\n\\n            // on hover\\n            \\\"group-hover:shadow-[inset_0_-6px_10px_#ffffff3f]\\\",\\n\\n            // on click\\n            \\\"group-active:shadow-[inset_0_-10px_10px_#ffffff3f]\\\"\\n          )}\\n        />\\n\\n        {/* backdrop */}\\n        <div\\n          className={cn(\\n            \\\"absolute inset-(--cut) -z-20 [border-radius:var(--radius)] [background:var(--bg)]\\\"\\n          )}\\n        />\\n      </button>\\n    )\\n  }\\n)\\n\\nShimmerButton.displayName = \\\"ShimmerButton\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-shimmer-slide\": \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n      \"animate-spin-around\": \"spin-around calc(var(--speed) * 2) infinite linear\"\n    }\n  },\n  \"css\": {\n    \"@keyframes shimmer-slide\": {\n      \"to\": {\n        \"transform\": \"translate(calc(100cqw - 100%), 0)\"\n      }\n    },\n    \"@keyframes spin-around\": {\n      \"0%\": {\n        \"transform\": \"translateZ(0) rotate(0)\"\n      },\n      \"15%, 35%\": {\n        \"transform\": \"translateZ(0) rotate(90deg)\"\n      },\n      \"65%, 85%\": {\n        \"transform\": \"translateZ(0) rotate(270deg)\"\n      },\n      \"100%\": {\n        \"transform\": \"translateZ(0) rotate(360deg)\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/shine-border-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shine-border-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Shine Border Demo 2\",\n  \"description\": \"Second example showing an animated shining border effect.\",\n  \"registryDependencies\": [\n    \"@magicui/shine-border\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/shine-border-demo-2.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useTheme } from \\\"next-themes\\\"\\n\\nimport { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Input } from \\\"@/components/ui/input\\\"\\nimport { Label } from \\\"@/components/ui/label\\\"\\nimport { ShineBorder } from \\\"@/registry/magicui/shine-border\\\"\\n\\nexport default function ShineBorderDemo2() {\\n  const theme = useTheme()\\n  return (\\n    <Card className=\\\"relative overflow-hidden\\\">\\n      <ShineBorder shineColor={theme.theme === \\\"dark\\\" ? \\\"white\\\" : \\\"black\\\"} />\\n      <CardHeader>\\n        <CardTitle>Login</CardTitle>\\n        <CardDescription>\\n          Enter your credentials to access your account\\n        </CardDescription>\\n      </CardHeader>\\n      <CardContent>\\n        <form>\\n          <div className=\\\"grid gap-4\\\">\\n            <div className=\\\"grid gap-2\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input id=\\\"email\\\" type=\\\"email\\\" placeholder=\\\"name@example.com\\\" />\\n            </div>\\n            <div className=\\\"grid gap-2\\\">\\n              <Label htmlFor=\\\"password\\\">Password</Label>\\n              <Input id=\\\"password\\\" type=\\\"password\\\" />\\n            </div>\\n          </div>\\n        </form>\\n      </CardContent>\\n      <CardFooter>\\n        <Button className=\\\"w-full\\\">Sign In</Button>\\n      </CardFooter>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/shine-border-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shine-border-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Shine Border Demo\",\n  \"description\": \"Example showing an animated shining border effect.\",\n  \"registryDependencies\": [\n    \"@magicui/shine-border\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/shine-border-demo.tsx\",\n      \"content\": \"import { Button } from \\\"@/components/ui/button\\\"\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardFooter,\\n  CardHeader,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { Input } from \\\"@/components/ui/input\\\"\\nimport { Label } from \\\"@/components/ui/label\\\"\\nimport { ShineBorder } from \\\"@/registry/magicui/shine-border\\\"\\n\\nexport default function ShineBorderDemo() {\\n  return (\\n    <Card className=\\\"relative w-full max-w-[350px] overflow-hidden\\\">\\n      <ShineBorder shineColor={[\\\"#A07CFE\\\", \\\"#FE8FB5\\\", \\\"#FFBE7B\\\"]} />\\n      <CardHeader>\\n        <CardTitle>Login</CardTitle>\\n        <CardDescription>\\n          Enter your credentials to access your account\\n        </CardDescription>\\n      </CardHeader>\\n      <CardContent>\\n        <form>\\n          <div className=\\\"grid gap-4\\\">\\n            <div className=\\\"grid gap-2\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input id=\\\"email\\\" type=\\\"email\\\" placeholder=\\\"name@example.com\\\" />\\n            </div>\\n            <div className=\\\"grid gap-2\\\">\\n              <Label htmlFor=\\\"password\\\">Password</Label>\\n              <Input id=\\\"password\\\" type=\\\"password\\\" />\\n            </div>\\n          </div>\\n        </form>\\n      </CardContent>\\n      <CardFooter>\\n        <Button className=\\\"w-full\\\">Sign In</Button>\\n      </CardFooter>\\n    </Card>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/shine-border.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shine-border\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Shine Border\",\n  \"description\": \"Shine border is an animated background border effect.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/shine-border.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport * as React from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {\\n  /**\\n   * Width of the border in pixels\\n   * @default 1\\n   */\\n  borderWidth?: number\\n  /**\\n   * Duration of the animation in seconds\\n   * @default 14\\n   */\\n  duration?: number\\n  /**\\n   * Color of the border, can be a single color or an array of colors\\n   * @default \\\"#000000\\\"\\n   */\\n  shineColor?: string | string[]\\n}\\n\\n/**\\n * Shine Border\\n *\\n * An animated background border effect component with configurable properties.\\n */\\nexport function ShineBorder({\\n  borderWidth = 1,\\n  duration = 14,\\n  shineColor = \\\"#000000\\\",\\n  className,\\n  style,\\n  ...props\\n}: ShineBorderProps) {\\n  return (\\n    <div\\n      style={\\n        {\\n          \\\"--border-width\\\": `${borderWidth}px`,\\n          \\\"--duration\\\": `${duration}s`,\\n          backgroundImage: `radial-gradient(transparent,transparent, ${\\n            Array.isArray(shineColor) ? shineColor.join(\\\",\\\") : shineColor\\n          },transparent,transparent)`,\\n          backgroundSize: \\\"300% 300%\\\",\\n          mask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\\n          WebkitMask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\\n          WebkitMaskComposite: \\\"xor\\\",\\n          maskComposite: \\\"exclude\\\",\\n          padding: \\\"var(--border-width)\\\",\\n          ...style,\\n        } as React.CSSProperties\\n      }\\n      className={cn(\\n        \\\"motion-safe:animate-shine pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position]\\\",\\n        className\\n      )}\\n      {...props}\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-shine\": \"shine var(--duration) infinite linear\"\n    }\n  },\n  \"css\": {\n    \"@keyframes shine\": {\n      \"0%\": {\n        \"background-position\": \"0% 0%\"\n      },\n      \"50%\": {\n        \"background-position\": \"100% 100%\"\n      },\n      \"to\": {\n        \"background-position\": \"0% 0%\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/shiny-button-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shiny-button-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Shiny Button Demo\",\n  \"description\": \"Example showing a shiny button with dynamic styles.\",\n  \"registryDependencies\": [\n    \"@magicui/shiny-button\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/shiny-button-demo.tsx\",\n      \"content\": \"import { ShinyButton } from \\\"@/registry/magicui/shiny-button\\\"\\n\\nexport default function ShinyButtonDemo() {\\n  return <ShinyButton>Shiny Button</ShinyButton>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/shiny-button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"shiny-button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Shiny Button\",\n  \"description\": \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/shiny-button.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React from \\\"react\\\"\\nimport { motion, type MotionProps } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst animationProps: MotionProps = {\\n  initial: { \\\"--x\\\": \\\"100%\\\", scale: 0.8 },\\n  animate: { \\\"--x\\\": \\\"-100%\\\", scale: 1 },\\n  whileTap: { scale: 0.95 },\\n  transition: {\\n    repeat: Infinity,\\n    repeatType: \\\"loop\\\",\\n    repeatDelay: 1,\\n    type: \\\"spring\\\",\\n    stiffness: 20,\\n    damping: 15,\\n    mass: 2,\\n    scale: {\\n      type: \\\"spring\\\",\\n      stiffness: 200,\\n      damping: 5,\\n      mass: 0.5,\\n    },\\n  },\\n}\\n\\ninterface ShinyButtonProps\\n  extends\\n    Omit<React.HTMLAttributes<HTMLElement>, keyof MotionProps>,\\n    MotionProps {\\n  children: React.ReactNode\\n  className?: string\\n}\\n\\nexport const ShinyButton = React.forwardRef<\\n  HTMLButtonElement,\\n  ShinyButtonProps\\n>(({ children, className, ...props }, ref) => {\\n  return (\\n    <motion.button\\n      ref={ref}\\n      className={cn(\\n        \\\"relative cursor-pointer rounded-lg border px-6 py-2 font-medium backdrop-blur-xl transition-shadow duration-300 ease-in-out hover:shadow dark:bg-[radial-gradient(circle_at_50%_0%,var(--primary)/10%_0%,transparent_60%)] dark:hover:shadow-[0_0_20px_var(--primary)/10%]\\\",\\n        className\\n      )}\\n      {...animationProps}\\n      {...props}\\n    >\\n      <span\\n        className=\\\"relative block size-full text-sm tracking-wide text-[rgb(0,0,0,65%)] uppercase dark:font-light dark:text-[rgb(255,255,255,90%)]\\\"\\n        style={{\\n          maskImage:\\n            \\\"linear-gradient(-75deg,var(--primary) calc(var(--x) + 20%),transparent calc(var(--x) + 30%),var(--primary) calc(var(--x) + 100%))\\\",\\n        }}\\n      >\\n        {children}\\n      </span>\\n      <span\\n        style={{\\n          mask: \\\"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\\\",\\n          WebkitMask:\\n            \\\"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\\\",\\n          backgroundImage:\\n            \\\"linear-gradient(-75deg,var(--primary)/10% calc(var(--x)+20%),var(--primary)/50% calc(var(--x)+25%),var(--primary)/10% calc(var(--x)+100%))\\\",\\n        }}\\n        className=\\\"absolute inset-0 z-10 block rounded-[inherit] p-px\\\"\\n      />\\n    </motion.button>\\n  )\\n})\\n\\nShinyButton.displayName = \\\"ShinyButton\\\"\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/smooth-cursor-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"smooth-cursor-demo\",\n  \"type\": \"registry:example\",\n  \"description\": \"Basic smooth cursor example\",\n  \"registryDependencies\": [\n    \"@magicui/smooth-cursor\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/smooth-cursor-demo.tsx\",\n      \"content\": \"import { SmoothCursor } from \\\"@/registry/magicui/smooth-cursor\\\"\\n\\nexport default function SmoothCursorDemo() {\\n  return (\\n    <>\\n      <span className=\\\"hidden md:block\\\">Move your mouse around</span>\\n      <span className=\\\"block md:hidden\\\">\\n        SmoothCursor is disabled on touch devices\\n      </span>\\n      <SmoothCursor />\\n    </>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/smooth-cursor.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"smooth-cursor\",\n  \"type\": \"registry:ui\",\n  \"description\": \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n  \"dependencies\": [\n    \"framer-motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/smooth-cursor.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { FC, useEffect, useRef, useState } from \\\"react\\\"\\nimport { motion, useSpring } from \\\"motion/react\\\"\\n\\ninterface Position {\\n  x: number\\n  y: number\\n}\\n\\nexport interface SmoothCursorProps {\\n  cursor?: React.ReactNode\\n  springConfig?: {\\n    damping: number\\n    stiffness: number\\n    mass: number\\n    restDelta: number\\n  }\\n}\\n\\nconst DESKTOP_POINTER_QUERY = \\\"(any-hover: hover) and (any-pointer: fine)\\\"\\n\\nfunction isTrackablePointer(pointerType: string) {\\n  return pointerType !== \\\"touch\\\"\\n}\\n\\nconst DefaultCursorSVG: FC = () => {\\n  return (\\n    <svg\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      width={50}\\n      height={54}\\n      viewBox=\\\"0 0 50 54\\\"\\n      fill=\\\"none\\\"\\n      style={{ scale: 0.5 }}\\n    >\\n      <g filter=\\\"url(#filter0_d_91_7928)\\\">\\n        <path\\n          d=\\\"M42.6817 41.1495L27.5103 6.79925C26.7269 5.02557 24.2082 5.02558 23.3927 6.79925L7.59814 41.1495C6.75833 42.9759 8.52712 44.8902 10.4125 44.1954L24.3757 39.0496C24.8829 38.8627 25.4385 38.8627 25.9422 39.0496L39.8121 44.1954C41.6849 44.8902 43.4884 42.9759 42.6817 41.1495Z\\\"\\n          fill=\\\"black\\\"\\n        />\\n        <path\\n          d=\\\"M43.7146 40.6933L28.5431 6.34306C27.3556 3.65428 23.5772 3.69516 22.3668 6.32755L6.57226 40.6778C5.3134 43.4156 7.97238 46.298 10.803 45.2549L24.7662 40.109C25.0221 40.0147 25.2999 40.0156 25.5494 40.1082L39.4193 45.254C42.2261 46.2953 44.9254 43.4347 43.7146 40.6933Z\\\"\\n          stroke=\\\"white\\\"\\n          strokeWidth={2.25825}\\n        />\\n      </g>\\n      <defs>\\n        <filter\\n          id=\\\"filter0_d_91_7928\\\"\\n          x={0.602397}\\n          y={0.952444}\\n          width={49.0584}\\n          height={52.428}\\n          filterUnits=\\\"userSpaceOnUse\\\"\\n          colorInterpolationFilters=\\\"sRGB\\\"\\n        >\\n          <feFlood floodOpacity={0} result=\\\"BackgroundImageFix\\\" />\\n          <feColorMatrix\\n            in=\\\"SourceAlpha\\\"\\n            type=\\\"matrix\\\"\\n            values=\\\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\\\"\\n            result=\\\"hardAlpha\\\"\\n          />\\n          <feOffset dy={2.25825} />\\n          <feGaussianBlur stdDeviation={2.25825} />\\n          <feComposite in2=\\\"hardAlpha\\\" operator=\\\"out\\\" />\\n          <feColorMatrix\\n            type=\\\"matrix\\\"\\n            values=\\\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\\\"\\n          />\\n          <feBlend\\n            mode=\\\"normal\\\"\\n            in2=\\\"BackgroundImageFix\\\"\\n            result=\\\"effect1_dropShadow_91_7928\\\"\\n          />\\n          <feBlend\\n            mode=\\\"normal\\\"\\n            in=\\\"SourceGraphic\\\"\\n            in2=\\\"effect1_dropShadow_91_7928\\\"\\n            result=\\\"shape\\\"\\n          />\\n        </filter>\\n      </defs>\\n    </svg>\\n  )\\n}\\n\\nexport function SmoothCursor({\\n  cursor = <DefaultCursorSVG />,\\n  springConfig = {\\n    damping: 45,\\n    stiffness: 400,\\n    mass: 1,\\n    restDelta: 0.001,\\n  },\\n}: SmoothCursorProps) {\\n  const lastMousePos = useRef<Position>({ x: 0, y: 0 })\\n  const velocity = useRef<Position>({ x: 0, y: 0 })\\n  const lastUpdateTime = useRef(Date.now())\\n  const previousAngle = useRef(0)\\n  const accumulatedRotation = useRef(0)\\n  const [isEnabled, setIsEnabled] = useState(false)\\n  const [isVisible, setIsVisible] = useState(false)\\n\\n  const cursorX = useSpring(0, springConfig)\\n  const cursorY = useSpring(0, springConfig)\\n  const rotation = useSpring(0, {\\n    ...springConfig,\\n    damping: 60,\\n    stiffness: 300,\\n  })\\n  const scale = useSpring(1, {\\n    ...springConfig,\\n    stiffness: 500,\\n    damping: 35,\\n  })\\n\\n  useEffect(() => {\\n    const mediaQuery = window.matchMedia(DESKTOP_POINTER_QUERY)\\n\\n    const updateEnabled = () => {\\n      const nextIsEnabled = mediaQuery.matches\\n      setIsEnabled(nextIsEnabled)\\n\\n      if (!nextIsEnabled) {\\n        setIsVisible(false)\\n      }\\n    }\\n\\n    updateEnabled()\\n    mediaQuery.addEventListener(\\\"change\\\", updateEnabled)\\n\\n    return () => {\\n      mediaQuery.removeEventListener(\\\"change\\\", updateEnabled)\\n    }\\n  }, [])\\n\\n  useEffect(() => {\\n    if (!isEnabled) {\\n      return\\n    }\\n\\n    let timeout: ReturnType<typeof setTimeout> | null = null\\n\\n    const updateVelocity = (currentPos: Position) => {\\n      const currentTime = Date.now()\\n      const deltaTime = currentTime - lastUpdateTime.current\\n\\n      if (deltaTime > 0) {\\n        velocity.current = {\\n          x: (currentPos.x - lastMousePos.current.x) / deltaTime,\\n          y: (currentPos.y - lastMousePos.current.y) / deltaTime,\\n        }\\n      }\\n\\n      lastUpdateTime.current = currentTime\\n      lastMousePos.current = currentPos\\n    }\\n\\n    const smoothPointerMove = (e: PointerEvent) => {\\n      if (!isTrackablePointer(e.pointerType)) {\\n        return\\n      }\\n\\n      setIsVisible(true)\\n\\n      const currentPos = { x: e.clientX, y: e.clientY }\\n      updateVelocity(currentPos)\\n\\n      const speed = Math.sqrt(\\n        Math.pow(velocity.current.x, 2) + Math.pow(velocity.current.y, 2)\\n      )\\n\\n      cursorX.set(currentPos.x)\\n      cursorY.set(currentPos.y)\\n\\n      if (speed > 0.1) {\\n        const currentAngle =\\n          Math.atan2(velocity.current.y, velocity.current.x) * (180 / Math.PI) +\\n          90\\n\\n        let angleDiff = currentAngle - previousAngle.current\\n        if (angleDiff > 180) angleDiff -= 360\\n        if (angleDiff < -180) angleDiff += 360\\n        accumulatedRotation.current += angleDiff\\n        rotation.set(accumulatedRotation.current)\\n        previousAngle.current = currentAngle\\n\\n        scale.set(0.95)\\n\\n        if (timeout !== null) {\\n          clearTimeout(timeout)\\n        }\\n\\n        timeout = setTimeout(() => {\\n          scale.set(1)\\n        }, 150)\\n      }\\n    }\\n\\n    let rafId = 0\\n    const throttledPointerMove = (e: PointerEvent) => {\\n      if (!isTrackablePointer(e.pointerType)) {\\n        return\\n      }\\n\\n      if (rafId) return\\n\\n      rafId = requestAnimationFrame(() => {\\n        smoothPointerMove(e)\\n        rafId = 0\\n      })\\n    }\\n\\n    document.body.style.cursor = \\\"none\\\"\\n    window.addEventListener(\\\"pointermove\\\", throttledPointerMove, {\\n      passive: true,\\n    })\\n\\n    return () => {\\n      window.removeEventListener(\\\"pointermove\\\", throttledPointerMove)\\n      document.body.style.cursor = \\\"auto\\\"\\n      if (rafId) cancelAnimationFrame(rafId)\\n      if (timeout !== null) {\\n        clearTimeout(timeout)\\n      }\\n    }\\n  }, [cursorX, cursorY, rotation, scale, isEnabled])\\n\\n  if (!isEnabled) {\\n    return null\\n  }\\n\\n  return (\\n    <motion.div\\n      style={{\\n        position: \\\"fixed\\\",\\n        left: cursorX,\\n        top: cursorY,\\n        translateX: \\\"-50%\\\",\\n        translateY: \\\"-50%\\\",\\n        rotate: rotation,\\n        scale: scale,\\n        zIndex: 100,\\n        pointerEvents: \\\"none\\\",\\n        willChange: \\\"transform\\\",\\n        opacity: isVisible ? 1 : 0,\\n      }}\\n      initial={false}\\n      animate={{ opacity: isVisible ? 1 : 0 }}\\n      transition={{\\n        duration: 0.15,\\n      }}\\n    >\\n      {cursor}\\n    </motion.div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/sparkles-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sparkles-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Sparkles Text Demo\",\n  \"description\": \"Example showing text with animated sparkle effects.\",\n  \"registryDependencies\": [\n    \"@magicui/sparkles-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/sparkles-text-demo.tsx\",\n      \"content\": \"import { SparklesText } from \\\"@/registry/magicui/sparkles-text\\\"\\n\\nexport default function SparklesTextDemo() {\\n  return <SparklesText>Magic UI</SparklesText>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/sparkles-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sparkles-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Sparkles Text\",\n  \"description\": \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/sparkles-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { CSSProperties, ReactElement, useEffect, useState } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface Sparkle {\\n  id: string\\n  x: string\\n  y: string\\n  color: string\\n  delay: number\\n  scale: number\\n  lifespan: number\\n}\\n\\nconst Sparkle: React.FC<Sparkle> = ({ id, x, y, color, delay, scale }) => {\\n  return (\\n    <motion.svg\\n      key={id}\\n      className=\\\"pointer-events-none absolute z-20\\\"\\n      initial={{ opacity: 0, left: x, top: y }}\\n      animate={{\\n        opacity: [0, 1, 0],\\n        scale: [0, scale, 0],\\n        rotate: [75, 120, 150],\\n      }}\\n      transition={{ duration: 0.8, repeat: Infinity, delay }}\\n      width=\\\"21\\\"\\n      height=\\\"21\\\"\\n      viewBox=\\\"0 0 21 21\\\"\\n    >\\n      <path\\n        d=\\\"M9.82531 0.843845C10.0553 0.215178 10.9446 0.215178 11.1746 0.843845L11.8618 2.72026C12.4006 4.19229 12.3916 6.39157 13.5 7.5C14.6084 8.60843 16.8077 8.59935 18.2797 9.13822L20.1561 9.82534C20.7858 10.0553 20.7858 10.9447 20.1561 11.1747L18.2797 11.8618C16.8077 12.4007 14.6084 12.3916 13.5 13.5C12.3916 14.6084 12.4006 16.8077 11.8618 18.2798L11.1746 20.1562C10.9446 20.7858 10.0553 20.7858 9.82531 20.1562L9.13819 18.2798C8.59932 16.8077 8.60843 14.6084 7.5 13.5C6.39157 12.3916 4.19225 12.4007 2.72023 11.8618L0.843814 11.1747C0.215148 10.9447 0.215148 10.0553 0.843814 9.82534L2.72023 9.13822C4.19225 8.59935 6.39157 8.60843 7.5 7.5C8.60843 6.39157 8.59932 4.19229 9.13819 2.72026L9.82531 0.843845Z\\\"\\n        fill={color}\\n      />\\n    </motion.svg>\\n  )\\n}\\n\\ninterface SparklesTextProps {\\n  /**\\n   * @default <div />\\n   * @type ReactElement\\n   * @description\\n   * The component to be rendered as the text\\n   * */\\n  as?: ReactElement\\n\\n  /**\\n   * @default \\\"\\\"\\n   * @type string\\n   * @description\\n   * The className of the text\\n   */\\n  className?: string\\n\\n  /**\\n   * @required\\n   * @type ReactNode\\n   * @description\\n   * The content to be displayed\\n   * */\\n  children: React.ReactNode\\n\\n  /**\\n   * @default 10\\n   * @type number\\n   * @description\\n   * The count of sparkles\\n   * */\\n  sparklesCount?: number\\n\\n  /**\\n   * @default \\\"{first: '#9E7AFF', second: '#FE8BBB'}\\\"\\n   * @type string\\n   * @description\\n   * The colors of the sparkles\\n   * */\\n  colors?: {\\n    first: string\\n    second: string\\n  }\\n}\\n\\nexport const SparklesText: React.FC<SparklesTextProps> = ({\\n  children,\\n  colors = { first: \\\"#9E7AFF\\\", second: \\\"#FE8BBB\\\" },\\n  className,\\n  sparklesCount = 10,\\n  ...props\\n}) => {\\n  const [sparkles, setSparkles] = useState<Sparkle[]>([])\\n\\n  useEffect(() => {\\n    const generateStar = (): Sparkle => {\\n      const starX = `${Math.random() * 100}%`\\n      const starY = `${Math.random() * 100}%`\\n      const color = Math.random() > 0.5 ? colors.first : colors.second\\n      const delay = Math.random() * 2\\n      const scale = Math.random() * 1 + 0.3\\n      const lifespan = Math.random() * 10 + 5\\n      const id = `${starX}-${starY}-${Date.now()}`\\n      return { id, x: starX, y: starY, color, delay, scale, lifespan }\\n    }\\n\\n    const initializeStars = () => {\\n      const newSparkles = Array.from({ length: sparklesCount }, generateStar)\\n      setSparkles(newSparkles)\\n    }\\n\\n    const updateStars = () => {\\n      setSparkles((currentSparkles) =>\\n        currentSparkles.map((star) => {\\n          if (star.lifespan <= 0) {\\n            return generateStar()\\n          } else {\\n            return { ...star, lifespan: star.lifespan - 0.1 }\\n          }\\n        })\\n      )\\n    }\\n\\n    initializeStars()\\n    const interval = setInterval(updateStars, 100)\\n\\n    return () => clearInterval(interval)\\n  }, [colors.first, colors.second, sparklesCount])\\n\\n  return (\\n    <div\\n      className={cn(\\\"text-6xl font-bold\\\", className)}\\n      {...props}\\n      style={\\n        {\\n          \\\"--sparkles-first-color\\\": `${colors.first}`,\\n          \\\"--sparkles-second-color\\\": `${colors.second}`,\\n        } as CSSProperties\\n      }\\n    >\\n      <span className=\\\"relative inline-block\\\">\\n        {sparkles.map((sparkle) => (\\n          <Sparkle key={sparkle.id} {...sparkle} />\\n        ))}\\n        <strong>{children}</strong>\\n      </span>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/spinning-text-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"spinning-text-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Spinning Text Demo 2\",\n  \"description\": \"Example showing spinning text animation.\",\n  \"registryDependencies\": [\n    \"@magicui/spinning-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/spinning-text-demo-2.tsx\",\n      \"content\": \"import { SpinningText } from \\\"@/registry/magicui/spinning-text\\\"\\n\\nexport default function SpinningTextBasic() {\\n  return (\\n    <SpinningText reverse className=\\\"text-4xl\\\" duration={4} radius={6}>\\n      learn more • earn more • grow more •\\n    </SpinningText>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/spinning-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"spinning-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Spinning Text Demo\",\n  \"description\": \"Example showing spinning text animation.\",\n  \"registryDependencies\": [\n    \"@magicui/spinning-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/spinning-text-demo.tsx\",\n      \"content\": \"import { SpinningText } from \\\"@/registry/magicui/spinning-text\\\"\\n\\nexport default function SpinningTextBasic() {\\n  return <SpinningText>learn more • earn more • grow more •</SpinningText>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/spinning-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"spinning-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Spinning Text\",\n  \"description\": \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/spinning-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { type ComponentPropsWithoutRef } from \\\"react\\\"\\nimport { motion, Transition, Variants } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface SpinningTextProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  children: string | string[]\\n  duration?: number\\n  reverse?: boolean\\n  radius?: number\\n  transition?: Transition\\n  variants?: {\\n    container?: Variants\\n    item?: Variants\\n  }\\n}\\n\\nconst BASE_TRANSITION: Transition = {\\n  repeat: Infinity,\\n  ease: \\\"linear\\\",\\n}\\n\\nconst BASE_ITEM_VARIANTS: Variants = {\\n  hidden: {\\n    opacity: 1,\\n  },\\n  visible: {\\n    opacity: 1,\\n  },\\n}\\n\\nexport function SpinningText({\\n  children,\\n  duration = 10,\\n  reverse = false,\\n  radius = 5,\\n  transition,\\n  variants,\\n  className,\\n  style,\\n}: SpinningTextProps) {\\n  if (typeof children !== \\\"string\\\" && !Array.isArray(children)) {\\n    throw new Error(\\\"children must be a string or an array of strings\\\")\\n  }\\n\\n  if (Array.isArray(children)) {\\n    // Validate all elements are strings\\n    if (!children.every((child) => typeof child === \\\"string\\\")) {\\n      throw new Error(\\\"all elements in children array must be strings\\\")\\n    }\\n    children = children.join(\\\"\\\")\\n  }\\n\\n  const letters = children.split(\\\"\\\")\\n  letters.push(\\\" \\\")\\n\\n  const finalTransition: Transition = {\\n    ...BASE_TRANSITION,\\n    ...transition,\\n    duration: (transition as { duration?: number })?.duration ?? duration,\\n  }\\n\\n  const containerVariants: Variants = {\\n    visible: { rotate: reverse ? -360 : 360 },\\n    ...variants?.container,\\n  }\\n\\n  const itemVariants: Variants = {\\n    ...BASE_ITEM_VARIANTS,\\n    ...variants?.item,\\n  }\\n\\n  return (\\n    <motion.div\\n      className={cn(\\\"relative\\\", className)}\\n      style={{\\n        ...style,\\n      }}\\n      initial=\\\"hidden\\\"\\n      animate=\\\"visible\\\"\\n      variants={containerVariants}\\n      transition={finalTransition}\\n    >\\n      {letters.map((letter, index) => (\\n        <motion.span\\n          aria-hidden=\\\"true\\\"\\n          key={`${index}-${letter}`}\\n          variants={itemVariants}\\n          className=\\\"absolute top-1/2 left-1/2 inline-block\\\"\\n          style={\\n            {\\n              \\\"--index\\\": index,\\n              \\\"--total\\\": letters.length,\\n              \\\"--radius\\\": radius,\\n              transform: `\\n                  translate(-50%, -50%)\\n                  rotate(calc(360deg / var(--total) * var(--index)))\\n                  translateY(calc(var(--radius, 5) * -1ch))\\n                `,\\n              transformOrigin: \\\"center\\\",\\n            } as React.CSSProperties\\n          }\\n        >\\n          {letter}\\n        </motion.span>\\n      ))}\\n      <span className=\\\"sr-only\\\">{children}</span>\\n    </motion.div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern-colored.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern-colored\",\n  \"type\": \"registry:example\",\n  \"title\": \"Striped Pattern (Colored)\",\n  \"description\": \"Example showing a background striped pattern with a colored stroke.\",\n  \"registryDependencies\": [\n    \"@magicui/striped-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/striped-pattern-colored.tsx\",\n      \"content\": \"import { StripedPattern } from \\\"@/registry/magicui/striped-pattern\\\"\\n\\nexport default function StripedPatternColored() {\\n  return (\\n    <div className=\\\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <StripedPattern className=\\\"stroke-[0.3] text-orange-500/60\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\",\n      \"target\": \"components/striped-pattern-colored.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern-dashed.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern-dashed\",\n  \"type\": \"registry:example\",\n  \"title\": \"Striped Pattern (Dashed)\",\n  \"description\": \"Example showing a background striped pattern with a dashed stroke.\",\n  \"registryDependencies\": [\n    \"@magicui/striped-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/striped-pattern-dashed.tsx\",\n      \"content\": \"import { StripedPattern } from \\\"@/registry/magicui/striped-pattern\\\"\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <StripedPattern className=\\\"stroke-[0.3] [stroke-dasharray:8,4]\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\",\n      \"target\": \"components/striped-pattern-dashed.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Striped Pattern Demo\",\n  \"description\": \"Example showing a background striped pattern made with SVGs.\",\n  \"registryDependencies\": [\n    \"@magicui/striped-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/striped-pattern-demo.tsx\",\n      \"content\": \"import { StripedPattern } from \\\"@/registry/magicui/striped-pattern\\\"\\n\\nexport default function StripedPatternDemo() {\\n  return (\\n    <div className=\\\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <StripedPattern className=\\\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\",\n      \"target\": \"components/striped-pattern-demo.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern-left.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern-left\",\n  \"type\": \"registry:example\",\n  \"title\": \"Striped Pattern (Left)\",\n  \"description\": \"Example showing a background striped pattern slanting to the left using SVG.\",\n  \"registryDependencies\": [\n    \"@magicui/striped-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/striped-pattern-left.tsx\",\n      \"content\": \"import { StripedPattern } from \\\"@/registry/magicui/striped-pattern\\\"\\n\\nexport default function StripedPatternLeft() {\\n  return (\\n    <div className=\\\"bg-background relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <StripedPattern />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\",\n      \"target\": \"components/striped-pattern-left.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern-right.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern-right\",\n  \"type\": \"registry:example\",\n  \"title\": \"Striped Pattern (Right)\",\n  \"description\": \"Example showing a background striped pattern slanting to the right using SVG.\",\n  \"registryDependencies\": [\n    \"@magicui/striped-pattern\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/striped-pattern-right.tsx\",\n      \"content\": \"import { StripedPattern } from \\\"@/registry/magicui/striped-pattern\\\"\\n\\nexport default function StripedPatternRight() {\\n  return (\\n    <div className=\\\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\\\">\\n      <StripedPattern direction=\\\"right\\\" />\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\",\n      \"target\": \"components/striped-pattern-right.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/striped-pattern.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"striped-pattern\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Striped Pattern\",\n  \"description\": \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/striped-pattern.tsx\",\n      \"content\": \"import React, { useId } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface StripedPatternProps extends React.SVGProps<SVGSVGElement> {\\n  direction?: \\\"left\\\" | \\\"right\\\"\\n}\\n\\nexport function StripedPattern({\\n  direction = \\\"left\\\",\\n  className,\\n  width = 10,\\n  height = 10,\\n  ...props\\n}: StripedPatternProps) {\\n  const id = useId()\\n  const w = Number(width)\\n  const h = Number(height)\\n\\n  return (\\n    <svg\\n      aria-hidden=\\\"true\\\"\\n      className={cn(\\n        \\\"pointer-events-none absolute inset-0 z-10 h-full w-full stroke-[0.5]\\\",\\n        className\\n      )}\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      {...props}\\n    >\\n      <defs>\\n        <pattern id={id} width={w} height={h} patternUnits=\\\"userSpaceOnUse\\\">\\n          {direction === \\\"left\\\" ? (\\n            <>\\n              <line x1=\\\"0\\\" y1={h} x2={w} y2=\\\"0\\\" stroke=\\\"currentColor\\\" />\\n              <line x1={-w} y1={h} x2=\\\"0\\\" y2=\\\"0\\\" stroke=\\\"currentColor\\\" />\\n              <line x1={w} y1={h} x2={w * 2} y2=\\\"0\\\" stroke=\\\"currentColor\\\" />\\n            </>\\n          ) : (\\n            <>\\n              <line x1=\\\"0\\\" y1=\\\"0\\\" x2={w} y2={h} stroke=\\\"currentColor\\\" />\\n              <line x1={-w} y1=\\\"0\\\" x2=\\\"0\\\" y2={h} stroke=\\\"currentColor\\\" />\\n              <line x1={w} y1=\\\"0\\\" x2={w * 2} y2={h} stroke=\\\"currentColor\\\" />\\n            </>\\n          )}\\n        </pattern>\\n      </defs>\\n      <rect width=\\\"100%\\\" height=\\\"100%\\\" fill={`url(#${id})`} />\\n    </svg>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\",\n      \"target\": \"components/magicui/striped-pattern.tsx\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/terminal-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"terminal-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Terminal Demo\",\n  \"description\": \"Example showing a terminal with animated text and custom delays\",\n  \"registryDependencies\": [\n    \"@magicui/terminal\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/terminal-demo-2.tsx\",\n      \"content\": \"import {\\n  AnimatedSpan,\\n  Terminal,\\n  TypingAnimation,\\n} from \\\"@/registry/magicui/terminal\\\"\\n\\nexport default function TerminalDemo2() {\\n  return (\\n    <Terminal>\\n      <TypingAnimation delay={0}>$ ls</TypingAnimation>\\n\\n      <AnimatedSpan delay={800} className=\\\"text-blue-500\\\">\\n        Documents Downloads Pictures\\n      </AnimatedSpan>\\n\\n      <TypingAnimation delay={1600}>$ cd Documents</TypingAnimation>\\n\\n      <TypingAnimation delay={2400}>$ pwd</TypingAnimation>\\n\\n      <AnimatedSpan delay={3200} className=\\\"text-green-500\\\">\\n        /home/user/Documents\\n      </AnimatedSpan>\\n    </Terminal>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/terminal-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"terminal-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Terminal Demo\",\n  \"description\": \"Example showing a terminal with animated text.\",\n  \"registryDependencies\": [\n    \"@magicui/terminal\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/terminal-demo.tsx\",\n      \"content\": \"import {\\n  AnimatedSpan,\\n  Terminal,\\n  TypingAnimation,\\n} from \\\"@/registry/magicui/terminal\\\"\\n\\nexport default function TerminalDemo() {\\n  return (\\n    <Terminal>\\n      <TypingAnimation>&gt; pnpm dlx shadcn@latest init</TypingAnimation>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Preflight checks.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Verifying framework. Found Next.js.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Validating Tailwind CSS.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Validating import alias.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Writing components.json.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Checking registry.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Updating tailwind.config.ts\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Updating app/globals.css\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-green-500\\\">\\n        ✔ Installing dependencies.\\n      </AnimatedSpan>\\n\\n      <AnimatedSpan className=\\\"text-blue-500\\\">\\n        <span>ℹ Updated 1 file:</span>\\n        <span className=\\\"pl-2\\\">- lib/utils.ts</span>\\n      </AnimatedSpan>\\n\\n      <TypingAnimation className=\\\"text-muted-foreground\\\">\\n        Success! Project initialization completed.\\n      </TypingAnimation>\\n\\n      <TypingAnimation className=\\\"text-muted-foreground\\\">\\n        You may now add components.\\n      </TypingAnimation>\\n    </Terminal>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/terminal.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"terminal\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Terminal\",\n  \"description\": \"A terminal component\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/terminal.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  Children,\\n  createContext,\\n  useContext,\\n  useEffect,\\n  useMemo,\\n  useRef,\\n  useState,\\n  type ComponentType,\\n  type RefAttributes,\\n} from \\\"react\\\"\\nimport {\\n  motion,\\n  useInView,\\n  type DOMMotionComponents,\\n  type HTMLMotionProps,\\n  type MotionProps,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface SequenceContextValue {\\n  completeItem: (index: number) => void\\n  activeIndex: number\\n  sequenceStarted: boolean\\n}\\n\\nconst SequenceContext = createContext<SequenceContextValue | null>(null)\\n\\nconst useSequence = () => useContext(SequenceContext)\\n\\nconst ItemIndexContext = createContext<number | null>(null)\\nconst useItemIndex = () => useContext(ItemIndexContext)\\n\\nconst motionElements = {\\n  article: motion.article,\\n  div: motion.div,\\n  h1: motion.h1,\\n  h2: motion.h2,\\n  h3: motion.h3,\\n  h4: motion.h4,\\n  h5: motion.h5,\\n  h6: motion.h6,\\n  li: motion.li,\\n  p: motion.p,\\n  section: motion.section,\\n  span: motion.span,\\n} as const\\n\\ntype MotionElementType = Extract<\\n  keyof DOMMotionComponents,\\n  keyof typeof motionElements\\n>\\ntype TerminalTypingMotionComponent = ComponentType<\\n  Omit<HTMLMotionProps<\\\"span\\\">, \\\"ref\\\"> & RefAttributes<HTMLElement>\\n>\\n\\ninterface AnimatedSpanProps extends MotionProps {\\n  children: React.ReactNode\\n  delay?: number\\n  className?: string\\n  startOnView?: boolean\\n}\\n\\nexport const AnimatedSpan = ({\\n  children,\\n  delay = 0,\\n  className,\\n  startOnView = false,\\n  ...props\\n}: AnimatedSpanProps) => {\\n  const elementRef = useRef<HTMLDivElement | null>(null)\\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\\n    amount: 0.3,\\n    once: true,\\n  })\\n\\n  const sequence = useSequence()\\n  const itemIndex = useItemIndex()\\n  const [hasStarted, setHasStarted] = useState(false)\\n  useEffect(() => {\\n    if (!sequence || itemIndex === null) return\\n    if (!sequence.sequenceStarted) return\\n    if (hasStarted) return\\n    if (sequence.activeIndex === itemIndex) {\\n      setHasStarted(true)\\n    }\\n  }, [sequence, hasStarted, itemIndex])\\n\\n  const shouldAnimate = sequence ? hasStarted : startOnView ? isInView : true\\n\\n  return (\\n    <motion.div\\n      ref={elementRef}\\n      initial={{ opacity: 0, y: -5 }}\\n      animate={shouldAnimate ? { opacity: 1, y: 0 } : { opacity: 0, y: -5 }}\\n      transition={{ duration: 0.3, delay: sequence ? 0 : delay / 1000 }}\\n      className={cn(\\\"grid text-sm font-normal tracking-tight\\\", className)}\\n      onAnimationComplete={() => {\\n        if (!sequence) return\\n        if (itemIndex === null) return\\n        sequence.completeItem(itemIndex)\\n      }}\\n      {...props}\\n    >\\n      {children}\\n    </motion.div>\\n  )\\n}\\n\\ninterface TypingAnimationProps extends Omit<MotionProps, \\\"children\\\"> {\\n  children: string\\n  className?: string\\n  duration?: number\\n  delay?: number\\n  as?: MotionElementType\\n  startOnView?: boolean\\n}\\n\\nexport const TypingAnimation = ({\\n  children,\\n  className,\\n  duration = 60,\\n  delay = 0,\\n  as: Component = \\\"span\\\",\\n  startOnView = true,\\n  ...props\\n}: TypingAnimationProps) => {\\n  if (typeof children !== \\\"string\\\") {\\n    throw new Error(\\\"TypingAnimation: children must be a string. Received:\\\")\\n  }\\n\\n  const MotionComponent = motionElements[\\n    Component\\n  ] as TerminalTypingMotionComponent\\n\\n  const [displayedText, setDisplayedText] = useState<string>(\\\"\\\")\\n  const [started, setStarted] = useState(false)\\n  const elementRef = useRef<HTMLElement | null>(null)\\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\\n    amount: 0.3,\\n    once: true,\\n  })\\n\\n  const sequence = useSequence()\\n  const itemIndex = useItemIndex()\\n  const hasSequence = sequence !== null\\n  const sequenceStarted = sequence?.sequenceStarted ?? false\\n  const sequenceActiveIndex = sequence?.activeIndex ?? null\\n  const sequenceCompleteItemRef = useRef<\\n    SequenceContextValue[\\\"completeItem\\\"] | null\\n  >(null)\\n  const sequenceItemIndexRef = useRef<number | null>(null)\\n\\n  useEffect(() => {\\n    sequenceCompleteItemRef.current = sequence?.completeItem ?? null\\n    sequenceItemIndexRef.current = itemIndex\\n  }, [sequence?.completeItem, itemIndex])\\n\\n  useEffect(() => {\\n    let startTimeout: ReturnType<typeof setTimeout> | null = null\\n\\n    if (hasSequence && itemIndex !== null) {\\n      if (sequenceStarted && !started && sequenceActiveIndex === itemIndex) {\\n        setStarted(true)\\n      }\\n    } else if (!startOnView || isInView) {\\n      startTimeout = setTimeout(() => setStarted(true), delay)\\n    }\\n\\n    return () => {\\n      if (startTimeout !== null) {\\n        clearTimeout(startTimeout)\\n      }\\n    }\\n  }, [\\n    delay,\\n    startOnView,\\n    isInView,\\n    started,\\n    hasSequence,\\n    sequenceActiveIndex,\\n    sequenceStarted,\\n    itemIndex,\\n  ])\\n\\n  useEffect(() => {\\n    let typingEffect: ReturnType<typeof setInterval> | null = null\\n\\n    if (started) {\\n      let i = 0\\n      typingEffect = setInterval(() => {\\n        if (i < children.length) {\\n          setDisplayedText(children.substring(0, i + 1))\\n          i++\\n        } else {\\n          if (typingEffect !== null) {\\n            clearInterval(typingEffect)\\n          }\\n          const completeItem = sequenceCompleteItemRef.current\\n          const currentItemIndex = sequenceItemIndexRef.current\\n          if (completeItem && currentItemIndex !== null) {\\n            completeItem(currentItemIndex)\\n          }\\n        }\\n      }, duration)\\n    }\\n\\n    return () => {\\n      if (typingEffect !== null) {\\n        clearInterval(typingEffect)\\n      }\\n    }\\n  }, [children, duration, started])\\n\\n  return (\\n    <MotionComponent\\n      ref={elementRef}\\n      className={cn(\\\"text-sm font-normal tracking-tight\\\", className)}\\n      {...props}\\n    >\\n      {displayedText}\\n    </MotionComponent>\\n  )\\n}\\n\\ninterface TerminalProps {\\n  children: React.ReactNode\\n  className?: string\\n  sequence?: boolean\\n  startOnView?: boolean\\n}\\n\\nexport const Terminal = ({\\n  children,\\n  className,\\n  sequence = true,\\n  startOnView = true,\\n}: TerminalProps) => {\\n  const containerRef = useRef<HTMLDivElement | null>(null)\\n  const isInView = useInView(containerRef as React.RefObject<Element>, {\\n    amount: 0.3,\\n    once: true,\\n  })\\n\\n  const [activeIndex, setActiveIndex] = useState(0)\\n  const sequenceHasStarted = sequence ? !startOnView || isInView : false\\n\\n  const contextValue = useMemo<SequenceContextValue | null>(() => {\\n    if (!sequence) return null\\n    return {\\n      completeItem: (index: number) => {\\n        setActiveIndex((current) => (index === current ? current + 1 : current))\\n      },\\n      activeIndex,\\n      sequenceStarted: sequenceHasStarted,\\n    }\\n  }, [sequence, activeIndex, sequenceHasStarted])\\n\\n  const wrappedChildren = useMemo(() => {\\n    if (!sequence) return children\\n    const array = Children.toArray(children)\\n    return array.map((child, index) => (\\n      <ItemIndexContext.Provider key={index} value={index}>\\n        {child as React.ReactNode}\\n      </ItemIndexContext.Provider>\\n    ))\\n  }, [children, sequence])\\n\\n  const content = (\\n    <div\\n      ref={containerRef}\\n      className={cn(\\n        \\\"border-border bg-background z-0 h-full max-h-100 w-full max-w-lg rounded-xl border\\\",\\n        className\\n      )}\\n    >\\n      <div className=\\\"border-border flex flex-col gap-y-2 border-b p-4\\\">\\n        <div className=\\\"flex flex-row gap-x-2\\\">\\n          <div className=\\\"h-2 w-2 rounded-full bg-red-500\\\"></div>\\n          <div className=\\\"h-2 w-2 rounded-full bg-yellow-500\\\"></div>\\n          <div className=\\\"h-2 w-2 rounded-full bg-green-500\\\"></div>\\n        </div>\\n      </div>\\n      <pre className=\\\"p-4\\\">\\n        <code className=\\\"grid gap-y-1 overflow-auto\\\">{wrappedChildren}</code>\\n      </pre>\\n    </div>\\n  )\\n\\n  if (!sequence) return content\\n\\n  return (\\n    <SequenceContext.Provider value={contextValue}>\\n      {content}\\n    </SequenceContext.Provider>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 2\",\n  \"description\": \"Second example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-2.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo2() {\\n  return (\\n    <TextAnimate animation=\\\"blurIn\\\" as=\\\"h1\\\">\\n      Blur in text\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 3\",\n  \"description\": \"Third example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-3.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo3() {\\n  return (\\n    <TextAnimate animation=\\\"slideUp\\\" by=\\\"word\\\">\\n      Slide up by word\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-4.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-4\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 4\",\n  \"description\": \"Fourth example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-4.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo4() {\\n  return (\\n    <TextAnimate animation=\\\"scaleUp\\\" by=\\\"text\\\">\\n      Scale up by text\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-5.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-5\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 5\",\n  \"description\": \"Fifth example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-5.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo5() {\\n  return (\\n    <TextAnimate animation=\\\"fadeIn\\\" by=\\\"line\\\" as=\\\"p\\\">\\n      {`Fade in by line as paragraph\\\\n\\\\nFade in by line as paragraph\\\\n\\\\nFade in by line as paragraph`}\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-6.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-6\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 6\",\n  \"description\": \"Sixth example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-6.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo6() {\\n  return (\\n    <TextAnimate animation=\\\"slideLeft\\\" by=\\\"character\\\">\\n      Slide left by character\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-7.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-7\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 7\",\n  \"description\": \"Seventh example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-7.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo7() {\\n  return (\\n    <TextAnimate animation=\\\"blurInUp\\\" by=\\\"character\\\" delay={2}>\\n      Blur in by character\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-8.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-8\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 8\",\n  \"description\": \"Eighth example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-8.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo8() {\\n  return (\\n    <TextAnimate animation=\\\"blurInUp\\\" by=\\\"character\\\" duration={5}>\\n      Blur in by character\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo-9.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo-9\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo 9\",\n  \"description\": \"Ninth example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo-9.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo9() {\\n  return (\\n    <TextAnimate\\n      variants={{\\n        hidden: {\\n          opacity: 0,\\n          y: 30,\\n          rotate: 45,\\n          scale: 0.5,\\n        },\\n        show: (i) => ({\\n          opacity: 1,\\n          y: 0,\\n          rotate: 0,\\n          scale: 1,\\n          transition: {\\n            delay: i * 0.1,\\n            duration: 0.4,\\n            y: {\\n              type: \\\"spring\\\",\\n              damping: 12,\\n              stiffness: 200,\\n              mass: 0.8,\\n            },\\n            rotate: {\\n              type: \\\"spring\\\",\\n              damping: 8,\\n              stiffness: 150,\\n            },\\n            scale: {\\n              type: \\\"spring\\\",\\n              damping: 10,\\n              stiffness: 300,\\n            },\\n          },\\n        }),\\n        exit: (i) => ({\\n          opacity: 0,\\n          y: 30,\\n          rotate: 45,\\n          scale: 0.5,\\n          transition: {\\n            delay: i * 0.1,\\n            duration: 0.4,\\n          },\\n        }),\\n      }}\\n      by=\\\"character\\\"\\n    >\\n      Wavy Motion!\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Animate Demo\",\n  \"description\": \"Example showing various text animations.\",\n  \"registryDependencies\": [\n    \"@magicui/text-animate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-animate-demo.tsx\",\n      \"content\": \"import { TextAnimate } from \\\"@/registry/magicui/text-animate\\\"\\n\\nexport default function TextAnimateDemo() {\\n  return (\\n    <TextAnimate animation=\\\"blurInUp\\\" by=\\\"character\\\" once>\\n      Blur in by character\\n    </TextAnimate>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-animate.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-animate\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Text Animate\",\n  \"description\": \"A text animation component that animates text using a variety of different animations.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/text-animate.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { memo } from \\\"react\\\"\\nimport {\\n  AnimatePresence,\\n  motion,\\n  Variants,\\n  type DOMMotionComponents,\\n  type MotionProps,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ntype AnimationType = \\\"text\\\" | \\\"word\\\" | \\\"character\\\" | \\\"line\\\"\\ntype AnimationVariant =\\n  | \\\"fadeIn\\\"\\n  | \\\"blurIn\\\"\\n  | \\\"blurInUp\\\"\\n  | \\\"blurInDown\\\"\\n  | \\\"slideUp\\\"\\n  | \\\"slideDown\\\"\\n  | \\\"slideLeft\\\"\\n  | \\\"slideRight\\\"\\n  | \\\"scaleUp\\\"\\n  | \\\"scaleDown\\\"\\n\\nconst motionElements = {\\n  article: motion.article,\\n  div: motion.div,\\n  h1: motion.h1,\\n  h2: motion.h2,\\n  h3: motion.h3,\\n  h4: motion.h4,\\n  h5: motion.h5,\\n  h6: motion.h6,\\n  li: motion.li,\\n  p: motion.p,\\n  section: motion.section,\\n  span: motion.span,\\n} as const\\n\\ntype MotionElementType = Extract<\\n  keyof DOMMotionComponents,\\n  keyof typeof motionElements\\n>\\n\\ninterface TextAnimateProps extends Omit<MotionProps, \\\"children\\\"> {\\n  /**\\n   * The text content to animate\\n   */\\n  children: string\\n  /**\\n   * The class name to be applied to the component\\n   */\\n  className?: string\\n  /**\\n   * The class name to be applied to each segment\\n   */\\n  segmentClassName?: string\\n  /**\\n   * The delay before the animation starts\\n   */\\n  delay?: number\\n  /**\\n   * The duration of the animation\\n   */\\n  duration?: number\\n  /**\\n   * Custom motion variants for the animation\\n   */\\n  variants?: Variants\\n  /**\\n   * The element type to render\\n   */\\n  as?: MotionElementType\\n  /**\\n   * How to split the text (\\\"text\\\", \\\"word\\\", \\\"character\\\")\\n   */\\n  by?: AnimationType\\n  /**\\n   * Whether to start animation when component enters viewport\\n   */\\n  startOnView?: boolean\\n  /**\\n   * Whether to animate only once\\n   */\\n  once?: boolean\\n  /**\\n   * The animation preset to use\\n   */\\n  animation?: AnimationVariant\\n  /**\\n   * Whether to enable accessibility features (default: true)\\n   */\\n  accessible?: boolean\\n}\\n\\nconst staggerTimings: Record<AnimationType, number> = {\\n  text: 0.06,\\n  word: 0.05,\\n  character: 0.03,\\n  line: 0.06,\\n}\\n\\nconst defaultContainerVariants = {\\n  hidden: { opacity: 1 },\\n  show: {\\n    opacity: 1,\\n    transition: {\\n      delayChildren: 0,\\n      staggerChildren: 0.05,\\n    },\\n  },\\n  exit: {\\n    opacity: 0,\\n    transition: {\\n      staggerChildren: 0.05,\\n      staggerDirection: -1,\\n    },\\n  },\\n}\\n\\nconst defaultItemVariants: Variants = {\\n  hidden: { opacity: 0 },\\n  show: {\\n    opacity: 1,\\n  },\\n  exit: {\\n    opacity: 0,\\n  },\\n}\\n\\nconst defaultItemAnimationVariants: Record<\\n  AnimationVariant,\\n  { container: Variants; item: Variants }\\n> = {\\n  fadeIn: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { opacity: 0, y: 20 },\\n      show: {\\n        opacity: 1,\\n        y: 0,\\n        transition: {\\n          duration: 0.3,\\n        },\\n      },\\n      exit: {\\n        opacity: 0,\\n        y: 20,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  blurIn: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { opacity: 0, filter: \\\"blur(10px)\\\" },\\n      show: {\\n        opacity: 1,\\n        filter: \\\"blur(0px)\\\",\\n        transition: {\\n          duration: 0.3,\\n        },\\n      },\\n      exit: {\\n        opacity: 0,\\n        filter: \\\"blur(10px)\\\",\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  blurInUp: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { opacity: 0, filter: \\\"blur(10px)\\\", y: 20 },\\n      show: {\\n        opacity: 1,\\n        filter: \\\"blur(0px)\\\",\\n        y: 0,\\n        transition: {\\n          y: { duration: 0.3 },\\n          opacity: { duration: 0.4 },\\n          filter: { duration: 0.3 },\\n        },\\n      },\\n      exit: {\\n        opacity: 0,\\n        filter: \\\"blur(10px)\\\",\\n        y: 20,\\n        transition: {\\n          y: { duration: 0.3 },\\n          opacity: { duration: 0.4 },\\n          filter: { duration: 0.3 },\\n        },\\n      },\\n    },\\n  },\\n  blurInDown: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { opacity: 0, filter: \\\"blur(10px)\\\", y: -20 },\\n      show: {\\n        opacity: 1,\\n        filter: \\\"blur(0px)\\\",\\n        y: 0,\\n        transition: {\\n          y: { duration: 0.3 },\\n          opacity: { duration: 0.4 },\\n          filter: { duration: 0.3 },\\n        },\\n      },\\n    },\\n  },\\n  slideUp: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { y: 20, opacity: 0 },\\n      show: {\\n        y: 0,\\n        opacity: 1,\\n        transition: {\\n          duration: 0.3,\\n        },\\n      },\\n      exit: {\\n        y: -20,\\n        opacity: 0,\\n        transition: {\\n          duration: 0.3,\\n        },\\n      },\\n    },\\n  },\\n  slideDown: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { y: -20, opacity: 0 },\\n      show: {\\n        y: 0,\\n        opacity: 1,\\n        transition: { duration: 0.3 },\\n      },\\n      exit: {\\n        y: 20,\\n        opacity: 0,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  slideLeft: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { x: 20, opacity: 0 },\\n      show: {\\n        x: 0,\\n        opacity: 1,\\n        transition: { duration: 0.3 },\\n      },\\n      exit: {\\n        x: -20,\\n        opacity: 0,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  slideRight: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { x: -20, opacity: 0 },\\n      show: {\\n        x: 0,\\n        opacity: 1,\\n        transition: { duration: 0.3 },\\n      },\\n      exit: {\\n        x: 20,\\n        opacity: 0,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  scaleUp: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { scale: 0.5, opacity: 0 },\\n      show: {\\n        scale: 1,\\n        opacity: 1,\\n        transition: {\\n          duration: 0.3,\\n          scale: {\\n            type: \\\"spring\\\",\\n            damping: 15,\\n            stiffness: 300,\\n          },\\n        },\\n      },\\n      exit: {\\n        scale: 0.5,\\n        opacity: 0,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n  scaleDown: {\\n    container: defaultContainerVariants,\\n    item: {\\n      hidden: { scale: 1.5, opacity: 0 },\\n      show: {\\n        scale: 1,\\n        opacity: 1,\\n        transition: {\\n          duration: 0.3,\\n          scale: {\\n            type: \\\"spring\\\",\\n            damping: 15,\\n            stiffness: 300,\\n          },\\n        },\\n      },\\n      exit: {\\n        scale: 1.5,\\n        opacity: 0,\\n        transition: { duration: 0.3 },\\n      },\\n    },\\n  },\\n}\\n\\nconst TextAnimateBase = ({\\n  children,\\n  delay = 0,\\n  duration = 0.3,\\n  variants,\\n  className,\\n  segmentClassName,\\n  as: Component = \\\"p\\\",\\n  startOnView = true,\\n  once = false,\\n  by = \\\"word\\\",\\n  animation = \\\"fadeIn\\\",\\n  accessible = true,\\n  ...props\\n}: TextAnimateProps) => {\\n  const MotionComponent = motionElements[Component]\\n\\n  let segments: string[] = []\\n  switch (by) {\\n    case \\\"word\\\":\\n      segments = children.split(/(\\\\s+)/)\\n      break\\n    case \\\"character\\\":\\n      segments = children.split(\\\"\\\")\\n      break\\n    case \\\"line\\\":\\n      segments = children.split(\\\"\\\\n\\\")\\n      break\\n    case \\\"text\\\":\\n    default:\\n      segments = [children]\\n      break\\n  }\\n\\n  const finalVariants = variants\\n    ? {\\n        container: {\\n          hidden: { opacity: 0 },\\n          show: {\\n            opacity: 1,\\n            transition: {\\n              opacity: { duration: 0.01, delay },\\n              delayChildren: delay,\\n              staggerChildren: duration / segments.length,\\n            },\\n          },\\n          exit: {\\n            opacity: 0,\\n            transition: {\\n              staggerChildren: duration / segments.length,\\n              staggerDirection: -1,\\n            },\\n          },\\n        },\\n        item: variants,\\n      }\\n    : animation\\n      ? {\\n          container: {\\n            ...defaultItemAnimationVariants[animation].container,\\n            show: {\\n              ...defaultItemAnimationVariants[animation].container.show,\\n              transition: {\\n                delayChildren: delay,\\n                staggerChildren: duration / segments.length,\\n              },\\n            },\\n            exit: {\\n              ...defaultItemAnimationVariants[animation].container.exit,\\n              transition: {\\n                staggerChildren: duration / segments.length,\\n                staggerDirection: -1,\\n              },\\n            },\\n          },\\n          item: defaultItemAnimationVariants[animation].item,\\n        }\\n      : { container: defaultContainerVariants, item: defaultItemVariants }\\n\\n  return (\\n    <AnimatePresence mode=\\\"popLayout\\\">\\n      <MotionComponent\\n        variants={finalVariants.container as Variants}\\n        initial=\\\"hidden\\\"\\n        whileInView={startOnView ? \\\"show\\\" : undefined}\\n        animate={startOnView ? undefined : \\\"show\\\"}\\n        exit=\\\"exit\\\"\\n        className={cn(\\\"whitespace-pre-wrap\\\", className)}\\n        viewport={{ once }}\\n        aria-label={accessible ? children : undefined}\\n        {...props}\\n      >\\n        {accessible && <span className=\\\"sr-only\\\">{children}</span>}\\n        {segments.map((segment, i) => (\\n          <motion.span\\n            key={`${by}-${segment}-${i}`}\\n            variants={finalVariants.item}\\n            custom={i * staggerTimings[by]}\\n            className={cn(\\n              by === \\\"line\\\" ? \\\"block\\\" : \\\"inline-block whitespace-pre\\\",\\n              by === \\\"character\\\" && \\\"\\\",\\n              segmentClassName\\n            )}\\n            aria-hidden={accessible ? true : undefined}\\n          >\\n            {segment}\\n          </motion.span>\\n        ))}\\n      </MotionComponent>\\n    </AnimatePresence>\\n  )\\n}\\n\\n// Export the memoized version\\nexport const TextAnimate = memo(TextAnimateBase)\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-reveal-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-reveal-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Text Reveal Demo\",\n  \"description\": \"Example showing text that fades in on scroll.\",\n  \"registryDependencies\": [\n    \"@magicui/text-reveal\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/text-reveal-demo.tsx\",\n      \"content\": \"import { TextReveal } from \\\"@/registry/magicui/text-reveal\\\"\\n\\nexport default function TextRevealDemo() {\\n  return <TextReveal>Magic UI will change the way you design.</TextReveal>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/text-reveal.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text-reveal\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Text Reveal\",\n  \"description\": \"Fade in text as you scroll down the page.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/text-reveal.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  useRef,\\n  type ComponentPropsWithoutRef,\\n  type FC,\\n  type ReactNode,\\n} from \\\"react\\\"\\nimport { motion, MotionValue, useScroll, useTransform } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface TextRevealProps extends ComponentPropsWithoutRef<\\\"div\\\"> {\\n  children: string\\n}\\n\\nexport const TextReveal: FC<TextRevealProps> = ({ children, className }) => {\\n  const sectionRef = useRef<HTMLDivElement | null>(null)\\n  const { scrollYProgress } = useScroll({\\n    target: sectionRef,\\n  })\\n\\n  if (typeof children !== \\\"string\\\") {\\n    throw new Error(\\\"TextReveal: children must be a string\\\")\\n  }\\n\\n  const words = children.split(\\\" \\\")\\n\\n  return (\\n    <div ref={sectionRef} className={cn(\\\"relative z-0 h-[200vh]\\\", className)}>\\n      <div\\n        className={\\n          \\\"sticky top-0 mx-auto flex h-[50%] max-w-4xl items-center bg-transparent px-4 py-20\\\"\\n        }\\n      >\\n        <span\\n          className={\\n            \\\"flex flex-wrap p-5 text-2xl font-bold text-black/20 md:p-8 md:text-3xl lg:p-10 lg:text-4xl xl:text-5xl dark:text-white/20\\\"\\n          }\\n        >\\n          {words.map((word, i) => {\\n            const start = i / words.length\\n            const end = start + 1 / words.length\\n            return (\\n              <Word key={i} progress={scrollYProgress} range={[start, end]}>\\n                {word}\\n              </Word>\\n            )\\n          })}\\n        </span>\\n      </div>\\n    </div>\\n  )\\n}\\n\\ninterface WordProps {\\n  children: ReactNode\\n  progress: MotionValue<number>\\n  range: [number, number]\\n}\\n\\nconst Word: FC<WordProps> = ({ children, progress, range }) => {\\n  const opacity = useTransform(progress, range, [0, 1])\\n  return (\\n    <span className=\\\"xl:lg-3 relative mx-1 lg:mx-1.5\\\">\\n      <span className=\\\"absolute opacity-30\\\">{children}</span>\\n      <motion.span\\n        style={{ opacity: opacity }}\\n        className={\\\"text-black dark:text-white\\\"}\\n      >\\n        {children}\\n      </motion.span>\\n    </span>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/theme-toggler-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"theme-toggler-demo\",\n  \"type\": \"registry:example\",\n  \"description\": \"Example showing animation in changing the theme.\",\n  \"registryDependencies\": [\n    \"animated-theme-toggler\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n      \"content\": \"import ThemeToggler from '@/registry/magicui/animated-theme-toggler';\\r\\n\\r\\nfunction AnimatedThemeTogglerDemo() {\\r\\n  return (\\r\\n    <div className='flex justify-center items-center'>\\r\\n        <ThemeToggler/>\\r\\n    </div>\\r\\n  )\\r\\n}\\r\\nexport default AnimatedThemeTogglerDemo;\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/tweet-card-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tweet-card-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Tweet Card Demo\",\n  \"description\": \"Example showing a tweet card with author info.\",\n  \"registryDependencies\": [\n    \"@magicui/client-tweet-card\",\n    \"@magicui/tweet-card\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/tweet-card-demo.tsx\",\n      \"content\": \"import { ClientTweetCard } from \\\"@/registry/magicui/client-tweet-card\\\"\\n\\n/**\\n * <TweetCard /> (Server Side Only)\\n * <ClientTweetCard /> (Client Side Only)\\n */\\nexport default function TweetDemo() {\\n  return <ClientTweetCard id=\\\"1668408059125702661\\\" />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/tweet-card-images.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tweet-card-images\",\n  \"type\": \"registry:example\",\n  \"title\": \"Tweet Card Images\",\n  \"description\": \"Example showing a tweet card with images.\",\n  \"registryDependencies\": [\n    \"@magicui/client-tweet-card\",\n    \"@magicui/tweet-card\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/tweet-card-images.tsx\",\n      \"content\": \"import { ClientTweetCard } from \\\"@/registry/magicui/client-tweet-card\\\"\\n\\nexport default function TweetImages() {\\n  return <ClientTweetCard id=\\\"1678577280489234432\\\" className=\\\"shadow-2xl\\\" />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/tweet-card-meta-preview.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tweet-card-meta-preview\",\n  \"type\": \"registry:example\",\n  \"title\": \"Tweet Card Meta Preview\",\n  \"description\": \"Example showing a tweet card with meta preview.\",\n  \"registryDependencies\": [\n    \"@magicui/client-tweet-card\",\n    \"@magicui/tweet-card\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/tweet-card-meta-preview.tsx\",\n      \"content\": \"import { ClientTweetCard } from \\\"@/registry/magicui/client-tweet-card\\\"\\n\\nexport default function TweetMetaPreview() {\\n  return <ClientTweetCard id=\\\"1675849118445436929\\\" className=\\\"shadow-2xl\\\" />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/tweet-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tweet-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Tweet Card\",\n  \"description\": \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n  \"dependencies\": [\n    \"react-tweet\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/tweet-card.tsx\",\n      \"content\": \"import { Suspense } from \\\"react\\\"\\nimport { enrichTweet, type EnrichedTweet, type TweetProps } from \\\"react-tweet\\\"\\nimport { getTweet, type Tweet } from \\\"react-tweet/api\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface TwitterIconProps {\\n  className?: string\\n  [key: string]: unknown\\n}\\nconst Twitter = ({ className, ...props }: TwitterIconProps) => (\\n  <svg\\n    stroke=\\\"currentColor\\\"\\n    fill=\\\"currentColor\\\"\\n    strokeWidth=\\\"0\\\"\\n    viewBox=\\\"0 0 24 24\\\"\\n    height=\\\"1em\\\"\\n    width=\\\"1em\\\"\\n    xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n    className={className}\\n    {...props}\\n  >\\n    <g>\\n      <path fill=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\"></path>\\n      <path d=\\\"M22.162 5.656a8.384 8.384 0 0 1-2.402.658A4.196 4.196 0 0 0 21.6 4c-.82.488-1.719.83-2.656 1.015a4.182 4.182 0 0 0-7.126 3.814 11.874 11.874 0 0 1-8.62-4.37 4.168 4.168 0 0 0-.566 2.103c0 1.45.738 2.731 1.86 3.481a4.168 4.168 0 0 1-1.894-.523v.052a4.185 4.185 0 0 0 3.355 4.101 4.21 4.21 0 0 1-1.89.072A4.185 4.185 0 0 0 7.97 16.65a8.394 8.394 0 0 1-6.191 1.732 11.83 11.83 0 0 0 6.41 1.88c7.693 0 11.9-6.373 11.9-11.9 0-.18-.005-.362-.013-.54a8.496 8.496 0 0 0 2.087-2.165z\\\"></path>\\n    </g>\\n  </svg>\\n)\\n\\nconst Verified = ({ className, ...props }: TwitterIconProps) => (\\n  <svg\\n    aria-label=\\\"Verified Account\\\"\\n    viewBox=\\\"0 0 24 24\\\"\\n    className={className}\\n    {...props}\\n  >\\n    <g fill=\\\"currentColor\\\">\\n      <path d=\\\"M22.5 12.5c0-1.58-.875-2.95-2.148-3.6.154-.435.238-.905.238-1.4 0-2.21-1.71-3.998-3.818-3.998-.47 0-.92.084-1.336.25C14.818 2.415 13.51 1.5 12 1.5s-2.816.917-3.437 2.25c-.415-.165-.866-.25-1.336-.25-2.11 0-3.818 1.79-3.818 4 0 .494.083.964.237 1.4-1.272.65-2.147 2.018-2.147 3.6 0 1.495.782 2.798 1.942 3.486-.02.17-.032.34-.032.514 0 2.21 1.708 4 3.818 4 .47 0 .92-.086 1.335-.25.62 1.334 1.926 2.25 3.437 2.25 1.512 0 2.818-.916 3.437-2.25.415.163.865.248 1.336.248 2.11 0 3.818-1.79 3.818-4 0-.174-.012-.344-.033-.513 1.158-.687 1.943-1.99 1.943-3.484zm-6.616-3.334l-4.334 6.5c-.145.217-.382.334-.625.334-.143 0-.288-.04-.416-.126l-.115-.094-2.415-2.415c-.293-.293-.293-.768 0-1.06s.768-.294 1.06 0l1.77 1.767 3.825-5.74c.23-.345.696-.436 1.04-.207.346.23.44.696.21 1.04z\\\" />\\n    </g>\\n  </svg>\\n)\\n\\nexport const truncate = (str: string | null, length: number) => {\\n  if (!str || str.length <= length) return str\\n  return `${str.slice(0, length - 3)}...`\\n}\\n\\nconst Skeleton = ({\\n  className,\\n  ...props\\n}: React.HTMLAttributes<HTMLDivElement>) => {\\n  return (\\n    <div className={cn(\\\"bg-primary/10 rounded-md\\\", className)} {...props} />\\n  )\\n}\\n\\nexport const TweetSkeleton = ({\\n  className,\\n  ...props\\n}: {\\n  className?: string\\n  [key: string]: unknown\\n}) => (\\n  <div\\n    className={cn(\\n      \\\"flex size-full max-h-max min-w-72 flex-col gap-2 rounded-xl border p-4\\\",\\n      className\\n    )}\\n    {...props}\\n  >\\n    <div className=\\\"flex flex-row gap-2\\\">\\n      <Skeleton className=\\\"size-10 shrink-0 rounded-full\\\" />\\n      <Skeleton className=\\\"h-10 w-full\\\" />\\n    </div>\\n    <Skeleton className=\\\"h-20 w-full\\\" />\\n  </div>\\n)\\n\\nexport const TweetNotFound = ({\\n  className,\\n  ...props\\n}: {\\n  className?: string\\n  [key: string]: unknown\\n}) => (\\n  <div\\n    className={cn(\\n      \\\"flex size-full flex-col items-center justify-center gap-2 rounded-lg border p-4\\\",\\n      className\\n    )}\\n    {...props}\\n  >\\n    <h3>Tweet not found</h3>\\n  </div>\\n)\\n\\nexport const TweetHeader = ({ tweet }: { tweet: EnrichedTweet }) => (\\n  <div className=\\\"flex flex-row items-start justify-between tracking-normal\\\">\\n    <div className=\\\"flex items-center space-x-3\\\">\\n      <a\\n        href={tweet.user.url}\\n        target=\\\"_blank\\\"\\n        rel=\\\"noreferrer\\\"\\n        className=\\\"shrink-0\\\"\\n      >\\n        <img\\n          title={`Profile picture of ${tweet.user.name}`}\\n          alt={tweet.user.screen_name}\\n          height={48}\\n          width={48}\\n          src={tweet.user.profile_image_url_https}\\n          className=\\\"border-border/50 overflow-hidden rounded-full border\\\"\\n        />\\n      </a>\\n      <div className=\\\"flex flex-col gap-0.5\\\">\\n        <a\\n          href={tweet.user.url}\\n          target=\\\"_blank\\\"\\n          rel=\\\"noreferrer\\\"\\n          className=\\\"text-foreground flex items-center font-medium whitespace-nowrap transition-opacity hover:opacity-80\\\"\\n        >\\n          {truncate(tweet.user.name, 20)}\\n          {tweet.user.verified ||\\n            (tweet.user.is_blue_verified && (\\n              <Verified className=\\\"ml-1 inline size-4 text-blue-500\\\" />\\n            ))}\\n        </a>\\n        <div className=\\\"flex items-center space-x-1\\\">\\n          <a\\n            href={tweet.user.url}\\n            target=\\\"_blank\\\"\\n            rel=\\\"noreferrer\\\"\\n            className=\\\"text-muted-foreground hover:text-foreground text-sm transition-colors\\\"\\n          >\\n            @{truncate(tweet.user.screen_name, 16)}\\n          </a>\\n        </div>\\n      </div>\\n    </div>\\n    <a href={tweet.url} target=\\\"_blank\\\" rel=\\\"noreferrer\\\">\\n      <span className=\\\"sr-only\\\">Link to tweet</span>\\n      <Twitter className=\\\"text-muted-foreground hover:text-foreground size-5 items-start transition-all ease-in-out hover:scale-105\\\" />\\n    </a>\\n  </div>\\n)\\n\\nexport const TweetBody = ({ tweet }: { tweet: EnrichedTweet }) => (\\n  <div className=\\\"text-[15px] leading-relaxed tracking-normal wrap-break-word\\\">\\n    {tweet.entities.map((entity, idx) => {\\n      switch (entity.type) {\\n        case \\\"url\\\":\\n        case \\\"symbol\\\":\\n        case \\\"hashtag\\\":\\n        case \\\"mention\\\":\\n          return (\\n            <a\\n              key={idx}\\n              href={entity.href}\\n              target=\\\"_blank\\\"\\n              rel=\\\"noopener noreferrer\\\"\\n              className=\\\"text-muted-foreground hover:text-foreground text-[15px] font-normal transition-colors\\\"\\n            >\\n              <span>{entity.text}</span>\\n            </a>\\n          )\\n        case \\\"text\\\":\\n          return (\\n            <span\\n              key={idx}\\n              className=\\\"text-foreground text-[15px] font-normal\\\"\\n              dangerouslySetInnerHTML={{ __html: entity.text }}\\n            />\\n          )\\n        default:\\n          return null\\n      }\\n    })}\\n  </div>\\n)\\n\\nexport const TweetMedia = ({ tweet }: { tweet: EnrichedTweet }) => {\\n  if (!tweet.video && !tweet.photos) return null\\n  return (\\n    <div className=\\\"flex flex-1 items-center justify-center\\\">\\n      {tweet.video && (\\n        <video\\n          poster={tweet.video.poster}\\n          autoPlay\\n          loop\\n          muted\\n          playsInline\\n          className=\\\"rounded-xl border shadow-sm\\\"\\n        >\\n          <source src={tweet.video.variants[0].src} type=\\\"video/mp4\\\" />\\n          Your browser does not support the video tag.\\n        </video>\\n      )}\\n      {tweet.photos && (\\n        <div className=\\\"relative flex transform-gpu snap-x snap-mandatory gap-4 overflow-x-auto\\\">\\n          <div className=\\\"shrink-0 snap-center sm:w-2\\\" />\\n          {tweet.photos.map((photo) => (\\n            <img\\n              key={photo.url}\\n              src={photo.url}\\n              width={photo.width}\\n              height={photo.height}\\n              title={\\\"Photo by \\\" + tweet.user.name}\\n              alt={tweet.text}\\n              className=\\\"h-64 w-5/6 shrink-0 snap-center snap-always rounded-xl border object-cover shadow-sm\\\"\\n            />\\n          ))}\\n          <div className=\\\"shrink-0 snap-center sm:w-2\\\" />\\n        </div>\\n      )}\\n      {!tweet.video &&\\n        !tweet.photos &&\\n        // @ts-expect-error package doesn't have type definitions\\n        tweet?.card?.binding_values?.thumbnail_image_large?.image_value.url && (\\n          <img\\n            src={\\n              // @ts-expect-error package doesn't have type definitions\\n              tweet.card.binding_values.thumbnail_image_large.image_value.url\\n            }\\n            className=\\\"h-64 rounded-xl border object-cover shadow-sm\\\"\\n            alt={tweet.text}\\n          />\\n        )}\\n    </div>\\n  )\\n}\\n\\nexport const MagicTweet = ({\\n  tweet,\\n  className,\\n  ...props\\n}: {\\n  tweet: Tweet\\n  className?: string\\n}) => {\\n  const enrichedTweet = enrichTweet(tweet)\\n  return (\\n    <div\\n      className={cn(\\n        \\\"relative flex h-fit w-full max-w-lg flex-col gap-4 overflow-hidden rounded-xl border p-5\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      <TweetHeader tweet={enrichedTweet} />\\n      <TweetBody tweet={enrichedTweet} />\\n      <TweetMedia tweet={enrichedTweet} />\\n    </div>\\n  )\\n}\\n\\n/**\\n * TweetCard (Server Side Only)\\n */\\nexport const TweetCard = async ({\\n  id,\\n  components,\\n  fallback = <TweetSkeleton />,\\n  onError,\\n  ...props\\n}: TweetProps & {\\n  className?: string\\n}) => {\\n  const tweet = id\\n    ? await getTweet(id).catch((err) => {\\n        if (onError) {\\n          onError(err)\\n        } else {\\n          console.error(err)\\n        }\\n      })\\n    : undefined\\n\\n  if (!tweet) {\\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\\n    return <NotFound {...props} />\\n  }\\n\\n  return (\\n    <Suspense fallback={fallback}>\\n      <MagicTweet tweet={tweet} {...props} />\\n    </Suspense>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-2.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-2\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Multiple Words\",\n  \"description\": \"Example showing multiple words with looping.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-2.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return <TypingAnimation words={[\\\"Design 🎨\\\", \\\"Build 🔨\\\", \\\"Ship 🚀\\\"]} loop />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-3.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-3\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Custom Speed\",\n  \"description\": \"Example showing custom typing and deleting speeds.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-3.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return (\\n    <TypingAnimation\\n      words={[\\\"Fast typing\\\", \\\"Slow delete\\\"]}\\n      typeSpeed={50}\\n      deleteSpeed={150}\\n      pauseDelay={2000}\\n      loop\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-4.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-4\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Start on View\",\n  \"description\": \"Example showing animation that starts when in viewport.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-4.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return (\\n    <TypingAnimation startOnView>Starts typing when in view</TypingAnimation>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-5.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-5\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Without Cursor\",\n  \"description\": \"Example showing typing animation without cursor.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-5.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return <TypingAnimation showCursor={false}>No cursor shown</TypingAnimation>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-6.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-6\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Single Play\",\n  \"description\": \"Example showing single play without looping.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-6.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return <TypingAnimation words={[\\\"First\\\", \\\"Second\\\", \\\"Final\\\"]} loop={false} />\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-7.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-7\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Cursor Blinking\",\n  \"description\": \"Example showing cursor blinking control.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-7.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"flex-1 space-y-8\\\">\\n      <div>\\n        <p className=\\\"text-muted-foreground mb-2 text-sm\\\">\\n          With blinking cursor (default) - watch during pause\\n        </p>\\n        <TypingAnimation\\n          words={[\\\"Type\\\", \\\"Pause\\\", \\\"Delete\\\"]}\\n          blinkCursor={true}\\n          pauseDelay={2000}\\n          loop\\n          className=\\\"text-4xl font-bold\\\"\\n        >\\n          Blinking cursor\\n        </TypingAnimation>\\n      </div>\\n      <div>\\n        <p className=\\\"text-muted-foreground mb-2 text-sm\\\">\\n          Without blinking cursor - static during pause\\n        </p>\\n        <TypingAnimation\\n          words={[\\\"Type\\\", \\\"Pause\\\", \\\"Delete\\\"]}\\n          blinkCursor={false}\\n          pauseDelay={2000}\\n          loop\\n          className=\\\"text-4xl font-bold\\\"\\n        >\\n          Static cursor\\n        </TypingAnimation>\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo-8.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo-8\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Cursor Styles\",\n  \"description\": \"Example showing different cursor styles (line, block, underscore).\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo-8.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return (\\n    <div className=\\\"flex-1 space-y-8\\\">\\n      <div>\\n        <p className=\\\"text-muted-foreground mb-2 text-sm\\\">\\n          Line cursor (default)\\n        </p>\\n        <TypingAnimation\\n          words={[\\\"Line cursor\\\"]}\\n          cursorStyle=\\\"line\\\"\\n          loop\\n          className=\\\"text-4xl font-bold\\\"\\n        />\\n      </div>\\n      <div>\\n        <p className=\\\"text-muted-foreground mb-2 text-sm\\\">\\n          Block cursor (VSCode style)\\n        </p>\\n        <TypingAnimation\\n          words={[\\\"Block cursor\\\"]}\\n          cursorStyle=\\\"block\\\"\\n          loop\\n          className=\\\"text-4xl font-bold\\\"\\n        />\\n      </div>\\n      <div>\\n        <p className=\\\"text-muted-foreground mb-2 text-sm\\\">Underscore cursor</p>\\n        <TypingAnimation\\n          words={[\\\"Underscore cursor\\\"]}\\n          cursorStyle=\\\"underscore\\\"\\n          loop\\n          className=\\\"text-4xl font-bold\\\"\\n        />\\n      </div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Typing Animation Demo\",\n  \"description\": \"Example showing typed character animations.\",\n  \"registryDependencies\": [\n    \"@magicui/typing-animation\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/typing-animation-demo.tsx\",\n      \"content\": \"import { TypingAnimation } from \\\"@/registry/magicui/typing-animation\\\"\\n\\nexport default function Component() {\\n  return <TypingAnimation>Hello World! 👋</TypingAnimation>\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/typing-animation.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"typing-animation\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Typing Animation\",\n  \"description\": \"Characters appearing in typed animation\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/typing-animation.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport {\\n  useEffect,\\n  useMemo,\\n  useRef,\\n  useState,\\n  type ComponentType,\\n  type RefAttributes,\\n  type RefObject,\\n} from \\\"react\\\"\\nimport {\\n  motion,\\n  useInView,\\n  type DOMMotionComponents,\\n  type HTMLMotionProps,\\n  type MotionProps,\\n} from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nconst motionElements = {\\n  article: motion.article,\\n  div: motion.div,\\n  h1: motion.h1,\\n  h2: motion.h2,\\n  h3: motion.h3,\\n  h4: motion.h4,\\n  h5: motion.h5,\\n  h6: motion.h6,\\n  li: motion.li,\\n  p: motion.p,\\n  section: motion.section,\\n  span: motion.span,\\n} as const\\n\\ntype MotionElementType = Extract<\\n  keyof DOMMotionComponents,\\n  keyof typeof motionElements\\n>\\ntype TypingAnimationMotionComponent = ComponentType<\\n  Omit<HTMLMotionProps<\\\"span\\\">, \\\"ref\\\"> & RefAttributes<HTMLElement>\\n>\\n\\ninterface TypingAnimationProps extends Omit<MotionProps, \\\"children\\\"> {\\n  children?: string\\n  words?: string[]\\n  className?: string\\n  duration?: number\\n  typeSpeed?: number\\n  deleteSpeed?: number\\n  delay?: number\\n  pauseDelay?: number\\n  loop?: boolean\\n  as?: MotionElementType\\n  startOnView?: boolean\\n  showCursor?: boolean\\n  blinkCursor?: boolean\\n  cursorStyle?: \\\"line\\\" | \\\"block\\\" | \\\"underscore\\\"\\n}\\n\\nexport function TypingAnimation({\\n  children,\\n  words,\\n  className,\\n  duration = 100,\\n  typeSpeed,\\n  deleteSpeed,\\n  delay = 0,\\n  pauseDelay = 1000,\\n  loop = false,\\n  as: Component = \\\"span\\\",\\n  startOnView = true,\\n  showCursor = true,\\n  blinkCursor = true,\\n  cursorStyle = \\\"line\\\",\\n  ...props\\n}: TypingAnimationProps) {\\n  const MotionComponent = motionElements[\\n    Component\\n  ] as TypingAnimationMotionComponent\\n\\n  const [displayedText, setDisplayedText] = useState<string>(\\\"\\\")\\n  const [currentWordIndex, setCurrentWordIndex] = useState(0)\\n  const [currentCharIndex, setCurrentCharIndex] = useState(0)\\n  const [phase, setPhase] = useState<\\\"typing\\\" | \\\"pause\\\" | \\\"deleting\\\">(\\\"typing\\\")\\n  const elementRef = useRef<HTMLElement | null>(null)\\n  const isInView = useInView(elementRef as RefObject<Element>, {\\n    amount: 0.3,\\n    once: true,\\n  })\\n\\n  const wordsToAnimate = useMemo(\\n    () => words ?? (children ? [children] : []),\\n    [words, children]\\n  )\\n  const hasMultipleWords = wordsToAnimate.length > 1\\n\\n  const typingSpeed = typeSpeed ?? duration\\n  const deletingSpeed = deleteSpeed ?? typingSpeed / 2\\n\\n  const shouldStart = startOnView ? isInView : true\\n  const animationSourceKey = useMemo(\\n    () => (words ? words.join(\\\"\\\\u0000\\\") : (children ?? \\\"\\\")),\\n    [words, children]\\n  )\\n\\n  useEffect(() => {\\n    setDisplayedText(\\\"\\\")\\n    setCurrentWordIndex(0)\\n    setCurrentCharIndex(0)\\n    setPhase(\\\"typing\\\")\\n  }, [animationSourceKey])\\n\\n  useEffect(() => {\\n    let timeout: ReturnType<typeof setTimeout> | null = null\\n\\n    if (shouldStart && wordsToAnimate.length > 0) {\\n      const timeoutDelay =\\n        delay > 0 && displayedText === \\\"\\\"\\n          ? delay\\n          : phase === \\\"typing\\\"\\n            ? typingSpeed\\n            : phase === \\\"deleting\\\"\\n              ? deletingSpeed\\n              : pauseDelay\\n\\n      timeout = setTimeout(() => {\\n        const currentWord = wordsToAnimate[currentWordIndex] || \\\"\\\"\\n        const graphemes = Array.from(currentWord)\\n\\n        switch (phase) {\\n          case \\\"typing\\\":\\n            if (currentCharIndex < graphemes.length) {\\n              setDisplayedText(\\n                graphemes.slice(0, currentCharIndex + 1).join(\\\"\\\")\\n              )\\n              setCurrentCharIndex(currentCharIndex + 1)\\n            } else {\\n              if (hasMultipleWords || loop) {\\n                const isLastWord =\\n                  currentWordIndex === wordsToAnimate.length - 1\\n                if (!isLastWord || loop) {\\n                  setPhase(\\\"pause\\\")\\n                }\\n              }\\n            }\\n            break\\n\\n          case \\\"pause\\\":\\n            setPhase(\\\"deleting\\\")\\n            break\\n\\n          case \\\"deleting\\\":\\n            if (currentCharIndex > 0) {\\n              setDisplayedText(\\n                graphemes.slice(0, currentCharIndex - 1).join(\\\"\\\")\\n              )\\n              setCurrentCharIndex(currentCharIndex - 1)\\n            } else {\\n              const nextIndex = (currentWordIndex + 1) % wordsToAnimate.length\\n              setCurrentWordIndex(nextIndex)\\n              setPhase(\\\"typing\\\")\\n            }\\n            break\\n        }\\n      }, timeoutDelay)\\n    }\\n\\n    return () => {\\n      if (timeout !== null) {\\n        clearTimeout(timeout)\\n      }\\n    }\\n  }, [\\n    shouldStart,\\n    phase,\\n    currentCharIndex,\\n    currentWordIndex,\\n    displayedText,\\n    wordsToAnimate,\\n    hasMultipleWords,\\n    loop,\\n    typingSpeed,\\n    deletingSpeed,\\n    pauseDelay,\\n    delay,\\n  ])\\n\\n  const currentWordGraphemes = Array.from(\\n    wordsToAnimate[currentWordIndex] || \\\"\\\"\\n  )\\n  const isComplete =\\n    !loop &&\\n    currentWordIndex === wordsToAnimate.length - 1 &&\\n    currentCharIndex >= currentWordGraphemes.length &&\\n    phase !== \\\"deleting\\\"\\n\\n  const shouldShowCursor =\\n    showCursor &&\\n    !isComplete &&\\n    (hasMultipleWords || loop || currentCharIndex < currentWordGraphemes.length)\\n\\n  const getCursorChar = () => {\\n    switch (cursorStyle) {\\n      case \\\"block\\\":\\n        return \\\"▌\\\"\\n      case \\\"underscore\\\":\\n        return \\\"_\\\"\\n      case \\\"line\\\":\\n      default:\\n        return \\\"|\\\"\\n    }\\n  }\\n\\n  return (\\n    <MotionComponent\\n      ref={elementRef}\\n      className={cn(\\n        \\\"leading-20 tracking-[-0.02em]\\\",\\n        Component === \\\"span\\\" && \\\"inline-block\\\",\\n        className\\n      )}\\n      {...props}\\n    >\\n      {displayedText}\\n      {shouldShowCursor && (\\n        <span\\n          className={cn(\\\"inline-block\\\", blinkCursor && \\\"animate-blink-cursor\\\")}\\n        >\\n          {getCursorChar()}\\n        </span>\\n      )}\\n    </MotionComponent>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ],\n  \"cssVars\": {\n    \"theme\": {\n      \"animate-blink-cursor\": \"blink-cursor 1.2s step-end infinite\"\n    }\n  },\n  \"css\": {\n    \"@keyframes blink-cursor\": {\n      \"0%, 49%\": {\n        \"opacity\": \"1\"\n      },\n      \"50%, 100%\": {\n        \"opacity\": \"0\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "apps/www/public/r/utils.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"utils\",\n  \"type\": \"registry:lib\",\n  \"dependencies\": [\n    \"clsx\",\n    \"tailwind-merge\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/lib/utils.ts\",\n      \"content\": \"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      \"type\": \"registry:lib\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/video-text-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"video-text-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Video Text Demo\",\n  \"description\": \"Example showing text with a video background.\",\n  \"registryDependencies\": [\n    \"@magicui/video-text\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/video-text-demo.tsx\",\n      \"content\": \"import { VideoText } from \\\"@/registry/magicui/video-text\\\"\\n\\nexport default function VideoTextDemo() {\\n  return (\\n    <div className=\\\"relative h-[200px] w-full overflow-hidden\\\">\\n      <VideoText src=\\\"https://cdn.magicui.design/ocean-small.webm\\\">\\n        OCEAN\\n      </VideoText>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/video-text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"video-text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Video Text\",\n  \"description\": \"A component that displays text with a video playing in the background.\",\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/video-text.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { ElementType, ReactNode, useEffect, useState } from \\\"react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\nexport interface VideoTextProps {\\n  /**\\n   * The video source URL\\n   */\\n  src: string\\n  /**\\n   * Additional className for the container\\n   */\\n  className?: string\\n  /**\\n   * Whether to autoplay the video\\n   */\\n  autoPlay?: boolean\\n  /**\\n   * Whether to mute the video\\n   */\\n  muted?: boolean\\n  /**\\n   * Whether to loop the video\\n   */\\n  loop?: boolean\\n  /**\\n   * Whether to preload the video\\n   */\\n  preload?: \\\"auto\\\" | \\\"metadata\\\" | \\\"none\\\"\\n  /**\\n   * The content to display (will have the video \\\"inside\\\" it)\\n   */\\n  children: ReactNode\\n  /**\\n   * Font size for the text mask (in viewport width units)\\n   * @default 10\\n   */\\n  fontSize?: string | number\\n  /**\\n   * Font weight for the text mask\\n   * @default \\\"bold\\\"\\n   */\\n  fontWeight?: string | number\\n  /**\\n   * Text anchor for the text mask\\n   * @default \\\"middle\\\"\\n   */\\n  textAnchor?: string\\n  /**\\n   * Dominant baseline for the text mask\\n   * @default \\\"middle\\\"\\n   */\\n  dominantBaseline?: string\\n  /**\\n   * Font family for the text mask\\n   * @default \\\"sans-serif\\\"\\n   */\\n  fontFamily?: string\\n  /**\\n   * The element type to render for the text\\n   * @default \\\"div\\\"\\n   */\\n  as?: ElementType\\n}\\n\\nexport function VideoText({\\n  src,\\n  children,\\n  className = \\\"\\\",\\n  autoPlay = true,\\n  muted = true,\\n  loop = true,\\n  preload = \\\"auto\\\",\\n  fontSize = 20,\\n  fontWeight = \\\"bold\\\",\\n  textAnchor = \\\"middle\\\",\\n  dominantBaseline = \\\"middle\\\",\\n  fontFamily = \\\"sans-serif\\\",\\n  as: Component = \\\"div\\\",\\n}: VideoTextProps) {\\n  const [svgMask, setSvgMask] = useState(\\\"\\\")\\n  const content = React.Children.toArray(children).join(\\\"\\\")\\n\\n  useEffect(() => {\\n    const updateSvgMask = () => {\\n      const responsiveFontSize =\\n        typeof fontSize === \\\"number\\\" ? `${fontSize}vw` : fontSize\\n      const newSvgMask = `<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%'><text x='50%' y='50%' font-size='${responsiveFontSize}' font-weight='${fontWeight}' text-anchor='${textAnchor}' dominant-baseline='${dominantBaseline}' font-family='${fontFamily}'>${content}</text></svg>`\\n      setSvgMask(newSvgMask)\\n    }\\n\\n    updateSvgMask()\\n    window.addEventListener(\\\"resize\\\", updateSvgMask)\\n    return () => window.removeEventListener(\\\"resize\\\", updateSvgMask)\\n  }, [content, fontSize, fontWeight, textAnchor, dominantBaseline, fontFamily])\\n\\n  const dataUrlMask = `url(\\\"data:image/svg+xml,${encodeURIComponent(svgMask)}\\\")`\\n\\n  return (\\n    <Component className={cn(`relative size-full`, className)}>\\n      {/* Create a container that masks the video to only show within text */}\\n      <div\\n        className=\\\"absolute inset-0 flex items-center justify-center\\\"\\n        style={{\\n          maskImage: dataUrlMask,\\n          WebkitMaskImage: dataUrlMask,\\n          maskSize: \\\"contain\\\",\\n          WebkitMaskSize: \\\"contain\\\",\\n          maskRepeat: \\\"no-repeat\\\",\\n          WebkitMaskRepeat: \\\"no-repeat\\\",\\n          maskPosition: \\\"center\\\",\\n          WebkitMaskPosition: \\\"center\\\",\\n        }}\\n      >\\n        <video\\n          className=\\\"h-full w-full object-cover\\\"\\n          autoPlay={autoPlay}\\n          muted={muted}\\n          loop={loop}\\n          preload={preload}\\n          playsInline\\n        >\\n          <source src={src} />\\n          Your browser does not support the video tag.\\n        </video>\\n      </div>\\n\\n      {/* Add a backup text element for SEO/accessibility */}\\n      <span className=\\\"sr-only\\\">{content}</span>\\n    </Component>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/warp-background-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"warp-background-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Warp Background Demo\",\n  \"description\": \"Example showing a card with a time warping background effect.\",\n  \"registryDependencies\": [\n    \"@magicui/warp-background\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/warp-background-demo.tsx\",\n      \"content\": \"import {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardTitle,\\n} from \\\"@/components/ui/card\\\"\\nimport { WarpBackground } from \\\"@/registry/magicui/warp-background\\\"\\n\\nexport default function ExampleComponentDemo() {\\n  return (\\n    <WarpBackground>\\n      <Card className=\\\"w-80\\\">\\n        <CardContent className=\\\"flex flex-col gap-2 p-4\\\">\\n          <CardTitle>Congratulations on Your Promotion!</CardTitle>\\n          <CardDescription>\\n            Your hard work and dedication have paid off. We&apos;re thrilled to\\n            see you take this next step in your career. Keep up the fantastic\\n            work!\\n          </CardDescription>\\n        </CardContent>\\n      </Card>\\n    </WarpBackground>\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/warp-background.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"warp-background\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Warp Background\",\n  \"description\": \"A card with a time warping background effect.\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/warp-background.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport React, { HTMLAttributes, useCallback, useMemo } from \\\"react\\\"\\nimport { motion } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface WarpBackgroundProps extends HTMLAttributes<HTMLDivElement> {\\n  children: React.ReactNode\\n  perspective?: number\\n  beamsPerSide?: number\\n  beamSize?: number\\n  beamDelayMax?: number\\n  beamDelayMin?: number\\n  beamDuration?: number\\n  gridColor?: string\\n}\\n\\nconst Beam = ({\\n  width,\\n  x,\\n  delay,\\n  duration,\\n}: {\\n  width: string | number\\n  x: string | number\\n  delay: number\\n  duration: number\\n}) => {\\n  const hue = Math.floor(Math.random() * 360)\\n  const ar = Math.floor(Math.random() * 10) + 1\\n\\n  return (\\n    <motion.div\\n      style={\\n        {\\n          \\\"--x\\\": `${x}`,\\n          \\\"--width\\\": `${width}`,\\n          \\\"--aspect-ratio\\\": `${ar}`,\\n          \\\"--background\\\": `linear-gradient(hsl(${hue} 80% 60%), transparent)`,\\n        } as React.CSSProperties\\n      }\\n      className={`absolute top-0 left-(--x) aspect-[1/var(--aspect-ratio)] w-(--width) [background:var(--background)]`}\\n      initial={{ y: \\\"100cqmax\\\", x: \\\"-50%\\\" }}\\n      animate={{ y: \\\"-100%\\\", x: \\\"-50%\\\" }}\\n      transition={{\\n        duration,\\n        delay,\\n        repeat: Infinity,\\n        ease: \\\"linear\\\",\\n      }}\\n    />\\n  )\\n}\\n\\nexport const WarpBackground: React.FC<WarpBackgroundProps> = ({\\n  children,\\n  perspective = 100,\\n  className,\\n  beamsPerSide = 3,\\n  beamSize = 5,\\n  beamDelayMax = 3,\\n  beamDelayMin = 0,\\n  beamDuration = 3,\\n  gridColor = \\\"var(--border)\\\",\\n  ...props\\n}) => {\\n  const generateBeams = useCallback(() => {\\n    const beams = []\\n    const cellsPerSide = Math.floor(100 / beamSize)\\n    const step = cellsPerSide / beamsPerSide\\n\\n    for (let i = 0; i < beamsPerSide; i++) {\\n      const x = Math.floor(i * step)\\n      const delay = Math.random() * (beamDelayMax - beamDelayMin) + beamDelayMin\\n      beams.push({ x, delay })\\n    }\\n    return beams\\n  }, [beamsPerSide, beamSize, beamDelayMax, beamDelayMin])\\n\\n  const topBeams = useMemo(() => generateBeams(), [generateBeams])\\n  const rightBeams = useMemo(() => generateBeams(), [generateBeams])\\n  const bottomBeams = useMemo(() => generateBeams(), [generateBeams])\\n  const leftBeams = useMemo(() => generateBeams(), [generateBeams])\\n\\n  return (\\n    <div className={cn(\\\"relative rounded border p-20\\\", className)} {...props}>\\n      <div\\n        style={\\n          {\\n            \\\"--perspective\\\": `${perspective}px`,\\n            \\\"--grid-color\\\": gridColor,\\n            \\\"--beam-size\\\": `${beamSize}%`,\\n          } as React.CSSProperties\\n        }\\n        className={\\n          \\\"@container-[size] pointer-events-none absolute top-0 left-0 size-full overflow-hidden [clipPath:inset(0)] perspective-(--perspective) transform-3d\\\"\\n        }\\n      >\\n        {/* top side */}\\n        <div className=\\\"@container absolute z-20 h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\\\">\\n          {topBeams.map((beam, index) => (\\n            <Beam\\n              key={`top-${index}`}\\n              width={`${beamSize}%`}\\n              x={`${beam.x * beamSize}%`}\\n              delay={beam.delay}\\n              duration={beamDuration}\\n            />\\n          ))}\\n        </div>\\n        {/* bottom side */}\\n        <div className=\\\"@container absolute top-full h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\\\">\\n          {bottomBeams.map((beam, index) => (\\n            <Beam\\n              key={`bottom-${index}`}\\n              width={`${beamSize}%`}\\n              x={`${beam.x * beamSize}%`}\\n              delay={beam.delay}\\n              duration={beamDuration}\\n            />\\n          ))}\\n        </div>\\n        {/* left side */}\\n        <div className=\\\"@container absolute top-0 left-0 h-[100cqmax] w-[100cqh] origin-[0%_0%] transform-[rotate(90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\\\">\\n          {leftBeams.map((beam, index) => (\\n            <Beam\\n              key={`left-${index}`}\\n              width={`${beamSize}%`}\\n              x={`${beam.x * beamSize}%`}\\n              delay={beam.delay}\\n              duration={beamDuration}\\n            />\\n          ))}\\n        </div>\\n        {/* right side */}\\n        <div className=\\\"@container absolute top-0 right-0 h-[100cqmax] w-[100cqh] origin-[100%_0%] transform-[rotate(-90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\\\">\\n          {rightBeams.map((beam, index) => (\\n            <Beam\\n              key={`right-${index}`}\\n              width={`${beamSize}%`}\\n              x={`${beam.x * beamSize}%`}\\n              delay={beam.delay}\\n              duration={beamDuration}\\n            />\\n          ))}\\n        </div>\\n      </div>\\n      <div className=\\\"relative\\\">{children}</div>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/word-rotate-demo.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"word-rotate-demo\",\n  \"type\": \"registry:example\",\n  \"title\": \"Word Rotate Demo\",\n  \"description\": \"Example showing vertical word rotation animation.\",\n  \"registryDependencies\": [\n    \"@magicui/word-rotate\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/example/word-rotate-demo.tsx\",\n      \"content\": \"import { WordRotate } from \\\"@/registry/magicui/word-rotate\\\"\\n\\nexport default function WordRotateDemo() {\\n  return (\\n    <WordRotate\\n      className=\\\"text-4xl font-bold text-black dark:text-white\\\"\\n      words={[\\\"Word\\\", \\\"Rotate\\\"]}\\n    />\\n  )\\n}\\n\",\n      \"type\": \"registry:example\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/r/word-rotate.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"word-rotate\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Word Rotate\",\n  \"description\": \"A vertical rotation of words\",\n  \"dependencies\": [\n    \"motion\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"registry/magicui/word-rotate.tsx\",\n      \"content\": \"\\\"use client\\\"\\n\\nimport { useEffect, useState } from \\\"react\\\"\\nimport { AnimatePresence, motion, type MotionProps } from \\\"motion/react\\\"\\n\\nimport { cn } from \\\"@/lib/utils\\\"\\n\\ninterface WordRotateProps {\\n  words: string[]\\n  duration?: number\\n  motionProps?: MotionProps\\n  className?: string\\n}\\n\\nexport function WordRotate({\\n  words,\\n  duration = 2500,\\n  motionProps = {\\n    initial: { opacity: 0, y: -50 },\\n    animate: { opacity: 1, y: 0 },\\n    exit: { opacity: 0, y: 50 },\\n    transition: { duration: 0.25, ease: \\\"easeOut\\\" },\\n  },\\n  className,\\n}: WordRotateProps) {\\n  const [index, setIndex] = useState(0)\\n\\n  useEffect(() => {\\n    const interval = setInterval(() => {\\n      setIndex((prevIndex) => (prevIndex + 1) % words.length)\\n    }, duration)\\n\\n    // Clean up interval on unmount\\n    return () => clearInterval(interval)\\n  }, [words, duration])\\n\\n  return (\\n    <div className=\\\"overflow-hidden py-2\\\">\\n      <AnimatePresence mode=\\\"wait\\\">\\n        <motion.h1\\n          key={words[index]}\\n          className={cn(className)}\\n          {...motionProps}\\n        >\\n          {words[index]}\\n        </motion.h1>\\n      </AnimatePresence>\\n    </div>\\n  )\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/registry.json",
    "content": "{\n  \"name\": \"magicui\",\n  \"homepage\": \"https://magicui.design\",\n  \"items\": [\n    {\n      \"name\": \"index\",\n      \"type\": \"registry:style\",\n      \"dependencies\": [\n        \"class-variance-authority\",\n        \"lucide-react\"\n      ],\n      \"devDependencies\": [\n        \"tw-animate-css\"\n      ],\n      \"registryDependencies\": [\n        \"utils\"\n      ],\n      \"files\": [],\n      \"cssVars\": {}\n    },\n    {\n      \"name\": \"magic-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Magic Card\",\n      \"description\": \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"dependencies\": [\n        \"motion\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/magic-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Android\",\n      \"description\": \"A mockup of an Android device.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/android.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Warp Background\",\n      \"description\": \"A card with a time warping background effect.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/warp-background.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Line Shadow Text\",\n      \"description\": \"A text component with a moving line shadow.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/line-shadow-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-line-shadow\": \"line-shadow 15s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes line-shadow\": {\n          \"0%\": {\n            \"background-position\": \"0 0\"\n          },\n          \"100%\": {\n            \"background-position\": \"100% -100%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"aurora-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aurora Text\",\n      \"description\": \"A beautiful aurora text effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/aurora-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes aurora\": {\n          \"0%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          },\n          \"25%\": {\n            \"background-position\": \"50% 100%\",\n            \"transform\": \"rotate(5deg) scale(1.1)\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 50%\",\n            \"transform\": \"rotate(-3deg) scale(0.95)\"\n          },\n          \"75%\": {\n            \"background-position\": \"50% 0%\",\n            \"transform\": \"rotate(3deg) scale(1.05)\"\n          },\n          \"100%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"morphing-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Morphing Text\",\n      \"description\": \"A dynamic text morphing component for Magic UI.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/morphing-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Progress\",\n      \"description\": \"Animated Scroll Progress for your pages\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-progress.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Lens\",\n      \"description\": \"A interactive component that enables zooming into images, videos and other elements.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/lens.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pointer\",\n      \"description\": \"A component that displays a pointer when hovering over an element\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pointer.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor\",\n      \"type\": \"registry:ui\",\n      \"description\": \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n      \"dependencies\": [\n        \"framer-motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/smooth-cursor.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progressive Blur\",\n      \"description\": \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/progressive-blur.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Neon Gradient Card\",\n      \"description\": \"A beautiful neon card effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/neon-gradient-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-background-position-spin\": \"background-position-spin 3000ms infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes background-position-spin\": {\n          \"0%\": {\n            \"background-position\": \"top center\"\n          },\n          \"100%\": {\n            \"background-position\": \"bottom center\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"meteors\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Meteors\",\n      \"description\": \"A meteor shower effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/meteors.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-meteor\": \"meteor 5s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes meteor\": {\n          \"0%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(0)\",\n            \"opacity\": \"1\"\n          },\n          \"70%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(-500px)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Grid Pattern\",\n      \"description\": \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Striped Pattern\",\n      \"description\": \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/striped-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/striped-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Interactive Grid Pattern\",\n      \"description\": \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dot Pattern\",\n      \"description\": \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dot-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Flickering Grid\",\n      \"description\": \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/flickering-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hero Video Dialog\",\n      \"description\": \"A hero video dialog component.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hero-video-dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Code Comparison\",\n      \"description\": \"A component which compares two code snippets.\",\n      \"dependencies\": [\n        \"shiki\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/code-comparison.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Marquee\",\n      \"description\": \"An infinite scrolling component that can be used to display text, images, or videos.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/marquee.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n          \"animate-marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes marquee\": {\n          \"from\": {\n            \"transform\": \"translateX(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateX(calc(-100% - var(--gap)))\"\n          }\n        },\n        \"@keyframes marquee-vertical\": {\n          \"from\": {\n            \"transform\": \"translateY(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateY(calc(-100% - var(--gap)))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"globe\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Globe\",\n      \"description\": \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n      \"dependencies\": [\n        \"cobe\",\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/globe.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shimmer Button\",\n      \"description\": \"A button with a shimmering light which travels around the perimeter.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shimmer-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shimmer-slide\": \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n          \"animate-spin-around\": \"spin-around calc(var(--speed) * 2) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shimmer-slide\": {\n          \"to\": {\n            \"transform\": \"translate(calc(100cqw - 100%), 0)\"\n          }\n        },\n        \"@keyframes spin-around\": {\n          \"0%\": {\n            \"transform\": \"translateZ(0) rotate(0)\"\n          },\n          \"15%, 35%\": {\n            \"transform\": \"translateZ(0) rotate(90deg)\"\n          },\n          \"65%, 85%\": {\n            \"transform\": \"translateZ(0) rotate(270deg)\"\n          },\n          \"100%\": {\n            \"transform\": \"translateZ(0) rotate(360deg)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tweet Card\",\n      \"description\": \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"client-tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Client Tweet Card\",\n      \"description\": \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/client-tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Bento Grid\",\n      \"description\": \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/bento-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Particles\",\n      \"description\": \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/particles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Number Ticker\",\n      \"description\": \"Animate numbers to count up or down to a target number\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/number-ticker.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple\",\n      \"description\": \"An animated ripple effect typically used behind elements to emphasize them.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-ripple\": \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes ripple\": {\n          \"0%, 100%\": {\n            \"transform\": \"translate(-50%, -50%) scale(1)\"\n          },\n          \"50%\": {\n            \"transform\": \"translate(-50%, -50%) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"retro-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Retro Grid\",\n      \"description\": \"An animated scrolling retro grid effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/retro-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated List\",\n      \"description\": \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-list.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Shiny Text\",\n      \"description\": \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-shiny-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shiny-text\": \"shiny-text 8s infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shiny-text\": {\n          \"0%, 90%, 100%\": {\n            \"background-position\": \"calc(-100% - var(--shiny-width)) 0\"\n          },\n          \"30%, 60%\": {\n            \"background-position\": \"calc(100% + var(--shiny-width)) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Grid Pattern\",\n      \"description\": \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Border Beam\",\n      \"description\": \"An animated beam of light which travels along the border of its container.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/border-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Beam\",\n      \"description\": \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Reveal\",\n      \"description\": \"Fade in text as you scroll down the page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-reveal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hyper Text\",\n      \"description\": \"A text animation that scrambles letters before revealing the final text.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hyper-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Gradient Text\",\n      \"description\": \"An animated gradient background which transitions between colors for text.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-gradient-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-gradient\": \"gradient 8s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes gradient\": {\n          \"to\": {\n            \"background-position\": \"var(--bg-size, 300%) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"orbiting-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Orbiting Circles\",\n      \"description\": \"A collection of circles which move in orbit along a circular path\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/orbiting-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes orbit\": {\n          \"0%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"dock\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dock\",\n      \"description\": \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dock.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Word Rotate\",\n      \"description\": \"A vertical rotation of words\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/word-rotate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar Circles\",\n      \"description\": \"Overlapping circles of avatars.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/avatar-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Typing Animation\",\n      \"description\": \"Characters appearing in typed animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/typing-animation.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-blink-cursor\": \"blink-cursor 1.2s step-end infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes blink-cursor\": {\n          \"0%, 49%\": {\n            \"opacity\": \"1\"\n          },\n          \"50%, 100%\": {\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"sparkles-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Sparkles Text\",\n      \"description\": \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/sparkles-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Spinning Text\",\n      \"description\": \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/spinning-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Comic Text\",\n      \"description\": \"Comic text animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/comic-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon Cloud\",\n      \"description\": \"An interactive 3D tag cloud component\",\n      \"dependencies\": [],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/icon-cloud.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Animate\",\n      \"description\": \"A text animation component that animates text using a variety of different animations.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-animate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Based Velocity\",\n      \"description\": \"Scrolling text whose speed changes based on scroll speed\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-based-velocity.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shiny Button\",\n      \"description\": \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shiny-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shine Border\",\n      \"description\": \"Shine border is an animated background border effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shine-border.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shine\": \"shine var(--duration) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shine\": {\n          \"0%\": {\n            \"background-position\": \"0% 0%\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 100%\"\n          },\n          \"to\": {\n            \"background-position\": \"0% 0%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-circular-progress-bar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Circular Progress Bar\",\n      \"description\": \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-circular-progress-bar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Confetti\",\n      \"description\": \"Confetti animations are best used to delight your users when something special happens\",\n      \"dependencies\": [\n        \"canvas-confetti\",\n        \"@types/canvas-confetti\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/confetti.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Cool Mode\",\n      \"description\": \"Cool mode effect for buttons, links, and other DOMs\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/cool-mode.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pulsating Button\",\n      \"description\": \"An animated pulsating button useful for capturing attention of users.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pulsating-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-pulse\": \"pulse var(--duration) ease-out infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes pulse\": {\n          \"0%, 100%\": {\n            \"boxShadow\": \"0 0 0 0 var(--pulse-color)\"\n          },\n          \"50%\": {\n            \"boxShadow\": \"0 0 0 8px var(--pulse-color)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"ripple-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple Button\",\n      \"description\": \"An animated button with ripple useful for user engagement.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rippling\": \"rippling var(--duration) ease-out\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rippling\": {\n          \"0%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"scale(2)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"file-tree\",\n      \"type\": \"registry:ui\",\n      \"title\": \"File Tree\",\n      \"description\": \"A component used to showcase the folder and file structure of a directory.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/file-tree.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Blur Fade\",\n      \"description\": \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/blur-fade.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Safari\",\n      \"description\": \"A safari browser mockup to showcase your website.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/safari.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone\",\n      \"type\": \"registry:ui\",\n      \"title\": \"iPhone\",\n      \"description\": \"A mockup of the iPhone\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/iphone.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Rainbow Button\",\n      \"description\": \"An animated button with a rainbow effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/rainbow-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\"\n        },\n        \"light\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        },\n        \"dark\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rainbow\": {\n          \"0%\": {\n            \"background-position\": \"0%\"\n          },\n          \"100%\": {\n            \"background-position\": \"200%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"interactive-hover-button\",\n      \"type\": \"registry:ui\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-hover-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Terminal\",\n      \"description\": \"A terminal component\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/terminal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Video Text\",\n      \"description\": \"A component that displays text with a video playing in the background.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/video-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pixel Image\",\n      \"description\": \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pixel-image.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Highlighter\",\n      \"description\": \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Theme Toggler\",\n      \"description\": \"A component for theme changing animation.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-theme-toggler.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"css\": {\n        \"::view-transition-old(root), ::view-transition-new(root)\": {\n          \"animation\": \"none\",\n          \"mix-blend-mode\": \"normal\"\n        }\n      }\n    },\n    {\n      \"name\": \"light-rays\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Light Rays\",\n      \"description\": \"A component with animated light rays which shine down from above.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/light-rays.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dotted Map\",\n      \"description\": \"A component with a dotted map.\",\n      \"dependencies\": [\n        \"svg-dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dotted-map.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo\",\n      \"description\": \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo 2\",\n      \"description\": \"Example showing a magic card with an orb effect.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\",\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo\",\n      \"description\": \"Example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 2\",\n      \"description\": \"Second example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 3\",\n      \"description\": \"Third example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Warp Background Demo\",\n      \"description\": \"Example showing a card with a time warping background effect.\",\n      \"registryDependencies\": [\n        \"@magicui/warp-background\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/warp-background-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Line Shadow Text Demo\",\n      \"description\": \"Example showing a text component with a moving line shadow.\",\n      \"registryDependencies\": [\n        \"@magicui/line-shadow-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/line-shadow-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"aurora-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Aurora Text Demo\",\n      \"description\": \"Example showing a beautiful aurora text effect.\",\n      \"registryDependencies\": [\n        \"@magicui/aurora-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/aurora-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"morphing-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Morphing Text Demo\",\n      \"description\": \"Example showing a dynamic text morphing component.\",\n      \"registryDependencies\": [\n        \"@magicui/morphing-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/morphing-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Progress Demo\",\n      \"description\": \"Example showing animated scroll progress for your pages.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-progress\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-progress-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo\",\n      \"description\": \"Example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 2\",\n      \"description\": \"Second example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 3\",\n      \"description\": \"Third example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer-demo-1\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pointer Demo 1\",\n      \"description\": \"Example showing a pointer effect component\",\n      \"registryDependencies\": [\n        \"@magicui/pointer\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pointer-demo-1.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Basic smooth cursor example\",\n      \"registryDependencies\": [\n        \"@magicui/smooth-cursor\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/smooth-cursor-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Progressive Blur Demo\",\n      \"description\": \"Example showing progressive blur effect for scrollable content.\",\n      \"registryDependencies\": [\n        \"@magicui/progressive-blur\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/progressive-blur-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Neon Gradient Card Demo\",\n      \"description\": \"Example showing a beautiful neon card effect.\",\n      \"registryDependencies\": [\n        \"@magicui/neon-gradient-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/neon-gradient-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"meteors-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Meteors Demo\",\n      \"description\": \"Example showing a meteor shower effect.\",\n      \"registryDependencies\": [\n        \"@magicui/meteors\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/meteors-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Demo\",\n      \"description\": \"Example showing a background grid pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern Demo\",\n      \"description\": \"Example showing a background striped pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Dashed)\",\n      \"description\": \"Example showing a background striped pattern with a dashed stroke.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-dashed.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-dashed.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-right\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Right)\",\n      \"description\": \"Example showing a background striped pattern slanting to the right using SVG.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-right.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-right.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Linear Gradient\",\n      \"description\": \"Example showing a grid pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Dashed\",\n      \"description\": \"Example showing a dashed grid pattern.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-dashed.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Demo\",\n      \"description\": \"Example showing a background dot pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Linear Gradient\",\n      \"description\": \"Example showing a dot pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-with-glow-effect\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern with glow effect\",\n      \"description\": \"Example showing a dot pattern with glow effect\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-with-glow-effect.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Demo\",\n      \"description\": \"Example showing a flickering grid background.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-rounded-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Rounded Demo\",\n      \"description\": \"Example showing a flickering grid background with rounded corners.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-rounded-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Demo\",\n      \"description\": \"Example showing a hero video dialog component.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo-top-in-bottom-out\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Top In Bottom Out Demo\",\n      \"description\": \"Example showing a hero video dialog with top-in bottom-out animation.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Code Comparison Demo\",\n      \"description\": \"Example showing a component which compares two code snippets.\",\n      \"registryDependencies\": [\n        \"@magicui/code-comparison\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/code-comparison-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Demo\",\n      \"description\": \"Example showing an infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Vertical Demo\",\n      \"description\": \"Example showing a vertical infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-logos\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Logos\",\n      \"description\": \"Example showing an infinite scrolling logo carousel.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-logos.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-3d\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee 3D\",\n      \"description\": \"Example showing a 3D infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-3d.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"globe-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Globe Demo\",\n      \"description\": \"Example showing an autorotating, interactive WebGL globe.\",\n      \"registryDependencies\": [\n        \"@magicui/globe\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/globe-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Demo\",\n      \"description\": \"Example showing a tweet card with author info.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-images\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Images\",\n      \"description\": \"Example showing a tweet card with images.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-images.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-meta-preview\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Meta Preview\",\n      \"description\": \"Example showing a tweet card with meta preview.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-meta-preview.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shimmer Button Demo\",\n      \"description\": \"Example showing a button with a shimmering light effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shimmer-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shimmer-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Demo\",\n      \"description\": \"Example showing a bento grid layout for showcasing features.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"calendar\",\n        \"@magicui/marquee\",\n        \"@magicui/bento-grid\",\n        \"@magicui/animated-beam\",\n        \"@magicui/animated-list\",\n        \"@magicui/animated-beam-multiple-outputs\",\n        \"@magicui/animated-list-demo\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Vertical Demo\",\n      \"description\": \"Example showing a vertical bento grid layout.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/bento-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo 2\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-decimal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Decimal Demo\",\n      \"description\": \"Example showing animated counting decimal numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-decimal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Demo\",\n      \"description\": \"Example showing an animated ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"retro-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Retro Grid Demo\",\n      \"description\": \"Example showing an animated scrolling retro grid effect.\",\n      \"registryDependencies\": [\n        \"@magicui/retro-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/retro-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated List Demo\",\n      \"description\": \"Example showing a list with sequenced item animations.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-list\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-list-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Shiny Text Demo\",\n      \"description\": \"Example showing text with a shimmering light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-shiny-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-shiny-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Particles Demo\",\n      \"description\": \"Example showing interactive particle effects.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/particles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/particles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Grid Pattern Demo\",\n      \"description\": \"Example showing an animated grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo\",\n      \"description\": \"Example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo 2\",\n      \"description\": \"Second example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 3\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"input\",\n        \"label\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 4\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Demo\",\n      \"description\": \"Example showing an animated beam of light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-unidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Unidirectional\",\n      \"description\": \"Example showing a unidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-unidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-bidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Bidirectional\",\n      \"description\": \"Example showing a bidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-bidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-inputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Inputs\",\n      \"description\": \"Example showing animated beams with multiple input points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-inputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-outputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Outputs\",\n      \"description\": \"Example showing animated beams with multiple output points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-outputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Reveal Demo\",\n      \"description\": \"Example showing text that fades in on scroll.\",\n      \"registryDependencies\": [\n        \"@magicui/text-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-reveal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo\",\n      \"description\": \"Example showing text with animated gradient backgrounds.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo 2\",\n      \"description\": \"Second example showing text with animated gradient backgrounds.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"orbiting-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Orbiting Circles Demo\",\n      \"description\": \"Example showing circles moving in orbital paths.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/orbiting-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/orbiting-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo\",\n      \"description\": \"Example showing a MacOS-style dock implementation.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 2\",\n      \"description\": \"Second example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 3\",\n      \"description\": \"Third example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Word Rotate Demo\",\n      \"description\": \"Example showing vertical word rotation animation.\",\n      \"registryDependencies\": [\n        \"@magicui/word-rotate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/word-rotate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hyper Text Demo\",\n      \"description\": \"Example showing text with scrambling letter animations.\",\n      \"registryDependencies\": [\n        \"@magicui/hyper-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hyper-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Avatar Circles Demo\",\n      \"description\": \"Example showing overlapping avatar circles.\",\n      \"registryDependencies\": [\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/avatar-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Demo\",\n      \"description\": \"Example showing typed character animations.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Multiple Words\",\n      \"description\": \"Example showing multiple words with looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Custom Speed\",\n      \"description\": \"Example showing custom typing and deleting speeds.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Start on View\",\n      \"description\": \"Example showing animation that starts when in viewport.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Without Cursor\",\n      \"description\": \"Example showing typing animation without cursor.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Single Play\",\n      \"description\": \"Example showing single play without looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Blinking\",\n      \"description\": \"Example showing cursor blinking control.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Styles\",\n      \"description\": \"Example showing different cursor styles (line, block, underscore).\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Demo\",\n      \"description\": \"Example showing text speed changes based on scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-images-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Images\",\n      \"description\": \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-images-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkles-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Sparkles Text Demo\",\n      \"description\": \"Example showing text with animated sparkle effects.\",\n      \"registryDependencies\": [\n        \"@magicui/sparkles-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/sparkles-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo 2\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Comic Text Demo\",\n      \"description\": \"Example showing comic text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/comic-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/comic-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo\",\n      \"description\": \"Example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 2\",\n      \"description\": \"Second example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 3\",\n      \"description\": \"Third example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo\",\n      \"description\": \"Example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 2\",\n      \"description\": \"Second example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 3\",\n      \"description\": \"Third example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 4\",\n      \"description\": \"Fourth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 5\",\n      \"description\": \"Fifth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 6\",\n      \"description\": \"Sixth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 7\",\n      \"description\": \"Seventh example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 8\",\n      \"description\": \"Eighth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-9\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 9\",\n      \"description\": \"Ninth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-9.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shiny Button Demo\",\n      \"description\": \"Example showing a shiny button with dynamic styles.\",\n      \"registryDependencies\": [\n        \"@magicui/shiny-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shiny-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-circular-progress-bar-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Circular Progress Bar Demo\",\n      \"description\": \"Example showing an animated circular progress gauge.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-circular-progress-bar\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-circular-progress-bar-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo\",\n      \"description\": \"Example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo 2\",\n      \"description\": \"Second example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Demo\",\n      \"description\": \"Example showing confetti animations for celebrations.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-basic-cannon\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Basic Cannon\",\n      \"description\": \"Example showing basic confetti cannon animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-basic-cannon.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-random-direction\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Random Direction\",\n      \"description\": \"Example showing confetti with random directions.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-random-direction.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-fireworks\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Fireworks\",\n      \"description\": \"Example showing fireworks-style confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-fireworks.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-stars\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Stars\",\n      \"description\": \"Example showing star-shaped confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-stars.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-side-cannons\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Side Cannons\",\n      \"description\": \"Example showing side-mounted confetti cannons.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-side-cannons.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-custom-shapes\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Custom Shapes\",\n      \"description\": \"Example showing confetti with custom shape particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-custom-shapes.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-emoji\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Emoji\",\n      \"description\": \"Example showing confetti with emoji particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-emoji.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Demo\",\n      \"description\": \"Example showing cool mode effect for buttons and links.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-custom\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Custom\",\n      \"description\": \"Example showing customized cool mode effects.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-custom.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pulsating Button Demo\",\n      \"description\": \"Example showing an animated pulsating button.\",\n      \"registryDependencies\": [\n        \"@magicui/pulsating-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pulsating-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Button Demo\",\n      \"description\": \"Example showing an animated button with ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"file-tree-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"File Tree Demo\",\n      \"description\": \"Example showing a component that displays folder and file structure.\",\n      \"registryDependencies\": [\n        \"@magicui/file-tree\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/file-tree-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Demo\",\n      \"description\": \"Example showing blur fade in and out animations.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Text Demo\",\n      \"description\": \"Example showing blur fade animations with text.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo\",\n      \"description\": \"Example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 2\",\n      \"description\": \"Second example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 3\",\n      \"description\": \"Third example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 4\",\n      \"description\": \"Fourth example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo\",\n      \"description\": \"Example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 2\",\n      \"description\": \"Second example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 3\",\n      \"description\": \"Third example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo 2\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-hover-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Hover Button Demo\",\n      \"description\": \"Example showing an interactive button with hover effects.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-hover-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-hover-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text.\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text and custom delays\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Video Text Demo\",\n      \"description\": \"Example showing text with a video background.\",\n      \"registryDependencies\": [\n        \"@magicui/video-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/video-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pixel Image Demo\",\n      \"description\": \"Example showing a pixelated image effect.\",\n      \"registryDependencies\": [\n        \"@magicui/pixel-image\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pixel-image-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Highlighter Demo\",\n      \"description\": \"Example showing the demo of a Highlighter\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/highlighter\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/highlighter-demo.tsx\",\n          \"type\": \"registry:example\"\n        },\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Theme Toggler Demo\",\n      \"description\": \"Example showing animation while changing the theme.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-theme-toggler\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"light-rays-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Demo of the light-rays component showcasing animated light rays\",\n      \"registryDependencies\": [\n        \"@magicui/light-rays\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/light-rays-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo\",\n      \"description\": \"Example showing a dotted map.\",\n      \"dependencies\": [\n        \"countries-list\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 2\",\n      \"description\": \"Example showing a dotted map.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 3\",\n      \"description\": \"Example showing a dotted map with pulse animation.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"utils\",\n      \"type\": \"registry:lib\",\n      \"dependencies\": [\n        \"clsx\",\n        \"tailwind-merge\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/lib/utils.ts\",\n          \"type\": \"registry:lib\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/public/site.webmanifest",
    "content": "{\n  \"name\": \"Magic UI\",\n  \"short_name\": \"Magic UI\",\n  \"icons\": [\n    {\n      \"src\": \"/android-chrome-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/android-chrome-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"theme_color\": \"#ffffff\",\n  \"background_color\": \"#ffffff\",\n  \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "apps/www/registry/__index__.tsx",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\n// This file is autogenerated by scripts/build-registry.ts\n// Do not edit this file directly.\nimport * as React from \"react\"\n\nexport const Index: Record<string, any> = {\n  \"index\": {\n    name: \"index\",\n    description: \"\",\n    type: \"registry:style\",\n    registryDependencies: [\"utils\"],\n    files: [],\n    component: null,\n    meta: undefined,\n  },\n  \"magic-card\": {\n    name: \"magic-card\",\n    description: \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/magic-card.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/magic-card.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"android\": {\n    name: \"android\",\n    description: \"A mockup of an Android device.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/android.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/android.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"warp-background\": {\n    name: \"warp-background\",\n    description: \"A card with a time warping background effect.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/warp-background.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/warp-background.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"line-shadow-text\": {\n    name: \"line-shadow-text\",\n    description: \"A text component with a moving line shadow.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/line-shadow-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/line-shadow-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"aurora-text\": {\n    name: \"aurora-text\",\n    description: \"A beautiful aurora text effect\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/aurora-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/aurora-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"morphing-text\": {\n    name: \"morphing-text\",\n    description: \"A dynamic text morphing component for Magic UI.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/morphing-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/morphing-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"scroll-progress\": {\n    name: \"scroll-progress\",\n    description: \"Animated Scroll Progress for your pages\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/scroll-progress.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/scroll-progress.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"lens\": {\n    name: \"lens\",\n    description: \"A interactive component that enables zooming into images, videos and other elements.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/lens.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/lens.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pointer\": {\n    name: \"pointer\",\n    description: \"A component that displays a pointer when hovering over an element\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/pointer.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/pointer.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"smooth-cursor\": {\n    name: \"smooth-cursor\",\n    description: \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/smooth-cursor.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/smooth-cursor.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"progressive-blur\": {\n    name: \"progressive-blur\",\n    description: \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/progressive-blur.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/progressive-blur.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"neon-gradient-card\": {\n    name: \"neon-gradient-card\",\n    description: \"A beautiful neon card effect\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/neon-gradient-card.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/neon-gradient-card.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"meteors\": {\n    name: \"meteors\",\n    description: \"A meteor shower effect.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/meteors.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/meteors.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"grid-pattern\": {\n    name: \"grid-pattern\",\n    description: \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/grid-pattern.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/grid-pattern.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"striped-pattern\": {\n    name: \"striped-pattern\",\n    description: \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/striped-pattern.tsx\",\n      type: \"registry:ui\",\n      target: \"components/magicui/striped-pattern.tsx\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/striped-pattern.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"interactive-grid-pattern\": {\n    name: \"interactive-grid-pattern\",\n    description: \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/interactive-grid-pattern.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/interactive-grid-pattern.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dot-pattern\": {\n    name: \"dot-pattern\",\n    description: \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/dot-pattern.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/dot-pattern.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"flickering-grid\": {\n    name: \"flickering-grid\",\n    description: \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/flickering-grid.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/flickering-grid.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"hero-video-dialog\": {\n    name: \"hero-video-dialog\",\n    description: \"A hero video dialog component.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/hero-video-dialog.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/hero-video-dialog.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"code-comparison\": {\n    name: \"code-comparison\",\n    description: \"A component which compares two code snippets.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/code-comparison.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/code-comparison.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"marquee\": {\n    name: \"marquee\",\n    description: \"An infinite scrolling component that can be used to display text, images, or videos.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/marquee.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/marquee.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"globe\": {\n    name: \"globe\",\n    description: \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/globe.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/globe.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shimmer-button\": {\n    name: \"shimmer-button\",\n    description: \"A button with a shimmering light which travels around the perimeter.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/shimmer-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/shimmer-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"tweet-card\": {\n    name: \"tweet-card\",\n    description: \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/tweet-card.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/tweet-card.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"client-tweet-card\": {\n    name: \"client-tweet-card\",\n    description: \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/client-tweet-card.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/client-tweet-card.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"bento-grid\": {\n    name: \"bento-grid\",\n    description: \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n    type: \"registry:ui\",\n    registryDependencies: [\"button\"],\n    files: [{\n      path: \"registry/magicui/bento-grid.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/bento-grid.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"particles\": {\n    name: \"particles\",\n    description: \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/particles.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/particles.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"number-ticker\": {\n    name: \"number-ticker\",\n    description: \"Animate numbers to count up or down to a target number\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/number-ticker.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/number-ticker.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"ripple\": {\n    name: \"ripple\",\n    description: \"An animated ripple effect typically used behind elements to emphasize them.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/ripple.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/ripple.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"retro-grid\": {\n    name: \"retro-grid\",\n    description: \"An animated scrolling retro grid effect\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/retro-grid.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/retro-grid.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-list\": {\n    name: \"animated-list\",\n    description: \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-list.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-list.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-shiny-text\": {\n    name: \"animated-shiny-text\",\n    description: \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-shiny-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-shiny-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-grid-pattern\": {\n    name: \"animated-grid-pattern\",\n    description: \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-grid-pattern.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-grid-pattern.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"border-beam\": {\n    name: \"border-beam\",\n    description: \"An animated beam of light which travels along the border of its container.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/border-beam.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/border-beam.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam\": {\n    name: \"animated-beam\",\n    description: \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-beam.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-beam.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-reveal\": {\n    name: \"text-reveal\",\n    description: \"Fade in text as you scroll down the page.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/text-reveal.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/text-reveal.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"hyper-text\": {\n    name: \"hyper-text\",\n    description: \"A text animation that scrambles letters before revealing the final text.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/hyper-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/hyper-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-gradient-text\": {\n    name: \"animated-gradient-text\",\n    description: \"An animated gradient background which transitions between colors for text.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-gradient-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-gradient-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"orbiting-circles\": {\n    name: \"orbiting-circles\",\n    description: \"A collection of circles which move in orbit along a circular path\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/orbiting-circles.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/orbiting-circles.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dock\": {\n    name: \"dock\",\n    description: \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/dock.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/dock.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"word-rotate\": {\n    name: \"word-rotate\",\n    description: \"A vertical rotation of words\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/word-rotate.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/word-rotate.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"avatar-circles\": {\n    name: \"avatar-circles\",\n    description: \"Overlapping circles of avatars.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/avatar-circles.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/avatar-circles.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation\": {\n    name: \"typing-animation\",\n    description: \"Characters appearing in typed animation\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/typing-animation.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/typing-animation.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"sparkles-text\": {\n    name: \"sparkles-text\",\n    description: \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/sparkles-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/sparkles-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"spinning-text\": {\n    name: \"spinning-text\",\n    description: \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/spinning-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/spinning-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"comic-text\": {\n    name: \"comic-text\",\n    description: \"Comic text animation\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/comic-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/comic-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"icon-cloud\": {\n    name: \"icon-cloud\",\n    description: \"An interactive 3D tag cloud component\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/icon-cloud.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/icon-cloud.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate\": {\n    name: \"text-animate\",\n    description: \"A text animation component that animates text using a variety of different animations.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/text-animate.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/text-animate.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"scroll-based-velocity\": {\n    name: \"scroll-based-velocity\",\n    description: \"Scrolling text whose speed changes based on scroll speed\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/scroll-based-velocity.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/scroll-based-velocity.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shiny-button\": {\n    name: \"shiny-button\",\n    description: \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/shiny-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/shiny-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shine-border\": {\n    name: \"shine-border\",\n    description: \"Shine border is an animated background border effect.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/shine-border.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/shine-border.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-circular-progress-bar\": {\n    name: \"animated-circular-progress-bar\",\n    description: \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-circular-progress-bar.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-circular-progress-bar.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti\": {\n    name: \"confetti\",\n    description: \"Confetti animations are best used to delight your users when something special happens\",\n    type: \"registry:ui\",\n    registryDependencies: [\"button\"],\n    files: [{\n      path: \"registry/magicui/confetti.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/confetti.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"cool-mode\": {\n    name: \"cool-mode\",\n    description: \"Cool mode effect for buttons, links, and other DOMs\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/cool-mode.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/cool-mode.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pulsating-button\": {\n    name: \"pulsating-button\",\n    description: \"An animated pulsating button useful for capturing attention of users.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/pulsating-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/pulsating-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"ripple-button\": {\n    name: \"ripple-button\",\n    description: \"An animated button with ripple useful for user engagement.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/ripple-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/ripple-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"file-tree\": {\n    name: \"file-tree\",\n    description: \"A component used to showcase the folder and file structure of a directory.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/file-tree.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/file-tree.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"blur-fade\": {\n    name: \"blur-fade\",\n    description: \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/blur-fade.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/blur-fade.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"safari\": {\n    name: \"safari\",\n    description: \"A safari browser mockup to showcase your website.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/safari.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/safari.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"iphone\": {\n    name: \"iphone\",\n    description: \"A mockup of the iPhone\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/iphone.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/iphone.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"rainbow-button\": {\n    name: \"rainbow-button\",\n    description: \"An animated button with a rainbow effect.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/rainbow-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/rainbow-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"interactive-hover-button\": {\n    name: \"interactive-hover-button\",\n    description: \"\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/interactive-hover-button.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/interactive-hover-button.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"terminal\": {\n    name: \"terminal\",\n    description: \"A terminal component\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/terminal.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/terminal.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"video-text\": {\n    name: \"video-text\",\n    description: \"A component that displays text with a video playing in the background.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/video-text.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/video-text.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pixel-image\": {\n    name: \"pixel-image\",\n    description: \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/pixel-image.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/pixel-image.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"highlighter\": {\n    name: \"highlighter\",\n    description: \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/highlighter.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/highlighter.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-theme-toggler\": {\n    name: \"animated-theme-toggler\",\n    description: \"A component for theme changing animation.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/animated-theme-toggler.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/animated-theme-toggler.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"light-rays\": {\n    name: \"light-rays\",\n    description: \"A component with animated light rays which shine down from above.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/light-rays.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/light-rays.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dotted-map\": {\n    name: \"dotted-map\",\n    description: \"A component with a dotted map.\",\n    type: \"registry:ui\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/magicui/dotted-map.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/magicui/dotted-map.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"magic-card-demo\": {\n    name: \"magic-card-demo\",\n    description: \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/magic-card\"],\n    files: [{\n      path: \"registry/example/magic-card-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/magic-card-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"magic-card-demo-2\": {\n    name: \"magic-card-demo-2\",\n    description: \"Example showing a magic card with an orb effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/magic-card\",\"@magicui/avatar-circles\"],\n    files: [{\n      path: \"registry/example/magic-card-demo2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/magic-card-demo2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"android-demo\": {\n    name: \"android-demo\",\n    description: \"Example showing a mockup of an Android device.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [{\n      path: \"registry/example/android-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/android-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"android-demo-2\": {\n    name: \"android-demo-2\",\n    description: \"Second example showing a mockup of an Android device.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [{\n      path: \"registry/example/android-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/android-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"android-demo-3\": {\n    name: \"android-demo-3\",\n    description: \"Third example showing a mockup of an Android device.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [{\n      path: \"registry/example/android-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/android-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"warp-background-demo\": {\n    name: \"warp-background-demo\",\n    description: \"Example showing a card with a time warping background effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/warp-background\"],\n    files: [{\n      path: \"registry/example/warp-background-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/warp-background-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"line-shadow-text-demo\": {\n    name: \"line-shadow-text-demo\",\n    description: \"Example showing a text component with a moving line shadow.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/line-shadow-text\"],\n    files: [{\n      path: \"registry/example/line-shadow-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/line-shadow-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"aurora-text-demo\": {\n    name: \"aurora-text-demo\",\n    description: \"Example showing a beautiful aurora text effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/aurora-text\"],\n    files: [{\n      path: \"registry/example/aurora-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/aurora-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"morphing-text-demo\": {\n    name: \"morphing-text-demo\",\n    description: \"Example showing a dynamic text morphing component.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/morphing-text\"],\n    files: [{\n      path: \"registry/example/morphing-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/morphing-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"scroll-progress-demo\": {\n    name: \"scroll-progress-demo\",\n    description: \"Example showing animated scroll progress for your pages.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/scroll-progress\"],\n    files: [{\n      path: \"registry/example/scroll-progress-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/scroll-progress-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"lens-demo\": {\n    name: \"lens-demo\",\n    description: \"Example showing a lens effect component\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"card\",\"@magicui/lens\"],\n    files: [{\n      path: \"registry/example/lens-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/lens-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"lens-demo-2\": {\n    name: \"lens-demo-2\",\n    description: \"Second example showing a lens effect component\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"card\",\"@magicui/lens\"],\n    files: [{\n      path: \"registry/example/lens-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/lens-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"lens-demo-3\": {\n    name: \"lens-demo-3\",\n    description: \"Third example showing a lens effect component\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"card\",\"@magicui/lens\"],\n    files: [{\n      path: \"registry/example/lens-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/lens-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pointer-demo-1\": {\n    name: \"pointer-demo-1\",\n    description: \"Example showing a pointer effect component\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/pointer\"],\n    files: [{\n      path: \"registry/example/pointer-demo-1.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/pointer-demo-1.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"smooth-cursor-demo\": {\n    name: \"smooth-cursor-demo\",\n    description: \"Basic smooth cursor example\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/smooth-cursor\"],\n    files: [{\n      path: \"registry/example/smooth-cursor-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/smooth-cursor-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"progressive-blur-demo\": {\n    name: \"progressive-blur-demo\",\n    description: \"Example showing progressive blur effect for scrollable content.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/progressive-blur\"],\n    files: [{\n      path: \"registry/example/progressive-blur-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/progressive-blur-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"neon-gradient-card-demo\": {\n    name: \"neon-gradient-card-demo\",\n    description: \"Example showing a beautiful neon card effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/neon-gradient-card\"],\n    files: [{\n      path: \"registry/example/neon-gradient-card-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/neon-gradient-card-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"meteors-demo\": {\n    name: \"meteors-demo\",\n    description: \"Example showing a meteor shower effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/meteors\"],\n    files: [{\n      path: \"registry/example/meteors-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/meteors-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"grid-pattern-demo\": {\n    name: \"grid-pattern-demo\",\n    description: \"Example showing a background grid pattern made with SVGs.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [{\n      path: \"registry/example/grid-pattern-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/grid-pattern-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"striped-pattern-demo\": {\n    name: \"striped-pattern-demo\",\n    description: \"Example showing a background striped pattern made with SVGs.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [{\n      path: \"registry/example/striped-pattern-demo.tsx\",\n      type: \"registry:example\",\n      target: \"components/striped-pattern-demo.tsx\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/striped-pattern-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"striped-pattern-dashed\": {\n    name: \"striped-pattern-dashed\",\n    description: \"Example showing a background striped pattern with a dashed stroke.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [{\n      path: \"registry/example/striped-pattern-dashed.tsx\",\n      type: \"registry:example\",\n      target: \"components/striped-pattern-dashed.tsx\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/striped-pattern-dashed.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"striped-pattern-right\": {\n    name: \"striped-pattern-right\",\n    description: \"Example showing a background striped pattern slanting to the right using SVG.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [{\n      path: \"registry/example/striped-pattern-right.tsx\",\n      type: \"registry:example\",\n      target: \"components/striped-pattern-right.tsx\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/striped-pattern-right.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"grid-pattern-linear-gradient\": {\n    name: \"grid-pattern-linear-gradient\",\n    description: \"Example showing a grid pattern with linear gradient effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [{\n      path: \"registry/example/grid-pattern-linear-gradient.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/grid-pattern-linear-gradient.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"grid-pattern-dashed\": {\n    name: \"grid-pattern-dashed\",\n    description: \"Example showing a dashed grid pattern.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [{\n      path: \"registry/example/grid-pattern-dashed.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/grid-pattern-dashed.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dot-pattern-demo\": {\n    name: \"dot-pattern-demo\",\n    description: \"Example showing a background dot pattern made with SVGs.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [{\n      path: \"registry/example/dot-pattern-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dot-pattern-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dot-pattern-linear-gradient\": {\n    name: \"dot-pattern-linear-gradient\",\n    description: \"Example showing a dot pattern with linear gradient effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [{\n      path: \"registry/example/dot-pattern-linear-gradient.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dot-pattern-linear-gradient.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dot-pattern-with-glow-effect\": {\n    name: \"dot-pattern-with-glow-effect\",\n    description: \"Example showing a dot pattern with glow effect\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [{\n      path: \"registry/example/dot-pattern-with-glow-effect.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dot-pattern-with-glow-effect.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"flickering-grid-demo\": {\n    name: \"flickering-grid-demo\",\n    description: \"Example showing a flickering grid background.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/flickering-grid\"],\n    files: [{\n      path: \"registry/example/flickering-grid-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/flickering-grid-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"flickering-grid-rounded-demo\": {\n    name: \"flickering-grid-rounded-demo\",\n    description: \"Example showing a flickering grid background with rounded corners.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/flickering-grid\"],\n    files: [{\n      path: \"registry/example/flickering-grid-rounded-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/flickering-grid-rounded-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"hero-video-dialog-demo\": {\n    name: \"hero-video-dialog-demo\",\n    description: \"Example showing a hero video dialog component.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/hero-video-dialog\"],\n    files: [{\n      path: \"registry/example/hero-video-dialog-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/hero-video-dialog-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"hero-video-dialog-demo-top-in-bottom-out\": {\n    name: \"hero-video-dialog-demo-top-in-bottom-out\",\n    description: \"Example showing a hero video dialog with top-in bottom-out animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/hero-video-dialog\"],\n    files: [{\n      path: \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"code-comparison-demo\": {\n    name: \"code-comparison-demo\",\n    description: \"Example showing a component which compares two code snippets.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/code-comparison\"],\n    files: [{\n      path: \"registry/example/code-comparison-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/code-comparison-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"marquee-demo\": {\n    name: \"marquee-demo\",\n    description: \"Example showing an infinite scrolling component.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [{\n      path: \"registry/example/marquee-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/marquee-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"marquee-demo-vertical\": {\n    name: \"marquee-demo-vertical\",\n    description: \"Example showing a vertical infinite scrolling component.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [{\n      path: \"registry/example/marquee-demo-vertical.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/marquee-demo-vertical.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"marquee-logos\": {\n    name: \"marquee-logos\",\n    description: \"Example showing an infinite scrolling logo carousel.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [{\n      path: \"registry/example/marquee-logos.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/marquee-logos.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"marquee-3d\": {\n    name: \"marquee-3d\",\n    description: \"Example showing a 3D infinite scrolling component.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [{\n      path: \"registry/example/marquee-3d.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/marquee-3d.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"globe-demo\": {\n    name: \"globe-demo\",\n    description: \"Example showing an autorotating, interactive WebGL globe.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/globe\"],\n    files: [{\n      path: \"registry/example/globe-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/globe-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"tweet-card-demo\": {\n    name: \"tweet-card-demo\",\n    description: \"Example showing a tweet card with author info.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/client-tweet-card\",\"@magicui/tweet-card\"],\n    files: [{\n      path: \"registry/example/tweet-card-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/tweet-card-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"tweet-card-images\": {\n    name: \"tweet-card-images\",\n    description: \"Example showing a tweet card with images.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/client-tweet-card\",\"@magicui/tweet-card\"],\n    files: [{\n      path: \"registry/example/tweet-card-images.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/tweet-card-images.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"tweet-card-meta-preview\": {\n    name: \"tweet-card-meta-preview\",\n    description: \"Example showing a tweet card with meta preview.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/client-tweet-card\",\"@magicui/tweet-card\"],\n    files: [{\n      path: \"registry/example/tweet-card-meta-preview.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/tweet-card-meta-preview.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shimmer-button-demo\": {\n    name: \"shimmer-button-demo\",\n    description: \"Example showing a button with a shimmering light effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/shimmer-button\"],\n    files: [{\n      path: \"registry/example/shimmer-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/shimmer-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"bento-demo\": {\n    name: \"bento-demo\",\n    description: \"Example showing a bento grid layout for showcasing features.\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"calendar\",\"@magicui/marquee\",\"@magicui/bento-grid\",\"@magicui/animated-beam\",\"@magicui/animated-list\",\"@magicui/animated-beam-multiple-outputs\",\"@magicui/animated-list-demo\"],\n    files: [{\n      path: \"registry/example/bento-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/bento-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"bento-demo-vertical\": {\n    name: \"bento-demo-vertical\",\n    description: \"Example showing a vertical bento grid layout.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/bento-grid\"],\n    files: [{\n      path: \"registry/example/bento-demo-vertical.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/bento-demo-vertical.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"number-ticker-demo\": {\n    name: \"number-ticker-demo\",\n    description: \"Example showing animated counting numbers.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [{\n      path: \"registry/example/number-ticker-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/number-ticker-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"number-ticker-demo-2\": {\n    name: \"number-ticker-demo-2\",\n    description: \"Example showing animated counting numbers.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [{\n      path: \"registry/example/number-ticker-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/number-ticker-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"number-ticker-decimal-demo\": {\n    name: \"number-ticker-decimal-demo\",\n    description: \"Example showing animated counting decimal numbers.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [{\n      path: \"registry/example/number-ticker-decimal-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/number-ticker-decimal-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"ripple-demo\": {\n    name: \"ripple-demo\",\n    description: \"Example showing an animated ripple effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/ripple\"],\n    files: [{\n      path: \"registry/example/ripple-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/ripple-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"retro-grid-demo\": {\n    name: \"retro-grid-demo\",\n    description: \"Example showing an animated scrolling retro grid effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/retro-grid\"],\n    files: [{\n      path: \"registry/example/retro-grid-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/retro-grid-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-list-demo\": {\n    name: \"animated-list-demo\",\n    description: \"Example showing a list with sequenced item animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-list\"],\n    files: [{\n      path: \"registry/example/animated-list-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-list-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-shiny-text-demo\": {\n    name: \"animated-shiny-text-demo\",\n    description: \"Example showing text with a shimmering light effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-shiny-text\"],\n    files: [{\n      path: \"registry/example/animated-shiny-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-shiny-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"particles-demo\": {\n    name: \"particles-demo\",\n    description: \"Example showing interactive particle effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/particles\"],\n    files: [{\n      path: \"registry/example/particles-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/particles-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-grid-pattern-demo\": {\n    name: \"animated-grid-pattern-demo\",\n    description: \"Example showing an animated grid pattern background.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-grid-pattern\"],\n    files: [{\n      path: \"registry/example/animated-grid-pattern-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-grid-pattern-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"interactive-grid-pattern-demo\": {\n    name: \"interactive-grid-pattern-demo\",\n    description: \"Example showing an interactive grid pattern background.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/interactive-grid-pattern\"],\n    files: [{\n      path: \"registry/example/interactive-grid-pattern-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/interactive-grid-pattern-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"interactive-grid-pattern-demo-2\": {\n    name: \"interactive-grid-pattern-demo-2\",\n    description: \"Second example showing an interactive grid pattern background.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/interactive-grid-pattern\"],\n    files: [{\n      path: \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/interactive-grid-pattern-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"border-beam-demo\": {\n    name: \"border-beam-demo\",\n    description: \"Example showing an animated border beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/border-beam\"],\n    files: [{\n      path: \"registry/example/border-beam-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/border-beam-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"border-beam-demo-2\": {\n    name: \"border-beam-demo-2\",\n    description: \"Example showing an animated border beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"card\",\"@magicui/border-beam\"],\n    files: [{\n      path: \"registry/example/border-beam-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/border-beam-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"border-beam-demo-3\": {\n    name: \"border-beam-demo-3\",\n    description: \"Example showing an animated border beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"card\",\"input\",\"label\",\"@magicui/border-beam\"],\n    files: [{\n      path: \"registry/example/border-beam-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/border-beam-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"border-beam-demo-4\": {\n    name: \"border-beam-demo-4\",\n    description: \"Example showing an animated border beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"@magicui/border-beam\"],\n    files: [{\n      path: \"registry/example/border-beam-demo-4.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/border-beam-demo-4.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam-demo\": {\n    name: \"animated-beam-demo\",\n    description: \"Example showing an animated beam of light effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [{\n      path: \"registry/example/animated-beam-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-beam-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam-unidirectional\": {\n    name: \"animated-beam-unidirectional\",\n    description: \"Example showing a unidirectional animated beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [{\n      path: \"registry/example/animated-beam-unidirectional.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-beam-unidirectional.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam-bidirectional\": {\n    name: \"animated-beam-bidirectional\",\n    description: \"Example showing a bidirectional animated beam effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [{\n      path: \"registry/example/animated-beam-bidirectional.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-beam-bidirectional.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam-multiple-inputs\": {\n    name: \"animated-beam-multiple-inputs\",\n    description: \"Example showing animated beams with multiple input points.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [{\n      path: \"registry/example/animated-beam-multiple-inputs.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-beam-multiple-inputs.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-beam-multiple-outputs\": {\n    name: \"animated-beam-multiple-outputs\",\n    description: \"Example showing animated beams with multiple output points.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [{\n      path: \"registry/example/animated-beam-multiple-outputs.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-beam-multiple-outputs.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-reveal-demo\": {\n    name: \"text-reveal-demo\",\n    description: \"Example showing text that fades in on scroll.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-reveal\"],\n    files: [{\n      path: \"registry/example/text-reveal-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-reveal-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-gradient-text-demo\": {\n    name: \"animated-gradient-text-demo\",\n    description: \"Example showing text with animated gradient backgrounds.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-gradient-text\"],\n    files: [{\n      path: \"registry/example/animated-gradient-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-gradient-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-gradient-text-demo-2\": {\n    name: \"animated-gradient-text-demo-2\",\n    description: \"Second example showing text with animated gradient backgrounds.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-gradient-text\"],\n    files: [{\n      path: \"registry/example/animated-gradient-text-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-gradient-text-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"orbiting-circles-demo\": {\n    name: \"orbiting-circles-demo\",\n    description: \"Example showing circles moving in orbital paths.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/orbiting-circles\"],\n    files: [{\n      path: \"registry/example/orbiting-circles-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/orbiting-circles-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dock-demo\": {\n    name: \"dock-demo\",\n    description: \"Example showing a MacOS-style dock implementation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"button\",\"@magicui/dock\"],\n    files: [{\n      path: \"registry/example/dock-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dock-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dock-demo-2\": {\n    name: \"dock-demo-2\",\n    description: \"Second example showing a MacOS-style dock implementation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dock\"],\n    files: [{\n      path: \"registry/example/dock-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dock-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dock-demo-3\": {\n    name: \"dock-demo-3\",\n    description: \"Third example showing a MacOS-style dock implementation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dock\"],\n    files: [{\n      path: \"registry/example/dock-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dock-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"word-rotate-demo\": {\n    name: \"word-rotate-demo\",\n    description: \"Example showing vertical word rotation animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/word-rotate\"],\n    files: [{\n      path: \"registry/example/word-rotate-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/word-rotate-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"hyper-text-demo\": {\n    name: \"hyper-text-demo\",\n    description: \"Example showing text with scrambling letter animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/hyper-text\"],\n    files: [{\n      path: \"registry/example/hyper-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/hyper-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"avatar-circles-demo\": {\n    name: \"avatar-circles-demo\",\n    description: \"Example showing overlapping avatar circles.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/avatar-circles\"],\n    files: [{\n      path: \"registry/example/avatar-circles-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/avatar-circles-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo\": {\n    name: \"typing-animation-demo\",\n    description: \"Example showing typed character animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-2\": {\n    name: \"typing-animation-demo-2\",\n    description: \"Example showing multiple words with looping.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-3\": {\n    name: \"typing-animation-demo-3\",\n    description: \"Example showing custom typing and deleting speeds.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-4\": {\n    name: \"typing-animation-demo-4\",\n    description: \"Example showing animation that starts when in viewport.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-4.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-4.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-5\": {\n    name: \"typing-animation-demo-5\",\n    description: \"Example showing typing animation without cursor.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-5.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-5.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-6\": {\n    name: \"typing-animation-demo-6\",\n    description: \"Example showing single play without looping.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-6.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-6.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-7\": {\n    name: \"typing-animation-demo-7\",\n    description: \"Example showing cursor blinking control.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-7.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-7.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"typing-animation-demo-8\": {\n    name: \"typing-animation-demo-8\",\n    description: \"Example showing different cursor styles (line, block, underscore).\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [{\n      path: \"registry/example/typing-animation-demo-8.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/typing-animation-demo-8.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"scroll-based-velocity-demo\": {\n    name: \"scroll-based-velocity-demo\",\n    description: \"Example showing text speed changes based on scroll velocity.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/scroll-based-velocity\"],\n    files: [{\n      path: \"registry/example/scroll-based-velocity-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/scroll-based-velocity-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"scroll-based-velocity-images-demo\": {\n    name: \"scroll-based-velocity-images-demo\",\n    description: \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/scroll-based-velocity\"],\n    files: [{\n      path: \"registry/example/scroll-based-velocity-images-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/scroll-based-velocity-images-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"sparkles-text-demo\": {\n    name: \"sparkles-text-demo\",\n    description: \"Example showing text with animated sparkle effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/sparkles-text\"],\n    files: [{\n      path: \"registry/example/sparkles-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/sparkles-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"spinning-text-demo\": {\n    name: \"spinning-text-demo\",\n    description: \"Example showing spinning text animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/spinning-text\"],\n    files: [{\n      path: \"registry/example/spinning-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/spinning-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"spinning-text-demo-2\": {\n    name: \"spinning-text-demo-2\",\n    description: \"Example showing spinning text animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/spinning-text\"],\n    files: [{\n      path: \"registry/example/spinning-text-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/spinning-text-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"comic-text-demo\": {\n    name: \"comic-text-demo\",\n    description: \"Example showing comic text animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/comic-text\"],\n    files: [{\n      path: \"registry/example/comic-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/comic-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"icon-cloud-demo\": {\n    name: \"icon-cloud-demo\",\n    description: \"Example showing an interactive 3D icon cloud.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [{\n      path: \"registry/example/icon-cloud-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/icon-cloud-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"icon-cloud-demo-2\": {\n    name: \"icon-cloud-demo-2\",\n    description: \"Second example showing an interactive 3D icon cloud.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [{\n      path: \"registry/example/icon-cloud-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/icon-cloud-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"icon-cloud-demo-3\": {\n    name: \"icon-cloud-demo-3\",\n    description: \"Third example showing an interactive 3D icon cloud.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [{\n      path: \"registry/example/icon-cloud-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/icon-cloud-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo\": {\n    name: \"text-animate-demo\",\n    description: \"Example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-2\": {\n    name: \"text-animate-demo-2\",\n    description: \"Second example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-3\": {\n    name: \"text-animate-demo-3\",\n    description: \"Third example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-4\": {\n    name: \"text-animate-demo-4\",\n    description: \"Fourth example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-4.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-4.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-5\": {\n    name: \"text-animate-demo-5\",\n    description: \"Fifth example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-5.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-5.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-6\": {\n    name: \"text-animate-demo-6\",\n    description: \"Sixth example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-6.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-6.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-7\": {\n    name: \"text-animate-demo-7\",\n    description: \"Seventh example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-7.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-7.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-8\": {\n    name: \"text-animate-demo-8\",\n    description: \"Eighth example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-8.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-8.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"text-animate-demo-9\": {\n    name: \"text-animate-demo-9\",\n    description: \"Ninth example showing various text animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [{\n      path: \"registry/example/text-animate-demo-9.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/text-animate-demo-9.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shiny-button-demo\": {\n    name: \"shiny-button-demo\",\n    description: \"Example showing a shiny button with dynamic styles.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/shiny-button\"],\n    files: [{\n      path: \"registry/example/shiny-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/shiny-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-circular-progress-bar-demo\": {\n    name: \"animated-circular-progress-bar-demo\",\n    description: \"Example showing an animated circular progress gauge.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-circular-progress-bar\"],\n    files: [{\n      path: \"registry/example/animated-circular-progress-bar-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-circular-progress-bar-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shine-border-demo\": {\n    name: \"shine-border-demo\",\n    description: \"Example showing an animated shining border effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/shine-border\"],\n    files: [{\n      path: \"registry/example/shine-border-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/shine-border-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"shine-border-demo-2\": {\n    name: \"shine-border-demo-2\",\n    description: \"Second example showing an animated shining border effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/shine-border\"],\n    files: [{\n      path: \"registry/example/shine-border-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/shine-border-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-demo\": {\n    name: \"confetti-demo\",\n    description: \"Example showing confetti animations for celebrations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-basic-cannon\": {\n    name: \"confetti-basic-cannon\",\n    description: \"Example showing basic confetti cannon animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-basic-cannon.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-basic-cannon.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-random-direction\": {\n    name: \"confetti-random-direction\",\n    description: \"Example showing confetti with random directions.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-random-direction.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-random-direction.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-fireworks\": {\n    name: \"confetti-fireworks\",\n    description: \"Example showing fireworks-style confetti animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-fireworks.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-fireworks.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-stars\": {\n    name: \"confetti-stars\",\n    description: \"Example showing star-shaped confetti animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-stars.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-stars.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-side-cannons\": {\n    name: \"confetti-side-cannons\",\n    description: \"Example showing side-mounted confetti cannons.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-side-cannons.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-side-cannons.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-custom-shapes\": {\n    name: \"confetti-custom-shapes\",\n    description: \"Example showing confetti with custom shape particles.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-custom-shapes.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-custom-shapes.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"confetti-emoji\": {\n    name: \"confetti-emoji\",\n    description: \"Example showing confetti with emoji particles.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [{\n      path: \"registry/example/confetti-emoji.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/confetti-emoji.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"cool-mode-demo\": {\n    name: \"cool-mode-demo\",\n    description: \"Example showing cool mode effect for buttons and links.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/cool-mode\"],\n    files: [{\n      path: \"registry/example/cool-mode-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/cool-mode-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"cool-mode-custom\": {\n    name: \"cool-mode-custom\",\n    description: \"Example showing customized cool mode effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/cool-mode\"],\n    files: [{\n      path: \"registry/example/cool-mode-custom.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/cool-mode-custom.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pulsating-button-demo\": {\n    name: \"pulsating-button-demo\",\n    description: \"Example showing an animated pulsating button.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/pulsating-button\"],\n    files: [{\n      path: \"registry/example/pulsating-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/pulsating-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"ripple-button-demo\": {\n    name: \"ripple-button-demo\",\n    description: \"Example showing an animated button with ripple effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/ripple-button\"],\n    files: [{\n      path: \"registry/example/ripple-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/ripple-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"file-tree-demo\": {\n    name: \"file-tree-demo\",\n    description: \"Example showing a component that displays folder and file structure.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/file-tree\"],\n    files: [{\n      path: \"registry/example/file-tree-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/file-tree-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"blur-fade-demo\": {\n    name: \"blur-fade-demo\",\n    description: \"Example showing blur fade in and out animations.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/blur-fade\"],\n    files: [{\n      path: \"registry/example/blur-fade-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/blur-fade-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"blur-fade-text-demo\": {\n    name: \"blur-fade-text-demo\",\n    description: \"Example showing blur fade animations with text.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/blur-fade\"],\n    files: [{\n      path: \"registry/example/blur-fade-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/blur-fade-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"safari-demo\": {\n    name: \"safari-demo\",\n    description: \"Example showing a Safari browser mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [{\n      path: \"registry/example/safari-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/safari-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"safari-demo-2\": {\n    name: \"safari-demo-2\",\n    description: \"Second example showing a Safari browser mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [{\n      path: \"registry/example/safari-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/safari-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"safari-demo-3\": {\n    name: \"safari-demo-3\",\n    description: \"Third example showing a Safari browser mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [{\n      path: \"registry/example/safari-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/safari-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"safari-demo-4\": {\n    name: \"safari-demo-4\",\n    description: \"Fourth example showing a Safari browser mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [{\n      path: \"registry/example/safari-demo-4.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/safari-demo-4.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"iphone-demo\": {\n    name: \"iphone-demo\",\n    description: \"Example showing an iPhone mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [{\n      path: \"registry/example/iphone-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/iphone-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"iphone-demo-2\": {\n    name: \"iphone-demo-2\",\n    description: \"Second example showing an iPhone mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [{\n      path: \"registry/example/iphone-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/iphone-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"iphone-demo-3\": {\n    name: \"iphone-demo-3\",\n    description: \"Third example showing an iPhone mockup.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [{\n      path: \"registry/example/iphone-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/iphone-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"rainbow-button-demo\": {\n    name: \"rainbow-button-demo\",\n    description: \"Example showing an animated button with rainbow effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/rainbow-button\"],\n    files: [{\n      path: \"registry/example/rainbow-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/rainbow-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"rainbow-button-demo-2\": {\n    name: \"rainbow-button-demo-2\",\n    description: \"Example showing an animated button with rainbow effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/rainbow-button\"],\n    files: [{\n      path: \"registry/example/rainbow-button-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/rainbow-button-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"interactive-hover-button-demo\": {\n    name: \"interactive-hover-button-demo\",\n    description: \"Example showing an interactive button with hover effects.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/interactive-hover-button\"],\n    files: [{\n      path: \"registry/example/interactive-hover-button-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/interactive-hover-button-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"terminal-demo\": {\n    name: \"terminal-demo\",\n    description: \"Example showing a terminal with animated text.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/terminal\"],\n    files: [{\n      path: \"registry/example/terminal-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/terminal-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"terminal-demo-2\": {\n    name: \"terminal-demo-2\",\n    description: \"Example showing a terminal with animated text and custom delays\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/terminal\"],\n    files: [{\n      path: \"registry/example/terminal-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/terminal-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"video-text-demo\": {\n    name: \"video-text-demo\",\n    description: \"Example showing text with a video background.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/video-text\"],\n    files: [{\n      path: \"registry/example/video-text-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/video-text-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"pixel-image-demo\": {\n    name: \"pixel-image-demo\",\n    description: \"Example showing a pixelated image effect.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/pixel-image\"],\n    files: [{\n      path: \"registry/example/pixel-image-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/pixel-image-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"highlighter-demo\": {\n    name: \"highlighter-demo\",\n    description: \"Example showing the demo of a Highlighter\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/highlighter\"],\n    files: [{\n      path: \"registry/example/highlighter-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    },{\n      path: \"registry/magicui/highlighter.tsx\",\n      type: \"registry:ui\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/highlighter-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"animated-theme-toggler-demo\": {\n    name: \"animated-theme-toggler-demo\",\n    description: \"Example showing animation while changing the theme.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/animated-theme-toggler\"],\n    files: [{\n      path: \"registry/example/animated-theme-toggler-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/animated-theme-toggler-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"light-rays-demo\": {\n    name: \"light-rays-demo\",\n    description: \"Demo of the light-rays component showcasing animated light rays\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/light-rays\"],\n    files: [{\n      path: \"registry/example/light-rays-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/light-rays-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dotted-map-demo\": {\n    name: \"dotted-map-demo\",\n    description: \"Example showing a dotted map.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    files: [{\n      path: \"registry/example/dotted-map-demo.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dotted-map-demo.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dotted-map-demo-2\": {\n    name: \"dotted-map-demo-2\",\n    description: \"Example showing a dotted map.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    files: [{\n      path: \"registry/example/dotted-map-demo-2.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dotted-map-demo-2.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"dotted-map-demo-3\": {\n    name: \"dotted-map-demo-3\",\n    description: \"Example showing a dotted map with pulse animation.\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    files: [{\n      path: \"registry/example/dotted-map-demo-3.tsx\",\n      type: \"registry:example\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/example/dotted-map-demo-3.tsx\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  \"utils\": {\n    name: \"utils\",\n    description: \"\",\n    type: \"registry:lib\",\n    registryDependencies: undefined,\n    files: [{\n      path: \"registry/lib/utils.ts\",\n      type: \"registry:lib\",\n      target: \"\"\n    }],\n    component: React.lazy(async () => {\n      const mod = await import(\"@/registry/lib/utils.ts\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    }),\n    meta: undefined,\n  },\n  }"
  },
  {
    "path": "apps/www/registry/example/android-demo-2.tsx",
    "content": "import { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android\n        className=\"size-full\"\n        src=\"https://images.unsplash.com/photo-1730326405863-c6fa7e499a6e?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/android-demo-3.tsx",
    "content": "import { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android\n        className=\"size-full\"\n        videoSrc=\"https://videos.pexels.com/video-files/14993748/14993748-uhd_1296_2304_30fps.mp4\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/android-demo.tsx",
    "content": "import { Android } from \"@/registry/magicui/android\"\n\nexport default function AndroidDemo() {\n  return (\n    <div className=\"relative\">\n      <Android className=\"size-full\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-beam-bidirectional.tsx",
    "content": "\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.user />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.openai />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n        startYOffset={10}\n        endYOffset={10}\n        curvature={-20}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n        startYOffset={-10}\n        endYOffset={-10}\n        curvature={20}\n        reverse\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  openai: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-beam-demo.tsx",
    "content": "\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex h-[300px] w-full items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-h-[200px] max-w-lg flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.googleDocs />\n          </Circle>\n        </div>\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div2Ref}>\n            <Icons.notion />\n          </Circle>\n          <Circle ref={div4Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n          <Circle ref={div6Ref}>\n            <Icons.zapier />\n          </Circle>\n        </div>\n        <div className=\"flex flex-row items-center justify-between\">\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div7Ref}>\n            <Icons.messenger />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div4Ref}\n        curvature={-75}\n        endYOffset={-10}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div4Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div4Ref}\n        curvature={75}\n        endYOffset={10}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div4Ref}\n        curvature={-75}\n        endYOffset={-10}\n        reverse\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div4Ref}\n        reverse\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div7Ref}\n        toRef={div4Ref}\n        curvature={75}\n        endYOffset={10}\n        reverse\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-beam-multiple-inputs.tsx",
    "content": "\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"border-border z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamMultipleOutputDemo({\n  className,\n}: {\n  className?: string\n}) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\",\n        className\n      )}\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\">\n        <div className=\"flex flex-col justify-center gap-2\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.googleDocs />\n          </Circle>\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div4Ref}>\n            <Icons.messenger />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.notion />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div6Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div7Ref}>\n            <Icons.user />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div4Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div6Ref}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div7Ref}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-beam-multiple-outputs.tsx",
    "content": "\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamMultipleOutputDemo({\n  className,\n}: {\n  className?: string\n}) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n  const div3Ref = useRef<HTMLDivElement>(null)\n  const div4Ref = useRef<HTMLDivElement>(null)\n  const div5Ref = useRef<HTMLDivElement>(null)\n  const div6Ref = useRef<HTMLDivElement>(null)\n  const div7Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full items-center justify-center overflow-hidden p-10\",\n        className\n      )}\n      ref={containerRef}\n    >\n      <div className=\"flex size-full max-w-lg flex-row items-stretch justify-between gap-10\">\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div7Ref}>\n            <Icons.user />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center\">\n          <Circle ref={div6Ref} className=\"size-16\">\n            <Icons.openai />\n          </Circle>\n        </div>\n        <div className=\"flex flex-col justify-center gap-2\">\n          <Circle ref={div1Ref}>\n            <Icons.googleDrive />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.googleDocs />\n          </Circle>\n          <Circle ref={div3Ref}>\n            <Icons.whatsapp />\n          </Circle>\n          <Circle ref={div4Ref}>\n            <Icons.messenger />\n          </Circle>\n          <Circle ref={div5Ref}>\n            <Icons.notion />\n          </Circle>\n        </div>\n      </div>\n\n      {/* AnimatedBeams */}\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div2Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div3Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div4Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div5Ref}\n        toRef={div6Ref}\n        duration={3}\n      />\n      <AnimatedBeam\n        containerRef={containerRef}\n        fromRef={div6Ref}\n        toRef={div7Ref}\n        duration={3}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  googleDocs: () => (\n    <svg\n      width=\"47px\"\n      height=\"65px\"\n      viewBox=\"0 0 47 65\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-1\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-3\"\n        />\n        <linearGradient\n          x1=\"50.0053945%\"\n          y1=\"8.58610612%\"\n          x2=\"50.0053945%\"\n          y2=\"100.013939%\"\n          id=\"linearGradient-5\"\n        >\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.2\" offset=\"0%\" />\n          <stop stopColor=\"#1A237E\" stopOpacity=\"0.02\" offset=\"100%\" />\n        </linearGradient>\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-6\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-8\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-10\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-12\"\n        />\n        <path\n          d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n          id=\"path-14\"\n        />\n        <radialGradient\n          cx=\"3.16804688%\"\n          cy=\"2.71744318%\"\n          fx=\"3.16804688%\"\n          fy=\"2.71744318%\"\n          r=\"161.248516%\"\n          gradientTransform=\"translate(0.031680,0.027174),scale(1.000000,0.723077),translate(-0.031680,-0.027174)\"\n          id=\"radialGradient-16\"\n        >\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0.1\" offset=\"0%\" />\n          <stop stopColor=\"#FFFFFF\" stopOpacity=\"0\" offset=\"100%\" />\n        </radialGradient>\n      </defs>\n      <g\n        id=\"Page-1\"\n        stroke=\"none\"\n        strokeWidth=\"1\"\n        fill=\"none\"\n        fillRule=\"evenodd\"\n      >\n        <g transform=\"translate(-451.000000, -463.000000)\">\n          <g id=\"Hero\" transform=\"translate(0.000000, 63.000000)\">\n            <g id=\"Personal\" transform=\"translate(277.000000, 309.000000)\">\n              <g id=\"Docs-icon\" transform=\"translate(174.000000, 91.000000)\">\n                <g id=\"Group\">\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-2\" fill=\"white\">\n                      <use xlinkHref=\"#path-1\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L36.71875,10.3409091 L29.375,0 Z\"\n                      id=\"Path\"\n                      fill=\"#4285F4\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-2)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-4\" fill=\"white\">\n                      <use xlinkHref=\"#path-3\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <polygon\n                      id=\"Path\"\n                      fill=\"url(#linearGradient-5)\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-4)\"\n                      points=\"30.6638281 16.4309659 47 32.8582386 47 17.7272727\"\n                    ></polygon>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-7\" fill=\"white\">\n                      <use xlinkHref=\"#path-6\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M11.75,47.2727273 L35.25,47.2727273 L35.25,44.3181818 L11.75,44.3181818 L11.75,47.2727273 Z M11.75,53.1818182 L29.375,53.1818182 L29.375,50.2272727 L11.75,50.2272727 L11.75,53.1818182 Z M11.75,32.5 L11.75,35.4545455 L35.25,35.4545455 L35.25,32.5 L11.75,32.5 Z M11.75,41.3636364 L35.25,41.3636364 L35.25,38.4090909 L11.75,38.4090909 L11.75,41.3636364 Z\"\n                      id=\"Shape\"\n                      fill=\"#F1F1F1\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-7)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-9\" fill=\"white\">\n                      <use xlinkHref=\"#path-8\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <g id=\"Group\" mask=\"url(#mask-9)\">\n                      <g transform=\"translate(26.437500, -2.954545)\">\n                        <path\n                          d=\"M2.9375,2.95454545 L2.9375,16.25 C2.9375,18.6985795 4.90929688,20.6818182 7.34375,20.6818182 L20.5625,20.6818182 L2.9375,2.95454545 Z\"\n                          id=\"Path\"\n                          fill=\"#A1C2FA\"\n                          fillRule=\"nonzero\"\n                        />\n                      </g>\n                    </g>\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-11\" fill=\"white\">\n                      <use xlinkHref=\"#path-10\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,4.80113636 C0,2.36363636 1.9828125,0.369318182 4.40625,0.369318182 L29.375,0.369318182 L29.375,0 L4.40625,0 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#FFFFFF\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-11)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-13\" fill=\"white\">\n                      <use xlinkHref=\"#path-12\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M42.59375,64.6306818 L4.40625,64.6306818 C1.9828125,64.6306818 0,62.6363636 0,60.1988636 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,60.1988636 C47,62.6363636 45.0171875,64.6306818 42.59375,64.6306818 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.2\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-13)\"\n                    />\n                  </g>\n                  <g id=\"Clipped\">\n                    <mask id=\"mask-15\" fill=\"white\">\n                      <use xlinkHref=\"#path-14\" />\n                    </mask>\n                    <g id=\"SVGID_1_\" />\n                    <path\n                      d=\"M33.78125,17.7272727 C31.3467969,17.7272727 29.375,15.7440341 29.375,13.2954545 L29.375,13.6647727 C29.375,16.1133523 31.3467969,18.0965909 33.78125,18.0965909 L47,18.0965909 L47,17.7272727 L33.78125,17.7272727 Z\"\n                      id=\"Path\"\n                      fillOpacity=\"0.1\"\n                      fill=\"#1A237E\"\n                      fillRule=\"nonzero\"\n                      mask=\"url(#mask-15)\"\n                    />\n                  </g>\n                </g>\n                <path\n                  d=\"M29.375,0 L4.40625,0 C1.9828125,0 0,1.99431818 0,4.43181818 L0,60.5681818 C0,63.0056818 1.9828125,65 4.40625,65 L42.59375,65 C45.0171875,65 47,63.0056818 47,60.5681818 L47,17.7272727 L29.375,0 Z\"\n                  id=\"Path\"\n                  fill=\"url(#radialGradient-16)\"\n                  fillRule=\"nonzero\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  ),\n  zapier: () => (\n    <svg\n      width=\"105\"\n      height=\"28\"\n      viewBox=\"0 0 244 66\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M57.1877 45.2253L57.1534 45.1166L78.809 25.2914V15.7391H44.0663V25.2914H64.8181L64.8524 25.3829L43.4084 45.2253V54.7775H79.1579V45.2253H57.1877Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M100.487 14.8297C96.4797 14.8297 93.2136 15.434 90.6892 16.6429C88.3376 17.6963 86.3568 19.4321 85.0036 21.6249C83.7091 23.8321 82.8962 26.2883 82.6184 28.832L93.1602 30.3135C93.5415 28.0674 94.3042 26.4754 95.4482 25.5373C96.7486 24.5562 98.3511 24.0605 99.9783 24.136C102.118 24.136 103.67 24.7079 104.634 25.8519C105.59 26.9959 106.076 28.5803 106.076 30.6681V31.7091H95.9401C90.7807 31.7091 87.0742 32.8531 84.8206 35.1411C82.5669 37.429 81.442 40.4492 81.4458 44.2014C81.4458 48.0452 82.5707 50.9052 84.8206 52.7813C87.0704 54.6574 89.8999 55.5897 93.3089 55.5783C97.5379 55.5783 100.791 54.1235 103.067 51.214C104.412 49.426 105.372 47.3793 105.887 45.2024H106.27L107.723 54.7546H117.275V30.5651C117.275 25.5659 115.958 21.6936 113.323 18.948C110.688 16.2024 106.409 14.8297 100.487 14.8297ZM103.828 44.6475C102.312 45.9116 100.327 46.5408 97.8562 46.5408C95.8199 46.5408 94.4052 46.1843 93.6121 45.4712C93.2256 45.1338 92.9182 44.7155 92.7116 44.246C92.505 43.7764 92.4043 43.2671 92.4166 42.7543C92.3941 42.2706 92.4702 41.7874 92.6403 41.3341C92.8104 40.8808 93.071 40.4668 93.4062 40.1174C93.7687 39.7774 94.1964 39.5145 94.6633 39.3444C95.1303 39.1743 95.6269 39.1006 96.1231 39.1278H106.093V39.7856C106.113 40.7154 105.919 41.6374 105.527 42.4804C105.134 43.3234 104.553 44.0649 103.828 44.6475Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M175.035 15.7391H163.75V54.7833H175.035V15.7391Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M241.666 15.7391C238.478 15.7391 235.965 16.864 234.127 19.1139C232.808 20.7307 231.805 23.1197 231.119 26.2809H230.787L229.311 15.7391H219.673V54.7775H230.959V34.7578C230.959 32.2335 231.55 30.2982 232.732 28.9521C233.914 27.606 236.095 26.933 239.275 26.933H243.559V15.7391H241.666Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M208.473 17.0147C205.839 15.4474 202.515 14.6657 198.504 14.6695C192.189 14.6695 187.247 16.4675 183.678 20.0634C180.108 23.6593 178.324 28.6166 178.324 34.9352C178.233 38.7553 179.067 42.5407 180.755 45.9689C182.3 49.0238 184.706 51.5592 187.676 53.2618C190.665 54.9892 194.221 55.8548 198.344 55.8586C201.909 55.8586 204.887 55.3095 207.278 54.2113C209.526 53.225 211.483 51.6791 212.964 49.7211C214.373 47.7991 215.42 45.6359 216.052 43.3377L206.329 40.615C205.919 42.1094 205.131 43.4728 204.041 44.5732C202.942 45.6714 201.102 46.2206 198.521 46.2206C195.451 46.2206 193.163 45.3416 191.657 43.5837C190.564 42.3139 189.878 40.5006 189.575 38.1498H216.201C216.31 37.0515 216.367 36.1306 216.367 35.387V32.9561C216.431 29.6903 215.757 26.4522 214.394 23.4839C213.118 20.7799 211.054 18.5248 208.473 17.0147ZM198.178 23.9758C202.754 23.9758 205.348 26.2275 205.962 30.731H189.775C190.032 29.2284 190.655 27.8121 191.588 26.607C193.072 24.8491 195.268 23.972 198.178 23.9758Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M169.515 0.00366253C168.666 -0.0252113 167.82 0.116874 167.027 0.421484C166.234 0.726094 165.511 1.187 164.899 1.77682C164.297 2.3723 163.824 3.08658 163.512 3.87431C163.2 4.66204 163.055 5.50601 163.086 6.35275C163.056 7.20497 163.201 8.05433 163.514 8.84781C163.826 9.64129 164.299 10.3619 164.902 10.9646C165.505 11.5673 166.226 12.0392 167.02 12.3509C167.814 12.6626 168.663 12.8074 169.515 12.7762C170.362 12.8082 171.206 12.6635 171.994 12.3514C172.782 12.0392 173.496 11.5664 174.091 10.963C174.682 10.3534 175.142 9.63077 175.446 8.83849C175.75 8.04621 175.89 7.20067 175.859 6.35275C175.898 5.50985 175.761 4.66806 175.456 3.88115C175.151 3.09424 174.686 2.37951 174.09 1.78258C173.493 1.18565 172.779 0.719644 171.992 0.414327C171.206 0.109011 170.364 -0.0288946 169.521 0.00938803L169.515 0.00366253Z\"\n        fill=\"#201515\"\n      />\n      <path\n        d=\"M146.201 14.6695C142.357 14.6695 139.268 15.8764 136.935 18.2902C135.207 20.0786 133.939 22.7479 133.131 26.2981H132.771L131.295 15.7563H121.657V66H132.942V45.3054H133.354C133.698 46.6852 134.181 48.0267 134.795 49.3093C135.75 51.3986 137.316 53.1496 139.286 54.3314C141.328 55.446 143.629 56.0005 145.955 55.9387C150.68 55.9387 154.277 54.0988 156.748 50.419C159.219 46.7392 160.455 41.6046 160.455 35.0153C160.455 28.6509 159.259 23.6689 156.869 20.0691C154.478 16.4694 150.922 14.6695 146.201 14.6695ZM147.345 42.9602C146.029 44.8668 143.97 45.8201 141.167 45.8201C140.012 45.8735 138.86 45.6507 137.808 45.1703C136.755 44.6898 135.832 43.9656 135.116 43.0574C133.655 41.2233 132.927 38.7122 132.931 35.5243V34.7807C132.931 31.5432 133.659 29.0646 135.116 27.3448C136.572 25.625 138.59 24.7747 141.167 24.7937C144.02 24.7937 146.092 25.6994 147.385 27.5107C148.678 29.322 149.324 31.8483 149.324 35.0896C149.332 38.4414 148.676 41.065 147.356 42.9602H147.345Z\"\n        fill=\"#201515\"\n      />\n      <path d=\"M39.0441 45.2253H0V54.789H39.0441V45.2253Z\" fill=\"#FF4F00\" />\n    </svg>\n  ),\n  messenger: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 48 48\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <radialGradient\n        id=\"8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1\"\n        cx=\"11.087\"\n        cy=\"7.022\"\n        r=\"47.612\"\n        gradientTransform=\"matrix(1 0 0 -1 0 50)\"\n        gradientUnits=\"userSpaceOnUse\"\n      >\n        <stop offset=\"0\" stopColor=\"#1292ff\"></stop>\n        <stop offset=\".079\" stopColor=\"#2982ff\"></stop>\n        <stop offset=\".23\" stopColor=\"#4e69ff\"></stop>\n        <stop offset=\".351\" stopColor=\"#6559ff\"></stop>\n        <stop offset=\".428\" stopColor=\"#6d53ff\"></stop>\n        <stop offset=\".754\" stopColor=\"#df47aa\"></stop>\n        <stop offset=\".946\" stopColor=\"#ff6257\"></stop>\n      </radialGradient>\n      <path\n        fill=\"url(#8O3wK6b5ASW2Wn6hRCB5xa_YFbzdUk7Q3F8_gr1)\"\n        d=\"M44,23.5C44,34.27,35.05,43,24,43c-1.651,0-3.25-0.194-4.784-0.564\tc-0.465-0.112-0.951-0.069-1.379,0.145L13.46,44.77C12.33,45.335,11,44.513,11,43.249v-4.025c0-0.575-0.257-1.111-0.681-1.499\tC6.425,34.165,4,29.11,4,23.5C4,12.73,12.95,4,24,4S44,12.73,44,23.5z\"\n      />\n      <path\n        d=\"M34.992,17.292c-0.428,0-0.843,0.142-1.2,0.411l-5.694,4.215\tc-0.133,0.1-0.28,0.15-0.435,0.15c-0.15,0-0.291-0.047-0.41-0.136l-3.972-2.99c-0.808-0.601-1.76-0.918-2.757-0.918\tc-1.576,0-3.025,0.791-3.876,2.116l-1.211,1.891l-4.12,6.695c-0.392,0.614-0.422,1.372-0.071,2.014\tc0.358,0.654,1.034,1.06,1.764,1.06c0.428,0,0.843-0.142,1.2-0.411l5.694-4.215c0.133-0.1,0.28-0.15,0.435-0.15\tc0.15,0,0.291,0.047,0.41,0.136l3.972,2.99c0.809,0.602,1.76,0.918,2.757,0.918c1.576,0,3.025-0.791,3.876-2.116l1.211-1.891\tl4.12-6.695c0.392-0.614,0.422-1.372,0.071-2.014C36.398,17.698,35.722,17.292,34.992,17.292L34.992,17.292z\"\n        opacity=\".05\"\n      />\n      <path\n        d=\"M34.992,17.792c-0.319,0-0.63,0.107-0.899,0.31l-5.697,4.218\tc-0.216,0.163-0.468,0.248-0.732,0.248c-0.259,0-0.504-0.082-0.71-0.236l-3.973-2.991c-0.719-0.535-1.568-0.817-2.457-0.817\tc-1.405,0-2.696,0.705-3.455,1.887l-1.21,1.891l-4.115,6.688c-0.297,0.465-0.32,1.033-0.058,1.511c0.266,0.486,0.787,0.8,1.325,0.8\tc0.319,0,0.63-0.107,0.899-0.31l5.697-4.218c0.216-0.163,0.468-0.248,0.732-0.248c0.259,0,0.504,0.082,0.71,0.236l3.973,2.991\tc0.719,0.535,1.568,0.817,2.457,0.817c1.405,0,2.696-0.705,3.455-1.887l1.21-1.891l4.115-6.688c0.297-0.465,0.32-1.033,0.058-1.511\tC36.051,18.106,35.531,17.792,34.992,17.792L34.992,17.792z\"\n        opacity=\".07\"\n      />\n      <path\n        fill=\"#ffffff\"\n        d=\"M34.394,18.501l-5.7,4.22c-0.61,0.46-1.44,0.46-2.04,0.01L22.68,19.74\tc-1.68-1.25-4.06-0.82-5.19,0.94l-1.21,1.89l-4.11,6.68c-0.6,0.94,0.55,2.01,1.44,1.34l5.7-4.22c0.61-0.46,1.44-0.46,2.04-0.01\tl3.974,2.991c1.68,1.25,4.06,0.82,5.19-0.94l1.21-1.89l4.11-6.68C36.434,18.901,35.284,17.831,34.394,18.501z\"\n      />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-beam-unidirectional.tsx",
    "content": "\"use client\"\n\nimport React, { forwardRef, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\"\n\nconst Circle = forwardRef<\n  HTMLDivElement,\n  { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"z-10 flex size-12 items-center justify-center rounded-full border-2 bg-white p-3 shadow-[0_0_20px_-12px_rgba(0,0,0,0.8)]\",\n        className\n      )}\n    >\n      {children}\n    </div>\n  )\n})\n\nCircle.displayName = \"Circle\"\n\nexport default function AnimatedBeamDemo() {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const div1Ref = useRef<HTMLDivElement>(null)\n  const div2Ref = useRef<HTMLDivElement>(null)\n\n  return (\n    <div\n      className=\"relative flex w-full max-w-[500px] items-center justify-center overflow-hidden p-10\"\n      ref={containerRef}\n    >\n      <div className=\"flex size-full flex-col items-stretch justify-between gap-10\">\n        <div className=\"flex flex-row justify-between\">\n          <Circle ref={div1Ref}>\n            <Icons.user />\n          </Circle>\n          <Circle ref={div2Ref}>\n            <Icons.openai />\n          </Circle>\n        </div>\n      </div>\n\n      <AnimatedBeam\n        duration={3}\n        containerRef={containerRef}\n        fromRef={div1Ref}\n        toRef={div2Ref}\n      />\n    </div>\n  )\n}\n\nconst Icons = {\n  openai: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  user: () => (\n    <svg\n      width=\"24\"\n      height=\"24\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"#000000\"\n      strokeWidth=\"2\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n      <circle cx=\"12\" cy=\"7\" r=\"4\" />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-circular-progress-bar-demo.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\nimport { AnimatedCircularProgressBar } from \"@/registry/magicui/animated-circular-progress-bar\"\n\nexport default function AnimatedCircularProgressBarDemo() {\n  const [value, setValue] = useState(0)\n\n  useEffect(() => {\n    const handleIncrement = (prev: number) => {\n      if (prev === 100) {\n        return 0\n      }\n      return prev + 10\n    }\n    setValue(handleIncrement)\n    const interval = setInterval(() => setValue(handleIncrement), 2000)\n    return () => clearInterval(interval)\n  }, [])\n\n  return (\n    <AnimatedCircularProgressBar\n      value={value}\n      gaugePrimaryColor=\"rgb(79 70 229)\"\n      gaugeSecondaryColor=\"rgba(0, 0, 0, 0.1)\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-gradient-text-demo-2.tsx",
    "content": "import { AnimatedGradientText } from \"@/registry/magicui/animated-gradient-text\"\n\nexport default function AnimatedGradientTextDemo() {\n  return (\n    <AnimatedGradientText\n      speed={2}\n      colorFrom=\"#4ade80\"\n      colorTo=\"#06b6d4\"\n      className=\"text-4xl font-semibold tracking-tight\"\n    >\n      Fast Gradient\n    </AnimatedGradientText>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-gradient-text-demo.tsx",
    "content": "import { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedGradientText } from \"@/registry/magicui/animated-gradient-text\"\n\nexport default function AnimatedGradientTextDemo() {\n  return (\n    <div className=\"group relative mx-auto flex items-center justify-center rounded-full px-4 py-1.5 shadow-[inset_0_-8px_10px_#8fdfff1f] transition-shadow duration-500 ease-out hover:shadow-[inset_0_-5px_10px_#8fdfff3f]\">\n      <span\n        className={cn(\n          \"animate-gradient absolute inset-0 block h-full w-full rounded-[inherit] bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:300%_100%] p-[1px]\"\n        )}\n        style={{\n          WebkitMask:\n            \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n          WebkitMaskComposite: \"destination-out\",\n          mask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n          maskComposite: \"subtract\",\n          WebkitClipPath: \"padding-box\",\n        }}\n      />\n      🎉 <hr className=\"mx-2 h-4 w-px shrink-0 bg-neutral-500\" />\n      <AnimatedGradientText className=\"text-sm font-medium\">\n        Introducing Magic UI\n      </AnimatedGradientText>\n      <ChevronRight className=\"ml-1 size-4 stroke-neutral-500 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-grid-pattern-demo.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { AnimatedGridPattern } from \"@/registry/magicui/animated-grid-pattern\"\n\nexport default function AnimatedGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <AnimatedGridPattern\n        numSquares={30}\n        maxOpacity={0.1}\n        duration={3}\n        repeatDelay={1}\n        className={cn(\n          \"mask-[radial-gradient(500px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-list-demo.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedList } from \"@/registry/magicui/animated-list\"\n\ninterface Item {\n  name: string\n  description: string\n  icon: string\n  color: string\n  time: string\n}\n\nlet notifications = [\n  {\n    name: \"Payment received\",\n    description: \"Magic UI\",\n    time: \"15m ago\",\n\n    icon: \"💸\",\n    color: \"#00C9A7\",\n  },\n  {\n    name: \"User signed up\",\n    description: \"Magic UI\",\n    time: \"10m ago\",\n    icon: \"👤\",\n    color: \"#FFB800\",\n  },\n  {\n    name: \"New message\",\n    description: \"Magic UI\",\n    time: \"5m ago\",\n    icon: \"💬\",\n    color: \"#FF3D71\",\n  },\n  {\n    name: \"New event\",\n    description: \"Magic UI\",\n    time: \"2m ago\",\n    icon: \"🗞️\",\n    color: \"#1E86FF\",\n  },\n]\n\nnotifications = Array.from({ length: 10 }, () => notifications).flat()\n\nconst Notification = ({ name, description, icon, color, time }: Item) => {\n  return (\n    <figure\n      className={cn(\n        \"relative mx-auto min-h-fit w-full max-w-[400px] cursor-pointer overflow-hidden rounded-2xl p-4\",\n        // animation styles\n        \"transition-all duration-200 ease-in-out hover:scale-[103%]\",\n        // light styles\n        \"bg-white [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\n        // dark styles\n        \"transform-gpu dark:bg-transparent dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:backdrop-blur-md dark:[border:1px_solid_rgba(255,255,255,.1)]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-3\">\n        <div\n          className=\"flex size-10 items-center justify-center rounded-2xl\"\n          style={{\n            backgroundColor: color,\n          }}\n        >\n          <span className=\"text-lg\">{icon}</span>\n        </div>\n        <div className=\"flex flex-col overflow-hidden\">\n          <figcaption className=\"flex flex-row items-center text-lg font-medium whitespace-pre dark:text-white\">\n            <span className=\"text-sm sm:text-lg\">{name}</span>\n            <span className=\"mx-1\">·</span>\n            <span className=\"text-xs text-gray-500\">{time}</span>\n          </figcaption>\n          <p className=\"text-sm font-normal dark:text-white/60\">\n            {description}\n          </p>\n        </div>\n      </div>\n    </figure>\n  )\n}\n\nexport default function AnimatedListDemo({\n  className,\n}: {\n  className?: string\n}) {\n  return (\n    <div\n      className={cn(\n        \"relative flex h-[500px] w-full flex-col overflow-hidden p-2\",\n        className\n      )}\n    >\n      <AnimatedList>\n        {notifications.map((item, idx) => (\n          <Notification {...item} key={idx} />\n        ))}\n      </AnimatedList>\n\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-shiny-text-demo.tsx",
    "content": "import { ArrowRightIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { AnimatedShinyText } from \"@/registry/magicui/animated-shiny-text\"\n\nexport default function AnimatedShinyTextDemo() {\n  return (\n    <div className=\"z-10 flex min-h-64 items-center justify-center\">\n      <div\n        className={cn(\n          \"group rounded-full border border-black/5 bg-neutral-100 text-base text-white transition-all ease-in hover:cursor-pointer hover:bg-neutral-200 dark:border-white/5 dark:bg-neutral-900 dark:hover:bg-neutral-800\"\n        )}\n      >\n        <AnimatedShinyText className=\"inline-flex items-center justify-center px-4 py-1 transition ease-out hover:text-neutral-600 hover:duration-300 hover:dark:text-neutral-400\">\n          <span>✨ Introducing Magic UI</span>\n          <ArrowRightIcon className=\"ml-1 size-3 transition-transform duration-300 ease-in-out group-hover:translate-x-0.5\" />\n        </AnimatedShinyText>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/animated-theme-toggler-demo.tsx",
    "content": "import { AnimatedThemeToggler } from \"@/registry/magicui/animated-theme-toggler\"\n\nexport default function AnimatedThemeTogglerDemo() {\n  return <AnimatedThemeToggler />\n}\n"
  },
  {
    "path": "apps/www/registry/example/aurora-text-demo.tsx",
    "content": "import { AuroraText } from \"@/registry/magicui/aurora-text\"\n\nexport default function AuroraTextDemo() {\n  return (\n    <h1 className=\"text-4xl font-bold tracking-tighter md:text-5xl lg:text-7xl\">\n      Ship <AuroraText>beautiful</AuroraText>\n    </h1>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/avatar-circles-demo.tsx",
    "content": "import { AvatarCircles } from \"@/registry/magicui/avatar-circles\"\n\nconst avatars = [\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/16860528\",\n    profileUrl: \"https://github.com/dillionverma\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/20110627\",\n    profileUrl: \"https://github.com/tomonarifeehan\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/106103625\",\n    profileUrl: \"https://github.com/BankkRoll\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/59228569\",\n    profileUrl: \"https://github.com/safethecode\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/59442788\",\n    profileUrl: \"https://github.com/sanjay-mali\",\n  },\n  {\n    imageUrl: \"https://avatars.githubusercontent.com/u/89768406\",\n    profileUrl: \"https://github.com/itsarghyadas\",\n  },\n]\n\nexport default function AvatarCirclesDemo() {\n  return <AvatarCircles numPeople={99} avatarUrls={avatars} />\n}\n"
  },
  {
    "path": "apps/www/registry/example/bento-demo-vertical.tsx",
    "content": "import {\n  BellIcon,\n  CalendarIcon,\n  FileTextIcon,\n  GlobeIcon,\n  InputIcon,\n} from \"@radix-ui/react-icons\"\n\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:row-start-1 lg:row-end-4 lg:col-start-2 lg:col-end-3\",\n  },\n  {\n    Icon: InputIcon,\n    name: \"Full text search\",\n    description: \"Search through all your files in one place.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-3\",\n  },\n  {\n    Icon: GlobeIcon,\n    name: \"Multilingual\",\n    description: \"Supports 100+ languages and counting.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-1 lg:col-end-2 lg:row-start-3 lg:row-end-4\",\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-3 lg:col-end-3 lg:row-start-1 lg:row-end-2\",\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description:\n      \"Get notified when someone shares a file or mentions you in a comment.\",\n    href: \"/\",\n    cta: \"Learn more\",\n    background: (\n      <img alt=\"\" className=\"absolute -top-20 -right-20 opacity-60\" />\n    ),\n    className: \"lg:col-start-3 lg:col-end-3 lg:row-start-2 lg:row-end-4\",\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid className=\"lg:grid-rows-3\">\n      {features.map((feature) => (\n        <BentoCard key={feature.name} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/bento-demo.tsx",
    "content": "import { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\"\nimport { BellIcon, Share2Icon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Calendar } from \"@/components/ui/calendar\"\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\"\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\"\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst files = [\n  {\n    name: \"bitcoin.pdf\",\n    body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n  },\n  {\n    name: \"finances.xlsx\",\n    body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n  },\n  {\n    name: \"logo.svg\",\n    body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n  },\n  {\n    name: \"keys.gpg\",\n    body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n  },\n  {\n    name: \"seed.txt\",\n    body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n  },\n]\n\nconst features = [\n  {\n    Icon: FileTextIcon,\n    name: \"Save your files\",\n    description: \"We automatically save your files as you type.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-1\",\n    background: (\n      <Marquee\n        pauseOnHover\n        className=\"absolute top-10 [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] [--duration:20s]\"\n      >\n        {files.map((f, idx) => (\n          <figure\n            key={idx}\n            className={cn(\n              \"relative w-32 cursor-pointer overflow-hidden rounded-xl border p-4\",\n              \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n              \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\",\n              \"transform-gpu blur-[1px] transition-all duration-300 ease-out hover:blur-none\"\n            )}\n          >\n            <div className=\"flex flex-row items-center gap-2\">\n              <div className=\"flex flex-col\">\n                <figcaption className=\"text-sm font-medium dark:text-white\">\n                  {f.name}\n                </figcaption>\n              </div>\n            </div>\n            <blockquote className=\"mt-2 text-xs\">{f.body}</blockquote>\n          </figure>\n        ))}\n      </Marquee>\n    ),\n  },\n  {\n    Icon: BellIcon,\n    name: \"Notifications\",\n    description: \"Get notified when something happens.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedListDemo className=\"absolute top-4 right-2 h-[300px] w-full scale-75 border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\" />\n    ),\n  },\n  {\n    Icon: Share2Icon,\n    name: \"Integrations\",\n    description: \"Supports 100+ integrations and counting.\",\n    href: \"#\",\n    cta: \"Learn more\",\n    className: \"col-span-3 lg:col-span-2\",\n    background: (\n      <AnimatedBeamMultipleOutputDemo className=\"absolute top-4 right-2 h-[300px] border-none [mask-image:linear-gradient(to_top,transparent_10%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-105\" />\n    ),\n  },\n  {\n    Icon: CalendarIcon,\n    name: \"Calendar\",\n    description: \"Use the calendar to filter your files by date.\",\n    className: \"col-span-3 lg:col-span-1\",\n    href: \"#\",\n    cta: \"Learn more\",\n    background: (\n      <Calendar\n        mode=\"single\"\n        selected={new Date(2022, 4, 11, 0, 0, 0)}\n        className=\"absolute top-10 right-0 origin-top scale-75 rounded-md border [mask-image:linear-gradient(to_top,transparent_40%,#000_100%)] transition-all duration-300 ease-out group-hover:scale-90\"\n      />\n    ),\n  },\n]\n\nexport default function BentoDemo() {\n  return (\n    <BentoGrid>\n      {features.map((feature, idx) => (\n        <BentoCard key={idx} {...feature} />\n      ))}\n    </BentoGrid>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/blur-fade-demo.tsx",
    "content": "import { BlurFade } from \"@/registry/magicui/blur-fade\"\n\nconst images = Array.from({ length: 9 }, (_, i) => {\n  const isLandscape = i % 2 === 0\n  const width = isLandscape ? 800 : 600\n  const height = isLandscape ? 600 : 800\n  return `https://picsum.photos/seed/${i + 1}/${width}/${height}`\n})\n\nexport default function BlurFadeDemo() {\n  return (\n    <section id=\"photos\">\n      <div className=\"columns-2 gap-4 sm:columns-3\">\n        {images.map((imageUrl, idx) => (\n          <BlurFade key={imageUrl} delay={0.25 + idx * 0.05} inView>\n            <img\n              className=\"mb-4 size-full rounded-lg object-contain\"\n              src={imageUrl}\n              alt={`Random stock image ${idx + 1}`}\n            />\n          </BlurFade>\n        ))}\n      </div>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/blur-fade-text-demo.tsx",
    "content": "import { BlurFade } from \"@/registry/magicui/blur-fade\"\n\nexport default function BlurFadeTextDemo() {\n  return (\n    <section id=\"header\">\n      <BlurFade delay={0.25} inView>\n        <h2 className=\"text-3xl font-bold tracking-tighter sm:text-5xl xl:text-6xl/none\">\n          Hello World 👋\n        </h2>\n      </BlurFade>\n      <BlurFade delay={0.25 * 2} inView>\n        <span className=\"text-xl tracking-tighter text-pretty sm:text-3xl xl:text-4xl/none\">\n          Nice to meet you\n        </span>\n      </BlurFade>\n    </section>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/border-beam-demo-2.tsx",
    "content": "import { Play, SkipBack, SkipForward } from \"lucide-react\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function MusicPlayer() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Now Playing</CardTitle>\n        <CardDescription>Stairway to Heaven - Led Zeppelin</CardDescription>\n      </CardHeader>\n      <CardContent>\n        <div className=\"flex flex-col items-center gap-4\">\n          <div className=\"h-48 w-48 rounded-lg bg-linear-to-br from-purple-500 to-pink-500\" />\n          <div className=\"bg-secondary h-1 w-full rounded-full\">\n            <div className=\"bg-primary h-full w-1/3 rounded-full\" />\n          </div>\n          <div className=\"text-muted-foreground flex w-full justify-between text-sm\">\n            <span>2:45</span>\n            <span>8:02</span>\n          </div>\n        </div>\n      </CardContent>\n      <CardFooter className=\"flex justify-center gap-4\">\n        <Button variant=\"outline\" size=\"icon\" className=\"rounded-full\">\n          <SkipBack className=\"size-4\" />\n        </Button>\n        <Button size=\"icon\" className=\"rounded-full\">\n          <Play className=\"size-4\" />\n        </Button>\n        <Button variant=\"outline\" size=\"icon\" className=\"rounded-full\">\n          <SkipForward className=\"size-4\" />\n        </Button>\n      </CardFooter>\n      <BorderBeam\n        duration={6}\n        size={400}\n        className=\"from-transparent via-red-500 to-transparent\"\n      />\n      <BorderBeam\n        duration={6}\n        delay={3}\n        size={400}\n        borderWidth={2}\n        className=\"from-transparent via-blue-500 to-transparent\"\n      />\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/border-beam-demo-3.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function LoginForm() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account.\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid w-full items-center gap-4\">\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"Enter your email\" />\n            </div>\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input\n                id=\"password\"\n                type=\"password\"\n                placeholder=\"Enter your password\"\n              />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter className=\"flex justify-between\">\n        <Button variant=\"outline\">Register</Button>\n        <Button>Login</Button>\n      </CardFooter>\n      <BorderBeam\n        duration={4}\n        size={300}\n        reverse\n        className=\"from-transparent via-green-500 to-transparent\"\n      />\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/border-beam-demo-4.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function Component() {\n  return (\n    <Button className=\"relative overflow-hidden\" size=\"lg\" variant=\"outline\">\n      Buy Now\n      <BorderBeam\n        size={40}\n        initialOffset={20}\n        className=\"from-transparent via-yellow-500 to-transparent\"\n        transition={{\n          type: \"spring\",\n          stiffness: 60,\n          damping: 20,\n        }}\n      />\n    </Button>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/border-beam-demo.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { BorderBeam } from \"@/registry/magicui/border-beam\"\n\nexport default function Component() {\n  return (\n    <Card className=\"relative w-[350px] overflow-hidden\">\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account.\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid w-full items-center gap-4\">\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"Enter your email\" />\n            </div>\n            <div className=\"flex flex-col space-y-1.5\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input\n                id=\"password\"\n                type=\"password\"\n                placeholder=\"Enter your password\"\n              />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter className=\"flex justify-between\">\n        <Button variant=\"outline\">Register</Button>\n        <Button>Login</Button>\n      </CardFooter>\n      <BorderBeam duration={8} size={100} />\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/code-comparison-demo.tsx",
    "content": "import { CodeComparison } from \"@/registry/magicui/code-comparison\"\n\nconst beforeCode = `import { NextRequest } from 'next/server';\n\nexport const middleware = async (req: NextRequest) => {\n  let user = undefined;\n  let team = undefined;\n  const token = req.headers.get('token'); \n\n  if(req.nextUrl.pathname.startsWith('/auth')) {\n    user = await getUserByToken(token);\n\n    if(!user) {\n      return NextResponse.redirect('/login');\n    }\n  }\n\n  if(req.nextUrl.pathname.startsWith('/team')) {\n    user = await getUserByToken(token);\n\n    if(!user) {\n      return NextResponse.redirect('/login');\n    }\n\n    const slug = req.nextUrl.query.slug;\n    team = await getTeamBySlug(slug); // [!code highlight]\n\n    if(!team) { // [!code highlight]\n      return NextResponse.redirect('/'); // [!code highlight]\n    } // [!code highlight]\n  } // [!code highlight]\n\n  return NextResponse.next(); // [!code highlight]\n}\n\nexport const config = {\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'], // [!code highlight]\n};`\n\nconst afterCode = `import { createMiddleware, type MiddlewareFunctionProps } from '@app/(auth)/auth/_middleware';\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code --]\nimport { auth } from '@/app/(auth)/auth/_middleware'; // [!code ++]\nimport { team } from '@/app/(team)/team/_middleware';\n\nconst middlewares = {\n  '/auth{/:path?}': auth,\n  '/team{/:slug?}': [ auth, team ],\n};\n\nexport const middleware = createMiddleware(middlewares); // [!code focus]\n\nexport const config = {\n  matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'],\n};`\n\nexport default function CodeComparisonDemo() {\n  return (\n    <CodeComparison\n      beforeCode={beforeCode}\n      afterCode={afterCode}\n      language=\"typescript\"\n      filename=\"middleware.ts\"\n      lightTheme=\"github-light\"\n      darkTheme=\"github-dark\"\n      highlightColor=\"rgba(101, 117, 133, 0.16)\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/comic-text-demo.tsx",
    "content": "import { ComicText } from \"@/registry/magicui/comic-text\"\n\nexport default function ComicTextDemo() {\n  return (\n    <div className=\"space-y-8 text-center\">\n      <ComicText fontSize={5}>BOOM!</ComicText>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-basic-cannon.tsx",
    "content": "import { ConfettiButton } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiButtonDemo() {\n  return (\n    <div className=\"relative\">\n      <ConfettiButton>Confetti 🎉</ConfettiButton>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-custom-shapes.tsx",
    "content": "\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiCustomShapes() {\n  const handleClick = () => {\n    const scalar = 2\n    const triangle = confetti.shapeFromPath({\n      path: \"M0 10 L5 0 L10 10z\",\n    })\n    const square = confetti.shapeFromPath({\n      path: \"M0 0 L10 0 L10 10 L0 10 Z\",\n    })\n    const coin = confetti.shapeFromPath({\n      path: \"M5 0 A5 5 0 1 0 5 10 A5 5 0 1 0 5 0 Z\",\n    })\n    const tree = confetti.shapeFromPath({\n      path: \"M5 0 L10 10 L0 10 Z\",\n    })\n\n    const defaults = {\n      spread: 360,\n      ticks: 60,\n      gravity: 0,\n      decay: 0.96,\n      startVelocity: 20,\n      shapes: [triangle, square, coin, tree],\n      scalar,\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 30,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 5,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 15,\n        scalar: scalar / 2,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative flex items-center justify-center\">\n      <Button onClick={handleClick}>Trigger Shapes</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-demo.tsx",
    "content": "\"use client\"\n\nimport { useRef } from \"react\"\n\nimport { Confetti, type ConfettiRef } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiDemo() {\n  const confettiRef = useRef<ConfettiRef>(null)\n\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Confetti\n      </span>\n\n      <Confetti\n        ref={confettiRef}\n        className=\"absolute top-0 left-0 z-0 size-full\"\n        onMouseEnter={() => {\n          confettiRef.current?.fire({})\n        }}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-emoji.tsx",
    "content": "\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiEmoji() {\n  const handleClick = () => {\n    const scalar = 2\n    const unicorn = confetti.shapeFromText({ text: \"🦄\", scalar })\n\n    const defaults = {\n      spread: 360,\n      ticks: 60,\n      gravity: 0,\n      decay: 0.96,\n      startVelocity: 20,\n      shapes: [unicorn],\n      scalar,\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 30,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 5,\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 15,\n        scalar: scalar / 2,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative justify-center\">\n      <Button onClick={handleClick}>Trigger Emoji</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-fireworks.tsx",
    "content": "\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiFireworks() {\n  const handleClick = () => {\n    const duration = 5 * 1000\n    const animationEnd = Date.now() + duration\n    const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 }\n\n    const randomInRange = (min: number, max: number) =>\n      Math.random() * (max - min) + min\n\n    const interval = window.setInterval(() => {\n      const timeLeft = animationEnd - Date.now()\n\n      if (timeLeft <= 0) {\n        return clearInterval(interval)\n      }\n\n      const particleCount = 50 * (timeLeft / duration)\n      confetti({\n        ...defaults,\n        particleCount,\n        origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n      })\n      confetti({\n        ...defaults,\n        particleCount,\n        origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n      })\n    }, 250)\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Fireworks</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-random-direction.tsx",
    "content": "import { ConfettiButton } from \"@/registry/magicui/confetti\"\n\nexport default function ConfettiButtonDemo() {\n  return (\n    <div className=\"relative\">\n      <ConfettiButton\n        options={{\n          get angle() {\n            return Math.random() * 360\n          },\n        }}\n      >\n        Random Confetti 🎉\n      </ConfettiButton>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-side-cannons.tsx",
    "content": "\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiSideCannons() {\n  const handleClick = () => {\n    const end = Date.now() + 3 * 1000 // 3 seconds\n    const colors = [\"#a786ff\", \"#fd8bbc\", \"#eca184\", \"#f8deb1\"]\n\n    const frame = () => {\n      if (Date.now() > end) return\n\n      confetti({\n        particleCount: 2,\n        angle: 60,\n        spread: 55,\n        startVelocity: 60,\n        origin: { x: 0, y: 0.5 },\n        colors: colors,\n      })\n      confetti({\n        particleCount: 2,\n        angle: 120,\n        spread: 55,\n        startVelocity: 60,\n        origin: { x: 1, y: 0.5 },\n        colors: colors,\n      })\n\n      requestAnimationFrame(frame)\n    }\n\n    frame()\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Side Cannons</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/confetti-stars.tsx",
    "content": "\"use client\"\n\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\nexport default function ConfettiStars() {\n  const handleClick = () => {\n    const defaults = {\n      spread: 360,\n      ticks: 50,\n      gravity: 0,\n      decay: 0.94,\n      startVelocity: 30,\n      colors: [\"#FFE400\", \"#FFBD00\", \"#E89400\", \"#FFCA6C\", \"#FDFFB8\"],\n    }\n\n    const shoot = () => {\n      confetti({\n        ...defaults,\n        particleCount: 40,\n        scalar: 1.2,\n        shapes: [\"star\"],\n      })\n\n      confetti({\n        ...defaults,\n        particleCount: 10,\n        scalar: 0.75,\n        shapes: [\"circle\"],\n      })\n    }\n\n    setTimeout(shoot, 0)\n    setTimeout(shoot, 100)\n    setTimeout(shoot, 200)\n  }\n\n  return (\n    <div className=\"relative\">\n      <Button onClick={handleClick}>Trigger Stars</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/cool-mode-custom.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport { CoolMode } from \"@/registry/magicui/cool-mode\"\n\nexport default function CoolModeCustom() {\n  return (\n    <div className=\"relative justify-center\">\n      <CoolMode\n        options={{\n          particle:\n            \"https://pbs.twimg.com/profile_images/1782811051504885763/YR5-kWOI_400x400.jpg\",\n        }}\n      >\n        <Button>Click Me!</Button>\n      </CoolMode>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/cool-mode-demo.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport { CoolMode } from \"@/registry/magicui/cool-mode\"\n\nexport default function CoolModeDemo() {\n  return (\n    <div className=\"relative justify-center\">\n      <CoolMode>\n        <Button>Click Me!</Button>\n      </CoolMode>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dock-demo-2.tsx",
    "content": "\"use client\"\n\nimport React from \"react\"\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nexport default function DockDemo() {\n  return (\n    <div className=\"relative\">\n      <Dock direction=\"middle\">\n        <DockIcon>\n          <Icons.gitHub className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.googleDrive className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.notion className=\"size-6\" />\n        </DockIcon>\n        <DockIcon>\n          <Icons.whatsapp className=\"size-6\" />\n        </DockIcon>\n      </Dock>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n  notion: (props: IconProps) => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#fff\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000\"\n      />\n    </svg>\n  ),\n  googleDrive: (props: IconProps) => (\n    <svg viewBox=\"0 0 87.3 78\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 175.216 175.552\"\n      {...props}\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        fill=\"#b3b3b3\"\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        filter=\"url(#a)\"\n      />\n      <path\n        fill=\"#fff\"\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n      />\n      <path\n        fill=\"url(#linearGradient1780)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n      />\n      <path\n        fill=\"url(#b)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n      />\n      <path\n        fill=\"#fff\"\n        fillRule=\"evenodd\"\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n      />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/dock-demo-3.tsx",
    "content": "\"use client\"\n\nimport React from \"react\"\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nexport default function DockDemo() {\n  return (\n    <div className=\"relative\">\n      <Dock iconMagnification={60} iconDistance={100}>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.gitHub className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.googleDrive className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.notion className=\"size-full\" />\n        </DockIcon>\n        <DockIcon className=\"bg-black/10 dark:bg-white/10\">\n          <Icons.whatsapp className=\"size-full\" />\n        </DockIcon>\n      </Dock>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n  notion: (props: IconProps) => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#fff\"\n      />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000\"\n      />\n    </svg>\n  ),\n  googleDrive: (props: IconProps) => (\n    <svg viewBox=\"0 0 87.3 78\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: (props: IconProps) => (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 175.216 175.552\"\n      {...props}\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        fill=\"#b3b3b3\"\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        filter=\"url(#a)\"\n      />\n      <path\n        fill=\"#fff\"\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n      />\n      <path\n        fill=\"url(#linearGradient1780)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n      />\n      <path\n        fill=\"url(#b)\"\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n      />\n      <path\n        fill=\"#fff\"\n        fillRule=\"evenodd\"\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n      />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/dock-demo.tsx",
    "content": "\"use client\"\n\nimport React from \"react\"\nimport Link from \"next/link\"\nimport { CalendarIcon, HomeIcon, MailIcon, PencilIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\"\n\nexport type IconProps = React.HTMLAttributes<SVGElement>\n\nconst Icons = {\n  calendar: (props: IconProps) => <CalendarIcon {...props} />,\n  email: (props: IconProps) => <MailIcon {...props} />,\n  linkedin: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <title>LinkedIn</title>\n      <path\n        fill=\"currentColor\"\n        d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"\n      />\n    </svg>\n  ),\n  x: (props: IconProps) => (\n    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n      <title>X</title>\n      <path\n        fill=\"currentColor\"\n        d=\"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\"\n      />\n    </svg>\n  ),\n  youtube: (props: IconProps) => (\n    <svg\n      width=\"32px\"\n      height=\"32px\"\n      viewBox=\"0 0 32 32\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <title>youtube</title>\n      <path d=\"M29.41,9.26a3.5,3.5,0,0,0-2.47-2.47C24.76,6.2,16,6.2,16,6.2s-8.76,0-10.94.59A3.5,3.5,0,0,0,2.59,9.26,36.13,36.13,0,0,0,2,16a36.13,36.13,0,0,0,.59,6.74,3.5,3.5,0,0,0,2.47,2.47C7.24,25.8,16,25.8,16,25.8s8.76,0,10.94-.59a3.5,3.5,0,0,0,2.47-2.47A36.13,36.13,0,0,0,30,16,36.13,36.13,0,0,0,29.41,9.26ZM13.2,20.2V11.8L20.47,16Z\" />\n    </svg>\n  ),\n  github: (props: IconProps) => (\n    <svg viewBox=\"0 0 438.549 438.549\" {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      ></path>\n    </svg>\n  ),\n}\n\nconst DATA = {\n  navbar: [\n    { href: \"#\", icon: HomeIcon, label: \"Home\" },\n    { href: \"#\", icon: PencilIcon, label: \"Blog\" },\n  ],\n  contact: {\n    social: {\n      GitHub: {\n        name: \"GitHub\",\n        url: \"#\",\n        icon: Icons.github,\n      },\n      LinkedIn: {\n        name: \"LinkedIn\",\n        url: \"#\",\n        icon: Icons.linkedin,\n      },\n      X: {\n        name: \"X\",\n        url: \"#\",\n        icon: Icons.x,\n      },\n      email: {\n        name: \"Send Email\",\n        url: \"#\",\n        icon: Icons.email,\n      },\n    },\n  },\n}\n\nexport default function DockDemo() {\n  return (\n    <div className=\"flex flex-col items-center justify-center\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Dock\n      </span>\n      <TooltipProvider>\n        <Dock direction=\"middle\">\n          {DATA.navbar.map((item) => (\n            <DockIcon key={item.label}>\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Link\n                    href={item.href}\n                    aria-label={item.label}\n                    className={cn(\n                      buttonVariants({ variant: \"ghost\", size: \"icon\" }),\n                      \"size-12 rounded-full\"\n                    )}\n                  >\n                    <item.icon className=\"size-4\" />\n                  </Link>\n                </TooltipTrigger>\n                <TooltipContent>\n                  <p>{item.label}</p>\n                </TooltipContent>\n              </Tooltip>\n            </DockIcon>\n          ))}\n          <Separator orientation=\"vertical\" className=\"h-full\" />\n          {Object.entries(DATA.contact.social).map(([name, social]) => (\n            <DockIcon key={name}>\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Link\n                    href={social.url}\n                    aria-label={social.name}\n                    className={cn(\n                      buttonVariants({ variant: \"ghost\", size: \"icon\" }),\n                      \"size-12 rounded-full\"\n                    )}\n                  >\n                    <social.icon className=\"size-4\" />\n                  </Link>\n                </TooltipTrigger>\n                <TooltipContent>\n                  <p>{name}</p>\n                </TooltipContent>\n              </Tooltip>\n            </DockIcon>\n          ))}\n        </Dock>\n      </TooltipProvider>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dot-pattern-demo.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <DotPattern\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dot-pattern-linear-gradient.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternLinearGradient() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <DotPattern\n        width={20}\n        height={20}\n        cx={1}\n        cy={1}\n        cr={1}\n        className={cn(\n          \"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dot-pattern-with-glow-effect.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\"\n\nexport default function DotPatternWithGlowEffectDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\">\n      <DotPattern\n        glow={true}\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dotted-map-demo-2.tsx",
    "content": "import { DottedMap } from \"@/registry/magicui/dotted-map\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <DottedMap dotRadius={0.1} />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dotted-map-demo-3.tsx",
    "content": "import { DottedMap } from \"@/registry/magicui/dotted-map\"\nimport type { Marker } from \"@/registry/magicui/dotted-map\"\n\nconst markers: Marker[] = [\n  {\n    lat: 37.5665,\n    lng: 126.978,\n    size: 0.3,\n  },\n  {\n    lat: 40.7128,\n    lng: -74.006,\n    size: 0.3,\n    pulse: false,\n  },\n]\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"to-background absolute inset-0 bg-radial from-transparent to-200%\" />\n      <DottedMap markers={markers} pulse />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/dotted-map-demo.tsx",
    "content": "import * as React from \"react\"\nimport type { TCountryCode } from \"countries-list\"\n\nimport { DottedMap } from \"@/registry/magicui/dotted-map\"\nimport type { Marker } from \"@/registry/magicui/dotted-map\"\n\ntype CountryCode = Lowercase<TCountryCode>\n\ntype MyMarker = Marker & {\n  overlay: {\n    countryCode: CountryCode\n    label: string\n  }\n}\n\nconst markers: MyMarker[] = [\n  {\n    lat: 37.5665,\n    lng: 126.978,\n    size: 2.8,\n    overlay: { countryCode: \"kr\", label: \"Seoul\" },\n  },\n  {\n    lat: 40.7128,\n    lng: -74.006,\n    size: 2.8,\n    overlay: { countryCode: \"us\", label: \"NYC\" },\n  },\n]\n\nexport default function Component() {\n  const id = React.useId()\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"to-background absolute inset-0 bg-radial from-transparent to-200%\" />\n      <DottedMap<MyMarker>\n        markers={markers}\n        renderMarkerOverlay={({ marker, x, y, r, index }) => {\n          const { countryCode, label } = marker.overlay\n          const href = `https://flagcdn.com/w80/${countryCode}.webp` // FlagCDN  [oai_citation:7‡Flagpedia](https://flagpedia.net/download/api)\n\n          const clipId = `${id}-flag-clip-${index}`.replace(/:/g, \"-\")\n          const imgR = r * 0.75\n\n          const fontSize = r * 0.9\n          const pillH = r * 1.5\n          const pillW = label.length * (fontSize * 0.62) + r * 1.4\n          const pillX = x + r + r * 0.6\n          const pillY = y - pillH / 2\n\n          return (\n            <g style={{ pointerEvents: \"none\" }}>\n              <clipPath id={clipId}>\n                <circle cx={x} cy={y} r={imgR} />\n              </clipPath>\n\n              <image\n                href={href}\n                x={x - imgR}\n                y={y - imgR}\n                width={imgR * 2}\n                height={imgR * 2}\n                preserveAspectRatio=\"xMidYMid slice\"\n                clipPath={`url(#${clipId})`}\n              />\n\n              <rect\n                x={pillX}\n                y={pillY}\n                width={pillW}\n                height={pillH}\n                rx={pillH / 2}\n                fill=\"rgba(0,0,0,0.55)\"\n              />\n              <text\n                x={pillX + r * 0.7}\n                y={y + fontSize * 0.35}\n                fontSize={fontSize}\n                fill=\"white\"\n              >\n                {label}\n              </text>\n            </g>\n          )\n        }}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/file-tree-demo.tsx",
    "content": "import { Tree } from \"@/registry/magicui/file-tree\"\nimport type { TreeViewElement } from \"@/registry/magicui/file-tree\"\n\nexport default function FileTreeDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[300px] w-full max-w-sm flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <Tree\n        className=\"bg-background overflow-hidden rounded-md p-2\"\n        initialSelectedId=\"button\"\n        initialExpandedItems={[\"src\", \"app\", \"components\", \"ui\", \"lib\"]}\n        elements={ELEMENTS}\n      />\n    </div>\n  )\n}\n\nconst ELEMENTS: TreeViewElement[] = [\n  {\n    id: \"src\",\n    type: \"folder\",\n    isSelectable: true,\n    name: \"src\",\n    children: [\n      {\n        id: \"lib\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"lib\",\n        children: [\n          {\n            id: \"utils\",\n            isSelectable: true,\n            name: \"utils.ts\",\n          },\n        ],\n      },\n      {\n        id: \"app\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"app\",\n        children: [\n          {\n            id: \"page\",\n            isSelectable: true,\n            name: \"page.tsx\",\n          },\n          {\n            id: \"layout\",\n            isSelectable: true,\n            name: \"layout.tsx\",\n          },\n        ],\n      },\n      {\n        id: \"components\",\n        type: \"folder\",\n        isSelectable: true,\n        name: \"components\",\n        children: [\n          {\n            id: \"header\",\n            isSelectable: true,\n            name: \"header.tsx\",\n          },\n          {\n            id: \"ui\",\n            type: \"folder\",\n            isSelectable: true,\n            name: \"ui\",\n            children: [\n              {\n                id: \"button\",\n                isSelectable: true,\n                name: \"button.tsx\",\n              },\n            ],\n          },\n          {\n            id: \"footer\",\n            isSelectable: true,\n            name: \"footer.tsx\",\n          },\n        ],\n      },\n    ],\n  },\n]\n"
  },
  {
    "path": "apps/www/registry/example/flickering-grid-demo.tsx",
    "content": "import { FlickeringGrid } from \"@/registry/magicui/flickering-grid\"\n\nexport default function FlickeringGridDemo() {\n  return (\n    <div className=\"bg-background relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <FlickeringGrid\n        className=\"absolute inset-0 z-0 size-full\"\n        squareSize={4}\n        gridGap={6}\n        color=\"#6B7280\"\n        maxOpacity={0.5}\n        flickerChance={0.1}\n        height={800}\n        width={800}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/flickering-grid-rounded-demo.tsx",
    "content": "import { FlickeringGrid } from \"@/registry/magicui/flickering-grid\"\n\nexport default function FlickeringGridRoundedDemo() {\n  return (\n    <div className=\"bg-background relative size-[600px] w-full overflow-hidden rounded-lg border\">\n      <FlickeringGrid\n        className=\"relative inset-0 z-0 [mask-image:radial-gradient(450px_circle_at_center,white,transparent)]\"\n        squareSize={4}\n        gridGap={6}\n        color=\"#60A5FA\"\n        maxOpacity={0.5}\n        flickerChance={0.1}\n        height={800}\n        width={800}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/globe-demo.tsx",
    "content": "import { Globe } from \"@/registry/magicui/globe\"\n\nexport default function GlobeDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border px-40 pt-8 pb-40 md:pb-60\">\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Globe\n      </span>\n      <Globe className=\"top-28\" />\n      <div className=\"pointer-events-none absolute inset-0 h-full bg-[radial-gradient(circle_at_50%_200%,rgba(0,0,0,0.2),rgba(255,255,255,0))]\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/grid-pattern-dashed.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternDashed() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <GridPattern\n        width={30}\n        height={30}\n        x={-1}\n        y={-1}\n        strokeDasharray={\"4 2\"}\n        className={cn(\n          \"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/grid-pattern-demo.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <GridPattern\n        squares={[\n          [4, 4],\n          [5, 1],\n          [8, 2],\n          [5, 3],\n          [5, 5],\n          [10, 10],\n          [12, 15],\n          [15, 10],\n          [10, 15],\n          [15, 10],\n          [10, 15],\n          [15, 10],\n        ]}\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/grid-pattern-linear-gradient.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\"\n\nexport default function GridPatternLinearGradient() {\n  return (\n    <div className=\"bg-background relative flex size-full items-center justify-center overflow-hidden rounded-lg border p-20\">\n      <GridPattern\n        width={20}\n        height={20}\n        x={-1}\n        y={-1}\n        className={cn(\n          \"[mask-image:linear-gradient(to_bottom_right,white,transparent,transparent)]\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx",
    "content": "import { HeroVideoDialog } from \"@/registry/magicui/hero-video-dialog\"\n\nexport default function HeroVideoDialogDemoTopInBottomOut() {\n  return (\n    <div className=\"relative\">\n      <HeroVideoDialog\n        className=\"block dark:hidden\"\n        animationStyle=\"top-in-bottom-out\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-light.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n      <HeroVideoDialog\n        className=\"hidden dark:block\"\n        animationStyle=\"top-in-bottom-out\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-dark.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/hero-video-dialog-demo.tsx",
    "content": "import { HeroVideoDialog } from \"@/registry/magicui/hero-video-dialog\"\n\nexport default function HeroVideoDialogDemo() {\n  return (\n    <div className=\"relative\">\n      <HeroVideoDialog\n        className=\"block dark:hidden\"\n        animationStyle=\"from-center\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-light.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n      <HeroVideoDialog\n        className=\"hidden dark:block\"\n        animationStyle=\"from-center\"\n        videoSrc=\"https://www.youtube.com/embed/qh3NGpYRG3I?si=4rb-zSdDkVK9qxxb\"\n        thumbnailSrc=\"https://startup-template-sage.vercel.app/hero-dark.png\"\n        thumbnailAlt=\"Hero Video\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/highlighter-demo.tsx",
    "content": "import { Highlighter } from \"@/registry/magicui/highlighter\"\n\nexport default function HighlighterDemo() {\n  return (\n    <div className=\"text-center\">\n      <p className=\"leading-relaxed\">\n        The{\" \"}\n        <Highlighter action=\"underline\" color=\"#FF9800\">\n          Magic UI Highlighter\n        </Highlighter>{\" \"}\n        makes important{\" \"}\n        <Highlighter action=\"highlight\" color=\"#87CEFA\">\n          text stand out\n        </Highlighter>{\" \"}\n        effortlessly.\n      </p>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/hyper-text-demo.tsx",
    "content": "import { HyperText } from \"@/registry/magicui/hyper-text\"\n\nexport default function HyperTextDemo() {\n  return <HyperText>Hover Me!</HyperText>\n}\n"
  },
  {
    "path": "apps/www/registry/example/icon-cloud-demo-2.tsx",
    "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst images = [\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nexport default function IconCloudDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\">\n      <IconCloud images={images} />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/icon-cloud-demo-3.tsx",
    "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst Icons = {\n  gitHub: () => (\n    <svg width=\"100\" height=\"100\" viewBox=\"0 0 438.549 438.549\">\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      />\n    </svg>\n  ),\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className=\"fill-black dark:fill-white\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n}\n\nexport default function IconCloudDemo() {\n  return (\n    <div className=\"bg-background relative flex size-full max-w-lg items-center justify-center overflow-hidden rounded-lg border\">\n      <IconCloud\n        icons={[\n          <Icons.gitHub key=\"github\" />,\n          <Icons.notion key=\"notion\" />,\n          <Icons.openai key=\"openai\" />,\n          <Icons.googleDrive key=\"gdrive\" />,\n          <Icons.whatsapp key=\"whatsapp\" />,\n          <Icons.gitHub key=\"github2\" />,\n          <Icons.notion key=\"notion2\" />,\n          <Icons.openai key=\"openai2\" />,\n          <Icons.googleDrive key=\"gdrive2\" />,\n          <Icons.whatsapp key=\"whatsapp2\" />,\n          <Icons.gitHub key=\"github3\" />,\n          <Icons.notion key=\"notion3\" />,\n          <Icons.openai key=\"openai3\" />,\n          <Icons.googleDrive key=\"gdrive3\" />,\n          <Icons.whatsapp key=\"whatsapp3\" />,\n          <Icons.gitHub key=\"github4\" />,\n          <Icons.notion key=\"notion4\" />,\n          <Icons.openai key=\"openai4\" />,\n          <Icons.googleDrive key=\"gdrive4\" />,\n          <Icons.whatsapp key=\"whatsapp4\" />,\n          <Icons.notion key=\"notion4\" />,\n          <Icons.openai key=\"openai4\" />,\n          <Icons.googleDrive key=\"gdrive4\" />,\n          <Icons.whatsapp key=\"whatsapp4\" />,\n        ]}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/icon-cloud-demo.tsx",
    "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\"\n\nconst slugs = [\n  \"typescript\",\n  \"javascript\",\n  \"dart\",\n  \"java\",\n  \"react\",\n  \"flutter\",\n  \"android\",\n  \"html5\",\n  \"css3\",\n  \"nodedotjs\",\n  \"express\",\n  \"nextdotjs\",\n  \"prisma\",\n  \"amazonaws\",\n  \"postgresql\",\n  \"firebase\",\n  \"nginx\",\n  \"vercel\",\n  \"testinglibrary\",\n  \"jest\",\n  \"cypress\",\n  \"docker\",\n  \"git\",\n  \"jira\",\n  \"github\",\n  \"gitlab\",\n  \"visualstudiocode\",\n  \"androidstudio\",\n  \"sonarqube\",\n  \"figma\",\n]\n\nexport default function IconCloudDemo() {\n  const images = slugs.map(\n    (slug) => `https://cdn.simpleicons.org/${slug}/${slug}`\n  )\n\n  return (\n    <div className=\"relative flex size-full items-center justify-center overflow-hidden\">\n      <IconCloud images={images} />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/interactive-grid-pattern-demo-2.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\"\n\nexport default function InteractiveGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <InteractiveGridPattern\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\"\n        )}\n        width={20}\n        height={20}\n        squares={[80, 80]}\n        squaresClassName=\"hover:fill-blue-500\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/interactive-grid-pattern-demo.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\"\n\nexport default function InteractiveGridPatternDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <InteractiveGridPattern\n        className={cn(\n          \"[mask-image:radial-gradient(400px_circle_at_center,white,transparent)]\",\n          \"inset-x-0 inset-y-[-30%] h-[200%] skew-y-12\"\n        )}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/interactive-hover-button-demo.tsx",
    "content": "import { InteractiveHoverButton } from \"@/registry/magicui/interactive-hover-button\"\n\nexport default function InteractiveHoverButtonDemo() {\n  return <InteractiveHoverButton>Hover Me</InteractiveHoverButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/iphone-demo-2.tsx",
    "content": "import { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone src=\"https://placehold.co/900x1600?text=Hello+World\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/iphone-demo-3.tsx",
    "content": "import { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone videoSrc=\"https://videos.pexels.com/video-files/8946986/8946986-uhd_1440_2732_25fps.mp4\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/iphone-demo.tsx",
    "content": "import { Iphone } from \"@/registry/magicui/iphone\"\n\nexport default function Demo() {\n  return (\n    <div className=\"w-[434px]\">\n      <Iphone />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/lens-demo-2.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens isStatic position={{ x: 260, y: 150 }}>\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/lens-demo-3.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens defaultPosition={{ x: 260, y: 150 }}>\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/lens-demo.tsx",
    "content": "\"use client\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Lens } from \"@/registry/magicui/lens\"\n\nexport default function LensDemo() {\n  return (\n    <Card className=\"relative max-w-md shadow-none\">\n      <CardHeader>\n        <Lens\n          zoomFactor={2}\n          lensSize={150}\n          isStatic={false}\n          ariaLabel=\"Zoom Area\"\n        >\n          <img\n            src=\"https://images.unsplash.com/photo-1736606355698-5efdb410fe93?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\"\n            alt=\"image placeholder\"\n            width={500}\n            height={500}\n          />\n        </Lens>\n      </CardHeader>\n      <CardContent>\n        <CardTitle className=\"text-2xl\">Your next camp</CardTitle>\n        <CardDescription>\n          See our latest and best camp destinations all across the five\n          continents of the globe.\n        </CardDescription>\n      </CardContent>\n      <CardFooter className=\"space-x-4\">\n        <Button>Let&apos;s go</Button>\n        <Button variant=\"secondary\">Another time</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/light-rays-demo.tsx",
    "content": "import { LightRays } from \"@/registry/magicui/light-rays\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative h-[500px] w-full overflow-hidden rounded-lg border\">\n      <div className=\"relative z-10 flex h-full flex-col items-center justify-center gap-4 px-6 text-center\">\n        <span className=\"text-xs font-semibold tracking-[0.35em] text-slate-800/60 uppercase dark:text-slate-200/60\">\n          Ambient glow\n        </span>\n        <h1 className=\"text-foreground text-4xl font-bold md:text-5xl\">\n          Light Rays\n        </h1>\n        <p className=\"max-w-md text-sm text-slate-800/80 md:text-base dark:text-slate-200/80\">\n          Drop this component into any container and it will fill the space with\n          softly animated light rays shining from above.\n        </p>\n      </div>\n      <LightRays />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/line-shadow-text-demo.tsx",
    "content": "\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { LineShadowText } from \"@/registry/magicui/line-shadow-text\"\n\nexport default function LineShadowTextDemo() {\n  const theme = useTheme()\n  const shadowColor = theme.resolvedTheme === \"dark\" ? \"white\" : \"black\"\n  return (\n    <h1 className=\"text-5xl leading-none font-semibold tracking-tighter text-balance sm:text-6xl md:text-7xl lg:text-8xl\">\n      Ship\n      <LineShadowText className=\"italic\" shadowColor={shadowColor}>\n        Fast\n      </LineShadowText>\n    </h1>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/magic-card-demo.tsx",
    "content": "\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { MagicCard } from \"@/registry/magicui/magic-card\"\n\nexport default function MagicCardDemo() {\n  const { theme } = useTheme()\n  return (\n    <Card className=\"w-full max-w-sm border-none p-0 shadow-none\">\n      <MagicCard\n        gradientColor={theme === \"dark\" ? \"#262626\" : \"#D9D9D955\"}\n        className=\"p-0\"\n      >\n        <CardHeader className=\"border-border border-b p-4 [.border-b]:pb-4\">\n          <CardTitle>Login</CardTitle>\n          <CardDescription>\n            Enter your credentials to access your account\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"p-4\">\n          <form>\n            <div className=\"grid gap-4\">\n              <div className=\"grid gap-2\">\n                <Label htmlFor=\"email\">Email</Label>\n                <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n              </div>\n              <div className=\"grid gap-2\">\n                <Label htmlFor=\"password\">Password</Label>\n                <Input id=\"password\" type=\"password\" />\n              </div>\n            </div>\n          </form>\n        </CardContent>\n        <CardFooter className=\"border-border border-t p-4 [.border-t]:pt-4\">\n          <Button className=\"w-full\">Sign In</Button>\n        </CardFooter>\n      </MagicCard>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/magic-card-demo2.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Link from \"next/link\"\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { AvatarCircles } from \"@/registry/magicui/avatar-circles\"\nimport { MagicCard } from \"@/registry/magicui/magic-card\"\n\nexport default function MagicCardDemo() {\n  const { theme, systemTheme } = useTheme()\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => {\n    setMounted(true)\n  }, [])\n\n  const isDark = mounted\n    ? (theme === \"system\" ? systemTheme : theme) === \"dark\"\n    : true\n\n  return (\n    <Card className=\"w-full max-w-sm border-none p-0 shadow-none\">\n      <MagicCard\n        mode=\"orb\"\n        glowFrom={isDark ? \"#ee4f27\" : \"#E9D5FF\"}\n        glowTo={isDark ? \"#6b21ef\" : \"#FBCFE8\"}\n        className=\"p-0\"\n      >\n        <CardHeader className=\"border-border border-b p-4 [.border-b]:pb-4\">\n          <div className=\"flex items-center gap-3\">\n            <AvatarCircles\n              avatarUrls={[\n                {\n                  imageUrl: \"https://avatars.githubusercontent.com/u/81306489\",\n                  profileUrl: \"https://github.com/Yeom-JinHo\",\n                },\n              ]}\n            />\n            <div className=\"flex-1\">\n              <CardTitle>Yeom JinHo</CardTitle>\n              <CardDescription className=\"mt-1\">\n                Frontend Developer\n              </CardDescription>\n            </div>\n          </div>\n        </CardHeader>\n        <CardContent className=\"space-y-2 p-4\">\n          <p className=\"text-sm font-medium\">\n            Frontend Developer focused on Interactive UI &amp; Performance\n          </p>\n          <p className=\"text-muted-foreground text-sm leading-relaxed\">\n            I&apos;m passionate about visual presentation and currently focusing\n            on interactive UI.\n          </p>\n        </CardContent>\n        <CardFooter className=\"border-border border-t p-4 [.border-t]:pt-4\">\n          <Button asChild className=\"w-full\">\n            <Link\n              href=\"https://github.com/Yeom-JinHo\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"flex items-center justify-center gap-2\"\n            >\n              <svg viewBox=\"0 0 438.549 438.549\" className=\"size-4\">\n                <path\n                  fill=\"currentColor\"\n                  d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n                ></path>\n              </svg>\n              View on GitHub\n            </Link>\n          </Button>\n        </CardFooter>\n      </MagicCard>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/marquee-3d.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\nconst thirdRow = reviews.slice(0, reviews.length / 2)\nconst fourthRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function Marquee3D() {\n  return (\n    <div className=\"relative flex h-96 w-full flex-row items-center justify-center gap-4 overflow-hidden [perspective:300px]\">\n      <div\n        className=\"flex flex-row items-center gap-4\"\n        style={{\n          transform:\n            \"translateX(-100px) translateY(0px) translateZ(-100px) rotateX(20deg) rotateY(-10deg) rotateZ(20deg)\",\n        }}\n      >\n        <Marquee pauseOnHover vertical className=\"[--duration:20s]\">\n          {firstRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee reverse pauseOnHover className=\"[--duration:20s]\" vertical>\n          {secondRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee reverse pauseOnHover className=\"[--duration:20s]\" vertical>\n          {thirdRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n        <Marquee pauseOnHover className=\"[--duration:20s]\" vertical>\n          {fourthRow.map((review) => (\n            <ReviewCard key={review.username} {...review} />\n          ))}\n        </Marquee>\n      </div>\n\n      <div className=\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/marquee-demo-vertical.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-fit cursor-pointer overflow-hidden rounded-xl border p-4 sm:w-36\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function MarqueeDemoVertical() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-row items-center justify-center overflow-hidden\">\n      <Marquee pauseOnHover vertical className=\"[--duration:20s]\">\n        {firstRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <Marquee reverse pauseOnHover vertical className=\"[--duration:20s]\">\n        {secondRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 top-0 h-1/4 bg-linear-to-b\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-x-0 bottom-0 h-1/4 bg-gradient-to-t\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/marquee-demo.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst reviews = [\n  {\n    name: \"Jack\",\n    username: \"@jack\",\n    body: \"I've never seen anything like this before. It's amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jack\",\n  },\n  {\n    name: \"Jill\",\n    username: \"@jill\",\n    body: \"I don't know what to say. I'm speechless. This is amazing.\",\n    img: \"https://avatar.vercel.sh/jill\",\n  },\n  {\n    name: \"John\",\n    username: \"@john\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/john\",\n  },\n  {\n    name: \"Jane\",\n    username: \"@jane\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jane\",\n  },\n  {\n    name: \"Jenny\",\n    username: \"@jenny\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/jenny\",\n  },\n  {\n    name: \"James\",\n    username: \"@james\",\n    body: \"I'm at a loss for words. This is amazing. I love it.\",\n    img: \"https://avatar.vercel.sh/james\",\n  },\n]\n\nconst firstRow = reviews.slice(0, reviews.length / 2)\nconst secondRow = reviews.slice(reviews.length / 2)\n\nconst ReviewCard = ({\n  img,\n  name,\n  username,\n  body,\n}: {\n  img: string\n  name: string\n  username: string\n  body: string\n}) => {\n  return (\n    <figure\n      className={cn(\n        \"relative h-full w-64 cursor-pointer overflow-hidden rounded-xl border p-4\",\n        // light styles\n        \"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]\",\n        // dark styles\n        \"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]\"\n      )}\n    >\n      <div className=\"flex flex-row items-center gap-2\">\n        <img className=\"rounded-full\" width=\"32\" height=\"32\" alt=\"\" src={img} />\n        <div className=\"flex flex-col\">\n          <figcaption className=\"text-sm font-medium dark:text-white\">\n            {name}\n          </figcaption>\n          <p className=\"text-xs font-medium dark:text-white/40\">{username}</p>\n        </div>\n      </div>\n      <blockquote className=\"mt-2 text-sm\">{body}</blockquote>\n    </figure>\n  )\n}\n\nexport default function MarqueeDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden\">\n      <Marquee pauseOnHover className=\"[--duration:20s]\">\n        {firstRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <Marquee reverse pauseOnHover className=\"[--duration:20s]\">\n        {secondRow.map((review) => (\n          <ReviewCard key={review.username} {...review} />\n        ))}\n      </Marquee>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/marquee-logos.tsx",
    "content": "import { cn } from \"@/lib/utils\"\nimport { Marquee } from \"@/registry/magicui/marquee\"\n\nconst logos = [\n  {\n    name: \"Microsoft\",\n    img: \"https://cdn.simpleicons.org/microsoft/000/fff\",\n  },\n  {\n    name: \"Apple\",\n    img: \"https://cdn.simpleicons.org/apple/000/fff\",\n  },\n  {\n    name: \"Google\",\n    img: \"https://cdn.simpleicons.org/google/000/fff\",\n  },\n  {\n    name: \"Facebook\",\n    img: \"https://cdn.simpleicons.org/facebook/000/fff\",\n  },\n  {\n    name: \"LinkedIn\",\n    img: \"https://cdn.simpleicons.org/linkedin/000/fff\",\n  },\n  {\n    name: \"Twitter\",\n    img: \"https://cdn.simpleicons.org/twitter/000/fff\",\n  },\n]\n\nconst Logo = ({ name, img }: { name: string; img: string }) => {\n  return (\n    <div className={cn(\"size-12 cursor-pointer\")}>\n      <img src={img} alt={name} />\n    </div>\n  )\n}\n\nexport default function MarqueeLogos() {\n  return (\n    <div className=\"bg-background relative flex size-full flex-col items-center justify-center gap-4 overflow-hidden rounded-lg border py-20 md:shadow-xl\">\n      <Marquee className=\"[--gap:3rem]\">\n        {logos.map((logo, idx) => (\n          <Logo key={idx} {...logo} />\n        ))}\n      </Marquee>\n      <div className=\"dark:from-background pointer-events-none absolute inset-y-0 left-0 w-1/3 bg-gradient-to-r from-white\"></div>\n      <div className=\"dark:from-background pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-gradient-to-l from-white\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/meteors-demo.tsx",
    "content": "import { Meteors } from \"@/registry/magicui/meteors\"\n\nexport default function MeteorDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <Meteors number={30} />\n      <span className=\"pointer-events-none bg-linear-to-b from-black to-gray-300/80 bg-clip-text text-center text-8xl leading-none font-semibold whitespace-pre-wrap text-transparent dark:from-white dark:to-slate-900/10\">\n        Meteors\n      </span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/morphing-text-demo.tsx",
    "content": "import { MorphingText } from \"@/registry/magicui/morphing-text\"\n\nconst texts = [\n  \"Hello\",\n  \"Morphing\",\n  \"Text\",\n  \"Animation\",\n  \"React\",\n  \"Component\",\n  \"Smooth\",\n  \"Transition\",\n  \"Engaging\",\n]\n\nexport default function MorphingTextDemo() {\n  return <MorphingText texts={texts} />\n}\n"
  },
  {
    "path": "apps/www/registry/example/neon-gradient-card-demo.tsx",
    "content": "import { NeonGradientCard } from \"@/registry/magicui/neon-gradient-card\"\n\nexport default function NeonGradientCardDemo() {\n  return (\n    <NeonGradientCard className=\"max-w-sm items-center justify-center text-center\">\n      <span className=\"pointer-events-none z-10 h-full bg-linear-to-br from-[#ff2975] from-35% to-[#00FFF1] bg-clip-text text-center text-3xl leading-none font-bold tracking-tighter text-balance whitespace-pre-wrap text-transparent md:text-5xl xl:text-6xl dark:drop-shadow-[0_5px_5px_rgba(0,0,0,0.8)]\">\n        Neon Gradient Card\n      </span>\n    </NeonGradientCard>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/number-ticker-decimal-demo.tsx",
    "content": "import { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={5.67}\n      decimalPlaces={2}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/number-ticker-demo-2.tsx",
    "content": "import { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={100}\n      startValue={80}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/number-ticker-demo.tsx",
    "content": "import { NumberTicker } from \"@/registry/magicui/number-ticker\"\n\nexport default function NumberTickerDemo() {\n  return (\n    <NumberTicker\n      value={100}\n      className=\"text-8xl font-medium tracking-tighter whitespace-pre-wrap text-black dark:text-white\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/orbiting-circles-demo.tsx",
    "content": "import { OrbitingCircles } from \"@/registry/magicui/orbiting-circles\"\n\nexport default function OrbitingCirclesDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden\">\n      <OrbitingCircles iconSize={40}>\n        <Icons.whatsapp />\n        <Icons.notion />\n        <Icons.openai />\n        <Icons.googleDrive />\n        <Icons.whatsapp />\n      </OrbitingCircles>\n      <OrbitingCircles iconSize={30} radius={100} reverse speed={2}>\n        <Icons.whatsapp />\n        <Icons.notion />\n        <Icons.openai />\n        <Icons.googleDrive />\n      </OrbitingCircles>\n    </div>\n  )\n}\n\nconst Icons = {\n  gitHub: () => (\n    <svg width=\"100\" height=\"100\" viewBox=\"0 0 438.549 438.549\">\n      <path\n        fill=\"currentColor\"\n        d=\"M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z\"\n      />\n    </svg>\n  ),\n  notion: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 100 100\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z\"\n        fill=\"#000000\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  openai: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className=\"fill-black dark:fill-white\"\n    >\n      <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n    </svg>\n  ),\n  googleDrive: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 87.3 78\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"m6.6 66.85 3.85 6.65c.8 1.4 1.95 2.5 3.3 3.3l13.75-23.8h-27.5c0 1.55.4 3.1 1.2 4.5z\"\n        fill=\"#0066da\"\n      />\n      <path\n        d=\"m43.65 25-13.75-23.8c-1.35.8-2.5 1.9-3.3 3.3l-25.4 44a9.06 9.06 0 0 0 -1.2 4.5h27.5z\"\n        fill=\"#00ac47\"\n      />\n      <path\n        d=\"m73.55 76.8c1.35-.8 2.5-1.9 3.3-3.3l1.6-2.75 7.65-13.25c.8-1.4 1.2-2.95 1.2-4.5h-27.502l5.852 11.5z\"\n        fill=\"#ea4335\"\n      />\n      <path\n        d=\"m43.65 25 13.75-23.8c-1.35-.8-2.9-1.2-4.5-1.2h-18.5c-1.6 0-3.15.45-4.5 1.2z\"\n        fill=\"#00832d\"\n      />\n      <path\n        d=\"m59.8 53h-32.3l-13.75 23.8c1.35.8 2.9 1.2 4.5 1.2h50.8c1.6 0 3.15-.45 4.5-1.2z\"\n        fill=\"#2684fc\"\n      />\n      <path\n        d=\"m73.4 26.5-12.7-22c-.8-1.4-1.95-2.5-3.3-3.3l-13.75 23.8 16.15 28h27.45c0-1.55-.4-3.1-1.2-4.5z\"\n        fill=\"#ffba00\"\n      />\n    </svg>\n  ),\n  whatsapp: () => (\n    <svg\n      width=\"100\"\n      height=\"100\"\n      viewBox=\"0 0 175.216 175.552\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <defs>\n        <linearGradient\n          id=\"b\"\n          x1=\"85.915\"\n          x2=\"86.535\"\n          y1=\"32.567\"\n          y2=\"137.092\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop offset=\"0\" stopColor=\"#57d163\" />\n          <stop offset=\"1\" stopColor=\"#23b33a\" />\n        </linearGradient>\n        <filter\n          id=\"a\"\n          width=\"1.115\"\n          height=\"1.114\"\n          x=\"-.057\"\n          y=\"-.057\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feGaussianBlur stdDeviation=\"3.531\" />\n        </filter>\n      </defs>\n      <path\n        d=\"m54.532 138.45 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.523h.023c33.707 0 61.139-27.426 61.153-61.135.006-16.335-6.349-31.696-17.895-43.251A60.75 60.75 0 0 0 87.94 25.983c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.558zm-40.811 23.544L24.16 123.88c-6.438-11.154-9.825-23.808-9.821-36.772.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954zm0 0\"\n        fill=\"#b3b3b3\"\n        filter=\"url(#a)\"\n      />\n      <path\n        d=\"m12.966 161.238 10.439-38.114a73.42 73.42 0 0 1-9.821-36.772c.017-40.556 33.021-73.55 73.578-73.55 19.681.01 38.154 7.669 52.047 21.572s21.537 32.383 21.53 52.037c-.018 40.553-33.027 73.553-73.578 73.553h-.032c-12.313-.005-24.412-3.094-35.159-8.954z\"\n        fill=\"#ffffff\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.312-6.179 22.559 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.518 31.126 8.524h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.929z\"\n        fill=\"url(#linearGradient1780)\"\n      />\n      <path\n        d=\"M87.184 25.227c-33.733 0-61.166 27.423-61.178 61.13a60.98 60.98 0 0 0 9.349 32.535l1.455 2.313-6.179 22.558 23.146-6.069 2.235 1.324c9.387 5.571 20.15 8.517 31.126 8.523h.023c33.707 0 61.14-27.426 61.153-61.135a60.75 60.75 0 0 0-17.895-43.251 60.75 60.75 0 0 0-43.235-17.928z\"\n        fill=\"url(#b)\"\n      />\n      <path\n        d=\"M68.772 55.603c-1.378-3.061-2.828-3.123-4.137-3.176l-3.524-.043c-1.226 0-3.218.46-4.902 2.3s-6.435 6.287-6.435 15.332 6.588 17.785 7.506 19.013 12.718 20.381 31.405 27.75c15.529 6.124 18.689 4.906 22.061 4.6s10.877-4.447 12.408-8.74 1.532-7.971 1.073-8.74-1.685-1.226-3.525-2.146-10.877-5.367-12.562-5.981-2.91-.919-4.137.921-4.746 5.979-5.819 7.206-2.144 1.381-3.984.462-7.76-2.861-14.784-9.124c-5.465-4.873-9.154-10.891-10.228-12.73s-.114-2.835.808-3.751c.825-.824 1.838-2.147 2.759-3.22s1.224-1.84 1.836-3.065.307-2.301-.153-3.22-4.032-10.011-5.666-13.647\"\n        fill=\"#ffffff\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n}\n"
  },
  {
    "path": "apps/www/registry/example/particles-demo.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useTheme } from \"next-themes\"\n\nimport { Particles } from \"@/registry/magicui/particles\"\n\nexport default function ParticlesDemo() {\n  const { resolvedTheme } = useTheme()\n  const [color, setColor] = useState(\"#ffffff\")\n\n  useEffect(() => {\n    setColor(resolvedTheme === \"dark\" ? \"#ffffff\" : \"#000000\")\n  }, [resolvedTheme])\n\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none z-10 text-center text-8xl leading-none font-semibold whitespace-pre-wrap\">\n        Particles\n      </span>\n      <Particles\n        className=\"absolute inset-0 z-0\"\n        quantity={100}\n        ease={80}\n        color={color}\n        refresh\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/pixel-image-demo.tsx",
    "content": "import { PixelImage } from \"@/registry/magicui/pixel-image\"\n\nexport default function Home() {\n  return (\n    <PixelImage\n      src=\"/pixel-image-demo.jpg\"\n      customGrid={{ rows: 4, cols: 6 }}\n      grayscaleAnimation\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/pointer-demo-1.tsx",
    "content": "\"use client\"\n\nimport { motion } from \"motion/react\"\n\nimport { Pointer } from \"@/registry/magicui/pointer\"\n\nexport default function PointerDemo1() {\n  return (\n    <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2 md:grid-rows-2\">\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Animated Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">Animated pointer</p>\n        </div>\n        <Pointer>\n          <motion.div\n            animate={{\n              scale: [0.8, 1, 0.8],\n              rotate: [0, 5, -5, 0],\n            }}\n            transition={{\n              duration: 1.5,\n              repeat: Infinity,\n              ease: \"easeInOut\",\n            }}\n          >\n            <svg\n              width=\"40\"\n              height=\"40\"\n              viewBox=\"0 0 40 40\"\n              fill=\"none\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"text-pink-600\"\n            >\n              <motion.path\n                d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"\n                fill=\"currentColor\"\n                animate={{ scale: [1, 1.2, 1] }}\n                transition={{\n                  duration: 0.8,\n                  repeat: Infinity,\n                  ease: \"easeInOut\",\n                }}\n              />\n            </svg>\n          </motion.div>\n        </Pointer>\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Colored Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            A custom pointer with different color\n          </p>\n        </div>\n        <Pointer className=\"fill-blue-500\" />\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Custom Shape</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            A pointer with a custom SVG shape\n          </p>\n        </div>\n        <Pointer>\n          <svg\n            width=\"24\"\n            height=\"24\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <circle cx=\"12\" cy=\"12\" r=\"10\" className=\"fill-purple-500\" />\n            <circle cx=\"12\" cy=\"12\" r=\"5\" className=\"fill-white\" />\n          </svg>\n        </Pointer>\n      </div>\n\n      <div className=\"border-border rounded-lg border p-4\">\n        <div className=\"relative flex h-40 flex-col items-center justify-center\">\n          <h3 className=\"text-xl font-semibold\">Emoji Pointer</h3>\n          <p className=\"text-muted-foreground text-sm\">\n            Using an emoji as a custom pointer\n          </p>\n        </div>\n        <Pointer>\n          <div className=\"text-2xl\">👆</div>\n        </Pointer>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/progressive-blur-demo.tsx",
    "content": "\"use client\"\n\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\nimport { ProgressiveBlur } from \"@/registry/magicui/progressive-blur\"\n\nexport default function ProgressiveBlurDemo() {\n  return (\n    <div className=\"relative w-full rounded-xl border\">\n      <ScrollArea className=\"relative h-[400px] overflow-hidden\">\n        <div className=\"flex flex-col gap-2 p-4\">\n          {Array.from({ length: 20 }).map((_, index) => (\n            <div\n              key={index}\n              className=\"bg-card flex h-20 w-full items-center justify-center rounded-xl border\"\n            >\n              {index}\n            </div>\n          ))}\n        </div>\n        <ProgressiveBlur position=\"bottom\" height=\"40%\" />\n      </ScrollArea>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/pulsating-button-demo.tsx",
    "content": "import { PulsatingButton } from \"@/registry/magicui/pulsating-button\"\n\nexport default function PulsatingButtonDemo() {\n  return <PulsatingButton>Join Affiliate Program</PulsatingButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/rainbow-button-demo-2.tsx",
    "content": "import { RainbowButton } from \"@/registry/magicui/rainbow-button\"\n\nexport default function RainbowButtonDemo() {\n  return <RainbowButton variant=\"outline\">Get Unlimited Access</RainbowButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/rainbow-button-demo.tsx",
    "content": "import { RainbowButton } from \"@/registry/magicui/rainbow-button\"\n\nexport default function RainbowButtonDemo() {\n  return <RainbowButton>Get Unlimited Access</RainbowButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/retro-grid-demo.tsx",
    "content": "\"use client\"\n\nimport { RetroGrid } from \"@/registry/magicui/retro-grid\"\n\nexport default function RetroGridDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <span className=\"pointer-events-none z-10 bg-linear-to-b from-[#ffd319] via-[#ff2975] to-[#8c1eff] bg-clip-text text-center text-7xl leading-none font-bold tracking-tighter whitespace-pre-wrap text-transparent\">\n        Retro Grid\n      </span>\n\n      <RetroGrid />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/ripple-button-demo.tsx",
    "content": "import { RippleButton } from \"@/registry/magicui/ripple-button\"\n\nexport default function RippleButtonDemo() {\n  return <RippleButton rippleColor=\"#ADD8E6\">Click me</RippleButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/ripple-demo.tsx",
    "content": "import { Ripple } from \"@/registry/magicui/ripple\"\n\nexport default function RippleDemo() {\n  return (\n    <div className=\"bg-background relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <p className=\"z-10 text-center text-5xl font-medium tracking-tighter whitespace-pre-wrap text-white\">\n        Ripple\n      </p>\n      <Ripple />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/safari-demo-2.tsx",
    "content": "import { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari\n        url=\"magicui.design\"\n        imageSrc=\"https://placehold.co/1200x750?text=Hello+World\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/safari-demo-3.tsx",
    "content": "import { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari\n        url=\"magicui.design\"\n        videoSrc=\"https://videos.pexels.com/video-files/27180348/12091515_2560_1440_50fps.mp4\"\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/safari-demo-4.tsx",
    "content": "import { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari url=\"magicui.design\" mode=\"simple\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/safari-demo.tsx",
    "content": "import { Safari } from \"@/registry/magicui/safari\"\n\nexport default function SafariDemo() {\n  return (\n    <div className=\"w-[1203px]\">\n      <Safari url=\"magicui.design\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/scroll-based-velocity-demo.tsx",
    "content": "import {\n  ScrollVelocityContainer,\n  ScrollVelocityRow,\n} from \"@/registry/magicui/scroll-based-velocity\"\n\nexport default function ScrollBasedVelocityDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden\">\n      <ScrollVelocityContainer className=\"text-4xl font-bold tracking-[-0.02em] md:text-7xl md:leading-20\">\n        <ScrollVelocityRow baseVelocity={20} direction={1}>\n          Velocity Scroll\n        </ScrollVelocityRow>\n        <ScrollVelocityRow baseVelocity={20} direction={-1}>\n          Velocity Scroll\n        </ScrollVelocityRow>\n      </ScrollVelocityContainer>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/scroll-based-velocity-images-demo.tsx",
    "content": "import {\n  ScrollVelocityContainer,\n  ScrollVelocityRow,\n} from \"@/registry/magicui/scroll-based-velocity\"\n\nconst IMAGES_ROW_A = [\n  \"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nconst IMAGES_ROW_B = [\n  \"https://images.unsplash.com/photo-1749738456487-2af715ab65ea?q=80&w=2340&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n  \"https://plus.unsplash.com/premium_photo-1720139288219-e20aa9c8895b?q=80&w=1810&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n]\n\nexport default function ScrollBasedVelocityImagesDemo() {\n  return (\n    <div className=\"relative flex w-full flex-col items-center justify-center overflow-hidden py-8\">\n      <ScrollVelocityContainer className=\"w-full\">\n        <ScrollVelocityRow baseVelocity={6} direction={1} className=\"py-4\">\n          {IMAGES_ROW_A.map((src, idx) => (\n            <img\n              key={idx}\n              src={`${src}&ixlib=rb-4.0.3`}\n              alt=\"Unsplash sample\"\n              width={240}\n              height={160}\n              loading=\"lazy\"\n              decoding=\"async\"\n              className=\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\"\n            />\n          ))}\n        </ScrollVelocityRow>\n        <ScrollVelocityRow baseVelocity={6} direction={-1} className=\"py-4\">\n          {IMAGES_ROW_B.map((src, idx) => (\n            <img\n              key={idx}\n              src={`${src}&ixlib=rb-4.0.3`}\n              alt=\"Unsplash sample\"\n              width={240}\n              height={160}\n              loading=\"lazy\"\n              decoding=\"async\"\n              className=\"mx-4 inline-block h-40 w-60 rounded-lg object-cover shadow-sm\"\n            />\n          ))}\n        </ScrollVelocityRow>\n      </ScrollVelocityContainer>\n\n      <div className=\"from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r\"></div>\n      <div className=\"from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l\"></div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/scroll-progress-demo.tsx",
    "content": "import { ScrollProgress } from \"@/registry/magicui/scroll-progress\"\n\nexport default function ScrollProgressDemo() {\n  return (\n    <div className=\"z-10 rounded-lg p-4\">\n      <ScrollProgress className=\"top-[65px]\" />\n      <h2 className=\"pb-4 font-bold\">\n        Note: The scroll progress is shown below the navbar of the page.\n      </h2>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/shimmer-button-demo.tsx",
    "content": "import { ShimmerButton } from \"@/registry/magicui/shimmer-button\"\n\nexport default function ShimmerButtonDemo() {\n  return (\n    <ShimmerButton className=\"shadow-2xl\">\n      <span className=\"text-center text-sm leading-none font-medium tracking-tight whitespace-pre-wrap text-white lg:text-lg dark:from-white dark:to-slate-900/10\">\n        Shimmer Button\n      </span>\n    </ShimmerButton>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/shine-border-demo-2.tsx",
    "content": "\"use client\"\n\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { ShineBorder } from \"@/registry/magicui/shine-border\"\n\nexport default function ShineBorderDemo2() {\n  const theme = useTheme()\n  return (\n    <Card className=\"relative overflow-hidden\">\n      <ShineBorder shineColor={theme.theme === \"dark\" ? \"white\" : \"black\"} />\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid gap-4\">\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n            </div>\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input id=\"password\" type=\"password\" />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter>\n        <Button className=\"w-full\">Sign In</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/shine-border-demo.tsx",
    "content": "import { Button } from \"@/components/ui/button\"\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { ShineBorder } from \"@/registry/magicui/shine-border\"\n\nexport default function ShineBorderDemo() {\n  return (\n    <Card className=\"relative w-full max-w-[350px] overflow-hidden\">\n      <ShineBorder shineColor={[\"#A07CFE\", \"#FE8FB5\", \"#FFBE7B\"]} />\n      <CardHeader>\n        <CardTitle>Login</CardTitle>\n        <CardDescription>\n          Enter your credentials to access your account\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n        <form>\n          <div className=\"grid gap-4\">\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input id=\"email\" type=\"email\" placeholder=\"name@example.com\" />\n            </div>\n            <div className=\"grid gap-2\">\n              <Label htmlFor=\"password\">Password</Label>\n              <Input id=\"password\" type=\"password\" />\n            </div>\n          </div>\n        </form>\n      </CardContent>\n      <CardFooter>\n        <Button className=\"w-full\">Sign In</Button>\n      </CardFooter>\n    </Card>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/shiny-button-demo.tsx",
    "content": "import { ShinyButton } from \"@/registry/magicui/shiny-button\"\n\nexport default function ShinyButtonDemo() {\n  return <ShinyButton>Shiny Button</ShinyButton>\n}\n"
  },
  {
    "path": "apps/www/registry/example/smooth-cursor-demo.tsx",
    "content": "import { SmoothCursor } from \"@/registry/magicui/smooth-cursor\"\n\nexport default function SmoothCursorDemo() {\n  return (\n    <>\n      <span className=\"hidden md:block\">Move your mouse around</span>\n      <span className=\"block md:hidden\">\n        SmoothCursor is disabled on touch devices\n      </span>\n      <SmoothCursor />\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/sparkles-text-demo.tsx",
    "content": "import { SparklesText } from \"@/registry/magicui/sparkles-text\"\n\nexport default function SparklesTextDemo() {\n  return <SparklesText>Magic UI</SparklesText>\n}\n"
  },
  {
    "path": "apps/www/registry/example/spinning-text-demo-2.tsx",
    "content": "import { SpinningText } from \"@/registry/magicui/spinning-text\"\n\nexport default function SpinningTextBasic() {\n  return (\n    <SpinningText reverse className=\"text-4xl\" duration={4} radius={6}>\n      learn more • earn more • grow more •\n    </SpinningText>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/spinning-text-demo.tsx",
    "content": "import { SpinningText } from \"@/registry/magicui/spinning-text\"\n\nexport default function SpinningTextBasic() {\n  return <SpinningText>learn more • earn more • grow more •</SpinningText>\n}\n"
  },
  {
    "path": "apps/www/registry/example/striped-pattern-dashed.tsx",
    "content": "import { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function Component() {\n  return (\n    <div className=\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern className=\"stroke-[0.3] [stroke-dasharray:8,4]\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/striped-pattern-demo.tsx",
    "content": "import { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function StripedPatternDemo() {\n  return (\n    <div className=\"relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern className=\"[mask-image:radial-gradient(300px_circle_at_center,white,transparent)]\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/striped-pattern-right.tsx",
    "content": "import { StripedPattern } from \"@/registry/magicui/striped-pattern\"\n\nexport default function StripedPatternRight() {\n  return (\n    <div className=\"relative flex h-[300px] w-full flex-col items-center justify-center overflow-hidden rounded-lg border\">\n      <StripedPattern direction=\"right\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/terminal-demo-2.tsx",
    "content": "import {\n  AnimatedSpan,\n  Terminal,\n  TypingAnimation,\n} from \"@/registry/magicui/terminal\"\n\nexport default function TerminalDemo2() {\n  return (\n    <Terminal>\n      <TypingAnimation delay={0}>$ ls</TypingAnimation>\n\n      <AnimatedSpan delay={800} className=\"text-blue-500\">\n        Documents Downloads Pictures\n      </AnimatedSpan>\n\n      <TypingAnimation delay={1600}>$ cd Documents</TypingAnimation>\n\n      <TypingAnimation delay={2400}>$ pwd</TypingAnimation>\n\n      <AnimatedSpan delay={3200} className=\"text-green-500\">\n        /home/user/Documents\n      </AnimatedSpan>\n    </Terminal>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/terminal-demo.tsx",
    "content": "import {\n  AnimatedSpan,\n  Terminal,\n  TypingAnimation,\n} from \"@/registry/magicui/terminal\"\n\nexport default function TerminalDemo() {\n  return (\n    <Terminal>\n      <TypingAnimation>&gt; pnpm dlx shadcn@latest init</TypingAnimation>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Preflight checks.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Verifying framework. Found Next.js.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Validating Tailwind CSS.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Validating import alias.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Writing components.json.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Checking registry.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Updating tailwind.config.ts\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Updating app/globals.css\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-green-500\">\n        ✔ Installing dependencies.\n      </AnimatedSpan>\n\n      <AnimatedSpan className=\"text-blue-500\">\n        <span>ℹ Updated 1 file:</span>\n        <span className=\"pl-2\">- lib/utils.ts</span>\n      </AnimatedSpan>\n\n      <TypingAnimation className=\"text-muted-foreground\">\n        Success! Project initialization completed.\n      </TypingAnimation>\n\n      <TypingAnimation className=\"text-muted-foreground\">\n        You may now add components.\n      </TypingAnimation>\n    </Terminal>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-2.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo2() {\n  return (\n    <TextAnimate animation=\"blurIn\" as=\"h1\">\n      Blur in text\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-3.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo3() {\n  return (\n    <TextAnimate animation=\"slideUp\" by=\"word\">\n      Slide up by word\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-4.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo4() {\n  return (\n    <TextAnimate animation=\"scaleUp\" by=\"text\">\n      Scale up by text\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-5.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo5() {\n  return (\n    <TextAnimate animation=\"fadeIn\" by=\"line\" as=\"p\">\n      {`Fade in by line as paragraph\\n\\nFade in by line as paragraph\\n\\nFade in by line as paragraph`}\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-6.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo6() {\n  return (\n    <TextAnimate animation=\"slideLeft\" by=\"character\">\n      Slide left by character\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-7.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo7() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" delay={2}>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-8.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo8() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" duration={5}>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo-9.tsx",
    "content": "\"use client\"\n\nimport { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo9() {\n  return (\n    <TextAnimate\n      variants={{\n        hidden: {\n          opacity: 0,\n          y: 30,\n          rotate: 45,\n          scale: 0.5,\n        },\n        show: (i) => ({\n          opacity: 1,\n          y: 0,\n          rotate: 0,\n          scale: 1,\n          transition: {\n            delay: i * 0.1,\n            duration: 0.4,\n            y: {\n              type: \"spring\",\n              damping: 12,\n              stiffness: 200,\n              mass: 0.8,\n            },\n            rotate: {\n              type: \"spring\",\n              damping: 8,\n              stiffness: 150,\n            },\n            scale: {\n              type: \"spring\",\n              damping: 10,\n              stiffness: 300,\n            },\n          },\n        }),\n        exit: (i) => ({\n          opacity: 0,\n          y: 30,\n          rotate: 45,\n          scale: 0.5,\n          transition: {\n            delay: i * 0.1,\n            duration: 0.4,\n          },\n        }),\n      }}\n      by=\"character\"\n    >\n      Wavy Motion!\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-animate-demo.tsx",
    "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\"\n\nexport default function TextAnimateDemo() {\n  return (\n    <TextAnimate animation=\"blurInUp\" by=\"character\" once>\n      Blur in by character\n    </TextAnimate>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/text-reveal-demo.tsx",
    "content": "import { TextReveal } from \"@/registry/magicui/text-reveal\"\n\nexport default function TextRevealDemo() {\n  return <TextReveal>Magic UI will change the way you design.</TextReveal>\n}\n"
  },
  {
    "path": "apps/www/registry/example/tweet-card-demo.tsx",
    "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\n/**\n * <TweetCard /> (Server Side Only)\n * <ClientTweetCard /> (Client Side Only)\n */\nexport default function TweetDemo() {\n  return <ClientTweetCard id=\"1668408059125702661\" />\n}\n"
  },
  {
    "path": "apps/www/registry/example/tweet-card-images.tsx",
    "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetImages() {\n  return <ClientTweetCard id=\"1678577280489234432\" className=\"shadow-2xl\" />\n}\n"
  },
  {
    "path": "apps/www/registry/example/tweet-card-meta-preview.tsx",
    "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\"\n\nexport default function TweetMetaPreview() {\n  return <ClientTweetCard id=\"1675849118445436929\" className=\"shadow-2xl\" />\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-2.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation words={[\"Design 🎨\", \"Build 🔨\", \"Ship 🚀\"]} loop />\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-3.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <TypingAnimation\n      words={[\"Fast typing\", \"Slow delete\"]}\n      typeSpeed={50}\n      deleteSpeed={150}\n      pauseDelay={2000}\n      loop\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-4.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <TypingAnimation startOnView>Starts typing when in view</TypingAnimation>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-5.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation showCursor={false}>No cursor shown</TypingAnimation>\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-6.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation words={[\"First\", \"Second\", \"Final\"]} loop={false} />\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-7.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <div className=\"flex-1 space-y-8\">\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          With blinking cursor (default) - watch during pause\n        </p>\n        <TypingAnimation\n          words={[\"Type\", \"Pause\", \"Delete\"]}\n          blinkCursor={true}\n          pauseDelay={2000}\n          loop\n          className=\"text-4xl font-bold\"\n        >\n          Blinking cursor\n        </TypingAnimation>\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Without blinking cursor - static during pause\n        </p>\n        <TypingAnimation\n          words={[\"Type\", \"Pause\", \"Delete\"]}\n          blinkCursor={false}\n          pauseDelay={2000}\n          loop\n          className=\"text-4xl font-bold\"\n        >\n          Static cursor\n        </TypingAnimation>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo-8.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return (\n    <div className=\"flex-1 space-y-8\">\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Line cursor (default)\n        </p>\n        <TypingAnimation\n          words={[\"Line cursor\"]}\n          cursorStyle=\"line\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">\n          Block cursor (VSCode style)\n        </p>\n        <TypingAnimation\n          words={[\"Block cursor\"]}\n          cursorStyle=\"block\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n      <div>\n        <p className=\"text-muted-foreground mb-2 text-sm\">Underscore cursor</p>\n        <TypingAnimation\n          words={[\"Underscore cursor\"]}\n          cursorStyle=\"underscore\"\n          loop\n          className=\"text-4xl font-bold\"\n        />\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/typing-animation-demo.tsx",
    "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\"\n\nexport default function Component() {\n  return <TypingAnimation>Hello World! 👋</TypingAnimation>\n}\n"
  },
  {
    "path": "apps/www/registry/example/video-text-demo.tsx",
    "content": "import { VideoText } from \"@/registry/magicui/video-text\"\n\nexport default function VideoTextDemo() {\n  return (\n    <div className=\"relative h-[200px] w-full overflow-hidden\">\n      <VideoText src=\"https://cdn.magicui.design/ocean-small.webm\">\n        OCEAN\n      </VideoText>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/warp-background-demo.tsx",
    "content": "import {\n  Card,\n  CardContent,\n  CardDescription,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport { WarpBackground } from \"@/registry/magicui/warp-background\"\n\nexport default function ExampleComponentDemo() {\n  return (\n    <WarpBackground>\n      <Card className=\"w-80\">\n        <CardContent className=\"flex flex-col gap-2 p-4\">\n          <CardTitle>Congratulations on Your Promotion!</CardTitle>\n          <CardDescription>\n            Your hard work and dedication have paid off. We&apos;re thrilled to\n            see you take this next step in your career. Keep up the fantastic\n            work!\n          </CardDescription>\n        </CardContent>\n      </Card>\n    </WarpBackground>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/example/word-rotate-demo.tsx",
    "content": "import { WordRotate } from \"@/registry/magicui/word-rotate\"\n\nexport default function WordRotateDemo() {\n  return (\n    <WordRotate\n      className=\"text-4xl font-bold text-black dark:text-white\"\n      words={[\"Word\", \"Rotate\"]}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/index.ts",
    "content": "import { registryIndexSchema, RegistryItem, type Registry } from \"shadcn/schema\"\n\nimport { examples } from \"@/registry/registry-examples\"\nimport { lib } from \"@/registry/registry-lib\"\nimport { ui } from \"@/registry/registry-ui\"\n\nconst DEPRECATED_ITEMS = [\"\"]\n\nconst DEFAULT: RegistryItem = {\n  name: \"index\",\n  type: \"registry:style\",\n  dependencies: [\"class-variance-authority\", \"lucide-react\"],\n  devDependencies: [\"tw-animate-css\"],\n  registryDependencies: [\"utils\"],\n  cssVars: {},\n  files: [],\n}\n\nexport const registry = {\n  name: \"magicui\",\n  homepage: \"https://magicui.design\",\n  items: registryIndexSchema.parse(\n    [DEFAULT, ...ui, ...examples, ...lib].filter((item) => {\n      return !DEPRECATED_ITEMS.includes(item.name)\n    })\n  ),\n} satisfies Registry\n"
  },
  {
    "path": "apps/www/registry/lib/utils.ts",
    "content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/android.tsx",
    "content": "import { SVGProps } from \"react\"\n\nexport interface AndroidProps extends SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  src?: string\n  videoSrc?: string\n}\n\nexport function Android({\n  width = 433,\n  height = 882,\n  src,\n  videoSrc,\n  ...props\n}: AndroidProps) {\n  return (\n    <svg\n      width={width}\n      height={height}\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <path\n        d=\"M376 153H378C379.105 153 380 153.895 380 155V249C380 250.105 379.105 251 378 251H376V153Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M376 301H378C379.105 301 380 301.895 380 303V351C380 352.105 379.105 353 378 353H376V301Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M0 42C0 18.8041 18.804 0 42 0H336C359.196 0 378 18.804 378 42V788C378 811.196 359.196 830 336 830H42C18.804 830 0 811.196 0 788V42Z\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      <path\n        d=\"M2 43C2 22.0132 19.0132 5 40 5H338C358.987 5 376 22.0132 376 43V787C376 807.987 358.987 825 338 825H40C19.0132 825 2 807.987 2 787V43Z\"\n        className=\"fill-white dark:fill-[#262626]\"\n      />\n\n      <g clipPath=\"url(#clip0_514_20855)\">\n        <path\n          d=\"M9.25 48C9.25 29.3604 24.3604 14.25 43 14.25H335C353.64 14.25 368.75 29.3604 368.75 48V780C368.75 798.64 353.64 813.75 335 813.75H43C24.3604 813.75 9.25 798.64 9.25 780V48Z\"\n          className=\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\"\n        />\n      </g>\n      <circle\n        cx=\"189\"\n        cy=\"28\"\n        r=\"9\"\n        className=\"fill-white dark:fill-[#262626]\"\n      />\n      <circle\n        cx=\"189\"\n        cy=\"28\"\n        r=\"4\"\n        className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n      />\n      {src && (\n        <image\n          href={src}\n          width=\"360\"\n          height=\"800\"\n          className=\"size-full object-cover\"\n          preserveAspectRatio=\"xMidYMid slice\"\n          clipPath=\"url(#clip0_514_20855)\"\n        />\n      )}\n      {videoSrc && (\n        <foreignObject\n          width=\"380\"\n          height=\"820\"\n          clipPath=\"url(#clip0_514_20855)\"\n          preserveAspectRatio=\"xMidYMid slice\"\n        >\n          <video\n            className=\"size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n          />\n        </foreignObject>\n      )}\n      <defs>\n        <clipPath id=\"clip0_514_20855\">\n          <rect\n            width=\"360\"\n            height=\"800\"\n            rx=\"33\"\n            ry=\"25\"\n            className=\"fill-white dark:fill-[#262626]\"\n            transform=\"translate(9 14)\"\n          />\n        </clipPath>\n      </defs>\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-beam.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useId, useState, type RefObject } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedBeamProps {\n  className?: string\n  containerRef: RefObject<HTMLElement | null> // Container ref\n  fromRef: RefObject<HTMLElement | null>\n  toRef: RefObject<HTMLElement | null>\n  curvature?: number\n  reverse?: boolean\n  pathColor?: string\n  pathWidth?: number\n  pathOpacity?: number\n  gradientStartColor?: string\n  gradientStopColor?: string\n  delay?: number\n  duration?: number\n  repeat?: number\n  repeatDelay?: number\n  startXOffset?: number\n  startYOffset?: number\n  endXOffset?: number\n  endYOffset?: number\n}\n\nexport const AnimatedBeam: React.FC<AnimatedBeamProps> = ({\n  className,\n  containerRef,\n  fromRef,\n  toRef,\n  curvature = 0,\n  reverse = false, // Include the reverse prop\n  duration = 5,\n  delay = 0,\n  pathColor = \"gray\",\n  pathWidth = 2,\n  pathOpacity = 0.2,\n  gradientStartColor = \"#ffaa40\",\n  gradientStopColor = \"#9c40ff\",\n  repeat = Infinity,\n  repeatDelay = 0,\n  startXOffset = 0,\n  startYOffset = 0,\n  endXOffset = 0,\n  endYOffset = 0,\n}) => {\n  const id = useId()\n  const [pathD, setPathD] = useState(\"\")\n  const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 })\n\n  // Calculate the gradient coordinates based on the reverse prop\n  const gradientCoordinates = reverse\n    ? {\n        x1: [\"90%\", \"-10%\"],\n        x2: [\"100%\", \"0%\"],\n        y1: [\"0%\", \"0%\"],\n        y2: [\"0%\", \"0%\"],\n      }\n    : {\n        x1: [\"10%\", \"110%\"],\n        x2: [\"0%\", \"100%\"],\n        y1: [\"0%\", \"0%\"],\n        y2: [\"0%\", \"0%\"],\n      }\n\n  useEffect(() => {\n    const updatePath = () => {\n      if (containerRef.current && fromRef.current && toRef.current) {\n        const containerRect = containerRef.current.getBoundingClientRect()\n        const rectA = fromRef.current.getBoundingClientRect()\n        const rectB = toRef.current.getBoundingClientRect()\n\n        const svgWidth = containerRect.width\n        const svgHeight = containerRect.height\n        setSvgDimensions({ width: svgWidth, height: svgHeight })\n\n        const startX =\n          rectA.left - containerRect.left + rectA.width / 2 + startXOffset\n        const startY =\n          rectA.top - containerRect.top + rectA.height / 2 + startYOffset\n        const endX =\n          rectB.left - containerRect.left + rectB.width / 2 + endXOffset\n        const endY =\n          rectB.top - containerRect.top + rectB.height / 2 + endYOffset\n\n        const controlY = startY - curvature\n        const d = `M ${startX},${startY} Q ${\n          (startX + endX) / 2\n        },${controlY} ${endX},${endY}`\n        setPathD(d)\n      }\n    }\n\n    // Initialize ResizeObserver\n    const resizeObserver = new ResizeObserver(() => {\n      updatePath()\n    })\n\n    // Observe the container element\n    if (containerRef.current) {\n      resizeObserver.observe(containerRef.current)\n    }\n\n    // Call the updatePath initially to set the initial path\n    updatePath()\n\n    // Clean up the observer on component unmount\n    return () => {\n      resizeObserver.disconnect()\n    }\n  }, [\n    containerRef,\n    fromRef,\n    toRef,\n    curvature,\n    startXOffset,\n    startYOffset,\n    endXOffset,\n    endYOffset,\n  ])\n\n  return (\n    <svg\n      fill=\"none\"\n      width={svgDimensions.width}\n      height={svgDimensions.height}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={cn(\n        \"pointer-events-none absolute top-0 left-0 transform-gpu stroke-2\",\n        className\n      )}\n      viewBox={`0 0 ${svgDimensions.width} ${svgDimensions.height}`}\n    >\n      <path\n        d={pathD}\n        stroke={pathColor}\n        strokeWidth={pathWidth}\n        strokeOpacity={pathOpacity}\n        strokeLinecap=\"round\"\n      />\n      <path\n        d={pathD}\n        strokeWidth={pathWidth}\n        stroke={`url(#${id})`}\n        strokeOpacity=\"1\"\n        strokeLinecap=\"round\"\n      />\n      <defs>\n        <motion.linearGradient\n          className=\"transform-gpu\"\n          id={id}\n          gradientUnits={\"userSpaceOnUse\"}\n          initial={{\n            x1: \"0%\",\n            x2: \"0%\",\n            y1: \"0%\",\n            y2: \"0%\",\n          }}\n          animate={{\n            x1: gradientCoordinates.x1,\n            x2: gradientCoordinates.x2,\n            y1: gradientCoordinates.y1,\n            y2: gradientCoordinates.y2,\n          }}\n          transition={{\n            delay,\n            duration,\n            ease: [0.16, 1, 0.3, 1], // https://easings.net/#easeOutExpo\n            repeat,\n            repeatDelay,\n          }}\n        >\n          <stop stopColor={gradientStartColor} stopOpacity=\"0\"></stop>\n          <stop stopColor={gradientStartColor}></stop>\n          <stop offset=\"32.5%\" stopColor={gradientStopColor}></stop>\n          <stop\n            offset=\"100%\"\n            stopColor={gradientStopColor}\n            stopOpacity=\"0\"\n          ></stop>\n        </motion.linearGradient>\n      </defs>\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-circular-progress-bar.tsx",
    "content": "import { cn } from \"@/lib/utils\"\n\ninterface AnimatedCircularProgressBarProps {\n  max?: number\n  min?: number\n  value: number\n  gaugePrimaryColor: string\n  gaugeSecondaryColor: string\n  className?: string\n}\n\nexport function AnimatedCircularProgressBar({\n  max = 100,\n  min = 0,\n  value = 0,\n  gaugePrimaryColor,\n  gaugeSecondaryColor,\n  className,\n}: AnimatedCircularProgressBarProps) {\n  const circumference = 2 * Math.PI * 45\n  const percentPx = circumference / 100\n  const currentPercent = Math.round(((value - min) / (max - min)) * 100)\n\n  return (\n    <div\n      className={cn(\"relative size-40 text-2xl font-semibold\", className)}\n      style={\n        {\n          \"--circle-size\": \"100px\",\n          \"--circumference\": circumference,\n          \"--percent-to-px\": `${percentPx}px`,\n          \"--gap-percent\": \"5\",\n          \"--offset-factor\": \"0\",\n          \"--transition-length\": \"1s\",\n          \"--transition-step\": \"200ms\",\n          \"--delay\": \"0s\",\n          \"--percent-to-deg\": \"3.6deg\",\n          transform: \"translateZ(0)\",\n        } as React.CSSProperties\n      }\n    >\n      <svg\n        fill=\"none\"\n        className=\"size-full\"\n        strokeWidth=\"2\"\n        viewBox=\"0 0 100 100\"\n      >\n        {currentPercent <= 90 && currentPercent >= 0 && (\n          <circle\n            cx=\"50\"\n            cy=\"50\"\n            r=\"45\"\n            strokeWidth=\"10\"\n            strokeDashoffset=\"0\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            className=\"opacity-100\"\n            style={\n              {\n                stroke: gaugeSecondaryColor,\n                \"--stroke-percent\": 90 - currentPercent,\n                \"--offset-factor-secondary\": \"calc(1 - var(--offset-factor))\",\n                strokeDasharray:\n                  \"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\",\n                transform:\n                  \"rotate(calc(1turn - 90deg - (var(--gap-percent) * var(--percent-to-deg) * var(--offset-factor-secondary)))) scaleY(-1)\",\n                transition: \"all var(--transition-length) ease var(--delay)\",\n                transformOrigin:\n                  \"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\",\n              } as React.CSSProperties\n            }\n          />\n        )}\n        <circle\n          cx=\"50\"\n          cy=\"50\"\n          r=\"45\"\n          strokeWidth=\"10\"\n          strokeDashoffset=\"0\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"opacity-100\"\n          style={\n            {\n              stroke: gaugePrimaryColor,\n              \"--stroke-percent\": currentPercent,\n              strokeDasharray:\n                \"calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference)\",\n              transition:\n                \"var(--transition-length) ease var(--delay),stroke var(--transition-length) ease var(--delay)\",\n              transitionProperty: \"stroke-dasharray,transform\",\n              transform:\n                \"rotate(calc(-90deg + var(--gap-percent) * var(--offset-factor) * var(--percent-to-deg)))\",\n              transformOrigin:\n                \"calc(var(--circle-size) / 2) calc(var(--circle-size) / 2)\",\n            } as React.CSSProperties\n          }\n        />\n      </svg>\n      <span\n        data-current-value={currentPercent}\n        className=\"animate-in fade-in absolute inset-0 m-auto size-fit delay-(--delay) duration-(--transition-length) ease-linear\"\n      >\n        {currentPercent}\n      </span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-gradient-text.tsx",
    "content": "import { type ComponentPropsWithoutRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedGradientTextProps extends ComponentPropsWithoutRef<\"div\"> {\n  speed?: number\n  colorFrom?: string\n  colorTo?: string\n}\n\nexport function AnimatedGradientText({\n  children,\n  className,\n  speed = 1,\n  colorFrom = \"#ffaa40\",\n  colorTo = \"#9c40ff\",\n  ...props\n}: AnimatedGradientTextProps) {\n  return (\n    <span\n      style={\n        {\n          \"--bg-size\": `${speed * 300}%`,\n          \"--color-from\": colorFrom,\n          \"--color-to\": colorTo,\n        } as React.CSSProperties\n      }\n      className={cn(\n        `animate-gradient inline bg-linear-to-r from-(--color-from) via-(--color-to) to-(--color-from) bg-size-[var(--bg-size)_100%] bg-clip-text text-transparent`,\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-grid-pattern.tsx",
    "content": "\"use client\"\n\nimport {\n  useCallback,\n  useEffect,\n  useId,\n  useRef,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedGridPatternProps extends ComponentPropsWithoutRef<\"svg\"> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  strokeDasharray?: number\n  numSquares?: number\n  maxOpacity?: number\n  duration?: number\n  repeatDelay?: number\n}\n\ntype Square = {\n  id: number\n  pos: [number, number]\n  iteration: number\n}\n\nexport function AnimatedGridPattern({\n  width = 40,\n  height = 40,\n  x = -1,\n  y = -1,\n  strokeDasharray = 0,\n  numSquares = 50,\n  className,\n  maxOpacity = 0.5,\n  duration = 4,\n  repeatDelay = 0.5,\n  ...props\n}: AnimatedGridPatternProps) {\n  const id = useId()\n  const containerRef = useRef<SVGSVGElement | null>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n  const [squares, setSquares] = useState<Array<Square>>([])\n\n  const getPos = useCallback((): [number, number] => {\n    return [\n      Math.floor((Math.random() * dimensions.width) / width),\n      Math.floor((Math.random() * dimensions.height) / height),\n    ]\n  }, [dimensions.height, dimensions.width, height, width])\n\n  const generateSquares = useCallback(\n    (count: number) => {\n      return Array.from({ length: count }, (_, i) => ({\n        id: i,\n        pos: getPos(),\n        iteration: 0,\n      }))\n    },\n    [getPos]\n  )\n\n  const updateSquarePosition = useCallback(\n    (squareId: number) => {\n      setSquares((currentSquares) => {\n        const current = currentSquares[squareId]\n        if (!current || current.id !== squareId) return currentSquares\n\n        const nextSquares = currentSquares.slice()\n        nextSquares[squareId] = {\n          ...current,\n          pos: getPos(),\n          iteration: current.iteration + 1,\n        }\n\n        return nextSquares\n      })\n    },\n    [getPos]\n  )\n\n  useEffect(() => {\n    if (dimensions.width && dimensions.height) {\n      setSquares(generateSquares(numSquares))\n    }\n  }, [dimensions.width, dimensions.height, generateSquares, numSquares])\n\n  useEffect(() => {\n    const element = containerRef.current\n    let resizeObserver: ResizeObserver | null = null\n\n    if (element) {\n      resizeObserver = new ResizeObserver((entries) => {\n        for (const entry of entries) {\n          setDimensions((currentDimensions) => {\n            const nextWidth = entry.contentRect.width\n            const nextHeight = entry.contentRect.height\n            if (\n              currentDimensions.width === nextWidth &&\n              currentDimensions.height === nextHeight\n            ) {\n              return currentDimensions\n            }\n            return { width: nextWidth, height: nextHeight }\n          })\n        }\n      })\n\n      resizeObserver.observe(element)\n    }\n\n    return () => {\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n    }\n  }, [])\n\n  return (\n    <svg\n      ref={containerRef}\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <pattern\n          id={id}\n          width={width}\n          height={height}\n          patternUnits=\"userSpaceOnUse\"\n          x={x}\n          y={y}\n        >\n          <path\n            d={`M.5 ${height}V.5H${width}`}\n            fill=\"none\"\n            strokeDasharray={strokeDasharray}\n          />\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n      <svg x={x} y={y} className=\"overflow-visible\">\n        {squares.map(({ pos: [squareX, squareY], id, iteration }, index) => (\n          <motion.rect\n            initial={{ opacity: 0 }}\n            animate={{ opacity: maxOpacity }}\n            transition={{\n              duration,\n              repeat: 1,\n              delay: index * 0.1,\n              repeatType: \"reverse\",\n              repeatDelay,\n            }}\n            onAnimationComplete={() => updateSquarePosition(id)}\n            key={`${id}-${iteration}`}\n            width={width - 1}\n            height={height - 1}\n            x={squareX * width + 1}\n            y={squareY * height + 1}\n            fill=\"currentColor\"\n            strokeWidth=\"0\"\n          />\n        ))}\n      </svg>\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-list.tsx",
    "content": "\"use client\"\n\nimport React, {\n  useEffect,\n  useMemo,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\nimport { AnimatePresence, motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport function AnimatedListItem({ children }: { children: React.ReactNode }) {\n  const animations: MotionProps = {\n    initial: { scale: 0, opacity: 0 },\n    animate: { scale: 1, opacity: 1, originY: 0 },\n    exit: { scale: 0, opacity: 0 },\n    transition: { type: \"spring\", stiffness: 350, damping: 40 },\n  }\n\n  return (\n    <motion.div {...animations} layout className=\"mx-auto w-full\">\n      {children}\n    </motion.div>\n  )\n}\n\nexport interface AnimatedListProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: React.ReactNode\n  delay?: number\n}\n\nexport const AnimatedList = React.memo(\n  ({ children, className, delay = 1000, ...props }: AnimatedListProps) => {\n    const [index, setIndex] = useState(0)\n    const childrenArray = useMemo(\n      () => React.Children.toArray(children),\n      [children]\n    )\n\n    useEffect(() => {\n      let timeout: ReturnType<typeof setTimeout> | null = null\n\n      if (index < childrenArray.length - 1) {\n        timeout = setTimeout(() => {\n          setIndex((prevIndex) => (prevIndex + 1) % childrenArray.length)\n        }, delay)\n      }\n\n      return () => {\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n      }\n    }, [index, delay, childrenArray.length])\n\n    const itemsToShow = useMemo(() => {\n      const result = childrenArray.slice(0, index + 1).reverse()\n      return result\n    }, [index, childrenArray])\n\n    return (\n      <div\n        className={cn(`flex flex-col items-center gap-4`, className)}\n        {...props}\n      >\n        <AnimatePresence>\n          {itemsToShow.map((item) => (\n            <AnimatedListItem key={(item as React.ReactElement).key}>\n              {item}\n            </AnimatedListItem>\n          ))}\n        </AnimatePresence>\n      </div>\n    )\n  }\n)\n\nAnimatedList.displayName = \"AnimatedList\"\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-shiny-text.tsx",
    "content": "import {\n  type ComponentPropsWithoutRef,\n  type CSSProperties,\n  type FC,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface AnimatedShinyTextProps extends ComponentPropsWithoutRef<\"span\"> {\n  shimmerWidth?: number\n}\n\nexport const AnimatedShinyText: FC<AnimatedShinyTextProps> = ({\n  children,\n  className,\n  shimmerWidth = 100,\n  ...props\n}) => {\n  return (\n    <span\n      style={\n        {\n          \"--shiny-width\": `${shimmerWidth}px`,\n        } as CSSProperties\n      }\n      className={cn(\n        \"mx-auto max-w-md text-neutral-600/70 dark:text-neutral-400/70\",\n\n        // Shine effect\n        \"animate-shiny-text bg-size-[var(--shiny-width)_100%] bg-clip-text bg-position-[0_0] bg-no-repeat [transition:background-position_1s_cubic-bezier(.6,.6,0,1)_infinite]\",\n\n        // Shine gradient\n        \"bg-linear-to-r from-transparent via-black/80 via-50% to-transparent dark:via-white/80\",\n\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-subscribe-button.tsx",
    "content": "\"use client\"\n\nimport React, { useEffect, useState } from \"react\"\nimport { AnimatePresence, HTMLMotionProps, motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface AnimatedSubscribeButtonProps extends Omit<\n  HTMLMotionProps<\"button\">,\n  \"ref\"\n> {\n  subscribeStatus?: boolean\n  children: React.ReactNode\n  className?: string\n}\n\nexport const AnimatedSubscribeButton = React.forwardRef<\n  HTMLButtonElement,\n  AnimatedSubscribeButtonProps\n>(({ subscribeStatus, onClick, className, children, ...props }, ref) => {\n  const isControlled = subscribeStatus !== undefined // controlled vs uncontrolled check\n  const [isSubscribed, setIsSubscribed] = useState<boolean>(\n    subscribeStatus ?? false\n  )\n\n  useEffect(() => {\n    if (isControlled) {\n      setIsSubscribed(subscribeStatus!)\n    }\n  }, [subscribeStatus, isControlled])\n\n  if (\n    React.Children.count(children) !== 2 ||\n    !React.Children.toArray(children).every(\n      (child) => React.isValidElement(child) && child.type === \"span\"\n    )\n  ) {\n    throw new Error(\n      \"AnimatedSubscribeButton expects two children, both of which must be <span> elements.\"\n    )\n  }\n\n  const childrenArray = React.Children.toArray(children)\n  const initialChild = childrenArray[0]\n  const changeChild = childrenArray[1]\n\n  return (\n    <AnimatePresence mode=\"wait\">\n      {isSubscribed ? (\n        <motion.button\n          ref={ref}\n          className={cn(\n            \"bg-primary text-primary-foreground relative flex h-10 w-fit items-center justify-center overflow-hidden rounded-lg px-6\",\n            className\n          )}\n          onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n            if (!isControlled) {\n              setIsSubscribed(false) // Only toggle manually if uncontrolled\n            }\n            onClick?.(e)\n          }}\n          initial={{ opacity: 0 }}\n          animate={{ opacity: 1 }}\n          exit={{ opacity: 0 }}\n          {...props}\n        >\n          <motion.span\n            key=\"action\"\n            className=\"relative flex h-full w-full items-center justify-center font-semibold\"\n            initial={{ y: -50 }}\n            animate={{ y: 0 }}\n          >\n            {changeChild} {/* Use children for subscribed state */}\n          </motion.span>\n        </motion.button>\n      ) : (\n        <motion.button\n          ref={ref}\n          className={cn(\n            \"bg-primary text-primary-foreground relative flex h-10 w-fit cursor-pointer items-center justify-center rounded-lg border-none px-6\",\n            className\n          )}\n          onClick={(e) => {\n            if (!isControlled) {\n              setIsSubscribed(true) // Only toggle manually if uncontrolled\n            }\n            onClick?.(e)\n          }}\n          initial={{ opacity: 0 }}\n          animate={{ opacity: 1 }}\n          exit={{ opacity: 0 }}\n          {...props}\n        >\n          <motion.span\n            key=\"reaction\"\n            className=\"relative flex items-center justify-center font-semibold\"\n            initial={{ x: 0 }}\n            exit={{ x: 50, transition: { duration: 0.1 } }}\n          >\n            {initialChild} {/* Use children for unsubscribed state */}\n          </motion.span>\n        </motion.button>\n      )}\n    </AnimatePresence>\n  )\n})\n\nAnimatedSubscribeButton.displayName = \"AnimatedSubscribeButton\"\n"
  },
  {
    "path": "apps/www/registry/magicui/animated-theme-toggler.tsx",
    "content": "\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { Moon, Sun } from \"lucide-react\"\nimport { flushSync } from \"react-dom\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutRef<\"button\"> {\n  duration?: number\n}\n\nexport const AnimatedThemeToggler = ({\n  className,\n  duration = 400,\n  ...props\n}: AnimatedThemeTogglerProps) => {\n  const [isDark, setIsDark] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement>(null)\n\n  useEffect(() => {\n    const updateTheme = () => {\n      setIsDark(document.documentElement.classList.contains(\"dark\"))\n    }\n\n    updateTheme()\n\n    const observer = new MutationObserver(updateTheme)\n    observer.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: [\"class\"],\n    })\n\n    return () => observer.disconnect()\n  }, [])\n\n  const toggleTheme = useCallback(() => {\n    const button = buttonRef.current\n    if (!button) return\n\n    const { top, left, width, height } = button.getBoundingClientRect()\n    const x = left + width / 2\n    const y = top + height / 2\n    const viewportWidth = window.visualViewport?.width ?? window.innerWidth\n    const viewportHeight = window.visualViewport?.height ?? window.innerHeight\n    const maxRadius = Math.hypot(\n      Math.max(x, viewportWidth - x),\n      Math.max(y, viewportHeight - y)\n    )\n\n    const applyTheme = () => {\n      const newTheme = !isDark\n      setIsDark(newTheme)\n      document.documentElement.classList.toggle(\"dark\")\n      localStorage.setItem(\"theme\", newTheme ? \"dark\" : \"light\")\n    }\n\n    if (typeof document.startViewTransition !== \"function\") {\n      applyTheme()\n      return\n    }\n\n    const transition = document.startViewTransition(() => {\n      flushSync(applyTheme)\n    })\n\n    const ready = transition?.ready\n    if (ready && typeof ready.then === \"function\") {\n      ready.then(() => {\n        document.documentElement.animate(\n          {\n            clipPath: [\n              `circle(0px at ${x}px ${y}px)`,\n              `circle(${maxRadius}px at ${x}px ${y}px)`,\n            ],\n          },\n          {\n            duration,\n            easing: \"ease-in-out\",\n            pseudoElement: \"::view-transition-new(root)\",\n          }\n        )\n      })\n    }\n  }, [isDark, duration])\n\n  return (\n    <button\n      type=\"button\"\n      ref={buttonRef}\n      onClick={toggleTheme}\n      className={cn(className)}\n      {...props}\n    >\n      {isDark ? <Sun /> : <Moon />}\n      <span className=\"sr-only\">Toggle theme</span>\n    </button>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/aurora-text.tsx",
    "content": "\"use client\"\n\nimport React, { memo } from \"react\"\n\ninterface AuroraTextProps {\n  children: React.ReactNode\n  className?: string\n  colors?: string[]\n  speed?: number\n}\n\nexport const AuroraText = memo(\n  ({\n    children,\n    className = \"\",\n    colors = [\"#FF0080\", \"#7928CA\", \"#0070F3\", \"#38bdf8\"],\n    speed = 1,\n  }: AuroraTextProps) => {\n    const gradientStyle = {\n      backgroundImage: `linear-gradient(135deg, ${colors.join(\", \")}, ${\n        colors[0]\n      })`,\n      WebkitBackgroundClip: \"text\",\n      WebkitTextFillColor: \"transparent\",\n      animationDuration: `${10 / speed}s`,\n    }\n\n    return (\n      <span className={`relative inline-block ${className}`}>\n        <span className=\"sr-only\">{children}</span>\n        <span\n          className=\"animate-aurora relative bg-size-[200%_auto] bg-clip-text text-transparent\"\n          style={gradientStyle}\n          aria-hidden=\"true\"\n        >\n          {children}\n        </span>\n      </span>\n    )\n  }\n)\n\nAuroraText.displayName = \"AuroraText\"\n"
  },
  {
    "path": "apps/www/registry/magicui/avatar-circles.tsx",
    "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Avatar {\n  imageUrl: string\n  profileUrl: string\n}\ninterface AvatarCirclesProps {\n  className?: string\n  numPeople?: number\n  avatarUrls: Avatar[]\n}\n\nexport const AvatarCircles = ({\n  numPeople,\n  className,\n  avatarUrls,\n}: AvatarCirclesProps) => {\n  return (\n    <div className={cn(\"z-10 flex -space-x-4 rtl:space-x-reverse\", className)}>\n      {avatarUrls.map((url, index) => (\n        <a\n          key={index}\n          href={url.profileUrl}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          <img\n            key={index}\n            className=\"h-10 w-10 rounded-full border-2 border-white dark:border-gray-800\"\n            src={url.imageUrl}\n            width={40}\n            height={40}\n            alt={`Avatar ${index + 1}`}\n          />\n        </a>\n      ))}\n      {(numPeople ?? 0) > 0 && (\n        <a\n          className=\"flex h-10 w-10 items-center justify-center rounded-full border-2 border-white bg-black text-center text-xs font-medium text-white hover:bg-gray-600 dark:border-gray-800 dark:bg-white dark:text-black\"\n          href=\"\"\n        >\n          +{numPeople}\n        </a>\n      )}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/bento-grid.tsx",
    "content": "import { type ComponentPropsWithoutRef, type ReactNode } from \"react\"\nimport { ArrowRightIcon } from \"@radix-ui/react-icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\ninterface BentoGridProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: ReactNode\n  className?: string\n}\n\ninterface BentoCardProps extends ComponentPropsWithoutRef<\"div\"> {\n  name: string\n  className: string\n  background: ReactNode\n  Icon: React.ElementType\n  description: string\n  href: string\n  cta: string\n}\n\nconst BentoGrid = ({ children, className, ...props }: BentoGridProps) => {\n  return (\n    <div\n      className={cn(\n        \"grid w-full auto-rows-[22rem] grid-cols-3 gap-4\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </div>\n  )\n}\n\nconst BentoCard = ({\n  name,\n  className,\n  background,\n  Icon,\n  description,\n  href,\n  cta,\n  ...props\n}: BentoCardProps) => (\n  <div\n    key={name}\n    className={cn(\n      \"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl\",\n      // light styles\n      \"bg-background [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]\",\n      // dark styles\n      \"dark:bg-background transform-gpu dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:[border:1px_solid_rgba(255,255,255,.1)]\",\n      className\n    )}\n    {...props}\n  >\n    <div>{background}</div>\n    <div className=\"p-4\">\n      <div className=\"pointer-events-none z-10 flex transform-gpu flex-col gap-1 transition-all duration-300 lg:group-hover:-translate-y-10\">\n        <Icon className=\"h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75\" />\n        <h3 className=\"text-xl font-semibold text-neutral-700 dark:text-neutral-300\">\n          {name}\n        </h3>\n        <p className=\"max-w-lg text-neutral-400\">{description}</p>\n      </div>\n\n      <div\n        className={cn(\n          \"pointer-events-none flex w-full translate-y-0 transform-gpu flex-row items-center transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:hidden\"\n        )}\n      >\n        <Button\n          variant=\"link\"\n          asChild\n          size=\"sm\"\n          className=\"pointer-events-auto p-0\"\n        >\n          <a href={href}>\n            {cta}\n            <ArrowRightIcon className=\"ms-2 h-4 w-4 rtl:rotate-180\" />\n          </a>\n        </Button>\n      </div>\n    </div>\n\n    <div\n      className={cn(\n        \"pointer-events-none absolute bottom-0 hidden w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:flex\"\n      )}\n    >\n      <Button\n        variant=\"link\"\n        asChild\n        size=\"sm\"\n        className=\"pointer-events-auto p-0\"\n      >\n        <a href={href}>\n          {cta}\n          <ArrowRightIcon className=\"ms-2 h-4 w-4 rtl:rotate-180\" />\n        </a>\n      </Button>\n    </div>\n\n    <div className=\"pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/3 group-hover:dark:bg-neutral-800/10\" />\n  </div>\n)\n\nexport { BentoCard, BentoGrid }\n"
  },
  {
    "path": "apps/www/registry/magicui/blur-fade.tsx",
    "content": "\"use client\"\n\nimport { useRef } from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  useInView,\n  type MotionProps,\n  type UseInViewOptions,\n  type Variants,\n} from \"motion/react\"\n\ntype MarginType = UseInViewOptions[\"margin\"]\n\ninterface BlurFadeProps extends MotionProps {\n  children: React.ReactNode\n  className?: string\n  variant?: {\n    hidden: { y: number }\n    visible: { y: number }\n  }\n  duration?: number\n  delay?: number\n  offset?: number\n  direction?: \"up\" | \"down\" | \"left\" | \"right\"\n  inView?: boolean\n  inViewMargin?: MarginType\n  blur?: string\n}\n\nconst getFilter = (v: Variants[string]) =>\n  typeof v === \"function\" ? undefined : v.filter\n\nexport function BlurFade({\n  children,\n  className,\n  variant,\n  duration = 0.4,\n  delay = 0,\n  offset = 6,\n  direction = \"down\",\n  inView = false,\n  inViewMargin = \"-50px\",\n  blur = \"6px\",\n  ...props\n}: BlurFadeProps) {\n  const ref = useRef(null)\n  const inViewResult = useInView(ref, { once: true, margin: inViewMargin })\n  const isInView = !inView || inViewResult\n  const defaultVariants: Variants = {\n    hidden: {\n      [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]:\n        direction === \"right\" || direction === \"down\" ? -offset : offset,\n      opacity: 0,\n      filter: `blur(${blur})`,\n    },\n    visible: {\n      [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]: 0,\n      opacity: 1,\n      filter: `blur(0px)`,\n    },\n  }\n  const combinedVariants = variant ?? defaultVariants\n\n  const hiddenFilter = getFilter(combinedVariants.hidden)\n  const visibleFilter = getFilter(combinedVariants.visible)\n\n  const shouldTransitionFilter =\n    hiddenFilter != null &&\n    visibleFilter != null &&\n    hiddenFilter !== visibleFilter\n\n  return (\n    <AnimatePresence>\n      <motion.div\n        ref={ref}\n        initial=\"hidden\"\n        animate={isInView ? \"visible\" : \"hidden\"}\n        exit=\"hidden\"\n        variants={combinedVariants}\n        transition={{\n          delay: 0.04 + delay,\n          duration,\n          ease: \"easeOut\",\n          ...(shouldTransitionFilter ? { filter: { duration } } : {}),\n        }}\n        className={className}\n        {...props}\n      >\n        {children}\n      </motion.div>\n    </AnimatePresence>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/border-beam.tsx",
    "content": "\"use client\"\n\nimport { motion, MotionStyle, Transition } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface BorderBeamProps {\n  /**\n   * The size of the border beam.\n   */\n  size?: number\n  /**\n   * The duration of the border beam.\n   */\n  duration?: number\n  /**\n   * The delay of the border beam.\n   */\n  delay?: number\n  /**\n   * The color of the border beam from.\n   */\n  colorFrom?: string\n  /**\n   * The color of the border beam to.\n   */\n  colorTo?: string\n  /**\n   * The motion transition of the border beam.\n   */\n  transition?: Transition\n  /**\n   * The class name of the border beam.\n   */\n  className?: string\n  /**\n   * The style of the border beam.\n   */\n  style?: React.CSSProperties\n  /**\n   * Whether to reverse the animation direction.\n   */\n  reverse?: boolean\n  /**\n   * The initial offset position (0-100).\n   */\n  initialOffset?: number\n  /**\n   * The border width of the beam.\n   */\n  borderWidth?: number\n}\n\nexport const BorderBeam = ({\n  className,\n  size = 50,\n  delay = 0,\n  duration = 6,\n  colorFrom = \"#ffaa40\",\n  colorTo = \"#9c40ff\",\n  transition,\n  style,\n  reverse = false,\n  initialOffset = 0,\n  borderWidth = 1,\n}: BorderBeamProps) => {\n  return (\n    <div\n      className=\"pointer-events-none absolute inset-0 rounded-[inherit] border-(length:--border-beam-width) border-transparent mask-[linear-gradient(transparent,transparent),linear-gradient(#000,#000)] mask-intersect [mask-clip:padding-box,border-box]\"\n      style={\n        {\n          \"--border-beam-width\": `${borderWidth}px`,\n        } as React.CSSProperties\n      }\n    >\n      <motion.div\n        className={cn(\n          \"absolute aspect-square\",\n          \"bg-linear-to-l from-(--color-from) via-(--color-to) to-transparent\",\n          className\n        )}\n        style={\n          {\n            width: size,\n            offsetPath: `rect(0 auto auto 0 round ${size}px)`,\n            \"--color-from\": colorFrom,\n            \"--color-to\": colorTo,\n            ...style,\n          } as MotionStyle\n        }\n        initial={{ offsetDistance: `${initialOffset}%` }}\n        animate={{\n          offsetDistance: reverse\n            ? [`${100 - initialOffset}%`, `${-initialOffset}%`]\n            : [`${initialOffset}%`, `${100 + initialOffset}%`],\n        }}\n        transition={{\n          repeat: Infinity,\n          ease: \"linear\",\n          duration,\n          delay: -delay,\n          ...transition,\n        }}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/client-tweet-card.tsx",
    "content": "\"use client\"\n\nimport { TweetProps, useTweet } from \"react-tweet\"\n\nimport {\n  MagicTweet,\n  TweetNotFound,\n  TweetSkeleton,\n} from \"@/registry/magicui/tweet-card\"\n\nexport const ClientTweetCard = ({\n  id,\n  apiUrl,\n  fallback = <TweetSkeleton />,\n  components,\n  fetchOptions,\n  onError,\n  ...props\n}: TweetProps & { className?: string }) => {\n  const { data, error, isLoading } = useTweet(id, apiUrl, fetchOptions)\n\n  if (isLoading) return fallback\n  if (error || !data) {\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\n    return <NotFound error={onError ? onError(error) : error} />\n  }\n\n  return <MagicTweet tweet={data} {...props} />\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/code-comparison.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport {\n  transformerNotationDiff,\n  transformerNotationFocus,\n} from \"@shikijs/transformers\"\nimport { FileIcon } from \"lucide-react\"\nimport { useTheme } from \"next-themes\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface CodeComparisonProps {\n  beforeCode: string\n  afterCode: string\n  language: string\n  filename: string\n  lightTheme: string\n  darkTheme: string\n  highlightColor?: string\n}\n\nexport function CodeComparison({\n  beforeCode,\n  afterCode,\n  language,\n  filename,\n  lightTheme,\n  darkTheme,\n  highlightColor = \"#ff3333\",\n}: CodeComparisonProps) {\n  const { theme, systemTheme } = useTheme()\n  const [highlightedBefore, setHighlightedBefore] = useState(\"\")\n  const [highlightedAfter, setHighlightedAfter] = useState(\"\")\n  const [hasLeftFocus, setHasLeftFocus] = useState(false)\n  const [hasRightFocus, setHasRightFocus] = useState(false)\n\n  const selectedTheme = useMemo(() => {\n    const currentTheme = theme === \"system\" ? systemTheme : theme\n    return currentTheme === \"dark\" ? darkTheme : lightTheme\n  }, [theme, systemTheme, darkTheme, lightTheme])\n\n  useEffect(() => {\n    if (highlightedBefore || highlightedAfter) {\n      setHasLeftFocus(highlightedBefore.includes('class=\"line focused\"'))\n      setHasRightFocus(highlightedAfter.includes('class=\"line focused\"'))\n    }\n  }, [highlightedBefore, highlightedAfter])\n\n  useEffect(() => {\n    async function highlightCode() {\n      try {\n        const { codeToHtml } = await import(\"shiki\")\n        const { transformerNotationHighlight } =\n          await import(\"@shikijs/transformers\")\n\n        const before = await codeToHtml(beforeCode, {\n          lang: language,\n          theme: selectedTheme,\n          transformers: [\n            transformerNotationHighlight({ matchAlgorithm: \"v3\" }),\n            transformerNotationDiff({ matchAlgorithm: \"v3\" }),\n            transformerNotationFocus({ matchAlgorithm: \"v3\" }),\n          ],\n        })\n        const after = await codeToHtml(afterCode, {\n          lang: language,\n          theme: selectedTheme,\n          transformers: [\n            transformerNotationHighlight({ matchAlgorithm: \"v3\" }),\n            transformerNotationDiff({ matchAlgorithm: \"v3\" }),\n            transformerNotationFocus({ matchAlgorithm: \"v3\" }),\n          ],\n        })\n        setHighlightedBefore(before)\n        setHighlightedAfter(after)\n      } catch (error) {\n        console.error(\"Error highlighting code:\", error)\n        setHighlightedBefore(`<pre>${beforeCode}</pre>`)\n        setHighlightedAfter(`<pre>${afterCode}</pre>`)\n      }\n    }\n    highlightCode()\n  }, [beforeCode, afterCode, language, selectedTheme])\n\n  const renderCode = (code: string, highlighted: string) => {\n    if (highlighted) {\n      return (\n        <div\n          style={{ \"--highlight-color\": highlightColor } as React.CSSProperties}\n          className={cn(\n            \"bg-background h-full w-full overflow-auto font-mono text-xs\",\n            \"[&>pre]:h-full [&>pre]:w-screen! [&>pre]:py-2\",\n            \"[&>pre>code]:inline-block! [&>pre>code]:w-full!\",\n            \"[&>pre>code>span]:inline-block! [&>pre>code>span]:w-full [&>pre>code>span]:px-4 [&>pre>code>span]:py-0.5\",\n            \"[&>pre>code>.highlighted]:inline-block [&>pre>code>.highlighted]:w-full [&>pre>code>.highlighted]:bg-(--highlight-color)!\",\n            \"group-hover/left:[&>pre>code>:not(.focused)]:opacity-100! group-hover/left:[&>pre>code>:not(.focused)]:blur-none!\",\n            \"group-hover/right:[&>pre>code>:not(.focused)]:opacity-100! group-hover/right:[&>pre>code>:not(.focused)]:blur-none!\",\n            \"[&>pre>code>.add]:bg-[rgba(16,185,129,.16)] [&>pre>code>.remove]:bg-[rgba(244,63,94,.16)]\",\n            \"group-hover/left:[&>pre>code>:not(.focused)]:transition-all group-hover/left:[&>pre>code>:not(.focused)]:duration-300\",\n            \"group-hover/right:[&>pre>code>:not(.focused)]:transition-all group-hover/right:[&>pre>code>:not(.focused)]:duration-300\"\n          )}\n          dangerouslySetInnerHTML={{ __html: highlighted }}\n        />\n      )\n    } else {\n      return (\n        <pre className=\"bg-background text-foreground h-full overflow-auto p-4 font-mono text-xs break-all\">\n          {code}\n        </pre>\n      )\n    }\n  }\n\n  return (\n    <div className=\"mx-auto w-full max-w-5xl\">\n      <div className=\"group border-border relative w-full overflow-hidden rounded-md border\">\n        <div className=\"relative grid md:grid-cols-2\">\n          <div\n            className={cn(\n              \"leftside group/left border-primary/20 md:border-r\",\n              hasLeftFocus &&\n                \"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\",\n              \"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\"\n            )}\n          >\n            <div className=\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\">\n              <FileIcon className=\"mr-2 h-4 w-4\" />\n              {filename}\n              <span className=\"ml-auto hidden md:block\">before</span>\n            </div>\n            {renderCode(beforeCode, highlightedBefore)}\n          </div>\n          <div\n            className={cn(\n              \"rightside group/right border-primary/20 border-t md:border-t-0\",\n              hasRightFocus &&\n                \"[&>div>pre>code>:not(.focused)]:opacity-50! [&>div>pre>code>:not(.focused)]:blur-[0.095rem]!\",\n              \"[&>div>pre>code>:not(.focused)]:transition-all [&>div>pre>code>:not(.focused)]:duration-300\"\n            )}\n          >\n            <div className=\"border-primary/20 bg-accent text-foreground flex items-center border-b p-2 text-sm\">\n              <FileIcon className=\"mr-2 h-4 w-4\" />\n              {filename}\n              <span className=\"ml-auto hidden md:block\">after</span>\n            </div>\n            {renderCode(afterCode, highlightedAfter)}\n          </div>\n        </div>\n        <div className=\"border-primary/20 bg-accent text-foreground absolute top-1/2 left-1/2 hidden h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-md border text-xs md:flex\">\n          VS\n        </div>\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/comic-text.tsx",
    "content": "\"use client\"\n\nimport { CSSProperties } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype ComicTextProps = {\n  children: string\n  className?: string\n  style?: CSSProperties\n  fontSize?: number\n}\n\nexport function ComicText({\n  children,\n  className,\n  style,\n  fontSize = 5,\n}: ComicTextProps) {\n  if (typeof children !== \"string\") {\n    throw new Error(\"children must be a string\")\n  }\n\n  const dotColor = \"#EF4444\"\n  const backgroundColor = \"#FACC15\"\n\n  return (\n    <motion.div\n      className={cn(\"text-center select-none\", className)}\n      style={{\n        fontSize: `${fontSize}rem`,\n        fontFamily: \"'Bangers', 'Comic Sans MS', 'Impact', sans-serif\",\n        fontWeight: \"900\",\n        WebkitTextStroke: `${fontSize * 0.35}px #000000`, // Thick black outline\n        transform: \"skewX(-10deg)\",\n        textTransform: \"uppercase\",\n        filter: `\n          drop-shadow(5px 5px 0px #000000) \n          drop-shadow(3px 3px 0px ${dotColor})\n        `,\n        backgroundColor: backgroundColor,\n        backgroundImage: `radial-gradient(circle at 1px 1px, ${dotColor} 1px, transparent 0)`,\n        backgroundSize: \"8px 8px\",\n        backgroundClip: \"text\",\n        WebkitBackgroundClip: \"text\",\n        WebkitTextFillColor: \"transparent\",\n        ...style,\n      }}\n      initial={{ opacity: 0, scale: 0.8, rotate: -2 }}\n      animate={{ opacity: 1, scale: 1, rotate: 0 }}\n      transition={{\n        duration: 0.6,\n        ease: [0.175, 0.885, 0.32, 1.275],\n        type: \"spring\",\n      }}\n    >\n      {children}\n    </motion.div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/confetti.tsx",
    "content": "\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport React, {\n  createContext,\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n} from \"react\"\nimport type {\n  GlobalOptions as ConfettiGlobalOptions,\n  CreateTypes as ConfettiInstance,\n  Options as ConfettiOptions,\n} from \"canvas-confetti\"\nimport confetti from \"canvas-confetti\"\n\nimport { Button } from \"@/components/ui/button\"\n\ntype Api = {\n  fire: (options?: ConfettiOptions) => void\n}\n\ntype Props = React.ComponentPropsWithRef<\"canvas\"> & {\n  options?: ConfettiOptions\n  globalOptions?: ConfettiGlobalOptions\n  manualstart?: boolean\n  children?: ReactNode\n}\n\nexport type ConfettiRef = Api | null\n\nconst ConfettiContext = createContext<Api>({} as Api)\n\n// Define component first\nconst ConfettiComponent = forwardRef<ConfettiRef, Props>((props, ref) => {\n  const {\n    options,\n    globalOptions = { resize: true, useWorker: true },\n    manualstart = false,\n    children,\n    ...rest\n  } = props\n  const instanceRef = useRef<ConfettiInstance | null>(null)\n\n  const canvasRef = useCallback(\n    (node: HTMLCanvasElement) => {\n      if (node !== null) {\n        if (instanceRef.current) return\n        instanceRef.current = confetti.create(node, {\n          ...globalOptions,\n          resize: true,\n        })\n      } else {\n        if (instanceRef.current) {\n          instanceRef.current.reset()\n          instanceRef.current = null\n        }\n      }\n    },\n    [globalOptions]\n  )\n\n  const fire = useCallback(\n    async (opts = {}) => {\n      try {\n        await instanceRef.current?.({ ...options, ...opts })\n      } catch (error) {\n        console.error(\"Confetti error:\", error)\n      }\n    },\n    [options]\n  )\n\n  const api = useMemo(\n    () => ({\n      fire,\n    }),\n    [fire]\n  )\n\n  useImperativeHandle(ref, () => api, [api])\n\n  useEffect(() => {\n    if (!manualstart) {\n      ;(async () => {\n        try {\n          await fire()\n        } catch (error) {\n          console.error(\"Confetti effect error:\", error)\n        }\n      })()\n    }\n  }, [manualstart, fire])\n\n  return (\n    <ConfettiContext.Provider value={api}>\n      <canvas ref={canvasRef} {...rest} />\n      {children}\n    </ConfettiContext.Provider>\n  )\n})\n\n// Set display name immediately\nConfettiComponent.displayName = \"Confetti\"\n\n// Export as Confetti\nexport const Confetti = ConfettiComponent\n\ninterface ConfettiButtonProps extends React.ComponentProps<\"button\"> {\n  options?: ConfettiOptions &\n    ConfettiGlobalOptions & { canvas?: HTMLCanvasElement }\n}\n\nconst ConfettiButtonComponent = ({\n  options,\n  children,\n  ...props\n}: ConfettiButtonProps) => {\n  const handleClick = async (event: React.MouseEvent<HTMLButtonElement>) => {\n    try {\n      const rect = event.currentTarget.getBoundingClientRect()\n      const x = rect.left + rect.width / 2\n      const y = rect.top + rect.height / 2\n      await confetti({\n        ...options,\n        origin: {\n          x: x / window.innerWidth,\n          y: y / window.innerHeight,\n        },\n      })\n    } catch (error) {\n      console.error(\"Confetti button error:\", error)\n    }\n  }\n\n  return (\n    <Button onClick={handleClick} {...props}>\n      {children}\n    </Button>\n  )\n}\n\nConfettiButtonComponent.displayName = \"ConfettiButton\"\n\nexport const ConfettiButton = ConfettiButtonComponent\n"
  },
  {
    "path": "apps/www/registry/magicui/cool-mode.tsx",
    "content": "\"use client\"\n\nimport React, { ReactNode, useEffect, useRef } from \"react\"\n\nexport interface BaseParticle {\n  element: HTMLElement | SVGSVGElement\n  left: number\n  size: number\n  top: number\n}\n\nexport interface BaseParticleOptions {\n  particle?: string\n  size?: number\n}\n\nexport interface CoolParticle extends BaseParticle {\n  direction: number\n  speedHorz: number\n  speedUp: number\n  spinSpeed: number\n  spinVal: number\n}\n\nexport interface CoolParticleOptions extends BaseParticleOptions {\n  particleCount?: number\n  speedHorz?: number\n  speedUp?: number\n}\n\nconst getContainer = () => {\n  const id = \"_coolMode_effect\"\n  const existingContainer = document.getElementById(id)\n\n  if (existingContainer) {\n    return existingContainer\n  }\n\n  const container = document.createElement(\"div\")\n  container.setAttribute(\"id\", id)\n  container.setAttribute(\n    \"style\",\n    \"overflow:hidden; position:fixed; height:100%; top:0; left:0; right:0; bottom:0; pointer-events:none; z-index:2147483647\"\n  )\n\n  document.body.appendChild(container)\n\n  return container\n}\n\nlet instanceCounter = 0\n\nconst applyParticleEffect = (\n  element: HTMLElement,\n  options?: CoolParticleOptions\n): (() => void) => {\n  instanceCounter++\n\n  const defaultParticle = \"circle\"\n  const particleType = options?.particle || defaultParticle\n  const sizes = [15, 20, 25, 35, 45]\n  const limit = 45\n\n  let particles: CoolParticle[] = []\n  let autoAddParticle = false\n  let mouseX = 0\n  let mouseY = 0\n\n  const container = getContainer()\n\n  function generateParticle() {\n    const size =\n      options?.size || sizes[Math.floor(Math.random() * sizes.length)]\n    const speedHorz = options?.speedHorz || Math.random() * 10\n    const speedUp = options?.speedUp || Math.random() * 25\n    const spinVal = Math.random() * 360\n    const spinSpeed = Math.random() * 35 * (Math.random() <= 0.5 ? -1 : 1)\n    const top = mouseY - size / 2\n    const left = mouseX - size / 2\n    const direction = Math.random() <= 0.5 ? -1 : 1\n\n    const particle = document.createElement(\"div\")\n\n    if (particleType === \"circle\") {\n      const svgNS = \"http://www.w3.org/2000/svg\"\n      const circleSVG = document.createElementNS(svgNS, \"svg\")\n      const circle = document.createElementNS(svgNS, \"circle\")\n      circle.setAttributeNS(null, \"cx\", (size / 2).toString())\n      circle.setAttributeNS(null, \"cy\", (size / 2).toString())\n      circle.setAttributeNS(null, \"r\", (size / 2).toString())\n      circle.setAttributeNS(\n        null,\n        \"fill\",\n        `hsl(${Math.random() * 360}, 70%, 50%)`\n      )\n\n      circleSVG.appendChild(circle)\n      circleSVG.setAttribute(\"width\", size.toString())\n      circleSVG.setAttribute(\"height\", size.toString())\n\n      particle.appendChild(circleSVG)\n    } else if (\n      particleType.startsWith(\"http\") ||\n      particleType.startsWith(\"/\")\n    ) {\n      // Handle URL-based images\n      particle.innerHTML = `<img src=\"${particleType}\" width=\"${size}\" height=\"${size}\" style=\"border-radius: 50%\">`\n    } else {\n      // Handle emoji or text characters\n      const fontSizeMultiplier = 3 // Make emojis 3x bigger\n      const emojiSize = size * fontSizeMultiplier\n      particle.innerHTML = `<div style=\"font-size: ${emojiSize}px; line-height: 1; text-align: center; width: ${size}px; height: ${size}px; display: flex; align-items: center; justify-content: center; transform: scale(${fontSizeMultiplier}); transform-origin: center;\">${particleType}</div>`\n    }\n\n    particle.style.position = \"absolute\"\n    particle.style.transform = `translate3d(${left}px, ${top}px, 0px) rotate(${spinVal}deg)`\n\n    container.appendChild(particle)\n\n    particles.push({\n      direction,\n      element: particle,\n      left,\n      size,\n      speedHorz,\n      speedUp,\n      spinSpeed,\n      spinVal,\n      top,\n    })\n  }\n\n  function refreshParticles() {\n    particles.forEach((p) => {\n      p.left = p.left - p.speedHorz * p.direction\n      p.top = p.top - p.speedUp\n      p.speedUp = Math.min(p.size, p.speedUp - 1)\n      p.spinVal = p.spinVal + p.spinSpeed\n\n      if (\n        p.top >=\n        Math.max(window.innerHeight, document.body.clientHeight) + p.size\n      ) {\n        particles = particles.filter((o) => o !== p)\n        p.element.remove()\n      }\n\n      p.element.setAttribute(\n        \"style\",\n        [\n          \"position:absolute\",\n          \"will-change:transform\",\n          `top:${p.top}px`,\n          `left:${p.left}px`,\n          `transform:rotate(${p.spinVal}deg)`,\n        ].join(\";\")\n      )\n    })\n  }\n\n  let animationFrame: number | undefined\n\n  let lastParticleTimestamp = 0\n  const particleGenerationDelay = 30\n\n  function loop() {\n    const currentTime = performance.now()\n    if (\n      autoAddParticle &&\n      particles.length < limit &&\n      currentTime - lastParticleTimestamp > particleGenerationDelay\n    ) {\n      generateParticle()\n      lastParticleTimestamp = currentTime\n    }\n\n    refreshParticles()\n    animationFrame = requestAnimationFrame(loop)\n  }\n\n  loop()\n\n  const isTouchInteraction = \"ontouchstart\" in window\n\n  const tap = isTouchInteraction ? \"touchstart\" : \"mousedown\"\n  const tapEnd = isTouchInteraction ? \"touchend\" : \"mouseup\"\n  const move = isTouchInteraction ? \"touchmove\" : \"mousemove\"\n\n  const updateMousePosition = (e: MouseEvent | TouchEvent) => {\n    if (\"touches\" in e) {\n      mouseX = e.touches?.[0].clientX\n      mouseY = e.touches?.[0].clientY\n    } else {\n      mouseX = e.clientX\n      mouseY = e.clientY\n    }\n  }\n\n  const tapHandler = (e: MouseEvent | TouchEvent) => {\n    updateMousePosition(e)\n    autoAddParticle = true\n  }\n\n  const disableAutoAddParticle = () => {\n    autoAddParticle = false\n  }\n\n  element.addEventListener(move, updateMousePosition, { passive: true })\n  element.addEventListener(tap, tapHandler, { passive: true })\n  element.addEventListener(tapEnd, disableAutoAddParticle, { passive: true })\n  element.addEventListener(\"mouseleave\", disableAutoAddParticle, {\n    passive: true,\n  })\n\n  return () => {\n    element.removeEventListener(move, updateMousePosition)\n    element.removeEventListener(tap, tapHandler)\n    element.removeEventListener(tapEnd, disableAutoAddParticle)\n    element.removeEventListener(\"mouseleave\", disableAutoAddParticle)\n\n    const interval = setInterval(() => {\n      if (animationFrame && particles.length === 0) {\n        cancelAnimationFrame(animationFrame)\n        clearInterval(interval)\n\n        if (--instanceCounter === 0) {\n          container.remove()\n        }\n      }\n    }, 500)\n  }\n}\n\ninterface CoolModeProps {\n  children: ReactNode\n  options?: CoolParticleOptions\n}\n\nexport const CoolMode: React.FC<CoolModeProps> = ({ children, options }) => {\n  const ref = useRef<HTMLSpanElement>(null)\n\n  useEffect(() => {\n    const element = ref.current\n    let cleanup: (() => void) | null = null\n\n    if (element) {\n      cleanup = applyParticleEffect(element, options)\n    }\n\n    return () => {\n      if (cleanup) {\n        cleanup()\n      }\n    }\n  }, [options])\n\n  return <span ref={ref}>{children}</span>\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/dock.tsx",
    "content": "\"use client\"\n\nimport React, { PropsWithChildren, useRef } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport {\n  motion,\n  MotionValue,\n  useMotionValue,\n  useSpring,\n  useTransform,\n} from \"motion/react\"\nimport type { MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface DockProps extends VariantProps<typeof dockVariants> {\n  className?: string\n  iconSize?: number\n  iconMagnification?: number\n  disableMagnification?: boolean\n  iconDistance?: number\n  direction?: \"top\" | \"middle\" | \"bottom\"\n  children: React.ReactNode\n}\n\nconst DEFAULT_SIZE = 40\nconst DEFAULT_MAGNIFICATION = 60\nconst DEFAULT_DISTANCE = 140\nconst DEFAULT_DISABLEMAGNIFICATION = false\n\nconst dockVariants = cva(\n  \"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 mx-auto mt-8 flex h-[58px] w-max items-center justify-center gap-2 rounded-2xl border p-2 backdrop-blur-md\"\n)\n\nconst Dock = React.forwardRef<HTMLDivElement, DockProps>(\n  (\n    {\n      className,\n      children,\n      iconSize = DEFAULT_SIZE,\n      iconMagnification = DEFAULT_MAGNIFICATION,\n      disableMagnification = DEFAULT_DISABLEMAGNIFICATION,\n      iconDistance = DEFAULT_DISTANCE,\n      direction = \"middle\",\n      ...props\n    },\n    ref\n  ) => {\n    const mouseX = useMotionValue(Infinity)\n\n    const renderChildren = () => {\n      return React.Children.map(children, (child) => {\n        if (\n          React.isValidElement<DockIconProps>(child) &&\n          child.type === DockIcon\n        ) {\n          return React.cloneElement(child, {\n            ...child.props,\n            mouseX: mouseX,\n            size: iconSize,\n            magnification: iconMagnification,\n            disableMagnification: disableMagnification,\n            distance: iconDistance,\n          })\n        }\n        return child\n      })\n    }\n\n    return (\n      <motion.div\n        ref={ref}\n        onMouseMove={(e) => mouseX.set(e.pageX)}\n        onMouseLeave={() => mouseX.set(Infinity)}\n        {...props}\n        className={cn(dockVariants({ className }), {\n          \"items-start\": direction === \"top\",\n          \"items-center\": direction === \"middle\",\n          \"items-end\": direction === \"bottom\",\n        })}\n      >\n        {renderChildren()}\n      </motion.div>\n    )\n  }\n)\n\nDock.displayName = \"Dock\"\n\nexport interface DockIconProps extends Omit<\n  MotionProps & React.HTMLAttributes<HTMLDivElement>,\n  \"children\"\n> {\n  size?: number\n  magnification?: number\n  disableMagnification?: boolean\n  distance?: number\n  mouseX?: MotionValue<number>\n  className?: string\n  children?: React.ReactNode\n  props?: PropsWithChildren\n}\n\nconst DockIcon = ({\n  size = DEFAULT_SIZE,\n  magnification = DEFAULT_MAGNIFICATION,\n  disableMagnification,\n  distance = DEFAULT_DISTANCE,\n  mouseX,\n  className,\n  children,\n  ...props\n}: DockIconProps) => {\n  const ref = useRef<HTMLDivElement>(null)\n  const padding = Math.max(6, size * 0.2)\n  const defaultMouseX = useMotionValue(Infinity)\n\n  const distanceCalc = useTransform(mouseX ?? defaultMouseX, (val: number) => {\n    const bounds = ref.current?.getBoundingClientRect() ?? { x: 0, width: 0 }\n    return val - bounds.x - bounds.width / 2\n  })\n\n  const targetSize = disableMagnification ? size : magnification\n\n  const sizeTransform = useTransform(\n    distanceCalc,\n    [-distance, 0, distance],\n    [size, targetSize, size]\n  )\n\n  const scaleSize = useSpring(sizeTransform, {\n    mass: 0.1,\n    stiffness: 150,\n    damping: 12,\n  })\n\n  return (\n    <motion.div\n      ref={ref}\n      style={{ width: scaleSize, height: scaleSize, padding }}\n      className={cn(\n        \"flex aspect-square cursor-pointer items-center justify-center rounded-full\",\n        disableMagnification && \"hover:bg-muted-foreground transition-colors\",\n        className\n      )}\n      {...props}\n    >\n      <div>{children}</div>\n    </motion.div>\n  )\n}\n\nDockIcon.displayName = \"DockIcon\"\n\nexport { Dock, DockIcon, dockVariants }\n"
  },
  {
    "path": "apps/www/registry/magicui/dot-pattern.tsx",
    "content": "\"use client\"\n\nimport React, { useEffect, useId, useRef, useState } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n *  DotPattern Component Props\n *\n * @param {number} [width=16] - The horizontal spacing between dots\n * @param {number} [height=16] - The vertical spacing between dots\n * @param {number} [x=0] - The x-offset of the entire pattern\n * @param {number} [y=0] - The y-offset of the entire pattern\n * @param {number} [cx=1] - The x-offset of individual dots\n * @param {number} [cy=1] - The y-offset of individual dots\n * @param {number} [cr=1] - The radius of each dot\n * @param {string} [className] - Additional CSS classes to apply to the SVG container\n * @param {boolean} [glow=false] - Whether dots should have a glowing animation effect\n */\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  cx?: number\n  cy?: number\n  cr?: number\n  className?: string\n  glow?: boolean\n  [key: string]: unknown\n}\n\n/**\n * DotPattern Component\n *\n * A React component that creates an animated or static dot pattern background using SVG.\n * The pattern automatically adjusts to fill its container and can optionally display glowing dots.\n *\n * @component\n *\n * @see DotPatternProps for the props interface.\n *\n * @example\n * // Basic usage\n * <DotPattern />\n *\n * // With glowing effect and custom spacing\n * <DotPattern\n *   width={20}\n *   height={20}\n *   glow={true}\n *   className=\"opacity-50\"\n * />\n *\n * @notes\n * - The component is client-side only (\"use client\")\n * - Automatically responds to container size changes\n * - When glow is enabled, dots will animate with random delays and durations\n * - Uses Motion for animations\n * - Dots color can be controlled via the text color utility classes\n */\n\nexport function DotPattern({\n  width = 16,\n  height = 16,\n  x = 0,\n  y = 0,\n  cx = 1,\n  cy = 1,\n  cr = 1,\n  className,\n  glow = false,\n  ...props\n}: DotPatternProps) {\n  const id = useId()\n  const containerRef = useRef<SVGSVGElement>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n  useEffect(() => {\n    const updateDimensions = () => {\n      if (containerRef.current) {\n        const { width, height } = containerRef.current.getBoundingClientRect()\n        setDimensions({ width, height })\n      }\n    }\n\n    updateDimensions()\n    window.addEventListener(\"resize\", updateDimensions)\n    return () => window.removeEventListener(\"resize\", updateDimensions)\n  }, [])\n\n  const dots = Array.from(\n    {\n      length:\n        Math.ceil(dimensions.width / width) *\n        Math.ceil(dimensions.height / height),\n    },\n    (_, i) => {\n      const col = i % Math.ceil(dimensions.width / width)\n      const row = Math.floor(i / Math.ceil(dimensions.width / width))\n      return {\n        x: col * width + cx + x,\n        y: row * height + cy + y,\n        delay: Math.random() * 5,\n        duration: Math.random() * 3 + 2,\n      }\n    }\n  )\n\n  return (\n    <svg\n      ref={containerRef}\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full text-neutral-400/80\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <radialGradient id={`${id}-gradient`}>\n          <stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity=\"1\" />\n          <stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity=\"0\" />\n        </radialGradient>\n      </defs>\n      {dots.map((dot) => (\n        <motion.circle\n          key={`${dot.x}-${dot.y}`}\n          cx={dot.x}\n          cy={dot.y}\n          r={cr}\n          fill={glow ? `url(#${id}-gradient)` : \"currentColor\"}\n          initial={glow ? { opacity: 0.4, scale: 1 } : {}}\n          animate={\n            glow\n              ? {\n                  opacity: [0.4, 1, 0.4],\n                  scale: [1, 1.5, 1],\n                }\n              : {}\n          }\n          transition={\n            glow\n              ? {\n                  duration: dot.duration,\n                  repeat: Infinity,\n                  repeatType: \"reverse\",\n                  delay: dot.delay,\n                  ease: \"easeInOut\",\n                }\n              : {}\n          }\n        />\n      ))}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/dotted-map.tsx",
    "content": "import * as React from \"react\"\nimport { createMap } from \"svg-dotted-map\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface Marker {\n  lat: number\n  lng: number\n  size?: number\n  pulse?: boolean\n}\n\n/** addMarkers returns markers with lat/lng removed; only x, y and other props (e.g. size) remain */\ntype MapMarker<M extends Marker> = Omit<M, \"lat\" | \"lng\"> & {\n  x: number\n  y: number\n}\n\nexport interface DottedMapProps<\n  M extends Marker = Marker,\n> extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  mapSamples?: number\n  markers?: M[]\n  dotColor?: string\n  markerColor?: string\n  dotRadius?: number\n  stagger?: boolean\n  pulse?: boolean\n\n  renderMarkerOverlay?: (args: {\n    marker: MapMarker<M>\n    index: number\n    x: number\n    y: number\n    r: number\n  }) => React.ReactNode\n}\n\nexport function DottedMap<M extends Marker = Marker>({\n  width = 150,\n  height = 75,\n  mapSamples = 5000,\n  markers = [],\n  dotColor = \"currentColor\",\n  markerColor = \"#FF6900\",\n  dotRadius = 0.2,\n  stagger = true,\n  pulse = false,\n  renderMarkerOverlay,\n  className,\n  style,\n  ...svgProps\n}: DottedMapProps<M>) {\n  const { points, addMarkers } = createMap({\n    width,\n    height,\n    mapSamples,\n  })\n  const processedMarkers = addMarkers(markers)\n\n  // Compute stagger helpers in a single, simple pass\n  const { xStep, yToRowIndex } = React.useMemo(() => {\n    const sorted = [...points].sort((a, b) => a.y - b.y || a.x - b.x)\n    const rowMap = new Map<number, number>()\n    let step = 0\n    let prevY = Number.NaN\n    let prevXInRow = Number.NaN\n\n    for (const p of sorted) {\n      if (p.y !== prevY) {\n        // new row\n        prevY = p.y\n        prevXInRow = Number.NaN\n        if (!rowMap.has(p.y)) rowMap.set(p.y, rowMap.size)\n      }\n      if (!Number.isNaN(prevXInRow)) {\n        const delta = p.x - prevXInRow\n        if (delta > 0) step = step === 0 ? delta : Math.min(step, delta)\n      }\n      prevXInRow = p.x\n    }\n\n    return { xStep: step || 1, yToRowIndex: rowMap }\n  }, [points])\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      className={cn(\"text-gray-500 dark:text-gray-500\", className)}\n      style={{ width: \"100%\", height: \"100%\", ...style }}\n      {...svgProps}\n    >\n      {points.map((point, index) => {\n        const rowIndex = yToRowIndex.get(point.y) ?? 0\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\n        return (\n          <circle\n            cx={point.x + offsetX}\n            cy={point.y}\n            r={dotRadius}\n            fill={dotColor}\n            key={`${point.x}-${point.y}-${index}`}\n          />\n        )\n      })}\n\n      {processedMarkers.map((marker, index) => {\n        const rowIndex = yToRowIndex.get(marker.y) ?? 0\n        const offsetX = stagger && rowIndex % 2 === 1 ? xStep / 2 : 0\n\n        const x = marker.x + offsetX\n        const y = marker.y\n        const r = marker.size ?? dotRadius\n        const shouldPulse = pulse\n          ? marker.pulse !== false\n          : marker.pulse === true\n        const pulseTo = r * 2.8\n\n        return (\n          <g key={`${marker.x}-${marker.y}-${index}`}>\n            <circle cx={x} cy={y} r={r} fill={markerColor} />\n\n            {shouldPulse ? (\n              <g pointerEvents=\"none\">\n                <circle\n                  cx={x}\n                  cy={y}\n                  r={r}\n                  fill=\"none\"\n                  stroke={markerColor}\n                  strokeOpacity={1}\n                  strokeWidth={0.35}\n                >\n                  <animate\n                    attributeName=\"r\"\n                    values={`${r};${pulseTo}`}\n                    dur=\"1.4s\"\n                    repeatCount=\"indefinite\"\n                  />\n                  <animate\n                    attributeName=\"opacity\"\n                    values=\"1;0\"\n                    dur=\"1.4s\"\n                    repeatCount=\"indefinite\"\n                  />\n                </circle>\n                <circle\n                  cx={x}\n                  cy={y}\n                  r={r}\n                  fill=\"none\"\n                  stroke={markerColor}\n                  strokeOpacity={0.9}\n                  strokeWidth={0.3}\n                >\n                  <animate\n                    attributeName=\"r\"\n                    values={`${r};${pulseTo}`}\n                    dur=\"1.4s\"\n                    begin=\"0.7s\"\n                    repeatCount=\"indefinite\"\n                  />\n                  <animate\n                    attributeName=\"opacity\"\n                    values=\"0.9;0\"\n                    dur=\"1.4s\"\n                    begin=\"0.7s\"\n                    repeatCount=\"indefinite\"\n                  />\n                </circle>\n              </g>\n            ) : null}\n\n            {renderMarkerOverlay?.({\n              marker: { ...marker, x, y },\n              index,\n              x,\n              y,\n              r,\n            })}\n          </g>\n        )\n      })}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/file-tree.tsx",
    "content": "\"use client\"\n\nimport React, {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useState,\n} from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { FileIcon, FolderIcon, FolderOpenIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\n\ntype TreeViewElement = {\n  id: string\n  name: string\n  type?: \"file\" | \"folder\"\n  isSelectable?: boolean\n  children?: TreeViewElement[]\n}\n\ntype TreeSortMode =\n  | \"default\"\n  | \"none\"\n  | ((a: TreeViewElement, b: TreeViewElement) => number)\n\ntype TreeContextProps = {\n  selectedId: string | undefined\n  expandedItems: string[] | undefined\n  indicator: boolean\n  handleExpand: (id: string) => void\n  selectItem: (id: string) => void\n  setExpandedItems?: React.Dispatch<React.SetStateAction<string[] | undefined>>\n  openIcon?: React.ReactNode\n  closeIcon?: React.ReactNode\n  direction: \"rtl\" | \"ltr\"\n}\n\nconst TreeContext = createContext<TreeContextProps | null>(null)\n\nconst useTree = () => {\n  const context = useContext(TreeContext)\n  if (!context) {\n    throw new Error(\"useTree must be used within a TreeProvider\")\n  }\n  return context\n}\n\ntype Direction = \"rtl\" | \"ltr\" | undefined\n\nconst isFolderElement = (element: TreeViewElement) => {\n  if (element.type) {\n    return element.type === \"folder\"\n  }\n\n  return Array.isArray(element.children)\n}\n\nconst mergeExpandedItems = (\n  currentItems: string[] | undefined,\n  nextItems: string[]\n) => [...new Set([...(currentItems ?? []), ...nextItems])]\n\nconst treeCollator = new Intl.Collator(\"en\", {\n  numeric: true,\n  sensitivity: \"base\",\n})\n\nconst defaultTreeComparator = (a: TreeViewElement, b: TreeViewElement) => {\n  const aIsFolder = isFolderElement(a)\n  const bIsFolder = isFolderElement(b)\n\n  if (aIsFolder !== bIsFolder) {\n    return aIsFolder ? -1 : 1\n  }\n\n  return treeCollator.compare(a.name, b.name)\n}\n\nconst getTreeComparator = (sort: TreeSortMode) => {\n  if (sort === \"none\") {\n    return undefined\n  }\n\n  if (sort === \"default\") {\n    return defaultTreeComparator\n  }\n\n  return sort\n}\n\nconst sortTreeElements = (\n  elements: TreeViewElement[],\n  sort: TreeSortMode\n): TreeViewElement[] => {\n  const comparator = getTreeComparator(sort)\n\n  const nextElements = elements.map((element) => {\n    if (!Array.isArray(element.children)) {\n      return element\n    }\n\n    return {\n      ...element,\n      children: sortTreeElements(element.children, sort),\n    }\n  })\n\n  if (!comparator) {\n    return nextElements\n  }\n\n  return [...nextElements].sort(comparator)\n}\n\nconst renderTreeElements = (\n  elements: TreeViewElement[],\n  sort: TreeSortMode\n): React.ReactNode =>\n  sortTreeElements(elements, sort).map((element) => {\n    if (isFolderElement(element)) {\n      return (\n        <Folder\n          key={element.id}\n          value={element.id}\n          element={element.name}\n          isSelectable={element.isSelectable}\n        >\n          {Array.isArray(element.children)\n            ? renderTreeElements(element.children, sort)\n            : null}\n        </Folder>\n      )\n    }\n\n    return (\n      <File\n        key={element.id}\n        value={element.id}\n        isSelectable={element.isSelectable}\n      >\n        <span>{element.name}</span>\n      </File>\n    )\n  })\n\ntype TreeViewProps = {\n  initialSelectedId?: string\n  indicator?: boolean\n  elements?: TreeViewElement[]\n  initialExpandedItems?: string[]\n  openIcon?: React.ReactNode\n  closeIcon?: React.ReactNode\n  sort?: TreeSortMode\n} & Omit<\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n  \"defaultValue\" | \"onValueChange\" | \"type\" | \"value\"\n>\n\nconst Tree = forwardRef<HTMLDivElement, TreeViewProps>(\n  (\n    {\n      className,\n      elements,\n      initialSelectedId,\n      initialExpandedItems,\n      children,\n      indicator = true,\n      openIcon,\n      closeIcon,\n      sort = \"default\",\n      dir,\n      ...props\n    },\n    ref\n  ) => {\n    const [selectedId, setSelectedId] = useState<string | undefined>(\n      initialSelectedId\n    )\n    const [expandedItems, setExpandedItems] = useState<string[] | undefined>(\n      initialExpandedItems\n    )\n\n    const selectItem = useCallback((id: string) => {\n      setSelectedId(id)\n    }, [])\n\n    const handleExpand = useCallback((id: string) => {\n      setExpandedItems((prev) => {\n        if (prev?.includes(id)) {\n          return prev.filter((item) => item !== id)\n        }\n        return [...(prev ?? []), id]\n      })\n    }, [])\n\n    const expandSpecificTargetedElements = useCallback(\n      (elements?: TreeViewElement[], selectId?: string) => {\n        if (!elements || !selectId) return\n        const findParent = (\n          currentElement: TreeViewElement,\n          currentPath: string[] = []\n        ) => {\n          const isSelectable = currentElement.isSelectable ?? true\n          const newPath = [...currentPath, currentElement.id]\n          if (currentElement.id === selectId) {\n            if (isSelectable) {\n              setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\n            } else {\n              if (newPath.includes(currentElement.id)) {\n                newPath.pop()\n                setExpandedItems((prev) => mergeExpandedItems(prev, newPath))\n              }\n            }\n            return\n          }\n          if (\n            Array.isArray(currentElement.children) &&\n            currentElement.children.length > 0\n          ) {\n            currentElement.children.forEach((child) => {\n              findParent(child, newPath)\n            })\n          }\n        }\n        elements.forEach((element) => {\n          findParent(element)\n        })\n      },\n      []\n    )\n\n    useEffect(() => {\n      if (initialSelectedId) {\n        expandSpecificTargetedElements(elements, initialSelectedId)\n      }\n    }, [initialSelectedId, elements, expandSpecificTargetedElements])\n\n    const direction = dir === \"rtl\" ? \"rtl\" : \"ltr\"\n    const treeChildren =\n      children ?? (elements ? renderTreeElements(elements, sort) : null)\n\n    return (\n      <TreeContext.Provider\n        value={{\n          selectedId,\n          expandedItems,\n          handleExpand,\n          selectItem,\n          setExpandedItems,\n          indicator,\n          openIcon,\n          closeIcon,\n          direction,\n        }}\n      >\n        <div className={cn(\"size-full\", className)}>\n          <ScrollArea\n            ref={ref}\n            className=\"relative h-full px-2\"\n            dir={dir as Direction}\n          >\n            <AccordionPrimitive.Root\n              {...props}\n              type=\"multiple\"\n              value={expandedItems}\n              className=\"flex flex-col gap-1\"\n              dir={dir as Direction}\n            >\n              {treeChildren}\n            </AccordionPrimitive.Root>\n          </ScrollArea>\n        </div>\n      </TreeContext.Provider>\n    )\n  }\n)\n\nTree.displayName = \"Tree\"\n\nconst TreeIndicator = forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { direction } = useTree()\n\n  return (\n    <div\n      dir={direction}\n      ref={ref}\n      className={cn(\n        \"bg-muted absolute left-1.5 h-full w-px rounded-md py-3 duration-300 ease-in-out hover:bg-slate-300 rtl:right-1.5\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\n\nTreeIndicator.displayName = \"TreeIndicator\"\n\ntype FolderProps = {\n  expandedItems?: string[]\n  element: string\n  isSelectable?: boolean\n  isSelect?: boolean\n} & React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n\nconst Folder = forwardRef<\n  HTMLDivElement,\n  FolderProps & React.HTMLAttributes<HTMLDivElement>\n>(\n  (\n    {\n      className,\n      element,\n      value,\n      isSelectable = true,\n      isSelect,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const {\n      direction,\n      handleExpand,\n      expandedItems,\n      indicator,\n      selectedId,\n      selectItem,\n      openIcon,\n      closeIcon,\n    } = useTree()\n    const isSelected = isSelect ?? selectedId === value\n\n    return (\n      <AccordionPrimitive.Item\n        ref={ref}\n        {...props}\n        value={value}\n        className=\"relative h-full overflow-hidden\"\n      >\n        <AccordionPrimitive.Trigger\n          className={cn(\n            `flex items-center gap-1 rounded-md text-sm`,\n            className,\n            {\n              \"bg-muted rounded-md\": isSelected && isSelectable,\n              \"cursor-pointer\": isSelectable,\n              \"cursor-not-allowed opacity-50\": !isSelectable,\n            }\n          )}\n          disabled={!isSelectable}\n          onClick={() => {\n            selectItem(value)\n            handleExpand(value)\n          }}\n        >\n          {expandedItems?.includes(value)\n            ? (openIcon ?? <FolderOpenIcon className=\"size-4\" />)\n            : (closeIcon ?? <FolderIcon className=\"size-4\" />)}\n          <span>{element}</span>\n        </AccordionPrimitive.Trigger>\n        <AccordionPrimitive.Content className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down relative h-full overflow-hidden text-sm\">\n          {element && indicator && <TreeIndicator aria-hidden=\"true\" />}\n          <AccordionPrimitive.Root\n            dir={direction}\n            type=\"multiple\"\n            className=\"ml-5 flex flex-col gap-1 py-1 rtl:mr-5\"\n            value={expandedItems}\n          >\n            {children}\n          </AccordionPrimitive.Root>\n        </AccordionPrimitive.Content>\n      </AccordionPrimitive.Item>\n    )\n  }\n)\n\nFolder.displayName = \"Folder\"\n\nconst File = forwardRef<\n  HTMLButtonElement,\n  {\n    value: string\n    handleSelect?: (id: string) => void\n    isSelectable?: boolean\n    isSelect?: boolean\n    fileIcon?: React.ReactNode\n  } & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(\n  (\n    {\n      value,\n      className,\n      handleSelect,\n      onClick,\n      isSelectable = true,\n      isSelect,\n      fileIcon,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const { direction, selectedId, selectItem } = useTree()\n    const isSelected = isSelect ?? selectedId === value\n    return (\n      <button\n        ref={ref}\n        type=\"button\"\n        disabled={!isSelectable}\n        className={cn(\n          \"flex w-fit items-center gap-1 rounded-md pr-1 text-sm duration-200 ease-in-out rtl:pr-0 rtl:pl-1\",\n          {\n            \"bg-muted\": isSelected && isSelectable,\n          },\n          isSelectable ? \"cursor-pointer\" : \"cursor-not-allowed opacity-50\",\n          direction === \"rtl\" ? \"rtl\" : \"ltr\",\n          className\n        )}\n        onClick={(event) => {\n          selectItem(value)\n          handleSelect?.(value)\n          onClick?.(event)\n        }}\n        {...props}\n      >\n        {fileIcon ?? <FileIcon className=\"size-4\" />}\n        {children}\n      </button>\n    )\n  }\n)\n\nFile.displayName = \"File\"\n\nconst CollapseButton = forwardRef<\n  HTMLButtonElement,\n  {\n    elements: TreeViewElement[]\n    expandAll?: boolean\n  } & React.HTMLAttributes<HTMLButtonElement>\n>(({ className, elements, expandAll = false, children, ...props }, ref) => {\n  const { expandedItems, setExpandedItems } = useTree()\n\n  const expendAllTree = useCallback((elements: TreeViewElement[]) => {\n    const expandedElementIds: string[] = []\n\n    const expandTree = (element: TreeViewElement) => {\n      const isSelectable = element.isSelectable ?? true\n      if (isSelectable && element.children && element.children.length > 0) {\n        expandedElementIds.push(element.id)\n        for (const child of element.children) {\n          expandTree(child)\n        }\n      }\n    }\n\n    for (const element of elements) {\n      expandTree(element)\n    }\n\n    return [...new Set(expandedElementIds)]\n  }, [])\n\n  const closeAll = useCallback(() => {\n    setExpandedItems?.([])\n  }, [setExpandedItems])\n\n  useEffect(() => {\n    if (expandAll) {\n      setExpandedItems?.(expendAllTree(elements))\n    }\n  }, [expandAll, elements, expendAllTree, setExpandedItems])\n\n  return (\n    <Button\n      variant={\"ghost\"}\n      className={cn(\"absolute right-2 bottom-1 h-8 w-fit p-1\", className)}\n      onClick={\n        expandedItems && expandedItems.length > 0\n          ? closeAll\n          : () => setExpandedItems?.(expendAllTree(elements))\n      }\n      ref={ref}\n      {...props}\n    >\n      {children}\n      <span className=\"sr-only\">Toggle</span>\n    </Button>\n  )\n})\n\nCollapseButton.displayName = \"CollapseButton\"\n\nexport { CollapseButton, File, Folder, Tree, type TreeViewElement }\nexport type { TreeSortMode }\n"
  },
  {
    "path": "apps/www/registry/magicui/flickering-grid.tsx",
    "content": "\"use client\"\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface FlickeringGridProps extends React.HTMLAttributes<HTMLDivElement> {\n  squareSize?: number\n  gridGap?: number\n  flickerChance?: number\n  color?: string\n  width?: number\n  height?: number\n  className?: string\n  maxOpacity?: number\n}\n\nexport const FlickeringGrid: React.FC<FlickeringGridProps> = ({\n  squareSize = 4,\n  gridGap = 6,\n  flickerChance = 0.3,\n  color = \"rgb(0, 0, 0)\",\n  width,\n  height,\n  className,\n  maxOpacity = 0.3,\n  ...props\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [isInView, setIsInView] = useState(false)\n  const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0 })\n\n  const memoizedColor = useMemo(() => {\n    const toRGBA = (color: string) => {\n      if (typeof window === \"undefined\") {\n        return `rgba(0, 0, 0,`\n      }\n      const canvas = document.createElement(\"canvas\")\n      canvas.width = canvas.height = 1\n      const ctx = canvas.getContext(\"2d\")\n      if (!ctx) return \"rgba(255, 0, 0,\"\n      ctx.fillStyle = color\n      ctx.fillRect(0, 0, 1, 1)\n      const [r, g, b] = Array.from(ctx.getImageData(0, 0, 1, 1).data)\n      return `rgba(${r}, ${g}, ${b},`\n    }\n    return toRGBA(color)\n  }, [color])\n\n  const setupCanvas = useCallback(\n    (canvas: HTMLCanvasElement, width: number, height: number) => {\n      const dpr = window.devicePixelRatio || 1\n      canvas.width = width * dpr\n      canvas.height = height * dpr\n      canvas.style.width = `${width}px`\n      canvas.style.height = `${height}px`\n      const cols = Math.ceil(width / (squareSize + gridGap))\n      const rows = Math.ceil(height / (squareSize + gridGap))\n\n      const squares = new Float32Array(cols * rows)\n      for (let i = 0; i < squares.length; i++) {\n        squares[i] = Math.random() * maxOpacity\n      }\n\n      return { cols, rows, squares, dpr }\n    },\n    [squareSize, gridGap, maxOpacity]\n  )\n\n  const updateSquares = useCallback(\n    (squares: Float32Array, deltaTime: number) => {\n      for (let i = 0; i < squares.length; i++) {\n        if (Math.random() < flickerChance * deltaTime) {\n          squares[i] = Math.random() * maxOpacity\n        }\n      }\n    },\n    [flickerChance, maxOpacity]\n  )\n\n  const drawGrid = useCallback(\n    (\n      ctx: CanvasRenderingContext2D,\n      width: number,\n      height: number,\n      cols: number,\n      rows: number,\n      squares: Float32Array,\n      dpr: number\n    ) => {\n      ctx.clearRect(0, 0, width, height)\n      ctx.fillStyle = \"transparent\"\n      ctx.fillRect(0, 0, width, height)\n\n      for (let i = 0; i < cols; i++) {\n        for (let j = 0; j < rows; j++) {\n          const opacity = squares[i * rows + j]\n          ctx.fillStyle = `${memoizedColor}${opacity})`\n          ctx.fillRect(\n            i * (squareSize + gridGap) * dpr,\n            j * (squareSize + gridGap) * dpr,\n            squareSize * dpr,\n            squareSize * dpr\n          )\n        }\n      }\n    },\n    [memoizedColor, squareSize, gridGap]\n  )\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const container = containerRef.current\n    const ctx = canvas?.getContext(\"2d\") ?? null\n    let animationFrameId: number | null = null\n    let resizeObserver: ResizeObserver | null = null\n    let intersectionObserver: IntersectionObserver | null = null\n    let gridParams: ReturnType<typeof setupCanvas> | null = null\n\n    if (canvas && container && ctx) {\n      const updateCanvasSize = () => {\n        const newWidth = width || container.clientWidth\n        const newHeight = height || container.clientHeight\n        setCanvasSize({ width: newWidth, height: newHeight })\n        gridParams = setupCanvas(canvas, newWidth, newHeight)\n      }\n\n      updateCanvasSize()\n\n      let lastTime = 0\n      const animate = (time: number) => {\n        if (!isInView || !gridParams) return\n\n        const deltaTime = (time - lastTime) / 1000\n        lastTime = time\n\n        updateSquares(gridParams.squares, deltaTime)\n        drawGrid(\n          ctx,\n          canvas.width,\n          canvas.height,\n          gridParams.cols,\n          gridParams.rows,\n          gridParams.squares,\n          gridParams.dpr\n        )\n        animationFrameId = requestAnimationFrame(animate)\n      }\n\n      resizeObserver = new ResizeObserver(() => {\n        updateCanvasSize()\n      })\n      resizeObserver.observe(container)\n\n      intersectionObserver = new IntersectionObserver(\n        ([entry]) => {\n          setIsInView(entry.isIntersecting)\n        },\n        { threshold: 0 }\n      )\n      intersectionObserver.observe(canvas)\n\n      if (isInView) {\n        animationFrameId = requestAnimationFrame(animate)\n      }\n    }\n\n    return () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n      }\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n      if (intersectionObserver) {\n        intersectionObserver.disconnect()\n      }\n    }\n  }, [setupCanvas, updateSquares, drawGrid, width, height, isInView])\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(`h-full w-full ${className}`)}\n      {...props}\n    >\n      <canvas\n        ref={canvasRef}\n        className=\"pointer-events-none\"\n        style={{\n          width: canvasSize.width,\n          height: canvasSize.height,\n        }}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/globe.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport createGlobe, { type COBEOptions } from \"cobe\"\nimport { useMotionValue, useSpring } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst MOVEMENT_DAMPING = 1400\n\nconst GLOBE_CONFIG: COBEOptions = {\n  width: 800,\n  height: 800,\n  onRender: () => {},\n  devicePixelRatio: 2,\n  phi: 0,\n  theta: 0.3,\n  dark: 0,\n  diffuse: 0.4,\n  mapSamples: 16000,\n  mapBrightness: 1.2,\n  baseColor: [1, 1, 1],\n  markerColor: [251 / 255, 100 / 255, 21 / 255],\n  glowColor: [1, 1, 1],\n  markers: [\n    { location: [14.5995, 120.9842], size: 0.03 },\n    { location: [19.076, 72.8777], size: 0.1 },\n    { location: [23.8103, 90.4125], size: 0.05 },\n    { location: [30.0444, 31.2357], size: 0.07 },\n    { location: [39.9042, 116.4074], size: 0.08 },\n    { location: [-23.5505, -46.6333], size: 0.1 },\n    { location: [19.4326, -99.1332], size: 0.1 },\n    { location: [40.7128, -74.006], size: 0.1 },\n    { location: [34.6937, 135.5022], size: 0.05 },\n    { location: [41.0082, 28.9784], size: 0.06 },\n  ],\n}\n\nexport function Globe({\n  className,\n  config = GLOBE_CONFIG,\n}: {\n  className?: string\n  config?: COBEOptions\n}) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const phiRef = useRef(0)\n  const widthRef = useRef(0)\n  const pointerInteracting = useRef<number | null>(null)\n  const pointerInteractionMovement = useRef(0)\n\n  const r = useMotionValue(0)\n  const rs = useSpring(r, {\n    mass: 1,\n    damping: 30,\n    stiffness: 100,\n  })\n\n  const updatePointerInteraction = (value: number | null) => {\n    pointerInteracting.current = value\n    if (canvasRef.current) {\n      canvasRef.current.style.cursor = value !== null ? \"grabbing\" : \"grab\"\n    }\n  }\n\n  const updateMovement = (clientX: number) => {\n    if (pointerInteracting.current !== null) {\n      const delta = clientX - pointerInteracting.current\n      pointerInteractionMovement.current = delta\n      r.set(r.get() + delta / MOVEMENT_DAMPING)\n    }\n  }\n\n  useEffect(() => {\n    const onResize = () => {\n      if (canvasRef.current) {\n        widthRef.current = canvasRef.current.offsetWidth\n      }\n    }\n\n    window.addEventListener(\"resize\", onResize)\n    onResize()\n\n    const globe = createGlobe(canvasRef.current!, {\n      ...config,\n      width: widthRef.current * 2,\n      height: widthRef.current * 2,\n      onRender: (state) => {\n        if (!pointerInteracting.current) phiRef.current += 0.005\n        state.phi = phiRef.current + rs.get()\n        state.width = widthRef.current * 2\n        state.height = widthRef.current * 2\n      },\n    })\n\n    setTimeout(() => (canvasRef.current!.style.opacity = \"1\"), 0)\n    return () => {\n      globe.destroy()\n      window.removeEventListener(\"resize\", onResize)\n    }\n  }, [rs, config])\n\n  return (\n    <div\n      className={cn(\n        \"absolute inset-0 mx-auto aspect-square w-full max-w-150\",\n        className\n      )}\n    >\n      <canvas\n        className={cn(\n          \"size-full opacity-0 transition-opacity duration-500 contain-[layout_paint_size]\"\n        )}\n        ref={canvasRef}\n        onPointerDown={(e) => {\n          pointerInteracting.current = e.clientX\n          updatePointerInteraction(e.clientX)\n        }}\n        onPointerUp={() => updatePointerInteraction(null)}\n        onPointerOut={() => updatePointerInteraction(null)}\n        onMouseMove={(e) => updateMovement(e.clientX)}\n        onTouchMove={(e) =>\n          e.touches[0] && updateMovement(e.touches[0].clientX)\n        }\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/grid-pattern.tsx",
    "content": "import { useId } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface GridPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  x?: number\n  y?: number\n  squares?: Array<[x: number, y: number]>\n  strokeDasharray?: string\n  className?: string\n  [key: string]: unknown\n}\n\nexport function GridPattern({\n  width = 40,\n  height = 40,\n  x = -1,\n  y = -1,\n  strokeDasharray = \"0\",\n  squares,\n  className,\n  ...props\n}: GridPatternProps) {\n  const id = useId()\n\n  return (\n    <svg\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      <defs>\n        <pattern\n          id={id}\n          width={width}\n          height={height}\n          patternUnits=\"userSpaceOnUse\"\n          x={x}\n          y={y}\n        >\n          <path\n            d={`M.5 ${height}V.5H${width}`}\n            fill=\"none\"\n            strokeDasharray={strokeDasharray}\n          />\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" strokeWidth={0} fill={`url(#${id})`} />\n      {squares && (\n        <svg x={x} y={y} className=\"overflow-visible\">\n          {squares.map(([x, y]) => (\n            <rect\n              strokeWidth=\"0\"\n              key={`${x}-${y}`}\n              width={width - 1}\n              height={height - 1}\n              x={x * width + 1}\n              y={y * height + 1}\n            />\n          ))}\n        </svg>\n      )}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/hero-video-dialog.tsx",
    "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { Play, XIcon } from \"lucide-react\"\nimport { AnimatePresence, motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype AnimationStyle =\n  | \"from-bottom\"\n  | \"from-center\"\n  | \"from-top\"\n  | \"from-left\"\n  | \"from-right\"\n  | \"fade\"\n  | \"top-in-bottom-out\"\n  | \"left-in-right-out\"\n\ninterface HeroVideoProps {\n  animationStyle?: AnimationStyle\n  videoSrc: string\n  thumbnailSrc: string\n  thumbnailAlt?: string\n  className?: string\n}\n\nconst animationVariants = {\n  \"from-bottom\": {\n    initial: { y: \"100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"100%\", opacity: 0 },\n  },\n  \"from-center\": {\n    initial: { scale: 0.5, opacity: 0 },\n    animate: { scale: 1, opacity: 1 },\n    exit: { scale: 0.5, opacity: 0 },\n  },\n  \"from-top\": {\n    initial: { y: \"-100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"-100%\", opacity: 0 },\n  },\n  \"from-left\": {\n    initial: { x: \"-100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"-100%\", opacity: 0 },\n  },\n  \"from-right\": {\n    initial: { x: \"100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"100%\", opacity: 0 },\n  },\n  fade: {\n    initial: { opacity: 0 },\n    animate: { opacity: 1 },\n    exit: { opacity: 0 },\n  },\n  \"top-in-bottom-out\": {\n    initial: { y: \"-100%\", opacity: 0 },\n    animate: { y: 0, opacity: 1 },\n    exit: { y: \"100%\", opacity: 0 },\n  },\n  \"left-in-right-out\": {\n    initial: { x: \"-100%\", opacity: 0 },\n    animate: { x: 0, opacity: 1 },\n    exit: { x: \"100%\", opacity: 0 },\n  },\n}\n\nexport function HeroVideoDialog({\n  animationStyle = \"from-center\",\n  videoSrc,\n  thumbnailSrc,\n  thumbnailAlt = \"Video thumbnail\",\n  className,\n}: HeroVideoProps) {\n  const [isVideoOpen, setIsVideoOpen] = useState(false)\n  const selectedAnimation = animationVariants[animationStyle]\n\n  return (\n    <div className={cn(\"relative\", className)}>\n      <button\n        type=\"button\"\n        aria-label=\"Play video\"\n        className=\"group relative cursor-pointer border-0 bg-transparent p-0\"\n        onClick={() => setIsVideoOpen(true)}\n      >\n        <img\n          src={thumbnailSrc}\n          alt={thumbnailAlt}\n          width={1920}\n          height={1080}\n          className=\"w-full rounded-md border shadow-lg transition-all duration-200 ease-out group-hover:brightness-[0.8]\"\n        />\n        <div className=\"absolute inset-0 flex scale-[0.9] items-center justify-center rounded-2xl transition-all duration-200 ease-out group-hover:scale-100\">\n          <div className=\"bg-primary/10 flex size-28 items-center justify-center rounded-full backdrop-blur-md\">\n            <div\n              className={`from-primary/30 to-primary relative flex size-20 scale-100 items-center justify-center rounded-full bg-linear-to-b shadow-md transition-all duration-200 ease-out group-hover:scale-[1.2]`}\n            >\n              <Play\n                className=\"size-8 scale-100 fill-white text-white transition-transform duration-200 ease-out group-hover:scale-105\"\n                style={{\n                  filter:\n                    \"drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06))\",\n                }}\n              />\n            </div>\n          </div>\n        </div>\n      </button>\n      <AnimatePresence>\n        {isVideoOpen && (\n          <motion.div\n            initial={{ opacity: 0 }}\n            animate={{ opacity: 1 }}\n            role=\"button\"\n            tabIndex={0}\n            onKeyDown={(e) => {\n              if (e.key === \"Escape\" || e.key === \"Enter\" || e.key === \" \") {\n                setIsVideoOpen(false)\n              }\n            }}\n            onClick={() => setIsVideoOpen(false)}\n            exit={{ opacity: 0 }}\n            className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md\"\n          >\n            <motion.div\n              {...selectedAnimation}\n              transition={{ type: \"spring\", damping: 30, stiffness: 300 }}\n              className=\"relative mx-4 aspect-video w-full max-w-4xl md:mx-0\"\n            >\n              <motion.button className=\"absolute -top-16 right-0 rounded-full bg-neutral-900/50 p-2 text-xl text-white ring-1 backdrop-blur-md dark:bg-neutral-100/50 dark:text-black\">\n                <XIcon className=\"size-5\" />\n              </motion.button>\n              <div className=\"relative isolate z-1 size-full overflow-hidden rounded-2xl border-2 border-white\">\n                <iframe\n                  src={videoSrc}\n                  title=\"Hero Video player\"\n                  className=\"mt-0 size-full rounded-2xl\"\n                  allowFullScreen\n                  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                ></iframe>\n              </div>\n            </motion.div>\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/highlighter.tsx",
    "content": "\"use client\"\n\nimport { useLayoutEffect, useRef } from \"react\"\nimport type React from \"react\"\nimport { useInView } from \"motion/react\"\nimport { annotate } from \"rough-notation\"\nimport { type RoughAnnotation } from \"rough-notation/lib/model\"\n\ntype AnnotationAction =\n  | \"highlight\"\n  | \"underline\"\n  | \"box\"\n  | \"circle\"\n  | \"strike-through\"\n  | \"crossed-off\"\n  | \"bracket\"\n\ninterface HighlighterProps {\n  children: React.ReactNode\n  action?: AnnotationAction\n  color?: string\n  strokeWidth?: number\n  animationDuration?: number\n  iterations?: number\n  padding?: number\n  multiline?: boolean\n  isView?: boolean\n}\n\nexport function Highlighter({\n  children,\n  action = \"highlight\",\n  color = \"#ffd1dc\",\n  strokeWidth = 1.5,\n  animationDuration = 600,\n  iterations = 2,\n  padding = 2,\n  multiline = true,\n  isView = false,\n}: HighlighterProps) {\n  const elementRef = useRef<HTMLSpanElement>(null)\n\n  const isInView = useInView(elementRef, {\n    once: true,\n    margin: \"-10%\",\n  })\n\n  // If isView is false, always show. If isView is true, wait for inView\n  const shouldShow = !isView || isInView\n\n  useLayoutEffect(() => {\n    const element = elementRef.current\n    let annotation: RoughAnnotation | null = null\n    let resizeObserver: ResizeObserver | null = null\n\n    if (shouldShow && element) {\n      const annotationConfig = {\n        type: action,\n        color,\n        strokeWidth,\n        animationDuration,\n        iterations,\n        padding,\n        multiline,\n      }\n\n      const currentAnnotation = annotate(element, annotationConfig)\n      annotation = currentAnnotation\n      currentAnnotation.show()\n\n      resizeObserver = new ResizeObserver(() => {\n        currentAnnotation.hide()\n        currentAnnotation.show()\n      })\n\n      resizeObserver.observe(element)\n      resizeObserver.observe(document.body)\n    }\n\n    return () => {\n      annotation?.remove()\n      if (resizeObserver) {\n        resizeObserver.disconnect()\n      }\n    }\n  }, [\n    shouldShow,\n    action,\n    color,\n    strokeWidth,\n    animationDuration,\n    iterations,\n    padding,\n    multiline,\n  ])\n\n  return (\n    <span ref={elementRef} className=\"relative inline-block bg-transparent\">\n      {children}\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/hyper-text.tsx",
    "content": "\"use client\"\n\nimport {\n  useEffect,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n} from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype CharacterSet = string[] | readonly string[]\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype HyperTextMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"div\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface HyperTextProps extends Omit<MotionProps, \"children\"> {\n  /** The text content to be animated */\n  children: string\n  /** Optional className for styling */\n  className?: string\n  /** Duration of the animation in milliseconds */\n  duration?: number\n  /** Delay before animation starts in milliseconds */\n  delay?: number\n  /** Component to render as - defaults to div */\n  as?: MotionElementType\n  /** Whether to start animation when element comes into view */\n  startOnView?: boolean\n  /** Whether to trigger animation on hover */\n  animateOnHover?: boolean\n  /** Custom character set for scramble effect. Defaults to uppercase alphabet */\n  characterSet?: CharacterSet\n}\n\nconst DEFAULT_CHARACTER_SET = Object.freeze(\n  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\")\n) as readonly string[]\n\nconst getRandomInt = (max: number): number => Math.floor(Math.random() * max)\n\nexport function HyperText({\n  children,\n  className,\n  duration = 800,\n  delay = 0,\n  as: Component = \"div\",\n  startOnView = false,\n  animateOnHover = true,\n  characterSet = DEFAULT_CHARACTER_SET,\n  ...props\n}: HyperTextProps) {\n  const MotionComponent = motionElements[Component] as HyperTextMotionComponent\n\n  const [displayText, setDisplayText] = useState<string[]>(() =>\n    children.split(\"\")\n  )\n  const [isAnimating, setIsAnimating] = useState(false)\n  const iterationCount = useRef(0)\n  const elementRef = useRef<HTMLElement | null>(null)\n\n  const handleAnimationTrigger = () => {\n    if (animateOnHover && !isAnimating) {\n      iterationCount.current = 0\n      setIsAnimating(true)\n    }\n  }\n\n  // Handle animation start based on view or delay\n  useEffect(() => {\n    if (!startOnView) {\n      const startTimeout = setTimeout(() => {\n        setIsAnimating(true)\n      }, delay)\n      return () => clearTimeout(startTimeout)\n    }\n\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        if (entry.isIntersecting) {\n          setTimeout(() => {\n            setIsAnimating(true)\n          }, delay)\n          observer.disconnect()\n        }\n      },\n      { threshold: 0.1, rootMargin: \"-30% 0px -30% 0px\" }\n    )\n\n    if (elementRef.current) {\n      observer.observe(elementRef.current)\n    }\n\n    return () => observer.disconnect()\n  }, [delay, startOnView])\n\n  // Handle scramble animation\n  useEffect(() => {\n    let animationFrameId: number | null = null\n\n    if (isAnimating) {\n      const maxIterations = children.length\n      const startTime = performance.now()\n\n      const animate = (currentTime: number) => {\n        const elapsed = currentTime - startTime\n        const progress = Math.min(elapsed / duration, 1)\n\n        iterationCount.current = progress * maxIterations\n\n        setDisplayText((currentText) =>\n          currentText.map((letter, index) =>\n            letter === \" \"\n              ? letter\n              : index <= iterationCount.current\n                ? children[index]\n                : characterSet[getRandomInt(characterSet.length)]\n          )\n        )\n\n        if (progress < 1) {\n          animationFrameId = requestAnimationFrame(animate)\n        } else {\n          setIsAnimating(false)\n        }\n      }\n\n      animationFrameId = requestAnimationFrame(animate)\n    }\n\n    return () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n      }\n    }\n  }, [children, duration, isAnimating, characterSet])\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\"overflow-hidden py-2 text-4xl font-bold\", className)}\n      onMouseEnter={handleAnimationTrigger}\n      {...props}\n    >\n      <AnimatePresence>\n        {displayText.map((letter, index) => (\n          <motion.span\n            key={index}\n            className={cn(\"font-mono\", letter === \" \" ? \"w-3\" : \"\")}\n          >\n            {letter.toUpperCase()}\n          </motion.span>\n        ))}\n      </AnimatePresence>\n    </MotionComponent>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/icon-cloud.tsx",
    "content": "\"use client\"\n\nimport React, { useEffect, useRef, useState } from \"react\"\nimport { renderToString } from \"react-dom/server\"\n\ninterface Icon {\n  x: number\n  y: number\n  z: number\n  scale: number\n  opacity: number\n  id: number\n}\n\ninterface IconCloudProps {\n  icons?: React.ReactNode[]\n  images?: string[]\n}\n\nfunction easeOutCubic(t: number): number {\n  return 1 - Math.pow(1 - t, 3)\n}\n\nexport function IconCloud({ icons, images }: IconCloudProps) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const [iconPositions, setIconPositions] = useState<Icon[]>([])\n  const [isDragging, setIsDragging] = useState(false)\n  const [lastMousePos, setLastMousePos] = useState({ x: 0, y: 0 })\n  const [mousePos, setMousePos] = useState({ x: 0, y: 0 })\n  const [targetRotation, setTargetRotation] = useState<{\n    x: number\n    y: number\n    startX: number\n    startY: number\n    distance: number\n    startTime: number\n    duration: number\n  } | null>(null)\n  const animationFrameRef = useRef<number>(0)\n  const rotationRef = useRef({ x: 0, y: 0 })\n  const iconCanvasesRef = useRef<HTMLCanvasElement[]>([])\n  const imagesLoadedRef = useRef<boolean[]>([])\n\n  // Create icon canvases once when icons/images change\n  useEffect(() => {\n    if (!icons && !images) return\n\n    const items = icons ?? images ?? []\n    imagesLoadedRef.current = new Array(items.length).fill(false)\n\n    const newIconCanvases = items.map((item, index) => {\n      const offscreen = document.createElement(\"canvas\")\n      offscreen.width = 40\n      offscreen.height = 40\n      const offCtx = offscreen.getContext(\"2d\")\n\n      if (offCtx) {\n        if (images) {\n          // Handle image URLs directly\n          const img = new Image()\n          img.crossOrigin = \"anonymous\"\n          img.src = items[index] as string\n          img.onload = () => {\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\n\n            // Create circular clipping path\n            offCtx.beginPath()\n            offCtx.arc(20, 20, 20, 0, Math.PI * 2)\n            offCtx.closePath()\n            offCtx.clip()\n\n            // Draw the image\n            offCtx.drawImage(img, 0, 0, 40, 40)\n\n            imagesLoadedRef.current[index] = true\n          }\n        } else {\n          // Handle SVG icons\n          offCtx.scale(0.4, 0.4)\n          const svgString = renderToString(item as React.ReactElement)\n          const img = new Image()\n          img.src = \"data:image/svg+xml;base64,\" + btoa(svgString)\n          img.onload = () => {\n            offCtx.clearRect(0, 0, offscreen.width, offscreen.height)\n            offCtx.drawImage(img, 0, 0)\n            imagesLoadedRef.current[index] = true\n          }\n        }\n      }\n      return offscreen\n    })\n\n    iconCanvasesRef.current = newIconCanvases\n  }, [icons, images])\n\n  // Generate initial icon positions on a sphere\n  useEffect(() => {\n    const items = icons ?? images ?? []\n    const newIcons: Icon[] = []\n    const numIcons = items.length || 20\n\n    // Fibonacci sphere parameters\n    const offset = 2 / numIcons\n    const increment = Math.PI * (3 - Math.sqrt(5))\n\n    for (let i = 0; i < numIcons; i++) {\n      const y = i * offset - 1 + offset / 2\n      const r = Math.sqrt(1 - y * y)\n      const phi = i * increment\n\n      const x = Math.cos(phi) * r\n      const z = Math.sin(phi) * r\n\n      newIcons.push({\n        x: x * 100,\n        y: y * 100,\n        z: z * 100,\n        scale: 1,\n        opacity: 1,\n        id: i,\n      })\n    }\n    setIconPositions(newIcons)\n  }, [icons, images])\n\n  // Handle mouse events\n  const handleMouseDown = (e: React.MouseEvent<HTMLCanvasElement>) => {\n    const rect = canvasRef.current?.getBoundingClientRect()\n    if (!rect || !canvasRef.current) return\n\n    const x = e.clientX - rect.left\n    const y = e.clientY - rect.top\n\n    const ctx = canvasRef.current.getContext(\"2d\")\n    if (!ctx) return\n\n    iconPositions.forEach((icon) => {\n      const cosX = Math.cos(rotationRef.current.x)\n      const sinX = Math.sin(rotationRef.current.x)\n      const cosY = Math.cos(rotationRef.current.y)\n      const sinY = Math.sin(rotationRef.current.y)\n\n      const rotatedX = icon.x * cosY - icon.z * sinY\n      const rotatedZ = icon.x * sinY + icon.z * cosY\n      const rotatedY = icon.y * cosX + rotatedZ * sinX\n\n      const screenX = canvasRef.current!.width / 2 + rotatedX\n      const screenY = canvasRef.current!.height / 2 + rotatedY\n\n      const scale = (rotatedZ + 200) / 300\n      const radius = 20 * scale\n      const dx = x - screenX\n      const dy = y - screenY\n\n      if (dx * dx + dy * dy < radius * radius) {\n        const targetX = -Math.atan2(\n          icon.y,\n          Math.sqrt(icon.x * icon.x + icon.z * icon.z)\n        )\n        const targetY = Math.atan2(icon.x, icon.z)\n\n        const currentX = rotationRef.current.x\n        const currentY = rotationRef.current.y\n        const distance = Math.sqrt(\n          Math.pow(targetX - currentX, 2) + Math.pow(targetY - currentY, 2)\n        )\n\n        const duration = Math.min(2000, Math.max(800, distance * 1000))\n\n        setTargetRotation({\n          x: targetX,\n          y: targetY,\n          startX: currentX,\n          startY: currentY,\n          distance,\n          startTime: performance.now(),\n          duration,\n        })\n        return\n      }\n    })\n\n    setIsDragging(true)\n    setLastMousePos({ x: e.clientX, y: e.clientY })\n  }\n\n  const handleMouseMove = (e: React.MouseEvent<HTMLCanvasElement>) => {\n    const rect = canvasRef.current?.getBoundingClientRect()\n    if (rect) {\n      const x = e.clientX - rect.left\n      const y = e.clientY - rect.top\n      setMousePos({ x, y })\n    }\n\n    if (isDragging) {\n      const deltaX = e.clientX - lastMousePos.x\n      const deltaY = e.clientY - lastMousePos.y\n\n      rotationRef.current = {\n        x: rotationRef.current.x + deltaY * 0.002,\n        y: rotationRef.current.y + deltaX * 0.002,\n      }\n\n      setLastMousePos({ x: e.clientX, y: e.clientY })\n    }\n  }\n\n  const handleMouseUp = () => {\n    setIsDragging(false)\n  }\n\n  // Animation and rendering\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const ctx = canvas?.getContext(\"2d\")\n    if (canvas && ctx) {\n      const animate = () => {\n        ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n        const centerX = canvas.width / 2\n        const centerY = canvas.height / 2\n        const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY)\n        const dx = mousePos.x - centerX\n        const dy = mousePos.y - centerY\n        const distance = Math.sqrt(dx * dx + dy * dy)\n        const speed = 0.003 + (distance / maxDistance) * 0.01\n\n        if (targetRotation) {\n          const elapsed = performance.now() - targetRotation.startTime\n          const progress = Math.min(1, elapsed / targetRotation.duration)\n          const easedProgress = easeOutCubic(progress)\n\n          rotationRef.current = {\n            x:\n              targetRotation.startX +\n              (targetRotation.x - targetRotation.startX) * easedProgress,\n            y:\n              targetRotation.startY +\n              (targetRotation.y - targetRotation.startY) * easedProgress,\n          }\n\n          if (progress >= 1) {\n            setTargetRotation(null)\n          }\n        } else if (!isDragging) {\n          rotationRef.current = {\n            x: rotationRef.current.x + (dy / canvas.height) * speed,\n            y: rotationRef.current.y + (dx / canvas.width) * speed,\n          }\n        }\n\n        iconPositions.forEach((icon, index) => {\n          const cosX = Math.cos(rotationRef.current.x)\n          const sinX = Math.sin(rotationRef.current.x)\n          const cosY = Math.cos(rotationRef.current.y)\n          const sinY = Math.sin(rotationRef.current.y)\n\n          const rotatedX = icon.x * cosY - icon.z * sinY\n          const rotatedZ = icon.x * sinY + icon.z * cosY\n          const rotatedY = icon.y * cosX + rotatedZ * sinX\n\n          const scale = (rotatedZ + 200) / 300\n          const opacity = Math.max(0.2, Math.min(1, (rotatedZ + 150) / 200))\n\n          ctx.save()\n          ctx.translate(\n            canvas.width / 2 + rotatedX,\n            canvas.height / 2 + rotatedY\n          )\n          ctx.scale(scale, scale)\n          ctx.globalAlpha = opacity\n\n          if (icons || images) {\n            // Only try to render icons/images if they exist\n            if (\n              iconCanvasesRef.current[index] &&\n              imagesLoadedRef.current[index]\n            ) {\n              ctx.drawImage(iconCanvasesRef.current[index], -20, -20, 40, 40)\n            }\n          } else {\n            // Show numbered circles if no icons/images are provided\n            ctx.beginPath()\n            ctx.arc(0, 0, 20, 0, Math.PI * 2)\n            ctx.fillStyle = \"#4444ff\"\n            ctx.fill()\n            ctx.fillStyle = \"white\"\n            ctx.textAlign = \"center\"\n            ctx.textBaseline = \"middle\"\n            ctx.font = \"16px Arial\"\n            ctx.fillText(`${icon.id + 1}`, 0, 0)\n          }\n\n          ctx.restore()\n        })\n        animationFrameRef.current = requestAnimationFrame(animate)\n      }\n\n      animate()\n    }\n\n    return () => {\n      if (animationFrameRef.current) {\n        cancelAnimationFrame(animationFrameRef.current)\n      }\n    }\n  }, [icons, images, iconPositions, isDragging, mousePos, targetRotation])\n\n  return (\n    <canvas\n      ref={canvasRef}\n      width={400}\n      height={400}\n      onMouseDown={handleMouseDown}\n      onMouseMove={handleMouseMove}\n      onMouseUp={handleMouseUp}\n      onMouseLeave={handleMouseUp}\n      className=\"rounded-lg\"\n      aria-label=\"Interactive 3D Icon Cloud\"\n      role=\"img\"\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/interactive-grid-pattern.tsx",
    "content": "\"use client\"\n\nimport React, { useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * InteractiveGridPattern is a component that renders a grid pattern with interactive squares.\n *\n * @param width - The width of each square.\n * @param height - The height of each square.\n * @param squares - The number of squares in the grid. The first element is the number of horizontal squares, and the second element is the number of vertical squares.\n * @param className - The class name of the grid.\n * @param squaresClassName - The class name of the squares.\n */\ninterface InteractiveGridPatternProps extends React.SVGProps<SVGSVGElement> {\n  width?: number\n  height?: number\n  squares?: [number, number] // [horizontal, vertical]\n  className?: string\n  squaresClassName?: string\n}\n\n/**\n * The InteractiveGridPattern component.\n *\n * @see InteractiveGridPatternProps for the props interface.\n * @returns A React component.\n */\nexport function InteractiveGridPattern({\n  width = 40,\n  height = 40,\n  squares = [24, 24],\n  className,\n  squaresClassName,\n  ...props\n}: InteractiveGridPatternProps) {\n  const [horizontal, vertical] = squares\n  const [hoveredSquare, setHoveredSquare] = useState<number | null>(null)\n\n  return (\n    <svg\n      width={width * horizontal}\n      height={height * vertical}\n      className={cn(\n        \"absolute inset-0 h-full w-full border border-gray-400/30\",\n        className\n      )}\n      {...props}\n    >\n      {Array.from({ length: horizontal * vertical }).map((_, index) => {\n        const x = (index % horizontal) * width\n        const y = Math.floor(index / horizontal) * height\n        return (\n          <rect\n            key={index}\n            x={x}\n            y={y}\n            width={width}\n            height={height}\n            className={cn(\n              \"stroke-gray-400/30 transition-all duration-100 ease-in-out not-[&:hover]:duration-1000\",\n              hoveredSquare === index ? \"fill-gray-300/30\" : \"fill-transparent\",\n              squaresClassName\n            )}\n            onMouseEnter={() => setHoveredSquare(index)}\n            onMouseLeave={() => setHoveredSquare(null)}\n          />\n        )\n      })}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/interactive-hover-button.tsx",
    "content": "import { ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport function InteractiveHoverButton({\n  children,\n  className,\n  ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n  return (\n    <button\n      className={cn(\n        \"group bg-background relative w-auto cursor-pointer overflow-hidden rounded-full border p-2 px-6 text-center font-semibold\",\n        className\n      )}\n      {...props}\n    >\n      <div className=\"flex items-center justify-center gap-2\">\n        <div className=\"bg-primary h-2 w-2 rounded-full transition-all duration-300 group-hover:scale-[100.8]\"></div>\n        <span className=\"inline-block transition-all duration-300 group-hover:translate-x-12 group-hover:opacity-0\">\n          {children}\n        </span>\n      </div>\n      <div className=\"text-primary-foreground absolute top-0 z-10 flex h-full w-full translate-x-12 items-center justify-center gap-2 opacity-0 transition-all duration-300 group-hover:-translate-x-5 group-hover:opacity-100\">\n        <span>{children}</span>\n        <ArrowRight />\n      </div>\n    </button>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/iphone.tsx",
    "content": "import type { HTMLAttributes } from \"react\"\n\nconst PHONE_WIDTH = 433\nconst PHONE_HEIGHT = 882\nconst SCREEN_X = 21.25\nconst SCREEN_Y = 19.25\nconst SCREEN_WIDTH = 389.5\nconst SCREEN_HEIGHT = 843.5\nconst SCREEN_RADIUS = 55.75\n\n// Calculated percentages\nconst LEFT_PCT = (SCREEN_X / PHONE_WIDTH) * 100\nconst TOP_PCT = (SCREEN_Y / PHONE_HEIGHT) * 100\nconst WIDTH_PCT = (SCREEN_WIDTH / PHONE_WIDTH) * 100\nconst HEIGHT_PCT = (SCREEN_HEIGHT / PHONE_HEIGHT) * 100\nconst RADIUS_H = (SCREEN_RADIUS / SCREEN_WIDTH) * 100\nconst RADIUS_V = (SCREEN_RADIUS / SCREEN_HEIGHT) * 100\n\nexport interface IphoneProps extends HTMLAttributes<HTMLDivElement> {\n  src?: string\n  videoSrc?: string\n}\n\nexport function Iphone({\n  src,\n  videoSrc,\n  className,\n  style,\n  ...props\n}: IphoneProps) {\n  const hasVideo = !!videoSrc\n  const hasMedia = hasVideo || !!src\n\n  return (\n    <div\n      className={`relative inline-block w-full align-middle leading-none ${className}`}\n      style={{\n        aspectRatio: `${PHONE_WIDTH}/${PHONE_HEIGHT}`,\n        ...style,\n      }}\n      {...props}\n    >\n      {hasVideo && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\n          }}\n        >\n          <video\n            className=\"block size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n            preload=\"metadata\"\n          />\n        </div>\n      )}\n\n      {!hasVideo && src && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: `${RADIUS_H}% / ${RADIUS_V}%`,\n          }}\n        >\n          <img\n            src={src}\n            alt=\"\"\n            className=\"block size-full object-cover object-top\"\n          />\n        </div>\n      )}\n\n      <svg\n        viewBox={`0 0 ${PHONE_WIDTH} ${PHONE_HEIGHT}`}\n        fill=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"absolute inset-0 size-full\"\n        style={{ transform: \"translateZ(0)\" }}\n      >\n        <g mask={hasMedia ? \"url(#screenPunch)\" : undefined}>\n          <path\n            d=\"M2 73C2 32.6832 34.6832 0 75 0H357C397.317 0 430 32.6832 430 73V809C430 849.317 397.317 882 357 882H75C34.6832 882 2 849.317 2 809V73Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M0 171C0 170.448 0.447715 170 1 170H3V204H1C0.447715 204 0 203.552 0 203V171Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M1 234C1 233.448 1.44772 233 2 233H3.5V300H2C1.44772 300 1 299.552 1 299V234Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M1 319C1 318.448 1.44772 318 2 318H3.5V385H2C1.44772 385 1 384.552 1 384V319Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M430 279H432C432.552 279 433 279.448 433 280V384C433 384.552 432.552 385 432 385H430V279Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M6 74C6 35.3401 37.3401 4 76 4H356C394.66 4 426 35.3401 426 74V808C426 846.66 394.66 878 356 878H76C37.3401 878 6 846.66 6 808V74Z\"\n            className=\"fill-white dark:fill-[#262626]\"\n          />\n        </g>\n\n        <path\n          opacity=\"0.5\"\n          d=\"M174 5H258V5.5C258 6.60457 257.105 7.5 256 7.5H176C174.895 7.5 174 6.60457 174 5.5V5Z\"\n          className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n        />\n\n        <path\n          d={`M${SCREEN_X} 75C${SCREEN_X} 44.2101 46.2101 ${SCREEN_Y} 77 ${SCREEN_Y}H355C385.79 ${SCREEN_Y} 410.75 44.2101 410.75 75V807C410.75 837.79 385.79 862.75 355 862.75H77C46.2101 862.75 ${SCREEN_X} 837.79 ${SCREEN_X} 807V75Z`}\n          className=\"fill-[#E5E5E5] stroke-[#E5E5E5] stroke-[0.5] dark:fill-[#404040] dark:stroke-[#404040]\"\n          mask={hasMedia ? \"url(#screenPunch)\" : undefined}\n        />\n\n        <path\n          d=\"M154 48.5C154 38.2827 162.283 30 172.5 30H259.5C269.717 30 278 38.2827 278 48.5C278 58.7173 269.717 67 259.5 67H172.5C162.283 67 154 58.7173 154 48.5Z\"\n          className=\"fill-[#F5F5F5] dark:fill-[#262626]\"\n        />\n        <path\n          d=\"M249 48.5C249 42.701 253.701 38 259.5 38C265.299 38 270 42.701 270 48.5C270 54.299 265.299 59 259.5 59C253.701 59 249 54.299 249 48.5Z\"\n          className=\"fill-[#F5F5F5] dark:fill-[#262626]\"\n        />\n        <path\n          d=\"M254 48.5C254 45.4624 256.462 43 259.5 43C262.538 43 265 45.4624 265 48.5C265 51.5376 262.538 54 259.5 54C256.462 54 254 51.5376 254 48.5Z\"\n          className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n        />\n\n        <defs>\n          <mask id=\"screenPunch\" maskUnits=\"userSpaceOnUse\">\n            <rect\n              x=\"0\"\n              y=\"0\"\n              width={PHONE_WIDTH}\n              height={PHONE_HEIGHT}\n              fill=\"white\"\n            />\n            <rect\n              x={SCREEN_X}\n              y={SCREEN_Y}\n              width={SCREEN_WIDTH}\n              height={SCREEN_HEIGHT}\n              rx={SCREEN_RADIUS}\n              ry={SCREEN_RADIUS}\n              fill=\"black\"\n            />\n          </mask>\n          <clipPath id=\"roundedCorners\">\n            <rect\n              x={SCREEN_X}\n              y={SCREEN_Y}\n              width={SCREEN_WIDTH}\n              height={SCREEN_HEIGHT}\n              rx={SCREEN_RADIUS}\n              ry={SCREEN_RADIUS}\n            />\n          </clipPath>\n        </defs>\n      </svg>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/lens.tsx",
    "content": "\"use client\"\n\nimport React, { useCallback, useMemo, useRef, useState } from \"react\"\nimport { AnimatePresence, motion, useMotionTemplate } from \"motion/react\"\n\ninterface Position {\n  /** The x coordinate of the lens */\n  x: number\n  /** The y coordinate of the lens */\n  y: number\n}\n\ninterface LensProps {\n  /** The children of the lens */\n  children: React.ReactNode\n  /** The zoom factor of the lens */\n  zoomFactor?: number\n  /** The size of the lens */\n  lensSize?: number\n  /** The position of the lens */\n  position?: Position\n  /** The default position of the lens */\n  defaultPosition?: Position\n  /** Whether the lens is static */\n  isStatic?: boolean\n  /** The duration of the animation */\n  duration?: number\n  /** The color of the lens */\n  lensColor?: string\n  /** The aria label of the lens */\n  ariaLabel?: string\n}\n\nexport function Lens({\n  children,\n  zoomFactor = 1.3,\n  lensSize = 170,\n  isStatic = false,\n  position = { x: 0, y: 0 },\n  defaultPosition,\n  duration = 0.1,\n  lensColor = \"black\",\n  ariaLabel = \"Zoom Area\",\n}: LensProps) {\n  if (zoomFactor < 1) {\n    throw new Error(\"zoomFactor must be greater than 1\")\n  }\n  if (lensSize < 0) {\n    throw new Error(\"lensSize must be greater than 0\")\n  }\n\n  const [isHovering, setIsHovering] = useState(false)\n  const [mousePosition, setMousePosition] = useState<Position>(position)\n  const containerRef = useRef<HTMLDivElement>(null)\n\n  const currentPosition = useMemo(() => {\n    if (isStatic) return position\n    if (defaultPosition && !isHovering) return defaultPosition\n    return mousePosition\n  }, [isStatic, position, defaultPosition, isHovering, mousePosition])\n\n  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    const rect = e.currentTarget.getBoundingClientRect()\n    setMousePosition({\n      x: e.clientX - rect.left,\n      y: e.clientY - rect.top,\n    })\n  }, [])\n\n  const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n    if (e.key === \"Escape\") setIsHovering(false)\n  }, [])\n\n  const maskImage = useMotionTemplate`radial-gradient(circle ${\n    lensSize / 2\n  }px at ${currentPosition.x}px ${\n    currentPosition.y\n  }px, ${lensColor} 100%, transparent 100%)`\n\n  const LensContent = useMemo(() => {\n    const { x, y } = currentPosition\n\n    return (\n      <motion.div\n        initial={{ opacity: 0, scale: 0.58 }}\n        animate={{ opacity: 1, scale: 1 }}\n        exit={{ opacity: 0, scale: 0.8 }}\n        transition={{ duration }}\n        className=\"absolute inset-0 overflow-hidden\"\n        style={{\n          maskImage,\n          WebkitMaskImage: maskImage,\n          transformOrigin: `${x}px ${y}px`,\n          zIndex: 50,\n        }}\n      >\n        <div\n          className=\"absolute inset-0\"\n          style={{\n            transform: `scale(${zoomFactor})`,\n            transformOrigin: `${x}px ${y}px`,\n          }}\n        >\n          {children}\n        </div>\n      </motion.div>\n    )\n  }, [currentPosition, maskImage, zoomFactor, children, duration])\n\n  return (\n    <div\n      ref={containerRef}\n      className=\"relative z-20 overflow-hidden rounded-xl\"\n      onMouseEnter={() => setIsHovering(true)}\n      onMouseLeave={() => setIsHovering(false)}\n      onMouseMove={handleMouseMove}\n      onKeyDown={handleKeyDown}\n      role=\"region\"\n      aria-label={ariaLabel}\n      tabIndex={0}\n    >\n      {children}\n      {isStatic || defaultPosition ? (\n        LensContent\n      ) : (\n        <AnimatePresence mode=\"popLayout\">\n          {isHovering && LensContent}\n        </AnimatePresence>\n      )}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/light-rays.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState, type CSSProperties } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface LightRaysProps extends React.HTMLAttributes<HTMLDivElement> {\n  ref?: React.Ref<HTMLDivElement>\n  count?: number\n  color?: string\n  blur?: number\n  speed?: number\n  length?: string\n}\n\ntype LightRay = {\n  id: string\n  left: number\n  rotate: number\n  width: number\n  swing: number\n  delay: number\n  duration: number\n  intensity: number\n}\n\nconst createRays = (count: number, cycle: number): LightRay[] => {\n  if (count <= 0) return []\n\n  return Array.from({ length: count }, (_, index) => {\n    const left = 8 + Math.random() * 84\n    const rotate = -28 + Math.random() * 56\n    const width = 160 + Math.random() * 160\n    const swing = 0.8 + Math.random() * 1.8\n    const delay = Math.random() * cycle\n    const duration = cycle * (0.75 + Math.random() * 0.5)\n    const intensity = 0.6 + Math.random() * 0.5\n\n    return {\n      id: `${index}-${Math.round(left * 10)}`,\n      left,\n      rotate,\n      width,\n      swing,\n      delay,\n      duration,\n      intensity,\n    }\n  })\n}\n\nconst Ray = ({\n  left,\n  rotate,\n  width,\n  swing,\n  delay,\n  duration,\n  intensity,\n}: LightRay) => {\n  return (\n    <motion.div\n      className=\"pointer-events-none absolute -top-[12%] left-[var(--ray-left)] h-[var(--light-rays-length)] w-[var(--ray-width)] origin-top -translate-x-1/2 rounded-full bg-linear-to-b from-[color-mix(in_srgb,var(--light-rays-color)_70%,transparent)] to-transparent opacity-0 mix-blend-screen blur-[var(--light-rays-blur)]\"\n      style={\n        {\n          \"--ray-left\": `${left}%`,\n          \"--ray-width\": `${width}px`,\n        } as CSSProperties\n      }\n      initial={{ rotate: rotate }}\n      animate={{\n        opacity: [0, intensity, 0],\n        rotate: [rotate - swing, rotate + swing, rotate - swing],\n      }}\n      transition={{\n        duration: duration,\n        repeat: Infinity,\n        ease: \"easeInOut\",\n        delay: delay,\n        repeatDelay: duration * 0.1,\n      }}\n    />\n  )\n}\n\nexport function LightRays({\n  className,\n  style,\n  count = 7,\n  color = \"rgba(160, 210, 255, 0.2)\",\n  blur = 36,\n  speed = 14,\n  length = \"70vh\",\n  ref,\n  ...props\n}: LightRaysProps) {\n  const [rays, setRays] = useState<LightRay[]>([])\n  const cycleDuration = Math.max(speed, 0.1)\n\n  useEffect(() => {\n    setRays(createRays(count, cycleDuration))\n  }, [count, cycleDuration])\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"pointer-events-none absolute inset-0 isolate overflow-hidden rounded-[inherit]\",\n        className\n      )}\n      style={\n        {\n          \"--light-rays-color\": color,\n          \"--light-rays-blur\": `${blur}px`,\n          \"--light-rays-length\": length,\n          ...style,\n        } as CSSProperties\n      }\n      {...props}\n    >\n      <div className=\"absolute inset-0 overflow-hidden\">\n        <div\n          aria-hidden\n          className=\"absolute inset-0 opacity-60\"\n          style={\n            {\n              background:\n                \"radial-gradient(circle at 20% 15%, color-mix(in srgb, var(--light-rays-color) 45%, transparent), transparent 70%)\",\n            } as CSSProperties\n          }\n        />\n        <div\n          aria-hidden\n          className=\"absolute inset-0 opacity-60\"\n          style={\n            {\n              background:\n                \"radial-gradient(circle at 80% 10%, color-mix(in srgb, var(--light-rays-color) 35%, transparent), transparent 75%)\",\n            } as CSSProperties\n          }\n        />\n        {rays.map((ray) => (\n          <Ray key={ray.id} {...ray} />\n        ))}\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/line-shadow-text.tsx",
    "content": "\"use client\"\n\nimport { type CSSProperties, type HTMLAttributes } from \"react\"\nimport {\n  motion,\n  type DOMMotionComponents,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\n\ninterface LineShadowTextProps\n  extends Omit<HTMLAttributes<HTMLElement>, keyof MotionProps>, MotionProps {\n  children: string\n  shadowColor?: string\n  as?: MotionElementType\n}\n\nexport function LineShadowText({\n  children,\n  shadowColor = \"black\",\n  className,\n  as: Component = \"span\",\n  ...props\n}: LineShadowTextProps) {\n  const MotionComponent = motionElements[Component]\n\n  return (\n    <MotionComponent\n      style={{ \"--shadow-color\": shadowColor } as CSSProperties}\n      className={cn(\n        \"relative z-0 inline-flex\",\n        \"after:absolute after:top-[0.04em] after:left-[0.04em] after:content-[attr(data-text)]\",\n        \"after:bg-[linear-gradient(45deg,transparent_45%,var(--shadow-color)_45%,var(--shadow-color)_55%,transparent_0)]\",\n        \"after:-z-10 after:bg-size-[0.06em_0.06em] after:bg-clip-text after:text-transparent\",\n        \"after:animate-line-shadow\",\n        className\n      )}\n      data-text={children}\n      {...props}\n    >\n      {children}\n    </MotionComponent>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/magic-card.tsx",
    "content": "\"use client\"\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n  motion,\n  useMotionTemplate,\n  useMotionValue,\n  useSpring,\n} from \"motion/react\"\nimport { useTheme } from \"next-themes\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MagicCardBaseProps {\n  children?: React.ReactNode\n  className?: string\n  gradientSize?: number\n  gradientFrom?: string\n  gradientTo?: string\n}\n\ninterface MagicCardGradientProps extends MagicCardBaseProps {\n  mode?: \"gradient\"\n\n  gradientColor?: string\n  gradientOpacity?: number\n\n  glowFrom?: never\n  glowTo?: never\n  glowAngle?: never\n  glowSize?: never\n  glowBlur?: never\n  glowOpacity?: never\n}\n\ninterface MagicCardOrbProps extends MagicCardBaseProps {\n  mode: \"orb\"\n\n  glowFrom?: string\n  glowTo?: string\n  glowAngle?: number\n  glowSize?: number\n  glowBlur?: number\n  glowOpacity?: number\n\n  gradientColor?: never\n  gradientOpacity?: never\n}\n\ntype MagicCardProps = MagicCardGradientProps | MagicCardOrbProps\ntype ResetReason = \"enter\" | \"leave\" | \"global\" | \"init\"\n\nfunction isOrbMode(props: MagicCardProps): props is MagicCardOrbProps {\n  return props.mode === \"orb\"\n}\n\nexport function MagicCard(props: MagicCardProps) {\n  const {\n    children,\n    className,\n    gradientSize = 200,\n    gradientColor = \"#262626\",\n    gradientOpacity = 0.8,\n    gradientFrom = \"#9E7AFF\",\n    gradientTo = \"#FE8BBB\",\n    mode = \"gradient\",\n  } = props\n\n  const glowFrom = isOrbMode(props) ? (props.glowFrom ?? \"#ee4f27\") : \"#ee4f27\"\n  const glowTo = isOrbMode(props) ? (props.glowTo ?? \"#6b21ef\") : \"#6b21ef\"\n  const glowAngle = isOrbMode(props) ? (props.glowAngle ?? 90) : 90\n  const glowSize = isOrbMode(props) ? (props.glowSize ?? 420) : 420\n  const glowBlur = isOrbMode(props) ? (props.glowBlur ?? 60) : 60\n  const glowOpacity = isOrbMode(props) ? (props.glowOpacity ?? 0.9) : 0.9\n  const { theme, systemTheme } = useTheme()\n  const [mounted, setMounted] = useState(false)\n\n  useEffect(() => setMounted(true), [])\n\n  const isDarkTheme = useMemo(() => {\n    if (!mounted) return true\n    const currentTheme = theme === \"system\" ? systemTheme : theme\n    return currentTheme === \"dark\"\n  }, [theme, systemTheme, mounted])\n\n  const mouseX = useMotionValue(-gradientSize)\n  const mouseY = useMotionValue(-gradientSize)\n\n  const orbX = useSpring(mouseX, { stiffness: 250, damping: 30, mass: 0.6 })\n  const orbY = useSpring(mouseY, { stiffness: 250, damping: 30, mass: 0.6 })\n  const orbVisible = useSpring(0, { stiffness: 300, damping: 35 })\n\n  const modeRef = useRef(mode)\n  const glowOpacityRef = useRef(glowOpacity)\n  const gradientSizeRef = useRef(gradientSize)\n\n  useEffect(() => {\n    modeRef.current = mode\n  }, [mode])\n\n  useEffect(() => {\n    glowOpacityRef.current = glowOpacity\n  }, [glowOpacity])\n\n  useEffect(() => {\n    gradientSizeRef.current = gradientSize\n  }, [gradientSize])\n\n  const reset = useCallback(\n    (reason: ResetReason = \"leave\") => {\n      const currentMode = modeRef.current\n\n      if (currentMode === \"orb\") {\n        if (reason === \"enter\") orbVisible.set(glowOpacityRef.current)\n        else orbVisible.set(0)\n        return\n      }\n\n      const off = -gradientSizeRef.current\n      mouseX.set(off)\n      mouseY.set(off)\n    },\n    [mouseX, mouseY, orbVisible]\n  )\n\n  const handlePointerMove = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      const rect = e.currentTarget.getBoundingClientRect()\n      mouseX.set(e.clientX - rect.left)\n      mouseY.set(e.clientY - rect.top)\n    },\n    [mouseX, mouseY]\n  )\n\n  useEffect(() => {\n    reset(\"init\")\n  }, [reset])\n\n  useEffect(() => {\n    const handleGlobalPointerOut = (e: PointerEvent) => {\n      if (!e.relatedTarget) reset(\"global\")\n    }\n    const handleBlur = () => reset(\"global\")\n    const handleVisibility = () => {\n      if (document.visibilityState !== \"visible\") reset(\"global\")\n    }\n\n    window.addEventListener(\"pointerout\", handleGlobalPointerOut)\n    window.addEventListener(\"blur\", handleBlur)\n    document.addEventListener(\"visibilitychange\", handleVisibility)\n\n    return () => {\n      window.removeEventListener(\"pointerout\", handleGlobalPointerOut)\n      window.removeEventListener(\"blur\", handleBlur)\n      document.removeEventListener(\"visibilitychange\", handleVisibility)\n    }\n  }, [reset])\n\n  return (\n    <motion.div\n      className={cn(\n        \"group relative isolate overflow-hidden rounded-[inherit] border border-transparent\",\n        className\n      )}\n      onPointerMove={handlePointerMove}\n      onPointerLeave={() => reset(\"leave\")}\n      onPointerEnter={() => reset(\"enter\")}\n      style={{\n        background: useMotionTemplate`\n          linear-gradient(var(--color-background) 0 0) padding-box,\n          radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\n            ${gradientFrom},\n            ${gradientTo},\n            var(--color-border) 100%\n          ) border-box\n        `,\n      }}\n    >\n      <div className=\"bg-background absolute inset-px z-20 rounded-[inherit]\" />\n\n      {mode === \"gradient\" && (\n        <motion.div\n          suppressHydrationWarning\n          className=\"pointer-events-none absolute inset-px z-30 rounded-[inherit] opacity-0 transition-opacity duration-300 group-hover:opacity-100\"\n          style={{\n            background: useMotionTemplate`\n              radial-gradient(${gradientSize}px circle at ${mouseX}px ${mouseY}px,\n                ${gradientColor},\n                transparent 100%\n              )\n            `,\n            opacity: gradientOpacity,\n          }}\n        />\n      )}\n\n      {mode === \"orb\" && (\n        <motion.div\n          suppressHydrationWarning\n          aria-hidden=\"true\"\n          className=\"pointer-events-none absolute z-30\"\n          style={{\n            width: glowSize,\n            height: glowSize,\n            x: orbX,\n            y: orbY,\n            translateX: \"-50%\",\n            translateY: \"-50%\",\n            borderRadius: 9999,\n            filter: `blur(${glowBlur}px)`,\n            opacity: orbVisible,\n            background: `linear-gradient(${glowAngle}deg, ${glowFrom}, ${glowTo})`,\n\n            mixBlendMode: isDarkTheme ? \"screen\" : \"multiply\",\n            willChange: \"transform, opacity\",\n          }}\n        />\n      )}\n      <div className=\"relative z-40\">{children}</div>\n    </motion.div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/marquee.tsx",
    "content": "import { type ComponentPropsWithoutRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MarqueeProps extends ComponentPropsWithoutRef<\"div\"> {\n  /**\n   * Optional CSS class name to apply custom styles\n   */\n  className?: string\n  /**\n   * Whether to reverse the animation direction\n   * @default false\n   */\n  reverse?: boolean\n  /**\n   * Whether to pause the animation on hover\n   * @default false\n   */\n  pauseOnHover?: boolean\n  /**\n   * Content to be displayed in the marquee\n   */\n  children: React.ReactNode\n  /**\n   * Whether to animate vertically instead of horizontally\n   * @default false\n   */\n  vertical?: boolean\n  /**\n   * Number of times to repeat the content\n   * @default 4\n   */\n  repeat?: number\n}\n\nexport function Marquee({\n  className,\n  reverse = false,\n  pauseOnHover = false,\n  children,\n  vertical = false,\n  repeat = 4,\n  ...props\n}: MarqueeProps) {\n  return (\n    <div\n      {...props}\n      className={cn(\n        \"group flex gap-(--gap) overflow-hidden p-2 [--duration:40s] [--gap:1rem]\",\n        {\n          \"flex-row\": !vertical,\n          \"flex-col\": vertical,\n        },\n        className\n      )}\n    >\n      {Array(repeat)\n        .fill(0)\n        .map((_, i) => (\n          <div\n            key={i}\n            className={cn(\"flex shrink-0 justify-around gap-(--gap)\", {\n              \"animate-marquee flex-row\": !vertical,\n              \"animate-marquee-vertical flex-col\": vertical,\n              \"group-hover:[animation-play-state:paused]\": pauseOnHover,\n              \"[animation-direction:reverse]\": reverse,\n            })}\n          >\n            {children}\n          </div>\n        ))}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/meteors.tsx",
    "content": "\"use client\"\n\nimport React, { useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MeteorsProps {\n  number?: number\n  minDelay?: number\n  maxDelay?: number\n  minDuration?: number\n  maxDuration?: number\n  angle?: number\n  className?: string\n}\n\nexport const Meteors = ({\n  number = 20,\n  minDelay = 0.2,\n  maxDelay = 1.2,\n  minDuration = 2,\n  maxDuration = 10,\n  angle = 215,\n  className,\n}: MeteorsProps) => {\n  const [meteorStyles, setMeteorStyles] = useState<Array<React.CSSProperties>>(\n    []\n  )\n\n  useEffect(() => {\n    const styles = [...new Array(number)].map(() => ({\n      \"--angle\": -angle + \"deg\",\n      top: \"-5%\",\n      left: `calc(0% + ${Math.floor(Math.random() * window.innerWidth)}px)`,\n      animationDelay: Math.random() * (maxDelay - minDelay) + minDelay + \"s\",\n      animationDuration:\n        Math.floor(Math.random() * (maxDuration - minDuration) + minDuration) +\n        \"s\",\n    }))\n    setMeteorStyles(styles)\n  }, [number, minDelay, maxDelay, minDuration, maxDuration, angle])\n\n  return (\n    <>\n      {[...meteorStyles].map((style, idx) => (\n        // Meteor Head\n        <span\n          key={idx}\n          style={{ ...style }}\n          className={cn(\n            \"animate-meteor pointer-events-none absolute size-0.5 rotate-(--angle) rounded-full bg-zinc-500 shadow-[0_0_0_1px_#ffffff10]\",\n            className\n          )}\n        >\n          {/* Meteor Tail */}\n          <div className=\"pointer-events-none absolute top-1/2 -z-10 h-px w-12.5 -translate-y-1/2 bg-linear-to-r from-zinc-500 to-transparent\" />\n        </span>\n      ))}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/morphing-text.tsx",
    "content": "\"use client\"\n\nimport { useCallback, useEffect, useRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst morphTime = 1.5\nconst cooldownTime = 0.5\n\nconst useMorphingText = (texts: string[]) => {\n  const textIndexRef = useRef(0)\n  const morphRef = useRef(0)\n  const cooldownRef = useRef(0)\n  const timeRef = useRef(new Date())\n\n  const text1Ref = useRef<HTMLSpanElement>(null)\n  const text2Ref = useRef<HTMLSpanElement>(null)\n\n  const setStyles = useCallback(\n    (fraction: number) => {\n      const [current1, current2] = [text1Ref.current, text2Ref.current]\n      if (!current1 || !current2) return\n\n      current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`\n      current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`\n\n      const invertedFraction = 1 - fraction\n      current1.style.filter = `blur(${Math.min(\n        8 / invertedFraction - 8,\n        100\n      )}px)`\n      current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`\n\n      current1.textContent = texts[textIndexRef.current % texts.length]\n      current2.textContent = texts[(textIndexRef.current + 1) % texts.length]\n    },\n    [texts]\n  )\n\n  const doMorph = useCallback(() => {\n    morphRef.current -= cooldownRef.current\n    cooldownRef.current = 0\n\n    let fraction = morphRef.current / morphTime\n\n    if (fraction > 1) {\n      cooldownRef.current = cooldownTime\n      fraction = 1\n    }\n\n    setStyles(fraction)\n\n    if (fraction === 1) {\n      textIndexRef.current++\n    }\n  }, [setStyles])\n\n  const doCooldown = useCallback(() => {\n    morphRef.current = 0\n    const [current1, current2] = [text1Ref.current, text2Ref.current]\n    if (current1 && current2) {\n      current2.style.filter = \"none\"\n      current2.style.opacity = \"100%\"\n      current1.style.filter = \"none\"\n      current1.style.opacity = \"0%\"\n    }\n  }, [])\n\n  useEffect(() => {\n    let animationFrameId: number\n\n    const animate = () => {\n      animationFrameId = requestAnimationFrame(animate)\n\n      const newTime = new Date()\n      const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000\n      timeRef.current = newTime\n\n      cooldownRef.current -= dt\n\n      if (cooldownRef.current <= 0) doMorph()\n      else doCooldown()\n    }\n\n    animate()\n    return () => {\n      cancelAnimationFrame(animationFrameId)\n    }\n  }, [doMorph, doCooldown])\n\n  return { text1Ref, text2Ref }\n}\n\ninterface MorphingTextProps {\n  className?: string\n  texts: string[]\n}\n\nconst Texts: React.FC<Pick<MorphingTextProps, \"texts\">> = ({ texts }) => {\n  const { text1Ref, text2Ref } = useMorphingText(texts)\n  return (\n    <>\n      <span\n        className=\"absolute inset-x-0 top-0 m-auto inline-block w-full\"\n        ref={text1Ref}\n      />\n      <span\n        className=\"absolute inset-x-0 top-0 m-auto inline-block w-full\"\n        ref={text2Ref}\n      />\n    </>\n  )\n}\n\nconst SvgFilters: React.FC = () => (\n  <svg\n    id=\"filters\"\n    className=\"fixed h-0 w-0\"\n    preserveAspectRatio=\"xMidYMid slice\"\n  >\n    <defs>\n      <filter id=\"threshold\">\n        <feColorMatrix\n          in=\"SourceGraphic\"\n          type=\"matrix\"\n          values=\"1 0 0 0 0\n                  0 1 0 0 0\n                  0 0 1 0 0\n                  0 0 0 255 -140\"\n        />\n      </filter>\n    </defs>\n  </svg>\n)\n\nexport const MorphingText: React.FC<MorphingTextProps> = ({\n  texts,\n  className,\n}) => (\n  <div\n    className={cn(\n      \"relative mx-auto h-16 w-full max-w-3xl text-center font-sans text-[40pt] leading-none font-bold filter-[url(#threshold)_blur(0.6px)] md:h-24 lg:text-[6rem]\",\n      className\n    )}\n  >\n    <Texts texts={texts} />\n    <SvgFilters />\n  </div>\n)\n"
  },
  {
    "path": "apps/www/registry/magicui/neon-gradient-card.tsx",
    "content": "\"use client\"\n\nimport {\n  CSSProperties,\n  ReactElement,\n  ReactNode,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface NeonColorsProps {\n  firstColor: string\n  secondColor: string\n}\n\ninterface NeonGradientCardProps extends React.HTMLAttributes<HTMLDivElement> {\n  /**\n   * @default <div />\n   * @type ReactElement\n   * @description\n   * The component to be rendered as the card\n   * */\n  as?: ReactElement\n  /**\n   * @default \"\"\n   * @type string\n   * @description\n   * The className of the card\n   */\n  className?: string\n\n  /**\n   * @default \"\"\n   * @type ReactNode\n   * @description\n   * The children of the card\n   * */\n  children?: ReactNode\n\n  /**\n   * @default 5\n   * @type number\n   * @description\n   * The size of the border in pixels\n   * */\n  borderSize?: number\n\n  /**\n   * @default 20\n   * @type number\n   * @description\n   * The size of the radius in pixels\n   * */\n  borderRadius?: number\n\n  /**\n   * @default \"{ firstColor: '#ff00aa', secondColor: '#00FFF1' }\"\n   * @type string\n   * @description\n   * The colors of the neon gradient\n   * */\n  neonColors?: NeonColorsProps\n}\n\nexport const NeonGradientCard: React.FC<NeonGradientCardProps> = ({\n  className,\n  children,\n  borderSize = 2,\n  borderRadius = 20,\n  neonColors = {\n    firstColor: \"#ff00aa\",\n    secondColor: \"#00FFF1\",\n  },\n  ...props\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n  useEffect(() => {\n    const updateDimensions = () => {\n      if (containerRef.current) {\n        const { offsetWidth, offsetHeight } = containerRef.current\n        setDimensions({ width: offsetWidth, height: offsetHeight })\n      }\n    }\n\n    updateDimensions()\n    window.addEventListener(\"resize\", updateDimensions)\n\n    return () => {\n      window.removeEventListener(\"resize\", updateDimensions)\n    }\n  }, [])\n\n  useEffect(() => {\n    if (containerRef.current) {\n      const { offsetWidth, offsetHeight } = containerRef.current\n      setDimensions({ width: offsetWidth, height: offsetHeight })\n    }\n  }, [children])\n\n  return (\n    <div\n      ref={containerRef}\n      style={\n        {\n          \"--border-size\": `${borderSize}px`,\n          \"--border-radius\": `${borderRadius}px`,\n          \"--neon-first-color\": neonColors.firstColor,\n          \"--neon-second-color\": neonColors.secondColor,\n          \"--card-width\": `${dimensions.width}px`,\n          \"--card-height\": `${dimensions.height}px`,\n          \"--card-content-radius\": `${borderRadius - borderSize}px`,\n          \"--pseudo-element-background-image\": `linear-gradient(0deg, ${neonColors.firstColor}, ${neonColors.secondColor})`,\n          \"--pseudo-element-width\": `${dimensions.width + borderSize * 2}px`,\n          \"--pseudo-element-height\": `${dimensions.height + borderSize * 2}px`,\n          \"--after-blur\": `${dimensions.width / 3}px`,\n        } as CSSProperties\n      }\n      className={cn(\n        \"relative z-10 size-full rounded-(--border-radius)\",\n        className\n      )}\n      {...props}\n    >\n      <div\n        className={cn(\n          \"relative size-full min-h-[inherit] rounded-(--card-content-radius) bg-gray-100 p-6\",\n          \"before:absolute before:-top-(--border-size) before:-left-(--border-size) before:-z-10 before:block\",\n          \"before:h-(--pseudo-element-height) before:w-(--pseudo-element-width) before:rounded-(--border-radius) before:content-['']\",\n          \"before:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] before:bg-size-[100%_200%]\",\n          \"before:animate-background-position-spin\",\n          \"after:absolute after:-top-(--border-size) after:-left-(--border-size) after:-z-10 after:block\",\n          \"after:h-(--pseudo-element-height) after:w-(--pseudo-element-width) after:rounded-(--border-radius) after:blur-(--after-blur) after:content-['']\",\n          \"after:bg-[linear-gradient(0deg,var(--neon-first-color),var(--neon-second-color))] after:bg-size-[100%_200%] after:opacity-80\",\n          \"after:animate-background-position-spin\",\n          \"dark:bg-neutral-900\",\n          \"wrap-break-word\"\n        )}\n      >\n        {children}\n      </div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/number-ticker.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useRef, type ComponentPropsWithoutRef } from \"react\"\nimport { useInView, useMotionValue, useSpring } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface NumberTickerProps extends ComponentPropsWithoutRef<\"span\"> {\n  value: number\n  startValue?: number\n  direction?: \"up\" | \"down\"\n  delay?: number\n  decimalPlaces?: number\n}\n\nexport function NumberTicker({\n  value,\n  startValue = 0,\n  direction = \"up\",\n  delay = 0,\n  className,\n  decimalPlaces = 0,\n  ...props\n}: NumberTickerProps) {\n  const ref = useRef<HTMLSpanElement>(null)\n  const motionValue = useMotionValue(direction === \"down\" ? value : startValue)\n  const springValue = useSpring(motionValue, {\n    damping: 60,\n    stiffness: 100,\n  })\n  const isInView = useInView(ref, { once: true, margin: \"0px\" })\n\n  useEffect(() => {\n    let timer: ReturnType<typeof setTimeout> | null = null\n\n    if (isInView) {\n      timer = setTimeout(() => {\n        motionValue.set(direction === \"down\" ? startValue : value)\n      }, delay * 1000)\n    }\n\n    return () => {\n      if (timer !== null) {\n        clearTimeout(timer)\n      }\n    }\n  }, [motionValue, isInView, delay, value, direction, startValue])\n\n  useEffect(\n    () =>\n      springValue.on(\"change\", (latest) => {\n        if (ref.current) {\n          ref.current.textContent = Intl.NumberFormat(\"en-US\", {\n            minimumFractionDigits: decimalPlaces,\n            maximumFractionDigits: decimalPlaces,\n          }).format(Number(latest.toFixed(decimalPlaces)))\n        }\n      }),\n    [springValue, decimalPlaces]\n  )\n\n  return (\n    <span\n      ref={ref}\n      className={cn(\n        \"inline-block tracking-wider text-black tabular-nums dark:text-white\",\n        className\n      )}\n      {...props}\n    >\n      {startValue}\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/orbiting-circles.tsx",
    "content": "import React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface OrbitingCirclesProps extends React.HTMLAttributes<HTMLDivElement> {\n  className?: string\n  children?: React.ReactNode\n  reverse?: boolean\n  duration?: number\n  delay?: number\n  radius?: number\n  path?: boolean\n  iconSize?: number\n  speed?: number\n}\n\nexport function OrbitingCircles({\n  className,\n  children,\n  reverse,\n  duration = 20,\n  radius = 160,\n  path = true,\n  iconSize = 30,\n  speed = 1,\n  ...props\n}: OrbitingCirclesProps) {\n  const calculatedDuration = duration / speed\n  return (\n    <>\n      {path && (\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          version=\"1.1\"\n          className=\"pointer-events-none absolute inset-0 size-full\"\n        >\n          <circle\n            className=\"stroke-black/10 stroke-1 dark:stroke-white/10\"\n            cx=\"50%\"\n            cy=\"50%\"\n            r={radius}\n            fill=\"none\"\n          />\n        </svg>\n      )}\n      {React.Children.map(children, (child, index) => {\n        const angle = (360 / React.Children.count(children)) * index\n        return (\n          <div\n            style={\n              {\n                \"--duration\": calculatedDuration,\n                \"--radius\": radius,\n                \"--angle\": angle,\n                \"--icon-size\": `${iconSize}px`,\n              } as React.CSSProperties\n            }\n            className={cn(\n              `animate-orbit absolute flex size-(--icon-size) transform-gpu items-center justify-center rounded-full`,\n              { \"[animation-direction:reverse]\": reverse },\n              className\n            )}\n            {...props}\n          >\n            {child}\n          </div>\n        )\n      })}\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/particles.tsx",
    "content": "\"use client\"\n\nimport React, {\n  useEffect,\n  useRef,\n  useState,\n  type ComponentPropsWithoutRef,\n} from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface MousePosition {\n  x: number\n  y: number\n}\n\nfunction MousePosition(): MousePosition {\n  const [mousePosition, setMousePosition] = useState<MousePosition>({\n    x: 0,\n    y: 0,\n  })\n\n  useEffect(() => {\n    const handleMouseMove = (event: MouseEvent) => {\n      setMousePosition({ x: event.clientX, y: event.clientY })\n    }\n\n    window.addEventListener(\"mousemove\", handleMouseMove)\n\n    return () => {\n      window.removeEventListener(\"mousemove\", handleMouseMove)\n    }\n  }, [])\n\n  return mousePosition\n}\n\ninterface ParticlesProps extends ComponentPropsWithoutRef<\"div\"> {\n  className?: string\n  quantity?: number\n  staticity?: number\n  ease?: number\n  size?: number\n  refresh?: boolean\n  color?: string\n  vx?: number\n  vy?: number\n}\n\nfunction hexToRgb(hex: string): number[] {\n  hex = hex.replace(\"#\", \"\")\n\n  if (hex.length === 3) {\n    hex = hex\n      .split(\"\")\n      .map((char) => char + char)\n      .join(\"\")\n  }\n\n  const hexInt = parseInt(hex, 16)\n  const red = (hexInt >> 16) & 255\n  const green = (hexInt >> 8) & 255\n  const blue = hexInt & 255\n  return [red, green, blue]\n}\n\ntype Circle = {\n  x: number\n  y: number\n  translateX: number\n  translateY: number\n  size: number\n  alpha: number\n  targetAlpha: number\n  dx: number\n  dy: number\n  magnetism: number\n}\n\nexport const Particles: React.FC<ParticlesProps> = ({\n  className = \"\",\n  quantity = 100,\n  staticity = 50,\n  ease = 50,\n  size = 0.4,\n  refresh = false,\n  color = \"#ffffff\",\n  vx = 0,\n  vy = 0,\n  ...props\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const canvasContainerRef = useRef<HTMLDivElement>(null)\n  const context = useRef<CanvasRenderingContext2D | null>(null)\n  const circles = useRef<Circle[]>([])\n  const mousePosition = MousePosition()\n  const mouse = useRef<{ x: number; y: number }>({ x: 0, y: 0 })\n  const canvasSize = useRef<{ w: number; h: number }>({ w: 0, h: 0 })\n  const dpr = typeof window !== \"undefined\" ? window.devicePixelRatio : 1\n  const rafID = useRef<number | null>(null)\n  const resizeTimeout = useRef<NodeJS.Timeout | null>(null)\n  const initCanvasRef = useRef<() => void>(() => {})\n  const onMouseMoveRef = useRef<() => void>(() => {})\n  const animateRef = useRef<() => void>(() => {})\n\n  useEffect(() => {\n    if (canvasRef.current) {\n      context.current = canvasRef.current.getContext(\"2d\")\n    }\n    initCanvasRef.current()\n    animateRef.current()\n\n    const handleResize = () => {\n      if (resizeTimeout.current) {\n        clearTimeout(resizeTimeout.current)\n      }\n      resizeTimeout.current = setTimeout(() => {\n        initCanvasRef.current()\n      }, 200)\n    }\n\n    window.addEventListener(\"resize\", handleResize)\n\n    return () => {\n      if (rafID.current != null) {\n        window.cancelAnimationFrame(rafID.current)\n      }\n      if (resizeTimeout.current) {\n        clearTimeout(resizeTimeout.current)\n      }\n      window.removeEventListener(\"resize\", handleResize)\n    }\n  }, [color])\n\n  useEffect(() => {\n    onMouseMoveRef.current()\n  }, [mousePosition.x, mousePosition.y])\n\n  useEffect(() => {\n    initCanvasRef.current()\n  }, [refresh])\n\n  const initCanvas = () => {\n    resizeCanvas()\n    drawParticles()\n  }\n\n  const onMouseMove = () => {\n    if (canvasRef.current) {\n      const rect = canvasRef.current.getBoundingClientRect()\n      const { w, h } = canvasSize.current\n      const x = mousePosition.x - rect.left - w / 2\n      const y = mousePosition.y - rect.top - h / 2\n      const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2\n      if (inside) {\n        mouse.current.x = x\n        mouse.current.y = y\n      }\n    }\n  }\n\n  const resizeCanvas = () => {\n    if (canvasContainerRef.current && canvasRef.current && context.current) {\n      canvasSize.current.w = canvasContainerRef.current.offsetWidth\n      canvasSize.current.h = canvasContainerRef.current.offsetHeight\n\n      canvasRef.current.width = canvasSize.current.w * dpr\n      canvasRef.current.height = canvasSize.current.h * dpr\n      canvasRef.current.style.width = `${canvasSize.current.w}px`\n      canvasRef.current.style.height = `${canvasSize.current.h}px`\n      context.current.scale(dpr, dpr)\n\n      // Clear existing particles and create new ones with exact quantity\n      circles.current = []\n      for (let i = 0; i < quantity; i++) {\n        const circle = circleParams()\n        drawCircle(circle)\n      }\n    }\n  }\n\n  const circleParams = (): Circle => {\n    const x = Math.floor(Math.random() * canvasSize.current.w)\n    const y = Math.floor(Math.random() * canvasSize.current.h)\n    const translateX = 0\n    const translateY = 0\n    const pSize = Math.floor(Math.random() * 2) + size\n    const alpha = 0\n    const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1))\n    const dx = (Math.random() - 0.5) * 0.1\n    const dy = (Math.random() - 0.5) * 0.1\n    const magnetism = 0.1 + Math.random() * 4\n    return {\n      x,\n      y,\n      translateX,\n      translateY,\n      size: pSize,\n      alpha,\n      targetAlpha,\n      dx,\n      dy,\n      magnetism,\n    }\n  }\n\n  const rgb = hexToRgb(color)\n\n  const drawCircle = (circle: Circle, update = false) => {\n    if (context.current) {\n      const { x, y, translateX, translateY, size, alpha } = circle\n      context.current.translate(translateX, translateY)\n      context.current.beginPath()\n      context.current.arc(x, y, size, 0, 2 * Math.PI)\n      context.current.fillStyle = `rgba(${rgb.join(\", \")}, ${alpha})`\n      context.current.fill()\n      context.current.setTransform(dpr, 0, 0, dpr, 0, 0)\n\n      if (!update) {\n        circles.current.push(circle)\n      }\n    }\n  }\n\n  const clearContext = () => {\n    if (context.current) {\n      context.current.clearRect(\n        0,\n        0,\n        canvasSize.current.w,\n        canvasSize.current.h\n      )\n    }\n  }\n\n  const drawParticles = () => {\n    clearContext()\n    const particleCount = quantity\n    for (let i = 0; i < particleCount; i++) {\n      const circle = circleParams()\n      drawCircle(circle)\n    }\n  }\n\n  const remapValue = (\n    value: number,\n    start1: number,\n    end1: number,\n    start2: number,\n    end2: number\n  ): number => {\n    const remapped =\n      ((value - start1) * (end2 - start2)) / (end1 - start1) + start2\n    return remapped > 0 ? remapped : 0\n  }\n\n  const animate = () => {\n    clearContext()\n    circles.current.forEach((circle: Circle, i: number) => {\n      // Handle the alpha value\n      const edge = [\n        circle.x + circle.translateX - circle.size, // distance from left edge\n        canvasSize.current.w - circle.x - circle.translateX - circle.size, // distance from right edge\n        circle.y + circle.translateY - circle.size, // distance from top edge\n        canvasSize.current.h - circle.y - circle.translateY - circle.size, // distance from bottom edge\n      ]\n      const closestEdge = edge.reduce((a, b) => Math.min(a, b))\n      const remapClosestEdge = parseFloat(\n        remapValue(closestEdge, 0, 20, 0, 1).toFixed(2)\n      )\n      if (remapClosestEdge > 1) {\n        circle.alpha += 0.02\n        if (circle.alpha > circle.targetAlpha) {\n          circle.alpha = circle.targetAlpha\n        }\n      } else {\n        circle.alpha = circle.targetAlpha * remapClosestEdge\n      }\n      circle.x += circle.dx + vx\n      circle.y += circle.dy + vy\n      circle.translateX +=\n        (mouse.current.x / (staticity / circle.magnetism) - circle.translateX) /\n        ease\n      circle.translateY +=\n        (mouse.current.y / (staticity / circle.magnetism) - circle.translateY) /\n        ease\n\n      drawCircle(circle, true)\n\n      // circle gets out of the canvas\n      if (\n        circle.x < -circle.size ||\n        circle.x > canvasSize.current.w + circle.size ||\n        circle.y < -circle.size ||\n        circle.y > canvasSize.current.h + circle.size\n      ) {\n        // remove the circle from the array\n        circles.current.splice(i, 1)\n        // create a new circle\n        const newCircle = circleParams()\n        drawCircle(newCircle)\n      }\n    })\n    rafID.current = window.requestAnimationFrame(animateRef.current)\n  }\n\n  initCanvasRef.current = initCanvas\n  onMouseMoveRef.current = onMouseMove\n  animateRef.current = animate\n\n  return (\n    <div\n      className={cn(\"pointer-events-none\", className)}\n      ref={canvasContainerRef}\n      aria-hidden=\"true\"\n      {...props}\n    >\n      <canvas ref={canvasRef} className=\"size-full\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/pixel-image.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Grid = {\n  rows: number\n  cols: number\n}\n\nconst DEFAULT_GRIDS: Record<string, Grid> = {\n  \"6x4\": { rows: 4, cols: 6 },\n  \"8x8\": { rows: 8, cols: 8 },\n  \"8x3\": { rows: 3, cols: 8 },\n  \"4x6\": { rows: 6, cols: 4 },\n  \"3x8\": { rows: 8, cols: 3 },\n}\n\ntype PredefinedGridKey = keyof typeof DEFAULT_GRIDS\n\ninterface PixelImageProps {\n  src: string\n  grid?: PredefinedGridKey\n  customGrid?: Grid\n  grayscaleAnimation?: boolean\n  pixelFadeInDuration?: number // in ms\n  maxAnimationDelay?: number // in ms\n  colorRevealDelay?: number // in ms\n}\n\nexport const PixelImage = ({\n  src,\n  grid = \"6x4\",\n  grayscaleAnimation = true,\n  pixelFadeInDuration = 1000,\n  maxAnimationDelay = 1200,\n  colorRevealDelay = 1300,\n  customGrid,\n}: PixelImageProps) => {\n  const [isVisible, setIsVisible] = useState(false)\n  const [showColor, setShowColor] = useState(false)\n\n  const MIN_GRID = 1\n  const MAX_GRID = 16\n\n  const { rows, cols } = useMemo(() => {\n    const isValidGrid = (grid?: Grid) => {\n      if (!grid) return false\n      const { rows, cols } = grid\n      return (\n        Number.isInteger(rows) &&\n        Number.isInteger(cols) &&\n        rows >= MIN_GRID &&\n        cols >= MIN_GRID &&\n        rows <= MAX_GRID &&\n        cols <= MAX_GRID\n      )\n    }\n\n    return isValidGrid(customGrid) ? customGrid! : DEFAULT_GRIDS[grid]\n  }, [customGrid, grid])\n\n  useEffect(() => {\n    setIsVisible(true)\n    const colorTimeout = setTimeout(() => {\n      setShowColor(true)\n    }, colorRevealDelay)\n    return () => clearTimeout(colorTimeout)\n  }, [colorRevealDelay])\n\n  const pieces = useMemo(() => {\n    const total = rows * cols\n    return Array.from({ length: total }, (_, index) => {\n      const row = Math.floor(index / cols)\n      const col = index % cols\n\n      const clipPath = `polygon(\n        ${col * (100 / cols)}% ${row * (100 / rows)}%,\n        ${(col + 1) * (100 / cols)}% ${row * (100 / rows)}%,\n        ${(col + 1) * (100 / cols)}% ${(row + 1) * (100 / rows)}%,\n        ${col * (100 / cols)}% ${(row + 1) * (100 / rows)}%\n      )`\n\n      const delay = Math.random() * maxAnimationDelay\n      return {\n        clipPath,\n        delay,\n      }\n    })\n  }, [rows, cols, maxAnimationDelay])\n\n  return (\n    <div className=\"relative h-72 w-72 select-none md:h-96 md:w-96\">\n      {pieces.map((piece, index) => (\n        <div\n          key={index}\n          className={cn(\n            \"absolute inset-0 transition-all ease-out\",\n            isVisible ? \"opacity-100\" : \"opacity-0\"\n          )}\n          style={{\n            clipPath: piece.clipPath,\n            transitionDelay: `${piece.delay}ms`,\n            transitionDuration: `${pixelFadeInDuration}ms`,\n          }}\n        >\n          <img\n            src={src}\n            alt={`Pixel image piece ${index + 1}`}\n            className={cn(\n              \"z-1 rounded-[2.5rem] object-cover\",\n              grayscaleAnimation && (showColor ? \"grayscale-0\" : \"grayscale\")\n            )}\n            style={{\n              transition: grayscaleAnimation\n                ? `filter ${pixelFadeInDuration}ms cubic-bezier(0.4, 0, 0.2, 1)`\n                : \"none\",\n            }}\n            draggable={false}\n          />\n        </div>\n      ))}\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/pointer.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport {\n  AnimatePresence,\n  HTMLMotionProps,\n  motion,\n  useMotionValue,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * A custom pointer component that displays an animated cursor.\n * Add this as a child to any component to enable a custom pointer when hovering.\n * You can pass custom children to render as the pointer.\n *\n * @component\n * @param {HTMLMotionProps<\"div\">} props - The component props\n */\nexport function Pointer({\n  className,\n  style,\n  children,\n  ...props\n}: HTMLMotionProps<\"div\">): React.ReactNode {\n  const x = useMotionValue(0)\n  const y = useMotionValue(0)\n  const [isActive, setIsActive] = useState<boolean>(false)\n  const containerRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const parentElement =\n      typeof window !== \"undefined\"\n        ? (containerRef.current?.parentElement ?? null)\n        : null\n\n    const handleMouseMove = (e: MouseEvent) => {\n      x.set(e.clientX)\n      y.set(e.clientY)\n      setIsActive(true)\n    }\n\n    const handleMouseEnter = (e: MouseEvent) => {\n      x.set(e.clientX)\n      y.set(e.clientY)\n      setIsActive(true)\n    }\n\n    const handleMouseLeave = () => {\n      setIsActive(false)\n    }\n\n    if (parentElement) {\n      parentElement.style.cursor = \"none\"\n      parentElement.addEventListener(\"mousemove\", handleMouseMove)\n      parentElement.addEventListener(\"mouseenter\", handleMouseEnter)\n      parentElement.addEventListener(\"mouseleave\", handleMouseLeave)\n    }\n\n    return () => {\n      if (parentElement) {\n        parentElement.style.cursor = \"\"\n        parentElement.removeEventListener(\"mousemove\", handleMouseMove)\n        parentElement.removeEventListener(\"mouseenter\", handleMouseEnter)\n        parentElement.removeEventListener(\"mouseleave\", handleMouseLeave)\n      }\n    }\n  }, [x, y])\n\n  return (\n    <>\n      <div ref={containerRef} />\n      <AnimatePresence>\n        {isActive && (\n          <motion.div\n            className=\"pointer-events-none fixed z-50 transform-[translate(-50%,-50%)]\"\n            style={{\n              top: y,\n              left: x,\n              ...style,\n            }}\n            initial={{\n              scale: 0,\n              opacity: 0,\n            }}\n            animate={{\n              scale: 1,\n              opacity: 1,\n            }}\n            exit={{\n              scale: 0,\n              opacity: 0,\n            }}\n            {...props}\n          >\n            {children || (\n              <svg\n                stroke=\"currentColor\"\n                fill=\"currentColor\"\n                strokeWidth=\"1\"\n                viewBox=\"0 0 16 16\"\n                height=\"24\"\n                width=\"24\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                className={cn(\n                  \"rotate-[-70deg] stroke-white text-black\",\n                  className\n                )}\n              >\n                <path d=\"M14.082 2.182a.5.5 0 0 1 .103.557L8.528 15.467a.5.5 0 0 1-.917-.007L5.57 10.694.803 8.652a.5.5 0 0 1-.006-.916l12.728-5.657a.5.5 0 0 1 .556.103z\" />\n              </svg>\n            )}\n          </motion.div>\n        )}\n      </AnimatePresence>\n    </>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/progressive-blur.tsx",
    "content": "\"use client\"\n\nimport React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface ProgressiveBlurProps {\n  className?: string\n  height?: string\n  position?: \"top\" | \"bottom\" | \"both\"\n  blurLevels?: number[]\n  children?: React.ReactNode\n}\n\nexport function ProgressiveBlur({\n  className,\n  height = \"30%\",\n  position = \"bottom\",\n  blurLevels = [0.5, 1, 2, 4, 8, 16, 32, 64],\n}: ProgressiveBlurProps) {\n  // Create array with length equal to blurLevels.length - 2 (for before/after pseudo elements)\n  const divElements = Array(blurLevels.length - 2).fill(null)\n\n  return (\n    <div\n      className={cn(\n        \"gradient-blur pointer-events-none absolute inset-x-0 z-10\",\n        className,\n        position === \"top\"\n          ? \"top-0\"\n          : position === \"bottom\"\n            ? \"bottom-0\"\n            : \"inset-y-0\"\n      )}\n      style={{\n        height: position === \"both\" ? \"100%\" : height,\n      }}\n    >\n      {/* First blur layer (pseudo element) */}\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: 1,\n          backdropFilter: `blur(${blurLevels[0]}px)`,\n          WebkitBackdropFilter: `blur(${blurLevels[0]}px)`,\n          maskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n          WebkitMaskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 12.5%, rgba(0,0,0,1) 25%, rgba(0,0,0,0) 37.5%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n        }}\n      />\n\n      {/* Middle blur layers */}\n      {divElements.map((_, index) => {\n        const blurIndex = index + 1\n        const startPercent = blurIndex * 12.5\n        const midPercent = (blurIndex + 1) * 12.5\n        const endPercent = (blurIndex + 2) * 12.5\n\n        const maskGradient =\n          position === \"bottom\"\n            ? `linear-gradient(to bottom, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\n            : position === \"top\"\n              ? `linear-gradient(to top, rgba(0,0,0,0) ${startPercent}%, rgba(0,0,0,1) ${midPercent}%, rgba(0,0,0,1) ${endPercent}%, rgba(0,0,0,0) ${endPercent + 12.5}%)`\n              : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`\n\n        return (\n          <div\n            key={`blur-${index}`}\n            className=\"absolute inset-0\"\n            style={{\n              zIndex: index + 2,\n              backdropFilter: `blur(${blurLevels[blurIndex]}px)`,\n              WebkitBackdropFilter: `blur(${blurLevels[blurIndex]}px)`,\n              maskImage: maskGradient,\n              WebkitMaskImage: maskGradient,\n            }}\n          />\n        )\n      })}\n\n      {/* Last blur layer (pseudo element) */}\n      <div\n        className=\"absolute inset-0\"\n        style={{\n          zIndex: blurLevels.length,\n          backdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\n          WebkitBackdropFilter: `blur(${blurLevels[blurLevels.length - 1]}px)`,\n          maskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n          WebkitMaskImage:\n            position === \"bottom\"\n              ? `linear-gradient(to bottom, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n              : position === \"top\"\n                ? `linear-gradient(to top, rgba(0,0,0,0) 87.5%, rgba(0,0,0,1) 100%)`\n                : `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,1) 5%, rgba(0,0,0,1) 95%, rgba(0,0,0,0) 100%)`,\n        }}\n      />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/pulsating-button.tsx",
    "content": "import React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface PulsatingButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  pulseColor?: string\n  duration?: string\n}\n\nexport const PulsatingButton = React.forwardRef<\n  HTMLButtonElement,\n  PulsatingButtonProps\n>(\n  (\n    {\n      className,\n      children,\n      pulseColor = \"#808080\",\n      duration = \"1.5s\",\n      ...props\n    },\n    ref\n  ) => {\n    return (\n      <button\n        ref={ref}\n        className={cn(\n          \"bg-primary text-primary-foreground relative flex cursor-pointer items-center justify-center rounded-lg px-4 py-2 text-center\",\n          className\n        )}\n        style={\n          {\n            \"--pulse-color\": pulseColor,\n            \"--duration\": duration,\n          } as React.CSSProperties\n        }\n        {...props}\n      >\n        <div className=\"relative z-10\">{children}</div>\n        <div className=\"absolute top-1/2 left-1/2 size-full -translate-x-1/2 -translate-y-1/2 animate-pulse rounded-lg bg-inherit\" />\n      </button>\n    )\n  }\n)\n\nPulsatingButton.displayName = \"PulsatingButton\"\n"
  },
  {
    "path": "apps/www/registry/magicui/rainbow-button.tsx",
    "content": "import React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst rainbowButtonVariants = cva(\n  cn(\n    \"relative cursor-pointer group transition-all animate-rainbow\",\n    \"inline-flex items-center justify-center gap-2 shrink-0\",\n    \"rounded-sm outline-none focus-visible:ring-[3px] aria-invalid:border-destructive\",\n    \"text-sm font-medium whitespace-nowrap\",\n    \"disabled:pointer-events-none disabled:opacity-50\",\n    \"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0\"\n  ),\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.125rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n        outline:\n          \"border border-input border-b-transparent bg-[linear-gradient(#ffffff,#ffffff),linear-gradient(#ffffff_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] bg-[length:200%] text-accent-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))]\",\n      },\n      size: {\n        default: \"h-9 px-4 py-2\",\n        sm: \"h-8 rounded-xl px-3 text-xs\",\n        lg: \"h-11 rounded-xl px-8\",\n        icon: \"size-9\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\ninterface RainbowButtonProps\n  extends\n    React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof rainbowButtonVariants> {\n  asChild?: boolean\n}\n\nconst RainbowButton = React.forwardRef<HTMLButtonElement, RainbowButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : \"button\"\n    return (\n      <Comp\n        data-slot=\"button\"\n        className={cn(rainbowButtonVariants({ variant, size, className }))}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\n\nRainbowButton.displayName = \"RainbowButton\"\n\nexport { RainbowButton, rainbowButtonVariants, type RainbowButtonProps }\n"
  },
  {
    "path": "apps/www/registry/magicui/retro-grid.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport type { CSSProperties, HTMLAttributes } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ANIMATION_DURATION_SECONDS = 15\nconst GRID_HEIGHT_RATIO = 3\nconst GRID_LINE_ALIGNMENT_OFFSET_PX = 0.5\nconst GRID_LINE_ANTIALIAS_MULTIPLIER = 0.9\nconst GRID_LINE_WIDTH_PX = 0.92\nconst GRID_START_OFFSET_RATIO = -0.5\nconst GRID_WIDTH_RATIO = 6\nconst GRID_X_OFFSET_RATIO = -2\nconst MAX_ANGLE = 89\nconst MAX_DEVICE_PIXEL_RATIO = 2\nconst MIN_ANGLE = 1\nconst PERSPECTIVE_PX = 200\nconst FALLBACK_ANIMATION_NAME = \"retro-grid-fallback-scroll\"\nconst FALLBACK_STYLES = `\n@keyframes ${FALLBACK_ANIMATION_NAME} {\n  from {\n    transform: translateY(-50%);\n  }\n\n  to {\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  [data-retro-grid-scroll=\"true\"] {\n    animation: none !important;\n    transform: translateY(-50%) !important;\n  }\n}\n`\n\nconst VERTEX_SHADER_SOURCE = `\nattribute vec2 a_position;\n\nvoid main() {\n  gl_Position = vec4(a_position, 0.0, 1.0);\n}\n`\n\nconst FRAGMENT_SHADER_SOURCE = `\n#extension GL_OES_standard_derivatives : enable\nprecision highp float;\n\nuniform vec2 u_container_size;\nuniform vec2 u_viewport_size;\nuniform vec4 u_line_color;\nuniform float u_angle;\nuniform float u_cell_size;\nuniform float u_device_pixel_ratio;\nuniform float u_time;\n\nconst float animationDurationSeconds = ${ANIMATION_DURATION_SECONDS.toFixed(1)};\nconst float gridHeightRatio = ${GRID_HEIGHT_RATIO.toFixed(1)};\nconst float gridStartOffsetRatio = ${GRID_START_OFFSET_RATIO.toFixed(1)};\nconst float gridWidthRatio = ${GRID_WIDTH_RATIO.toFixed(1)};\nconst float gridXOffsetRatio = ${GRID_X_OFFSET_RATIO.toFixed(1)};\nconst float gridLineAlignmentOffsetPx = ${GRID_LINE_ALIGNMENT_OFFSET_PX.toFixed(1)};\nconst float gridLineAntialiasMultiplier = ${GRID_LINE_ANTIALIAS_MULTIPLIER.toFixed(1)};\nconst float horizontalLodLevelOneEndPx = 5.6;\nconst float horizontalLodLevelOneStartPx = 2.8;\nconst float horizontalLodLevelTwoEndPx = 3.0;\nconst float horizontalLodLevelTwoStartPx = 1.4;\nconst float horizontalCompressionEndPx = 2.8;\nconst float horizontalCompressionStartPx = 1.2;\nconst float lineWidthPx = ${GRID_LINE_WIDTH_PX.toFixed(2)};\nconst float perspectivePx = ${PERSPECTIVE_PX.toFixed(1)};\nconst float gridTravelRatio = 0.5;\nconst float verticalCompressionEndPx = 2.6;\nconst float verticalCompressionStartPx = 1.0;\nconst float verticalEdgeCompressionEnd = 0.95;\nconst float verticalEdgeCompressionStart = 0.45;\nconst float verticalLodLevelEnd = 0.64;\nconst float verticalLodLevelStart = 0.22;\nconst float verticalTopCompressionEndCells = 6.0;\nconst float verticalTopCompressionStartCells = 2.0;\n\nfloat renderGridLine(\n  float wrappedCoord,\n  float antiAliasWidth,\n  float softnessBoost\n) {\n  return 1.0 - smoothstep(\n    lineWidthPx,\n    lineWidthPx + (antiAliasWidth * (1.5 + softnessBoost)),\n    wrappedCoord\n  );\n}\n\nvoid main() {\n  float angle = radians(clamp(u_angle, 1.0, 89.0));\n  float sinAngle = sin(angle);\n  float cosAngle = cos(angle);\n  vec2 screen = vec2(\n    (gl_FragCoord.x / u_device_pixel_ratio) - (u_container_size.x * 0.5),\n    (u_container_size.y * 0.5) - (gl_FragCoord.y / u_device_pixel_ratio)\n  );\n\n  vec3 rayOrigin = vec3(0.0, 0.0, perspectivePx);\n  vec3 rayDirection = normalize(vec3(screen, -perspectivePx));\n  vec3 planeXAxis = vec3(1.0, 0.0, 0.0);\n  vec3 planeYAxis = vec3(0.0, cosAngle, sinAngle);\n  vec3 planeNormal = normalize(cross(planeXAxis, planeYAxis));\n  float denominator = dot(rayDirection, planeNormal);\n\n  if (abs(denominator) < 0.0001) {\n    discard;\n  }\n\n  float distanceToPlane = dot(-rayOrigin, planeNormal) / denominator;\n\n  if (distanceToPlane <= 0.0) {\n    discard;\n  }\n\n  vec3 hitPoint = rayOrigin + (rayDirection * distanceToPlane);\n  float localX = hitPoint.x;\n  float localY = dot(hitPoint, planeYAxis);\n  float gridWidth = u_viewport_size.x * gridWidthRatio;\n  float gridHeight = u_viewport_size.y * gridHeightRatio;\n  float gridScrollSpeed = (gridHeight * gridTravelRatio) / animationDurationSeconds;\n  float patternOffsetY = u_time * gridScrollSpeed;\n  float gridLeft = (-0.5 * u_container_size.x) + (gridXOffsetRatio * u_container_size.x);\n  float gridTop = (-0.5 * u_container_size.y) + (gridStartOffsetRatio * gridHeight);\n  vec2 planePosition = vec2(localX - gridLeft, localY - gridTop);\n\n  if (\n    planePosition.x < 0.0 ||\n    planePosition.y < 0.0 ||\n    planePosition.x > gridWidth ||\n    planePosition.y > gridHeight\n  ) {\n    discard;\n  }\n\n  vec2 patternPosition = vec2(planePosition.x, planePosition.y - patternOffsetY);\n  vec2 wrapped = mod(\n    patternPosition + vec2(gridLineAlignmentOffsetPx),\n    u_cell_size\n  );\n  vec2 patternDerivative = max(fwidth(patternPosition), vec2(0.0001));\n  vec2 antiAliasWidth = patternDerivative * gridLineAntialiasMultiplier;\n  float horizontalCellSpanPx = u_cell_size / patternDerivative.y;\n  float horizontalCompression = 1.0 - smoothstep(\n    horizontalCompressionStartPx,\n    horizontalCompressionEndPx,\n    horizontalCellSpanPx\n  );\n  float verticalCellSpanPx = u_cell_size / patternDerivative.x;\n  float sideDistance = abs((planePosition.x / gridWidth) * 2.0 - 1.0);\n  float verticalEdgeCompression = smoothstep(\n    verticalEdgeCompressionStart,\n    verticalEdgeCompressionEnd,\n    sideDistance\n  );\n  float verticalTopCompression = 1.0 - smoothstep(\n    u_cell_size * verticalTopCompressionStartCells,\n    u_cell_size * verticalTopCompressionEndCells,\n    planePosition.y\n  );\n  float verticalCompression =\n    (1.0 - smoothstep(\n      verticalCompressionStartPx,\n      verticalCompressionEndPx,\n      verticalCellSpanPx\n    )) * verticalEdgeCompression * verticalTopCompression;\n  float horizontalSoftnessBoost = 1.0 + (horizontalCompression * 3.0);\n  float verticalSoftnessBoost = 1.0 + (verticalCompression * 3.5);\n  float verticalLod = smoothstep(\n    verticalLodLevelStart,\n    verticalLodLevelEnd,\n    verticalCompression\n  );\n  float verticalLineFine = renderGridLine(\n    wrapped.x,\n    antiAliasWidth.x,\n    verticalSoftnessBoost\n  );\n  float verticalWrappedLod = mod(\n    patternPosition.x + gridLineAlignmentOffsetPx,\n    u_cell_size * 2.0\n  );\n  float verticalLineCoarse = renderGridLine(\n    verticalWrappedLod,\n    antiAliasWidth.x,\n    verticalSoftnessBoost + verticalLod\n  );\n  float verticalLine = max(\n    verticalLineFine * (1.0 - verticalLod),\n    verticalLineCoarse * verticalLod\n  );\n  float horizontalLodLevelOne = 1.0 - smoothstep(\n    horizontalLodLevelOneStartPx,\n    horizontalLodLevelOneEndPx,\n    horizontalCellSpanPx\n  );\n  float horizontalLodLevelTwo = 1.0 - smoothstep(\n    horizontalLodLevelTwoStartPx,\n    horizontalLodLevelTwoEndPx,\n    horizontalCellSpanPx\n  );\n  float horizontalLineFine = renderGridLine(\n    wrapped.y,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost\n  );\n  float horizontalWrappedLodOne = mod(\n    patternPosition.y + gridLineAlignmentOffsetPx,\n    u_cell_size * 2.0\n  );\n  float horizontalWrappedLodTwo = mod(\n    patternPosition.y + gridLineAlignmentOffsetPx,\n    u_cell_size * 4.0\n  );\n  float horizontalLineCoarse = renderGridLine(\n    horizontalWrappedLodOne,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost + horizontalLodLevelOne\n  );\n  float horizontalLineExtraCoarse = renderGridLine(\n    horizontalWrappedLodTwo,\n    antiAliasWidth.y,\n    horizontalSoftnessBoost + horizontalLodLevelOne + horizontalLodLevelTwo\n  );\n  float horizontalLineReduced = max(\n    horizontalLineFine * (1.0 - horizontalLodLevelOne),\n    horizontalLineCoarse * horizontalLodLevelOne\n  );\n  float horizontalLine = max(\n    horizontalLineReduced * (1.0 - horizontalLodLevelTwo),\n    horizontalLineExtraCoarse * horizontalLodLevelTwo\n  );\n  float line = max(verticalLine, horizontalLine);\n\n  if (line <= 0.001) {\n    discard;\n  }\n\n  float alpha = u_line_color.a * line;\n  gl_FragColor = vec4(u_line_color.rgb * alpha, alpha);\n}\n`\n\ninterface RetroGridProps extends HTMLAttributes<HTMLDivElement> {\n  /**\n   * Additional CSS classes to apply to the grid container\n   */\n  className?: string\n  /**\n   * Rotation angle of the grid in degrees\n   * @default 65\n   */\n  angle?: number\n  /**\n   * Grid cell size in pixels\n   * @default 60\n   */\n  cellSize?: number\n  /**\n   * Grid opacity value between 0 and 1\n   * @default 0.5\n   */\n  opacity?: number\n  /**\n   * Grid line color in light mode\n   * @default \"gray\"\n   */\n  lightLineColor?: string\n  /**\n   * Grid line color in dark mode\n   * @default \"gray\"\n   */\n  darkLineColor?: string\n}\n\ninterface ProgramInfo {\n  attributeLocation: number\n  program: WebGLProgram\n  uniforms: {\n    angle: WebGLUniformLocation\n    cellSize: WebGLUniformLocation\n    containerSize: WebGLUniformLocation\n    devicePixelRatio: WebGLUniformLocation\n    lineColor: WebGLUniformLocation\n    time: WebGLUniformLocation\n    viewportSize: WebGLUniformLocation\n  }\n}\n\nlet colorResolveContext: CanvasRenderingContext2D | null | undefined\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max)\n}\n\nfunction createShader(gl: WebGLRenderingContext, type: number, source: string) {\n  const shader = gl.createShader(type)\n\n  if (!shader) {\n    return null\n  }\n\n  gl.shaderSource(shader, source)\n  gl.compileShader(shader)\n\n  if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    return shader\n  }\n\n  gl.deleteShader(shader)\n  return null\n}\n\nfunction createProgram(gl: WebGLRenderingContext) {\n  const vertexShader = createShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER_SOURCE)\n  const fragmentShader = createShader(\n    gl,\n    gl.FRAGMENT_SHADER,\n    FRAGMENT_SHADER_SOURCE\n  )\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  const program = gl.createProgram()\n\n  if (!program) {\n    gl.deleteShader(vertexShader)\n    gl.deleteShader(fragmentShader)\n    return null\n  }\n\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n  gl.deleteShader(vertexShader)\n  gl.deleteShader(fragmentShader)\n\n  if (gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    return program\n  }\n\n  gl.deleteProgram(program)\n  return null\n}\n\nfunction getProgramInfo(\n  gl: WebGLRenderingContext,\n  program: WebGLProgram\n): ProgramInfo | null {\n  const attributeLocation = gl.getAttribLocation(program, \"a_position\")\n  const angle = gl.getUniformLocation(program, \"u_angle\")\n  const cellSize = gl.getUniformLocation(program, \"u_cell_size\")\n  const containerSize = gl.getUniformLocation(program, \"u_container_size\")\n  const devicePixelRatio = gl.getUniformLocation(\n    program,\n    \"u_device_pixel_ratio\"\n  )\n  const lineColor = gl.getUniformLocation(program, \"u_line_color\")\n  const time = gl.getUniformLocation(program, \"u_time\")\n  const viewportSize = gl.getUniformLocation(program, \"u_viewport_size\")\n\n  if (\n    attributeLocation < 0 ||\n    !angle ||\n    !cellSize ||\n    !containerSize ||\n    !devicePixelRatio ||\n    !lineColor ||\n    !time ||\n    !viewportSize\n  ) {\n    return null\n  }\n\n  return {\n    attributeLocation,\n    program,\n    uniforms: {\n      angle,\n      cellSize,\n      containerSize,\n      devicePixelRatio,\n      lineColor,\n      time,\n      viewportSize,\n    },\n  }\n}\n\nfunction isDarkMode(colorScheme: MediaQueryList) {\n  const root = document.documentElement\n\n  if (root.classList.contains(\"dark\")) {\n    return true\n  }\n\n  if (root.classList.contains(\"light\")) {\n    return false\n  }\n\n  return colorScheme.matches\n}\n\nfunction getColorResolveContext() {\n  if (colorResolveContext !== undefined) {\n    return colorResolveContext\n  }\n\n  const canvas = document.createElement(\"canvas\")\n  canvas.width = 1\n  canvas.height = 1\n  colorResolveContext = canvas.getContext(\"2d\", {\n    willReadFrequently: true,\n  })\n\n  return colorResolveContext\n}\n\nfunction resolveLineColor(color: string, element: HTMLElement) {\n  const resolver = document.createElement(\"span\")\n  resolver.style.color = color\n  resolver.style.opacity = \"0\"\n  resolver.style.pointerEvents = \"none\"\n  resolver.style.position = \"absolute\"\n  element.appendChild(resolver)\n\n  const resolvedColor = getComputedStyle(resolver).color\n  resolver.remove()\n  const context = getColorResolveContext()\n\n  if (!context) {\n    return new Float32Array([0.5, 0.5, 0.5, 1])\n  }\n\n  context.clearRect(0, 0, 1, 1)\n  context.fillStyle = resolvedColor\n  context.fillRect(0, 0, 1, 1)\n  const pixel = context.getImageData(0, 0, 1, 1).data\n\n  return new Float32Array([\n    pixel[0] / 255,\n    pixel[1] / 255,\n    pixel[2] / 255,\n    pixel[3] / 255,\n  ])\n}\n\nfunction createFallbackGridStyle(\n  cellSize: number,\n  lineColor: string\n): CSSProperties {\n  return {\n    animation: `${FALLBACK_ANIMATION_NAME} ${ANIMATION_DURATION_SECONDS}s linear infinite`,\n    backgroundImage: `linear-gradient(to right, ${lineColor} 1px, transparent 0), linear-gradient(to bottom, ${lineColor} 1px, transparent 0)`,\n    backgroundRepeat: \"repeat\",\n    backgroundSize: `${cellSize}px ${cellSize}px`,\n    transform: \"translateY(-50%)\",\n  }\n}\n\nexport function RetroGrid({\n  className,\n  angle = 65,\n  cellSize = 60,\n  opacity = 0.5,\n  lightLineColor = \"gray\",\n  darkLineColor = \"gray\",\n  style,\n  ...props\n}: RetroGridProps) {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const [isWebGlReady, setIsWebGlReady] = useState(false)\n  const angleRef = useRef(angle)\n  const cellSizeRef = useRef(cellSize)\n  const darkLineColorRef = useRef(darkLineColor)\n  const lightLineColorRef = useRef(lightLineColor)\n  const syncSceneRef = useRef<(() => void) | null>(null)\n\n  useEffect(() => {\n    angleRef.current = angle\n    cellSizeRef.current = cellSize\n    darkLineColorRef.current = darkLineColor\n    lightLineColorRef.current = lightLineColor\n    syncSceneRef.current?.()\n  }, [angle, cellSize, darkLineColor, lightLineColor])\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    const container = containerRef.current\n\n    if (!canvas || !container) {\n      return\n    }\n\n    const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n    const colorScheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\n    let animationFrameId: number | null = null\n    let currentWidth = 0\n    let currentHeight = 0\n    let currentDevicePixelRatio = 1\n    let gl: WebGLRenderingContext | null = null\n    let isVisible = true\n    let isContextLost = false\n    let lineColor = resolveLineColor(lightLineColorRef.current, container)\n    let positionBuffer: WebGLBuffer | null = null\n    let programInfo: ProgramInfo | null = null\n\n    const getContext = () => {\n      const nextGl = canvas.getContext(\"webgl\", {\n        alpha: true,\n        antialias: true,\n        premultipliedAlpha: true,\n      })\n\n      if (!nextGl || !nextGl.getExtension(\"OES_standard_derivatives\")) {\n        return null\n      }\n\n      return nextGl\n    }\n\n    const releasePipeline = (shouldDeleteResources: boolean) => {\n      if (shouldDeleteResources && gl) {\n        if (positionBuffer) {\n          gl.deleteBuffer(positionBuffer)\n        }\n\n        if (programInfo) {\n          gl.deleteProgram(programInfo.program)\n        }\n      }\n\n      positionBuffer = null\n      programInfo = null\n\n      if (shouldDeleteResources) {\n        gl = null\n      }\n    }\n\n    const initializePipeline = () => {\n      const nextGl = getContext()\n\n      if (!nextGl) {\n        releasePipeline(false)\n        return false\n      }\n\n      gl = nextGl\n      releasePipeline(true)\n      gl = nextGl\n\n      const program = createProgram(nextGl)\n\n      if (!program) {\n        return false\n      }\n\n      const nextProgramInfo = getProgramInfo(nextGl, program)\n\n      if (!nextProgramInfo) {\n        nextGl.deleteProgram(program)\n        return false\n      }\n\n      const nextPositionBuffer = nextGl.createBuffer()\n\n      if (!nextPositionBuffer) {\n        nextGl.deleteProgram(program)\n        return false\n      }\n\n      nextGl.bindBuffer(nextGl.ARRAY_BUFFER, nextPositionBuffer)\n      nextGl.bufferData(\n        nextGl.ARRAY_BUFFER,\n        new Float32Array([-1, -1, 3, -1, -1, 3]),\n        nextGl.STATIC_DRAW\n      )\n\n      positionBuffer = nextPositionBuffer\n      programInfo = nextProgramInfo\n\n      return true\n    }\n\n    const updateLineColor = () => {\n      const activeColor = isDarkMode(colorScheme)\n        ? darkLineColorRef.current\n        : lightLineColorRef.current\n      lineColor = resolveLineColor(activeColor, container)\n    }\n\n    const resizeCanvas = () => {\n      currentWidth = Math.floor(container.clientWidth)\n      currentHeight = Math.floor(container.clientHeight)\n\n      if (currentWidth === 0 || currentHeight === 0 || !gl) {\n        return\n      }\n\n      currentDevicePixelRatio = Math.min(\n        window.devicePixelRatio || 1,\n        MAX_DEVICE_PIXEL_RATIO\n      )\n\n      canvas.width = Math.floor(currentWidth * currentDevicePixelRatio)\n      canvas.height = Math.floor(currentHeight * currentDevicePixelRatio)\n      canvas.style.width = `${currentWidth}px`\n      canvas.style.height = `${currentHeight}px`\n      gl.viewport(0, 0, canvas.width, canvas.height)\n    }\n\n    const draw = (timestamp: number) => {\n      if (\n        currentWidth === 0 ||\n        currentHeight === 0 ||\n        !gl ||\n        !positionBuffer ||\n        !programInfo ||\n        isContextLost\n      ) {\n        return\n      }\n\n      gl.useProgram(programInfo.program)\n      gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n      gl.enableVertexAttribArray(programInfo.attributeLocation)\n      gl.vertexAttribPointer(\n        programInfo.attributeLocation,\n        2,\n        gl.FLOAT,\n        false,\n        0,\n        0\n      )\n      gl.clearColor(0, 0, 0, 0)\n      gl.clear(gl.COLOR_BUFFER_BIT)\n      gl.uniform1f(\n        programInfo.uniforms.angle,\n        clamp(angleRef.current, MIN_ANGLE, MAX_ANGLE)\n      )\n      gl.uniform1f(\n        programInfo.uniforms.cellSize,\n        Math.max(cellSizeRef.current, 1)\n      )\n      gl.uniform2f(\n        programInfo.uniforms.containerSize,\n        currentWidth,\n        currentHeight\n      )\n      gl.uniform1f(\n        programInfo.uniforms.devicePixelRatio,\n        currentDevicePixelRatio\n      )\n      gl.uniform4fv(programInfo.uniforms.lineColor, lineColor)\n      gl.uniform1f(\n        programInfo.uniforms.time,\n        reducedMotion.matches ? 0 : timestamp / 1000\n      )\n      gl.uniform2f(\n        programInfo.uniforms.viewportSize,\n        window.innerWidth,\n        window.innerHeight\n      )\n      gl.drawArrays(gl.TRIANGLES, 0, 3)\n    }\n\n    const stopAnimation = () => {\n      if (animationFrameId !== null) {\n        cancelAnimationFrame(animationFrameId)\n        animationFrameId = null\n      }\n    }\n\n    const frame = (timestamp: number) => {\n      draw(timestamp)\n\n      if (!reducedMotion.matches && isVisible) {\n        animationFrameId = requestAnimationFrame(frame)\n        return\n      }\n\n      animationFrameId = null\n    }\n\n    const syncScene = () => {\n      if (isContextLost) {\n        stopAnimation()\n        setIsWebGlReady(false)\n        return\n      }\n\n      if (!gl || !positionBuffer || !programInfo) {\n        if (!initializePipeline()) {\n          stopAnimation()\n          setIsWebGlReady(false)\n          return\n        }\n      }\n\n      resizeCanvas()\n\n      if (currentWidth === 0 || currentHeight === 0) {\n        stopAnimation()\n        return\n      }\n\n      updateLineColor()\n      draw(performance.now())\n      setIsWebGlReady(true)\n\n      if (reducedMotion.matches || !isVisible) {\n        stopAnimation()\n        return\n      }\n\n      if (animationFrameId === null) {\n        animationFrameId = requestAnimationFrame(frame)\n      }\n    }\n\n    syncSceneRef.current = syncScene\n\n    const resizeObserver = new ResizeObserver(() => {\n      syncScene()\n    })\n    resizeObserver.observe(container)\n\n    const handleWindowResize = () => {\n      syncScene()\n    }\n\n    const intersectionObserver = new IntersectionObserver(([entry]) => {\n      isVisible = entry?.isIntersecting ?? false\n\n      if (isVisible) {\n        syncScene()\n        return\n      }\n\n      stopAnimation()\n    })\n    intersectionObserver.observe(container)\n\n    const themeObserver = new MutationObserver(() => {\n      syncScene()\n    })\n    themeObserver.observe(document.documentElement, {\n      attributeFilter: [\"class\"],\n      attributes: true,\n    })\n\n    const handleMotionChange = () => {\n      syncScene()\n    }\n\n    const handleColorSchemeChange = () => {\n      syncScene()\n    }\n\n    const handleContextLost = (event: Event) => {\n      event.preventDefault()\n      isContextLost = true\n      stopAnimation()\n      releasePipeline(false)\n      setIsWebGlReady(false)\n    }\n\n    const handleContextRestored = () => {\n      isContextLost = false\n      syncScene()\n    }\n\n    reducedMotion.addEventListener(\"change\", handleMotionChange)\n    colorScheme.addEventListener(\"change\", handleColorSchemeChange)\n    window.addEventListener(\"resize\", handleWindowResize)\n    canvas.addEventListener(\"webglcontextlost\", handleContextLost)\n    canvas.addEventListener(\"webglcontextrestored\", handleContextRestored)\n\n    syncScene()\n\n    return () => {\n      stopAnimation()\n      resizeObserver.disconnect()\n      intersectionObserver.disconnect()\n      themeObserver.disconnect()\n      reducedMotion.removeEventListener(\"change\", handleMotionChange)\n      colorScheme.removeEventListener(\"change\", handleColorSchemeChange)\n      window.removeEventListener(\"resize\", handleWindowResize)\n      canvas.removeEventListener(\"webglcontextlost\", handleContextLost)\n      canvas.removeEventListener(\"webglcontextrestored\", handleContextRestored)\n      syncSceneRef.current = null\n      releasePipeline(!isContextLost)\n    }\n  }, [])\n\n  const gridStyles = {\n    ...style,\n    opacity,\n  } as CSSProperties\n  const normalizedAngle = clamp(angle, MIN_ANGLE, MAX_ANGLE)\n  const normalizedCellSize = Math.max(cellSize, 1)\n  const fallbackProjectionStyles = {\n    perspective: `${PERSPECTIVE_PX}px`,\n  } as CSSProperties\n  const fallbackRotationStyles = {\n    transform: `rotateX(${normalizedAngle}deg)`,\n  } as CSSProperties\n  const lightFallbackGridStyles = createFallbackGridStyle(\n    normalizedCellSize,\n    lightLineColor\n  )\n  const darkFallbackGridStyles = createFallbackGridStyle(\n    normalizedCellSize,\n    darkLineColor\n  )\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\n        \"pointer-events-none absolute size-full overflow-hidden\",\n        className\n      )}\n      style={gridStyles}\n      {...props}\n    >\n      <style>{FALLBACK_STYLES}</style>\n      {!isWebGlReady ? (\n        <div className=\"absolute inset-0\" style={fallbackProjectionStyles}>\n          <div className=\"absolute inset-0\" style={fallbackRotationStyles}>\n            <div\n              data-retro-grid-scroll=\"true\"\n              className=\"absolute inset-[0%_0px] ml-[-200%] h-[300vh] w-[600vw] origin-[100%_0_0] dark:hidden\"\n              style={lightFallbackGridStyles}\n            />\n            <div\n              data-retro-grid-scroll=\"true\"\n              className=\"absolute inset-[0%_0px] ml-[-200%] hidden h-[300vh] w-[600vw] origin-[100%_0_0] dark:block\"\n              style={darkFallbackGridStyles}\n            />\n          </div>\n        </div>\n      ) : null}\n      <canvas\n        ref={canvasRef}\n        className={cn(\n          \"absolute inset-0 size-full\",\n          isWebGlReady ? \"opacity-100\" : \"opacity-0\"\n        )}\n      />\n      <div className=\"absolute inset-0 bg-linear-to-t from-white to-transparent to-90% dark:from-black\" />\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/ripple-button.tsx",
    "content": "\"use client\"\n\nimport React, { MouseEvent, useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface RippleButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  rippleColor?: string\n  duration?: string\n}\n\nexport const RippleButton = React.forwardRef<\n  HTMLButtonElement,\n  RippleButtonProps\n>(\n  (\n    {\n      className,\n      children,\n      rippleColor = \"#ffffff\",\n      duration = \"600ms\",\n      onClick,\n      ...props\n    },\n    ref\n  ) => {\n    const [buttonRipples, setButtonRipples] = useState<\n      Array<{ x: number; y: number; size: number; key: number }>\n    >([])\n\n    const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n      createRipple(event)\n      onClick?.(event)\n    }\n\n    const createRipple = (event: MouseEvent<HTMLButtonElement>) => {\n      const button = event.currentTarget\n      const rect = button.getBoundingClientRect()\n      const size = Math.max(rect.width, rect.height)\n      const x = event.clientX - rect.left - size / 2\n      const y = event.clientY - rect.top - size / 2\n\n      const newRipple = { x, y, size, key: Date.now() }\n      setButtonRipples((prevRipples) => [...prevRipples, newRipple])\n    }\n\n    useEffect(() => {\n      let timeout: ReturnType<typeof setTimeout> | null = null\n\n      if (buttonRipples.length > 0) {\n        const lastRipple = buttonRipples[buttonRipples.length - 1]\n        timeout = setTimeout(() => {\n          setButtonRipples((prevRipples) =>\n            prevRipples.filter((ripple) => ripple.key !== lastRipple.key)\n          )\n        }, parseInt(duration))\n      }\n\n      return () => {\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n      }\n    }, [buttonRipples, duration])\n\n    return (\n      <button\n        className={cn(\n          \"bg-background text-primary relative flex cursor-pointer items-center justify-center overflow-hidden rounded-lg border-2 px-4 py-2 text-center\",\n          className\n        )}\n        onClick={handleClick}\n        ref={ref}\n        {...props}\n      >\n        <div className=\"relative z-10\">{children}</div>\n        <span className=\"pointer-events-none absolute inset-0\">\n          {buttonRipples.map((ripple) => (\n            <span\n              className=\"animate-rippling bg-background absolute rounded-full opacity-30\"\n              key={ripple.key}\n              style={\n                {\n                  width: `${ripple.size}px`,\n                  height: `${ripple.size}px`,\n                  top: `${ripple.y}px`,\n                  left: `${ripple.x}px`,\n                  backgroundColor: rippleColor,\n                  transform: `scale(0)`,\n                  \"--duration\": duration,\n                } as React.CSSProperties\n              }\n            />\n          ))}\n        </span>\n      </button>\n    )\n  }\n)\n\nRippleButton.displayName = \"RippleButton\"\n"
  },
  {
    "path": "apps/www/registry/magicui/ripple.tsx",
    "content": "import React, { type ComponentPropsWithoutRef, type CSSProperties } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface RippleProps extends ComponentPropsWithoutRef<\"div\"> {\n  mainCircleSize?: number\n  mainCircleOpacity?: number\n  numCircles?: number\n}\n\nexport const Ripple = React.memo(function Ripple({\n  mainCircleSize = 210,\n  mainCircleOpacity = 0.24,\n  numCircles = 8,\n  className,\n  ...props\n}: RippleProps) {\n  return (\n    <div\n      className={cn(\n        \"pointer-events-none absolute inset-0 mask-[linear-gradient(to_bottom,white,transparent)] select-none\",\n        className\n      )}\n      {...props}\n    >\n      {Array.from({ length: numCircles }, (_, i) => {\n        const size = mainCircleSize + i * 70\n        const opacity = mainCircleOpacity - i * 0.03\n        const animationDelay = `${i * 0.06}s`\n        const borderStyle = \"solid\"\n\n        return (\n          <div\n            key={i}\n            className={`animate-ripple bg-foreground/25 absolute rounded-full border shadow-xl`}\n            style={\n              {\n                \"--i\": i,\n                width: `${size}px`,\n                height: `${size}px`,\n                opacity,\n                animationDelay,\n                borderStyle,\n                borderWidth: \"1px\",\n                borderColor: `var(--foreground)`,\n                top: \"50%\",\n                left: \"50%\",\n                transform: \"translate(-50%, -50%) scale(1)\",\n              } as CSSProperties\n            }\n          />\n        )\n      })}\n    </div>\n  )\n})\n\nRipple.displayName = \"Ripple\"\n"
  },
  {
    "path": "apps/www/registry/magicui/safari.tsx",
    "content": "import type { HTMLAttributes } from \"react\"\n\nconst SAFARI_WIDTH = 1203\nconst SAFARI_HEIGHT = 753\nconst SCREEN_X = 1\nconst SCREEN_Y = 52\nconst SCREEN_WIDTH = 1200\nconst SCREEN_HEIGHT = 700\n\n// Calculated percentages\nconst LEFT_PCT = (SCREEN_X / SAFARI_WIDTH) * 100\nconst TOP_PCT = (SCREEN_Y / SAFARI_HEIGHT) * 100\nconst WIDTH_PCT = (SCREEN_WIDTH / SAFARI_WIDTH) * 100\nconst HEIGHT_PCT = (SCREEN_HEIGHT / SAFARI_HEIGHT) * 100\n\ntype SafariMode = \"default\" | \"simple\"\n\nexport interface SafariProps extends HTMLAttributes<HTMLDivElement> {\n  url?: string\n  imageSrc?: string\n  videoSrc?: string\n  mode?: SafariMode\n}\n\nexport function Safari({\n  imageSrc,\n  videoSrc,\n  url,\n  mode = \"default\",\n  className,\n  style,\n  ...props\n}: SafariProps) {\n  const hasVideo = !!videoSrc\n  const hasMedia = hasVideo || !!imageSrc\n\n  return (\n    <div\n      className={`relative inline-block w-full align-middle leading-none ${className ?? \"\"}`}\n      style={{\n        aspectRatio: `${SAFARI_WIDTH}/${SAFARI_HEIGHT}`,\n        ...style,\n      }}\n      {...props}\n    >\n      {hasVideo && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n          }}\n        >\n          <video\n            className=\"block size-full object-cover\"\n            src={videoSrc}\n            autoPlay\n            loop\n            muted\n            playsInline\n            preload=\"metadata\"\n          />\n        </div>\n      )}\n\n      {!hasVideo && imageSrc && (\n        <div\n          className=\"pointer-events-none absolute z-0 overflow-hidden\"\n          style={{\n            left: `${LEFT_PCT}%`,\n            top: `${TOP_PCT}%`,\n            width: `${WIDTH_PCT}%`,\n            height: `${HEIGHT_PCT}%`,\n            borderRadius: \"0 0 11px 11px\",\n          }}\n        >\n          <img\n            src={imageSrc}\n            alt=\"\"\n            className=\"block size-full object-cover object-top\"\n          />\n        </div>\n      )}\n\n      <svg\n        viewBox={`0 0 ${SAFARI_WIDTH} ${SAFARI_HEIGHT}`}\n        fill=\"none\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"absolute inset-0 z-10 size-full\"\n        style={{ transform: \"translateZ(0)\" }}\n      >\n        <defs>\n          <mask id=\"safariPunch\" maskUnits=\"userSpaceOnUse\">\n            <rect\n              x=\"0\"\n              y=\"0\"\n              width={SAFARI_WIDTH}\n              height={SAFARI_HEIGHT}\n              fill=\"white\"\n            />\n            <path\n              d=\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\"\n              fill=\"black\"\n            />\n          </mask>\n\n          <clipPath id=\"path0\">\n            <rect width={SAFARI_WIDTH} height={SAFARI_HEIGHT} fill=\"white\" />\n          </clipPath>\n\n          <clipPath id=\"roundedBottom\">\n            <path\n              d=\"M1 52H1201V741C1201 747.075 1196.08 752 1190 752H12C5.92486 752 1 747.075 1 741V52Z\"\n              fill=\"white\"\n            />\n          </clipPath>\n        </defs>\n\n        <g\n          clipPath=\"url(#path0)\"\n          mask={hasMedia ? \"url(#safariPunch)\" : undefined}\n        >\n          <path\n            d=\"M0 52H1202V741C1202 747.627 1196.63 753 1190 753H12C5.37258 753 0 747.627 0 741V52Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M0 12C0 5.37258 5.37258 0 12 0H1190C1196.63 0 1202 5.37258 1202 12V52H0L0 12Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M1.06738 12C1.06738 5.92487 5.99225 1 12.0674 1H1189.93C1196.01 1 1200.93 5.92487 1200.93 12V51H1.06738V12Z\"\n            className=\"fill-white dark:fill-[#262626]\"\n          />\n          <circle\n            cx=\"27\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <circle\n            cx=\"47\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <circle\n            cx=\"67\"\n            cy=\"25\"\n            r=\"6\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <path\n            d=\"M286 17C286 13.6863 288.686 11 292 11H946C949.314 11 952 13.6863 952 17V35C952 38.3137 949.314 41 946 41H292C288.686 41 286 38.3137 286 35V17Z\"\n            className=\"fill-[#E5E5E5] dark:fill-[#404040]\"\n          />\n          <g className=\"mix-blend-luminosity\">\n            <path\n              d=\"M566.269 32.0852H572.426C573.277 32.0852 573.696 31.6663 573.696 30.7395V25.9851C573.696 25.1472 573.353 24.7219 572.642 24.6521V23.0842C572.642 20.6721 571.036 19.5105 569.348 19.5105C567.659 19.5105 566.053 20.6721 566.053 23.0842V24.6711C565.393 24.7727 565 25.1917 565 25.9851V30.7395C565 31.6663 565.418 32.0852 566.269 32.0852ZM567.272 22.97C567.272 21.491 568.211 20.6785 569.348 20.6785C570.478 20.6785 571.423 21.491 571.423 22.97V24.6394L567.272 24.6458V22.97Z\"\n              fill=\"#A3A3A3\"\n            />\n          </g>\n\n          <g className=\"mix-blend-luminosity\">\n            <text\n              x=\"580\"\n              y=\"30\"\n              fill=\"#A3A3A3\"\n              fontSize=\"12\"\n              fontFamily=\"Arial, sans-serif\"\n            >\n              {url}\n            </text>\n          </g>\n\n          {mode === \"default\" ? (\n            <>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M265.5 33.8984C265.641 33.8984 265.852 33.8516 266.047 33.7422C270.547 31.2969 272.109 30.1641 272.109 27.3203V21.4219C272.109 20.4844 271.742 20.1484 270.961 19.8125C270.094 19.4453 267.18 18.4297 266.328 18.1406C266.07 18.0547 265.766 18 265.5 18C265.234 18 264.93 18.0703 264.672 18.1406C263.82 18.3828 260.906 19.4531 260.039 19.8125C259.258 20.1406 258.891 20.4844 258.891 21.4219V27.3203C258.891 30.1641 260.461 31.2812 264.945 33.7422C265.148 33.8516 265.359 33.8984 265.5 33.8984ZM265.922 19.5781C266.945 19.9766 269.172 20.7656 270.344 21.1875C270.562 21.2656 270.617 21.3828 270.617 21.6641V27.0234C270.617 29.3125 269.469 29.9375 265.945 32.0625C265.727 32.1875 265.617 32.2344 265.508 32.2344V19.4844C265.617 19.4844 265.734 19.5156 265.922 19.5781Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M936.273 24.9766C936.5 24.9766 936.68 24.9062 936.82 24.7578L940.023 21.5312C940.195 21.3594 940.273 21.1719 940.273 20.9531C940.273 20.7422 940.188 20.5391 940.023 20.3828L936.82 17.125C936.68 16.9688 936.5 16.8906 936.273 16.8906C935.852 16.8906 935.516 17.2422 935.516 17.6719C935.516 17.8828 935.594 18.0547 935.727 18.2031L937.594 20.0312C937.227 19.9766 936.852 19.9453 936.477 19.9453C932.609 19.9453 929.516 23.0391 929.516 26.9141C929.516 30.7891 932.633 33.9062 936.5 33.9062C940.375 33.9062 943.484 30.7891 943.484 26.9141C943.484 26.4453 943.156 26.1094 942.688 26.1094C942.234 26.1094 941.93 26.4453 941.93 26.9141C941.93 29.9297 939.516 32.3516 936.5 32.3516C933.492 32.3516 931.07 29.9297 931.07 26.9141C931.07 23.875 933.469 21.4688 936.477 21.4688C936.984 21.4688 937.453 21.5078 937.867 21.5781L935.734 23.6875C935.594 23.8281 935.516 24 935.516 24.2109C935.516 24.6406 935.852 24.9766 936.273 24.9766Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1134 33.0156C1134.49 33.0156 1134.89 32.6094 1134.89 32.1484V27.2578H1139.66C1140.13 27.2578 1140.54 26.8594 1140.54 26.3672C1140.54 25.8828 1140.13 25.4766 1139.66 25.4766H1134.89V20.5859C1134.89 20.1172 1134.49 19.7188 1134 19.7188C1133.52 19.7188 1133.11 20.1172 1133.11 20.5859V25.4766H1128.34C1127.88 25.4766 1127.46 25.8828 1127.46 26.3672C1127.46 26.8594 1127.88 27.2578 1128.34 27.2578H1133.11V32.1484C1133.11 32.6094 1133.52 33.0156 1134 33.0156Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1161.8 31.0703H1163.23V32.375C1163.23 34.0547 1164.12 34.9219 1165.81 34.9219H1174.2C1175.89 34.9219 1176.77 34.0547 1176.77 32.3828V24.0469C1176.77 22.375 1175.89 21.5 1174.2 21.5H1172.77V20.2578C1172.77 18.5859 1171.88 17.7109 1170.19 17.7109H1161.8C1160.1 17.7109 1159.23 18.5781 1159.23 20.2578V28.5234C1159.23 30.1953 1160.1 31.0703 1161.8 31.0703ZM1161.9 29.5078C1161.18 29.5078 1160.78 29.1328 1160.78 28.3828V20.3984C1160.78 19.6406 1161.18 19.2656 1161.9 19.2656H1170.09C1170.8 19.2656 1171.2 19.6406 1171.2 20.3984V21.5H1165.81C1164.12 21.5 1163.23 22.375 1163.23 24.0469V29.5078H1161.9ZM1165.91 33.3672C1165.19 33.3672 1164.8 32.9922 1164.8 32.2422V24.1875C1164.8 23.4297 1165.19 23.0625 1165.91 23.0625H1174.1C1174.81 23.0625 1175.21 23.4297 1175.21 24.1875V32.2422C1175.21 32.9922 1174.81 33.3672 1174.1 33.3672H1165.91Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M1099.51 28.4141C1099.91 28.4141 1100.24 28.0859 1100.24 27.6953V19.8359L1100.18 18.6797L1100.66 19.25L1101.75 20.4141C1101.88 20.5547 1102.06 20.625 1102.24 20.625C1102.6 20.625 1102.9 20.3672 1102.9 20C1102.9 19.8047 1102.82 19.6641 1102.69 19.5312L1100.06 17.0078C1099.88 16.8203 1099.7 16.7578 1099.51 16.7578C1099.32 16.7578 1099.14 16.8203 1098.95 17.0078L1096.33 19.5312C1096.2 19.6641 1096.12 19.8047 1096.12 20C1096.12 20.3672 1096.41 20.625 1096.77 20.625C1096.95 20.625 1097.14 20.5547 1097.27 20.4141L1098.35 19.25L1098.84 18.6719L1098.78 19.8359V27.6953C1098.78 28.0859 1099.11 28.4141 1099.51 28.4141ZM1095 34.6562H1104C1105.7 34.6562 1106.57 33.7812 1106.57 32.1094V24.4297C1106.57 22.7578 1105.7 21.8828 1104 21.8828H1101.89V23.4375H1103.9C1104.61 23.4375 1105.02 23.8125 1105.02 24.5625V31.9688C1105.02 32.7188 1104.61 33.0938 1103.9 33.0938H1095.1C1094.38 33.0938 1093.98 32.7188 1093.98 31.9688V24.5625C1093.98 23.8125 1094.38 23.4375 1095.1 23.4375H1097.13V21.8828H1095C1093.31 21.8828 1092.43 22.75 1092.43 24.4297V32.1094C1092.43 33.7812 1093.31 34.6562 1095 34.6562Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M99.5703 33.6016H112.938C114.633 33.6016 115.516 32.7266 115.516 31.0547V21.5469C115.516 19.875 114.633 19 112.938 19H99.5703C97.8828 19 97 19.8672 97 21.5469V31.0547C97 32.7266 97.8828 33.6016 99.5703 33.6016ZM99.6719 32.0469C98.9531 32.0469 98.5547 31.6719 98.5547 30.9141V21.6875C98.5547 20.9297 98.9531 20.5547 99.6719 20.5547H103.234V32.0469H99.6719ZM112.836 20.5547C113.555 20.5547 113.953 20.9297 113.953 21.6875V30.9141C113.953 31.6719 113.555 32.0469 112.836 32.0469H104.711V20.5547H112.836ZM101.703 23.4141C101.984 23.4141 102.219 23.1719 102.219 22.9062C102.219 22.6406 101.984 22.4062 101.703 22.4062H100.102C99.8203 22.4062 99.5859 22.6406 99.5859 22.9062C99.5859 23.1719 99.8203 23.4141 100.102 23.4141H101.703ZM101.703 25.5156C101.984 25.5156 102.219 25.2812 102.219 25.0078C102.219 24.7422 101.984 24.5078 101.703 24.5078H100.102C99.8203 24.5078 99.5859 24.7422 99.5859 25.0078C99.5859 25.2812 99.8203 25.5156 100.102 25.5156H101.703ZM101.703 27.6094C101.984 27.6094 102.219 27.3828 102.219 27.1094C102.219 26.8438 101.984 26.6172 101.703 26.6172H100.102C99.8203 26.6172 99.5859 26.8438 99.5859 27.1094C99.5859 27.3828 99.8203 27.6094 100.102 27.6094H101.703Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M143.914 32.5938C144.094 32.7656 144.312 32.8594 144.562 32.8594C145.086 32.8594 145.492 32.4531 145.492 31.9375C145.492 31.6797 145.391 31.4453 145.211 31.2656L139.742 25.9219L145.211 20.5938C145.391 20.4141 145.492 20.1719 145.492 19.9219C145.492 19.4062 145.086 19 144.562 19C144.312 19 144.094 19.0938 143.922 19.2656L137.844 25.2031C137.625 25.4062 137.516 25.6562 137.516 25.9297C137.516 26.2031 137.625 26.4375 137.836 26.6484L143.914 32.5938Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n              <g className=\"mix-blend-luminosity\">\n                <path\n                  d=\"M168.422 32.8594C168.68 32.8594 168.891 32.7656 169.07 32.5938L175.148 26.6562C175.359 26.4375 175.469 26.2109 175.469 25.9297C175.469 25.6562 175.367 25.4141 175.148 25.2109L169.07 19.2656C168.891 19.0938 168.68 19 168.422 19C167.898 19 167.492 19.4062 167.492 19.9219C167.492 20.1719 167.602 20.4141 167.773 20.5938L173.25 25.9375L167.773 31.2656C167.594 31.4531 167.492 31.6797 167.492 31.9375C167.492 32.4531 167.898 32.8594 168.422 32.8594Z\"\n                  fill=\"#A3A3A3\"\n                />\n              </g>\n            </>\n          ) : null}\n        </g>\n      </svg>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/scroll-based-velocity.tsx",
    "content": "\"use client\"\n\nimport React, { useContext, useEffect, useRef, useState } from \"react\"\nimport {\n  motion,\n  useAnimationFrame,\n  useMotionValue,\n  useScroll,\n  useSpring,\n  useTransform,\n  useVelocity,\n} from \"motion/react\"\nimport type { MotionValue } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ScrollVelocityRowProps extends React.HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode\n  baseVelocity?: number\n  direction?: 1 | -1\n  scrollReactivity?: boolean\n}\n\nexport const wrap = (min: number, max: number, v: number) => {\n  const rangeSize = max - min\n  return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min\n}\n\nconst ScrollVelocityContext = React.createContext<MotionValue<number> | null>(\n  null\n)\n\nexport function ScrollVelocityContainer({\n  children,\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  const { scrollY } = useScroll()\n  const scrollVelocity = useVelocity(scrollY)\n  const smoothVelocity = useSpring(scrollVelocity, {\n    damping: 50,\n    stiffness: 400,\n  })\n  const velocityFactor = useTransform(smoothVelocity, (v) => {\n    const sign = v < 0 ? -1 : 1\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\n    return sign * magnitude\n  })\n\n  return (\n    <ScrollVelocityContext.Provider value={velocityFactor}>\n      <div className={cn(\"relative w-full\", className)} {...props}>\n        {children}\n      </div>\n    </ScrollVelocityContext.Provider>\n  )\n}\n\nexport function ScrollVelocityRow(props: ScrollVelocityRowProps) {\n  const sharedVelocityFactor = useContext(ScrollVelocityContext)\n  if (sharedVelocityFactor) {\n    return (\n      <ScrollVelocityRowImpl {...props} velocityFactor={sharedVelocityFactor} />\n    )\n  }\n  return <ScrollVelocityRowLocal {...props} />\n}\n\ninterface ScrollVelocityRowImplProps extends ScrollVelocityRowProps {\n  velocityFactor: MotionValue<number>\n}\n\nfunction ScrollVelocityRowImpl({\n  children,\n  baseVelocity = 5,\n  direction = 1,\n  className,\n  velocityFactor,\n  scrollReactivity = true,\n  ...props\n}: ScrollVelocityRowImplProps) {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const blockRef = useRef<HTMLDivElement>(null)\n  const [numCopies, setNumCopies] = useState(1)\n\n  const baseX = useMotionValue(0)\n  const baseDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\n  const currentDirectionRef = useRef<number>(direction >= 0 ? 1 : -1)\n  const unitWidth = useMotionValue(0)\n\n  const isInViewRef = useRef(true)\n  const isPageVisibleRef = useRef(true)\n  const prefersReducedMotionRef = useRef(false)\n\n  useEffect(() => {\n    const container = containerRef.current\n    const block = blockRef.current\n    let ro: ResizeObserver | null = null\n    let io: IntersectionObserver | null = null\n    let mq: MediaQueryList | null = null\n    const handleVisibility = () => {\n      isPageVisibleRef.current = document.visibilityState === \"visible\"\n    }\n    const handlePRM = () => {\n      if (mq) {\n        prefersReducedMotionRef.current = mq.matches\n      }\n    }\n\n    if (container && block) {\n      const updateSizes = () => {\n        const cw = container.offsetWidth || 0\n        const bw = block.scrollWidth || 0\n        unitWidth.set(bw)\n        const nextCopies = bw > 0 ? Math.max(3, Math.ceil(cw / bw) + 2) : 1\n        setNumCopies((prev) => (prev === nextCopies ? prev : nextCopies))\n      }\n\n      updateSizes()\n\n      ro = new ResizeObserver(updateSizes)\n      ro.observe(container)\n      ro.observe(block)\n\n      io = new IntersectionObserver(([entry]) => {\n        isInViewRef.current = entry.isIntersecting\n      })\n      io.observe(container)\n\n      document.addEventListener(\"visibilitychange\", handleVisibility, {\n        passive: true,\n      })\n      handleVisibility()\n\n      mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n      mq.addEventListener(\"change\", handlePRM)\n      handlePRM()\n    }\n\n    return () => {\n      if (ro) {\n        ro.disconnect()\n      }\n      if (io) {\n        io.disconnect()\n      }\n      document.removeEventListener(\"visibilitychange\", handleVisibility)\n      if (mq) {\n        mq.removeEventListener(\"change\", handlePRM)\n      }\n    }\n  }, [children, unitWidth])\n\n  const x = useTransform([baseX, unitWidth], ([v, bw]) => {\n    const width = Number(bw) || 1\n    const offset = Number(v) || 0\n    return `${-wrap(0, width, offset)}px`\n  })\n\n  useAnimationFrame((_, delta) => {\n    if (!isInViewRef.current || !isPageVisibleRef.current) return\n    const dt = delta / 1000\n    const vf = scrollReactivity ? velocityFactor.get() : 0\n    const absVf = Math.min(5, Math.abs(vf))\n    const speedMultiplier = prefersReducedMotionRef.current ? 1 : 1 + absVf\n\n    if (absVf > 0.1) {\n      const scrollDirection = vf >= 0 ? 1 : -1\n      currentDirectionRef.current = baseDirectionRef.current * scrollDirection\n    }\n\n    const bw = unitWidth.get() || 0\n    if (bw <= 0) return\n    const pixelsPerSecond = (bw * baseVelocity) / 100\n    const moveBy =\n      currentDirectionRef.current * pixelsPerSecond * speedMultiplier * dt\n    baseX.set(baseX.get() + moveBy)\n  })\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\"w-full overflow-hidden whitespace-nowrap\", className)}\n      {...props}\n    >\n      <motion.div\n        className=\"inline-flex transform-gpu items-center will-change-transform select-none\"\n        style={{ x }}\n      >\n        {Array.from({ length: numCopies }).map((_, i) => (\n          <div\n            key={i}\n            ref={i === 0 ? blockRef : null}\n            aria-hidden={i !== 0}\n            className=\"inline-flex shrink-0 items-center\"\n          >\n            {children}\n          </div>\n        ))}\n      </motion.div>\n    </div>\n  )\n}\n\nfunction ScrollVelocityRowLocal(props: ScrollVelocityRowProps) {\n  const { scrollY } = useScroll()\n  const localVelocity = useVelocity(scrollY)\n  const localSmoothVelocity = useSpring(localVelocity, {\n    damping: 50,\n    stiffness: 400,\n  })\n  const localVelocityFactor = useTransform(localSmoothVelocity, (v) => {\n    const sign = v < 0 ? -1 : 1\n    const magnitude = Math.min(5, (Math.abs(v) / 1000) * 5)\n    return sign * magnitude\n  })\n  return (\n    <ScrollVelocityRowImpl {...props} velocityFactor={localVelocityFactor} />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/scroll-progress.tsx",
    "content": "\"use client\"\n\nimport { motion, useScroll, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ScrollProgressProps extends Omit<\n  React.HTMLAttributes<HTMLElement>,\n  keyof MotionProps\n> {\n  ref?: React.Ref<HTMLDivElement>\n}\n\nexport function ScrollProgress({\n  className,\n  ref,\n  ...props\n}: ScrollProgressProps) {\n  const { scrollYProgress } = useScroll()\n\n  return (\n    <motion.div\n      ref={ref}\n      className={cn(\n        \"fixed inset-x-0 top-0 z-50 h-px origin-left bg-linear-to-r from-[#A97CF8] via-[#F38CB8] to-[#FDCC92]\",\n        className\n      )}\n      style={{\n        scaleX: scrollYProgress,\n      }}\n      {...props}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/shimmer-button.tsx",
    "content": "import React, { type ComponentPropsWithoutRef, type CSSProperties } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface ShimmerButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n  shimmerColor?: string\n  shimmerSize?: string\n  borderRadius?: string\n  shimmerDuration?: string\n  background?: string\n  className?: string\n  children?: React.ReactNode\n}\n\nexport const ShimmerButton = React.forwardRef<\n  HTMLButtonElement,\n  ShimmerButtonProps\n>(\n  (\n    {\n      shimmerColor = \"#ffffff\",\n      shimmerSize = \"0.05em\",\n      shimmerDuration = \"3s\",\n      borderRadius = \"100px\",\n      background = \"rgba(0, 0, 0, 1)\",\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    return (\n      <button\n        style={\n          {\n            \"--spread\": \"90deg\",\n            \"--shimmer-color\": shimmerColor,\n            \"--radius\": borderRadius,\n            \"--speed\": shimmerDuration,\n            \"--cut\": shimmerSize,\n            \"--bg\": background,\n          } as CSSProperties\n        }\n        className={cn(\n          \"group relative z-0 flex cursor-pointer items-center justify-center overflow-hidden [border-radius:var(--radius)] border border-white/10 px-6 py-3 whitespace-nowrap text-white [background:var(--bg)]\",\n          \"transform-gpu transition-transform duration-300 ease-in-out active:translate-y-px\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      >\n        {/* spark container */}\n        <div\n          className={cn(\n            \"-z-30 blur-[2px]\",\n            \"@container-[size] absolute inset-0 overflow-visible\"\n          )}\n        >\n          {/* spark */}\n          <div className=\"animate-shimmer-slide absolute inset-0 aspect-[1] h-[100cqh] rounded-none [mask:none]\">\n            {/* spark before */}\n            <div className=\"animate-spin-around absolute -inset-full w-auto [translate:0_0] rotate-0 [background:conic-gradient(from_calc(270deg-(var(--spread)*0.5)),transparent_0,var(--shimmer-color)_var(--spread),transparent_var(--spread))]\" />\n          </div>\n        </div>\n        {children}\n\n        {/* Highlight */}\n        <div\n          className={cn(\n            \"absolute inset-0 size-full\",\n\n            \"rounded-2xl px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#ffffff1f]\",\n\n            // transition\n            \"transform-gpu transition-all duration-300 ease-in-out\",\n\n            // on hover\n            \"group-hover:shadow-[inset_0_-6px_10px_#ffffff3f]\",\n\n            // on click\n            \"group-active:shadow-[inset_0_-10px_10px_#ffffff3f]\"\n          )}\n        />\n\n        {/* backdrop */}\n        <div\n          className={cn(\n            \"absolute inset-(--cut) -z-20 [border-radius:var(--radius)] [background:var(--bg)]\"\n          )}\n        />\n      </button>\n    )\n  }\n)\n\nShimmerButton.displayName = \"ShimmerButton\"\n"
  },
  {
    "path": "apps/www/registry/magicui/shine-border.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {\n  /**\n   * Width of the border in pixels\n   * @default 1\n   */\n  borderWidth?: number\n  /**\n   * Duration of the animation in seconds\n   * @default 14\n   */\n  duration?: number\n  /**\n   * Color of the border, can be a single color or an array of colors\n   * @default \"#000000\"\n   */\n  shineColor?: string | string[]\n}\n\n/**\n * Shine Border\n *\n * An animated background border effect component with configurable properties.\n */\nexport function ShineBorder({\n  borderWidth = 1,\n  duration = 14,\n  shineColor = \"#000000\",\n  className,\n  style,\n  ...props\n}: ShineBorderProps) {\n  return (\n    <div\n      style={\n        {\n          \"--border-width\": `${borderWidth}px`,\n          \"--duration\": `${duration}s`,\n          backgroundImage: `radial-gradient(transparent,transparent, ${\n            Array.isArray(shineColor) ? shineColor.join(\",\") : shineColor\n          },transparent,transparent)`,\n          backgroundSize: \"300% 300%\",\n          mask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n          WebkitMask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n          WebkitMaskComposite: \"xor\",\n          maskComposite: \"exclude\",\n          padding: \"var(--border-width)\",\n          ...style,\n        } as React.CSSProperties\n      }\n      className={cn(\n        \"motion-safe:animate-shine pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/shiny-button.tsx",
    "content": "\"use client\"\n\nimport React from \"react\"\nimport { motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst animationProps: MotionProps = {\n  initial: { \"--x\": \"100%\", scale: 0.8 },\n  animate: { \"--x\": \"-100%\", scale: 1 },\n  whileTap: { scale: 0.95 },\n  transition: {\n    repeat: Infinity,\n    repeatType: \"loop\",\n    repeatDelay: 1,\n    type: \"spring\",\n    stiffness: 20,\n    damping: 15,\n    mass: 2,\n    scale: {\n      type: \"spring\",\n      stiffness: 200,\n      damping: 5,\n      mass: 0.5,\n    },\n  },\n}\n\ninterface ShinyButtonProps\n  extends\n    Omit<React.HTMLAttributes<HTMLElement>, keyof MotionProps>,\n    MotionProps {\n  children: React.ReactNode\n  className?: string\n}\n\nexport const ShinyButton = React.forwardRef<\n  HTMLButtonElement,\n  ShinyButtonProps\n>(({ children, className, ...props }, ref) => {\n  return (\n    <motion.button\n      ref={ref}\n      className={cn(\n        \"relative cursor-pointer rounded-lg border px-6 py-2 font-medium backdrop-blur-xl transition-shadow duration-300 ease-in-out hover:shadow dark:bg-[radial-gradient(circle_at_50%_0%,var(--primary)/10%_0%,transparent_60%)] dark:hover:shadow-[0_0_20px_var(--primary)/10%]\",\n        className\n      )}\n      {...animationProps}\n      {...props}\n    >\n      <span\n        className=\"relative block size-full text-sm tracking-wide text-[rgb(0,0,0,65%)] uppercase dark:font-light dark:text-[rgb(255,255,255,90%)]\"\n        style={{\n          maskImage:\n            \"linear-gradient(-75deg,var(--primary) calc(var(--x) + 20%),transparent calc(var(--x) + 30%),var(--primary) calc(var(--x) + 100%))\",\n        }}\n      >\n        {children}\n      </span>\n      <span\n        style={{\n          mask: \"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\",\n          WebkitMask:\n            \"linear-gradient(rgb(0,0,0), rgb(0,0,0)) content-box exclude,linear-gradient(rgb(0,0,0), rgb(0,0,0))\",\n          backgroundImage:\n            \"linear-gradient(-75deg,var(--primary)/10% calc(var(--x)+20%),var(--primary)/50% calc(var(--x)+25%),var(--primary)/10% calc(var(--x)+100%))\",\n        }}\n        className=\"absolute inset-0 z-10 block rounded-[inherit] p-px\"\n      />\n    </motion.button>\n  )\n})\n\nShinyButton.displayName = \"ShinyButton\"\n"
  },
  {
    "path": "apps/www/registry/magicui/smooth-cursor.tsx",
    "content": "\"use client\"\n\nimport { FC, useEffect, useRef, useState } from \"react\"\nimport { motion, useSpring } from \"motion/react\"\n\ninterface Position {\n  x: number\n  y: number\n}\n\nexport interface SmoothCursorProps {\n  cursor?: React.ReactNode\n  springConfig?: {\n    damping: number\n    stiffness: number\n    mass: number\n    restDelta: number\n  }\n}\n\nconst DESKTOP_POINTER_QUERY = \"(any-hover: hover) and (any-pointer: fine)\"\n\nfunction isTrackablePointer(pointerType: string) {\n  return pointerType !== \"touch\"\n}\n\nconst DefaultCursorSVG: FC = () => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width={50}\n      height={54}\n      viewBox=\"0 0 50 54\"\n      fill=\"none\"\n      style={{ scale: 0.5 }}\n    >\n      <g filter=\"url(#filter0_d_91_7928)\">\n        <path\n          d=\"M42.6817 41.1495L27.5103 6.79925C26.7269 5.02557 24.2082 5.02558 23.3927 6.79925L7.59814 41.1495C6.75833 42.9759 8.52712 44.8902 10.4125 44.1954L24.3757 39.0496C24.8829 38.8627 25.4385 38.8627 25.9422 39.0496L39.8121 44.1954C41.6849 44.8902 43.4884 42.9759 42.6817 41.1495Z\"\n          fill=\"black\"\n        />\n        <path\n          d=\"M43.7146 40.6933L28.5431 6.34306C27.3556 3.65428 23.5772 3.69516 22.3668 6.32755L6.57226 40.6778C5.3134 43.4156 7.97238 46.298 10.803 45.2549L24.7662 40.109C25.0221 40.0147 25.2999 40.0156 25.5494 40.1082L39.4193 45.254C42.2261 46.2953 44.9254 43.4347 43.7146 40.6933Z\"\n          stroke=\"white\"\n          strokeWidth={2.25825}\n        />\n      </g>\n      <defs>\n        <filter\n          id=\"filter0_d_91_7928\"\n          x={0.602397}\n          y={0.952444}\n          width={49.0584}\n          height={52.428}\n          filterUnits=\"userSpaceOnUse\"\n          colorInterpolationFilters=\"sRGB\"\n        >\n          <feFlood floodOpacity={0} result=\"BackgroundImageFix\" />\n          <feColorMatrix\n            in=\"SourceAlpha\"\n            type=\"matrix\"\n            values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n            result=\"hardAlpha\"\n          />\n          <feOffset dy={2.25825} />\n          <feGaussianBlur stdDeviation={2.25825} />\n          <feComposite in2=\"hardAlpha\" operator=\"out\" />\n          <feColorMatrix\n            type=\"matrix\"\n            values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\"\n          />\n          <feBlend\n            mode=\"normal\"\n            in2=\"BackgroundImageFix\"\n            result=\"effect1_dropShadow_91_7928\"\n          />\n          <feBlend\n            mode=\"normal\"\n            in=\"SourceGraphic\"\n            in2=\"effect1_dropShadow_91_7928\"\n            result=\"shape\"\n          />\n        </filter>\n      </defs>\n    </svg>\n  )\n}\n\nexport function SmoothCursor({\n  cursor = <DefaultCursorSVG />,\n  springConfig = {\n    damping: 45,\n    stiffness: 400,\n    mass: 1,\n    restDelta: 0.001,\n  },\n}: SmoothCursorProps) {\n  const lastMousePos = useRef<Position>({ x: 0, y: 0 })\n  const velocity = useRef<Position>({ x: 0, y: 0 })\n  const lastUpdateTime = useRef(Date.now())\n  const previousAngle = useRef(0)\n  const accumulatedRotation = useRef(0)\n  const [isEnabled, setIsEnabled] = useState(false)\n  const [isVisible, setIsVisible] = useState(false)\n\n  const cursorX = useSpring(0, springConfig)\n  const cursorY = useSpring(0, springConfig)\n  const rotation = useSpring(0, {\n    ...springConfig,\n    damping: 60,\n    stiffness: 300,\n  })\n  const scale = useSpring(1, {\n    ...springConfig,\n    stiffness: 500,\n    damping: 35,\n  })\n\n  useEffect(() => {\n    const mediaQuery = window.matchMedia(DESKTOP_POINTER_QUERY)\n\n    const updateEnabled = () => {\n      const nextIsEnabled = mediaQuery.matches\n      setIsEnabled(nextIsEnabled)\n\n      if (!nextIsEnabled) {\n        setIsVisible(false)\n      }\n    }\n\n    updateEnabled()\n    mediaQuery.addEventListener(\"change\", updateEnabled)\n\n    return () => {\n      mediaQuery.removeEventListener(\"change\", updateEnabled)\n    }\n  }, [])\n\n  useEffect(() => {\n    if (!isEnabled) {\n      return\n    }\n\n    let timeout: ReturnType<typeof setTimeout> | null = null\n\n    const updateVelocity = (currentPos: Position) => {\n      const currentTime = Date.now()\n      const deltaTime = currentTime - lastUpdateTime.current\n\n      if (deltaTime > 0) {\n        velocity.current = {\n          x: (currentPos.x - lastMousePos.current.x) / deltaTime,\n          y: (currentPos.y - lastMousePos.current.y) / deltaTime,\n        }\n      }\n\n      lastUpdateTime.current = currentTime\n      lastMousePos.current = currentPos\n    }\n\n    const smoothPointerMove = (e: PointerEvent) => {\n      if (!isTrackablePointer(e.pointerType)) {\n        return\n      }\n\n      setIsVisible(true)\n\n      const currentPos = { x: e.clientX, y: e.clientY }\n      updateVelocity(currentPos)\n\n      const speed = Math.sqrt(\n        Math.pow(velocity.current.x, 2) + Math.pow(velocity.current.y, 2)\n      )\n\n      cursorX.set(currentPos.x)\n      cursorY.set(currentPos.y)\n\n      if (speed > 0.1) {\n        const currentAngle =\n          Math.atan2(velocity.current.y, velocity.current.x) * (180 / Math.PI) +\n          90\n\n        let angleDiff = currentAngle - previousAngle.current\n        if (angleDiff > 180) angleDiff -= 360\n        if (angleDiff < -180) angleDiff += 360\n        accumulatedRotation.current += angleDiff\n        rotation.set(accumulatedRotation.current)\n        previousAngle.current = currentAngle\n\n        scale.set(0.95)\n\n        if (timeout !== null) {\n          clearTimeout(timeout)\n        }\n\n        timeout = setTimeout(() => {\n          scale.set(1)\n        }, 150)\n      }\n    }\n\n    let rafId = 0\n    const throttledPointerMove = (e: PointerEvent) => {\n      if (!isTrackablePointer(e.pointerType)) {\n        return\n      }\n\n      if (rafId) return\n\n      rafId = requestAnimationFrame(() => {\n        smoothPointerMove(e)\n        rafId = 0\n      })\n    }\n\n    document.body.style.cursor = \"none\"\n    window.addEventListener(\"pointermove\", throttledPointerMove, {\n      passive: true,\n    })\n\n    return () => {\n      window.removeEventListener(\"pointermove\", throttledPointerMove)\n      document.body.style.cursor = \"auto\"\n      if (rafId) cancelAnimationFrame(rafId)\n      if (timeout !== null) {\n        clearTimeout(timeout)\n      }\n    }\n  }, [cursorX, cursorY, rotation, scale, isEnabled])\n\n  if (!isEnabled) {\n    return null\n  }\n\n  return (\n    <motion.div\n      style={{\n        position: \"fixed\",\n        left: cursorX,\n        top: cursorY,\n        translateX: \"-50%\",\n        translateY: \"-50%\",\n        rotate: rotation,\n        scale: scale,\n        zIndex: 100,\n        pointerEvents: \"none\",\n        willChange: \"transform\",\n        opacity: isVisible ? 1 : 0,\n      }}\n      initial={false}\n      animate={{ opacity: isVisible ? 1 : 0 }}\n      transition={{\n        duration: 0.15,\n      }}\n    >\n      {cursor}\n    </motion.div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/sparkles-text.tsx",
    "content": "\"use client\"\n\nimport { CSSProperties, ReactElement, useEffect, useState } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Sparkle {\n  id: string\n  x: string\n  y: string\n  color: string\n  delay: number\n  scale: number\n  lifespan: number\n}\n\nconst Sparkle: React.FC<Sparkle> = ({ id, x, y, color, delay, scale }) => {\n  return (\n    <motion.svg\n      key={id}\n      className=\"pointer-events-none absolute z-20\"\n      initial={{ opacity: 0, left: x, top: y }}\n      animate={{\n        opacity: [0, 1, 0],\n        scale: [0, scale, 0],\n        rotate: [75, 120, 150],\n      }}\n      transition={{ duration: 0.8, repeat: Infinity, delay }}\n      width=\"21\"\n      height=\"21\"\n      viewBox=\"0 0 21 21\"\n    >\n      <path\n        d=\"M9.82531 0.843845C10.0553 0.215178 10.9446 0.215178 11.1746 0.843845L11.8618 2.72026C12.4006 4.19229 12.3916 6.39157 13.5 7.5C14.6084 8.60843 16.8077 8.59935 18.2797 9.13822L20.1561 9.82534C20.7858 10.0553 20.7858 10.9447 20.1561 11.1747L18.2797 11.8618C16.8077 12.4007 14.6084 12.3916 13.5 13.5C12.3916 14.6084 12.4006 16.8077 11.8618 18.2798L11.1746 20.1562C10.9446 20.7858 10.0553 20.7858 9.82531 20.1562L9.13819 18.2798C8.59932 16.8077 8.60843 14.6084 7.5 13.5C6.39157 12.3916 4.19225 12.4007 2.72023 11.8618L0.843814 11.1747C0.215148 10.9447 0.215148 10.0553 0.843814 9.82534L2.72023 9.13822C4.19225 8.59935 6.39157 8.60843 7.5 7.5C8.60843 6.39157 8.59932 4.19229 9.13819 2.72026L9.82531 0.843845Z\"\n        fill={color}\n      />\n    </motion.svg>\n  )\n}\n\ninterface SparklesTextProps {\n  /**\n   * @default <div />\n   * @type ReactElement\n   * @description\n   * The component to be rendered as the text\n   * */\n  as?: ReactElement\n\n  /**\n   * @default \"\"\n   * @type string\n   * @description\n   * The className of the text\n   */\n  className?: string\n\n  /**\n   * @required\n   * @type ReactNode\n   * @description\n   * The content to be displayed\n   * */\n  children: React.ReactNode\n\n  /**\n   * @default 10\n   * @type number\n   * @description\n   * The count of sparkles\n   * */\n  sparklesCount?: number\n\n  /**\n   * @default \"{first: '#9E7AFF', second: '#FE8BBB'}\"\n   * @type string\n   * @description\n   * The colors of the sparkles\n   * */\n  colors?: {\n    first: string\n    second: string\n  }\n}\n\nexport const SparklesText: React.FC<SparklesTextProps> = ({\n  children,\n  colors = { first: \"#9E7AFF\", second: \"#FE8BBB\" },\n  className,\n  sparklesCount = 10,\n  ...props\n}) => {\n  const [sparkles, setSparkles] = useState<Sparkle[]>([])\n\n  useEffect(() => {\n    const generateStar = (): Sparkle => {\n      const starX = `${Math.random() * 100}%`\n      const starY = `${Math.random() * 100}%`\n      const color = Math.random() > 0.5 ? colors.first : colors.second\n      const delay = Math.random() * 2\n      const scale = Math.random() * 1 + 0.3\n      const lifespan = Math.random() * 10 + 5\n      const id = `${starX}-${starY}-${Date.now()}`\n      return { id, x: starX, y: starY, color, delay, scale, lifespan }\n    }\n\n    const initializeStars = () => {\n      const newSparkles = Array.from({ length: sparklesCount }, generateStar)\n      setSparkles(newSparkles)\n    }\n\n    const updateStars = () => {\n      setSparkles((currentSparkles) =>\n        currentSparkles.map((star) => {\n          if (star.lifespan <= 0) {\n            return generateStar()\n          } else {\n            return { ...star, lifespan: star.lifespan - 0.1 }\n          }\n        })\n      )\n    }\n\n    initializeStars()\n    const interval = setInterval(updateStars, 100)\n\n    return () => clearInterval(interval)\n  }, [colors.first, colors.second, sparklesCount])\n\n  return (\n    <div\n      className={cn(\"text-6xl font-bold\", className)}\n      {...props}\n      style={\n        {\n          \"--sparkles-first-color\": `${colors.first}`,\n          \"--sparkles-second-color\": `${colors.second}`,\n        } as CSSProperties\n      }\n    >\n      <span className=\"relative inline-block\">\n        {sparkles.map((sparkle) => (\n          <Sparkle key={sparkle.id} {...sparkle} />\n        ))}\n        <strong>{children}</strong>\n      </span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/spinning-text.tsx",
    "content": "\"use client\"\n\nimport React, { type ComponentPropsWithoutRef } from \"react\"\nimport { motion, Transition, Variants } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface SpinningTextProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: string | string[]\n  duration?: number\n  reverse?: boolean\n  radius?: number\n  transition?: Transition\n  variants?: {\n    container?: Variants\n    item?: Variants\n  }\n}\n\nconst BASE_TRANSITION: Transition = {\n  repeat: Infinity,\n  ease: \"linear\",\n}\n\nconst BASE_ITEM_VARIANTS: Variants = {\n  hidden: {\n    opacity: 1,\n  },\n  visible: {\n    opacity: 1,\n  },\n}\n\nexport function SpinningText({\n  children,\n  duration = 10,\n  reverse = false,\n  radius = 5,\n  transition,\n  variants,\n  className,\n  style,\n}: SpinningTextProps) {\n  if (typeof children !== \"string\" && !Array.isArray(children)) {\n    throw new Error(\"children must be a string or an array of strings\")\n  }\n\n  if (Array.isArray(children)) {\n    // Validate all elements are strings\n    if (!children.every((child) => typeof child === \"string\")) {\n      throw new Error(\"all elements in children array must be strings\")\n    }\n    children = children.join(\"\")\n  }\n\n  const letters = children.split(\"\")\n  letters.push(\" \")\n\n  const finalTransition: Transition = {\n    ...BASE_TRANSITION,\n    ...transition,\n    duration: (transition as { duration?: number })?.duration ?? duration,\n  }\n\n  const containerVariants: Variants = {\n    visible: { rotate: reverse ? -360 : 360 },\n    ...variants?.container,\n  }\n\n  const itemVariants: Variants = {\n    ...BASE_ITEM_VARIANTS,\n    ...variants?.item,\n  }\n\n  return (\n    <motion.div\n      className={cn(\"relative\", className)}\n      style={{\n        ...style,\n      }}\n      initial=\"hidden\"\n      animate=\"visible\"\n      variants={containerVariants}\n      transition={finalTransition}\n    >\n      {letters.map((letter, index) => (\n        <motion.span\n          aria-hidden=\"true\"\n          key={`${index}-${letter}`}\n          variants={itemVariants}\n          className=\"absolute top-1/2 left-1/2 inline-block\"\n          style={\n            {\n              \"--index\": index,\n              \"--total\": letters.length,\n              \"--radius\": radius,\n              transform: `\n                  translate(-50%, -50%)\n                  rotate(calc(360deg / var(--total) * var(--index)))\n                  translateY(calc(var(--radius, 5) * -1ch))\n                `,\n              transformOrigin: \"center\",\n            } as React.CSSProperties\n          }\n        >\n          {letter}\n        </motion.span>\n      ))}\n      <span className=\"sr-only\">{children}</span>\n    </motion.div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/striped-pattern.tsx",
    "content": "import React, { useId } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface StripedPatternProps extends React.SVGProps<SVGSVGElement> {\n  direction?: \"left\" | \"right\"\n}\n\nexport function StripedPattern({\n  direction = \"left\",\n  className,\n  width = 10,\n  height = 10,\n  ...props\n}: StripedPatternProps) {\n  const id = useId()\n  const w = Number(width)\n  const h = Number(height)\n\n  return (\n    <svg\n      aria-hidden=\"true\"\n      className={cn(\n        \"pointer-events-none absolute inset-0 z-10 h-full w-full stroke-[0.5]\",\n        className\n      )}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <defs>\n        <pattern id={id} width={w} height={h} patternUnits=\"userSpaceOnUse\">\n          {direction === \"left\" ? (\n            <>\n              <line x1=\"0\" y1={h} x2={w} y2=\"0\" stroke=\"currentColor\" />\n              <line x1={-w} y1={h} x2=\"0\" y2=\"0\" stroke=\"currentColor\" />\n              <line x1={w} y1={h} x2={w * 2} y2=\"0\" stroke=\"currentColor\" />\n            </>\n          ) : (\n            <>\n              <line x1=\"0\" y1=\"0\" x2={w} y2={h} stroke=\"currentColor\" />\n              <line x1={-w} y1=\"0\" x2=\"0\" y2={h} stroke=\"currentColor\" />\n              <line x1={w} y1=\"0\" x2={w * 2} y2={h} stroke=\"currentColor\" />\n            </>\n          )}\n        </pattern>\n      </defs>\n      <rect width=\"100%\" height=\"100%\" fill={`url(#${id})`} />\n    </svg>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/terminal.tsx",
    "content": "\"use client\"\n\nimport {\n  Children,\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n} from \"react\"\nimport {\n  motion,\n  useInView,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface SequenceContextValue {\n  completeItem: (index: number) => void\n  activeIndex: number\n  sequenceStarted: boolean\n}\n\nconst SequenceContext = createContext<SequenceContextValue | null>(null)\n\nconst useSequence = () => useContext(SequenceContext)\n\nconst ItemIndexContext = createContext<number | null>(null)\nconst useItemIndex = () => useContext(ItemIndexContext)\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype TerminalTypingMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"span\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface AnimatedSpanProps extends MotionProps {\n  children: React.ReactNode\n  delay?: number\n  className?: string\n  startOnView?: boolean\n}\n\nexport const AnimatedSpan = ({\n  children,\n  delay = 0,\n  className,\n  startOnView = false,\n  ...props\n}: AnimatedSpanProps) => {\n  const elementRef = useRef<HTMLDivElement | null>(null)\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const sequence = useSequence()\n  const itemIndex = useItemIndex()\n  const [hasStarted, setHasStarted] = useState(false)\n  useEffect(() => {\n    if (!sequence || itemIndex === null) return\n    if (!sequence.sequenceStarted) return\n    if (hasStarted) return\n    if (sequence.activeIndex === itemIndex) {\n      setHasStarted(true)\n    }\n  }, [sequence, hasStarted, itemIndex])\n\n  const shouldAnimate = sequence ? hasStarted : startOnView ? isInView : true\n\n  return (\n    <motion.div\n      ref={elementRef}\n      initial={{ opacity: 0, y: -5 }}\n      animate={shouldAnimate ? { opacity: 1, y: 0 } : { opacity: 0, y: -5 }}\n      transition={{ duration: 0.3, delay: sequence ? 0 : delay / 1000 }}\n      className={cn(\"grid text-sm font-normal tracking-tight\", className)}\n      onAnimationComplete={() => {\n        if (!sequence) return\n        if (itemIndex === null) return\n        sequence.completeItem(itemIndex)\n      }}\n      {...props}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\ninterface TypingAnimationProps extends Omit<MotionProps, \"children\"> {\n  children: string\n  className?: string\n  duration?: number\n  delay?: number\n  as?: MotionElementType\n  startOnView?: boolean\n}\n\nexport const TypingAnimation = ({\n  children,\n  className,\n  duration = 60,\n  delay = 0,\n  as: Component = \"span\",\n  startOnView = true,\n  ...props\n}: TypingAnimationProps) => {\n  if (typeof children !== \"string\") {\n    throw new Error(\"TypingAnimation: children must be a string. Received:\")\n  }\n\n  const MotionComponent = motionElements[\n    Component\n  ] as TerminalTypingMotionComponent\n\n  const [displayedText, setDisplayedText] = useState<string>(\"\")\n  const [started, setStarted] = useState(false)\n  const elementRef = useRef<HTMLElement | null>(null)\n  const isInView = useInView(elementRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const sequence = useSequence()\n  const itemIndex = useItemIndex()\n  const hasSequence = sequence !== null\n  const sequenceStarted = sequence?.sequenceStarted ?? false\n  const sequenceActiveIndex = sequence?.activeIndex ?? null\n  const sequenceCompleteItemRef = useRef<\n    SequenceContextValue[\"completeItem\"] | null\n  >(null)\n  const sequenceItemIndexRef = useRef<number | null>(null)\n\n  useEffect(() => {\n    sequenceCompleteItemRef.current = sequence?.completeItem ?? null\n    sequenceItemIndexRef.current = itemIndex\n  }, [sequence?.completeItem, itemIndex])\n\n  useEffect(() => {\n    let startTimeout: ReturnType<typeof setTimeout> | null = null\n\n    if (hasSequence && itemIndex !== null) {\n      if (sequenceStarted && !started && sequenceActiveIndex === itemIndex) {\n        setStarted(true)\n      }\n    } else if (!startOnView || isInView) {\n      startTimeout = setTimeout(() => setStarted(true), delay)\n    }\n\n    return () => {\n      if (startTimeout !== null) {\n        clearTimeout(startTimeout)\n      }\n    }\n  }, [\n    delay,\n    startOnView,\n    isInView,\n    started,\n    hasSequence,\n    sequenceActiveIndex,\n    sequenceStarted,\n    itemIndex,\n  ])\n\n  useEffect(() => {\n    let typingEffect: ReturnType<typeof setInterval> | null = null\n\n    if (started) {\n      let i = 0\n      typingEffect = setInterval(() => {\n        if (i < children.length) {\n          setDisplayedText(children.substring(0, i + 1))\n          i++\n        } else {\n          if (typingEffect !== null) {\n            clearInterval(typingEffect)\n          }\n          const completeItem = sequenceCompleteItemRef.current\n          const currentItemIndex = sequenceItemIndexRef.current\n          if (completeItem && currentItemIndex !== null) {\n            completeItem(currentItemIndex)\n          }\n        }\n      }, duration)\n    }\n\n    return () => {\n      if (typingEffect !== null) {\n        clearInterval(typingEffect)\n      }\n    }\n  }, [children, duration, started])\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\"text-sm font-normal tracking-tight\", className)}\n      {...props}\n    >\n      {displayedText}\n    </MotionComponent>\n  )\n}\n\ninterface TerminalProps {\n  children: React.ReactNode\n  className?: string\n  sequence?: boolean\n  startOnView?: boolean\n}\n\nexport const Terminal = ({\n  children,\n  className,\n  sequence = true,\n  startOnView = true,\n}: TerminalProps) => {\n  const containerRef = useRef<HTMLDivElement | null>(null)\n  const isInView = useInView(containerRef as React.RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const [activeIndex, setActiveIndex] = useState(0)\n  const sequenceHasStarted = sequence ? !startOnView || isInView : false\n\n  const contextValue = useMemo<SequenceContextValue | null>(() => {\n    if (!sequence) return null\n    return {\n      completeItem: (index: number) => {\n        setActiveIndex((current) => (index === current ? current + 1 : current))\n      },\n      activeIndex,\n      sequenceStarted: sequenceHasStarted,\n    }\n  }, [sequence, activeIndex, sequenceHasStarted])\n\n  const wrappedChildren = useMemo(() => {\n    if (!sequence) return children\n    const array = Children.toArray(children)\n    return array.map((child, index) => (\n      <ItemIndexContext.Provider key={index} value={index}>\n        {child as React.ReactNode}\n      </ItemIndexContext.Provider>\n    ))\n  }, [children, sequence])\n\n  const content = (\n    <div\n      ref={containerRef}\n      className={cn(\n        \"border-border bg-background z-0 h-full max-h-100 w-full max-w-lg rounded-xl border\",\n        className\n      )}\n    >\n      <div className=\"border-border flex flex-col gap-y-2 border-b p-4\">\n        <div className=\"flex flex-row gap-x-2\">\n          <div className=\"h-2 w-2 rounded-full bg-red-500\"></div>\n          <div className=\"h-2 w-2 rounded-full bg-yellow-500\"></div>\n          <div className=\"h-2 w-2 rounded-full bg-green-500\"></div>\n        </div>\n      </div>\n      <pre className=\"p-4\">\n        <code className=\"grid gap-y-1 overflow-auto\">{wrappedChildren}</code>\n      </pre>\n    </div>\n  )\n\n  if (!sequence) return content\n\n  return (\n    <SequenceContext.Provider value={contextValue}>\n      {content}\n    </SequenceContext.Provider>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/text-animate.tsx",
    "content": "\"use client\"\n\nimport { memo } from \"react\"\nimport {\n  AnimatePresence,\n  motion,\n  Variants,\n  type DOMMotionComponents,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype AnimationType = \"text\" | \"word\" | \"character\" | \"line\"\ntype AnimationVariant =\n  | \"fadeIn\"\n  | \"blurIn\"\n  | \"blurInUp\"\n  | \"blurInDown\"\n  | \"slideUp\"\n  | \"slideDown\"\n  | \"slideLeft\"\n  | \"slideRight\"\n  | \"scaleUp\"\n  | \"scaleDown\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\n\ninterface TextAnimateProps extends Omit<MotionProps, \"children\"> {\n  /**\n   * The text content to animate\n   */\n  children: string\n  /**\n   * The class name to be applied to the component\n   */\n  className?: string\n  /**\n   * The class name to be applied to each segment\n   */\n  segmentClassName?: string\n  /**\n   * The delay before the animation starts\n   */\n  delay?: number\n  /**\n   * The duration of the animation\n   */\n  duration?: number\n  /**\n   * Custom motion variants for the animation\n   */\n  variants?: Variants\n  /**\n   * The element type to render\n   */\n  as?: MotionElementType\n  /**\n   * How to split the text (\"text\", \"word\", \"character\")\n   */\n  by?: AnimationType\n  /**\n   * Whether to start animation when component enters viewport\n   */\n  startOnView?: boolean\n  /**\n   * Whether to animate only once\n   */\n  once?: boolean\n  /**\n   * The animation preset to use\n   */\n  animation?: AnimationVariant\n  /**\n   * Whether to enable accessibility features (default: true)\n   */\n  accessible?: boolean\n}\n\nconst staggerTimings: Record<AnimationType, number> = {\n  text: 0.06,\n  word: 0.05,\n  character: 0.03,\n  line: 0.06,\n}\n\nconst defaultContainerVariants = {\n  hidden: { opacity: 1 },\n  show: {\n    opacity: 1,\n    transition: {\n      delayChildren: 0,\n      staggerChildren: 0.05,\n    },\n  },\n  exit: {\n    opacity: 0,\n    transition: {\n      staggerChildren: 0.05,\n      staggerDirection: -1,\n    },\n  },\n}\n\nconst defaultItemVariants: Variants = {\n  hidden: { opacity: 0 },\n  show: {\n    opacity: 1,\n  },\n  exit: {\n    opacity: 0,\n  },\n}\n\nconst defaultItemAnimationVariants: Record<\n  AnimationVariant,\n  { container: Variants; item: Variants }\n> = {\n  fadeIn: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, y: 20 },\n      show: {\n        opacity: 1,\n        y: 0,\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        opacity: 0,\n        y: 20,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  blurIn: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\" },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        opacity: 0,\n        filter: \"blur(10px)\",\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  blurInUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\", y: 20 },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        y: 0,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n      exit: {\n        opacity: 0,\n        filter: \"blur(10px)\",\n        y: 20,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n    },\n  },\n  blurInDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: \"blur(10px)\", y: -20 },\n      show: {\n        opacity: 1,\n        filter: \"blur(0px)\",\n        y: 0,\n        transition: {\n          y: { duration: 0.3 },\n          opacity: { duration: 0.4 },\n          filter: { duration: 0.3 },\n        },\n      },\n    },\n  },\n  slideUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { y: 20, opacity: 0 },\n      show: {\n        y: 0,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n        },\n      },\n      exit: {\n        y: -20,\n        opacity: 0,\n        transition: {\n          duration: 0.3,\n        },\n      },\n    },\n  },\n  slideDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { y: -20, opacity: 0 },\n      show: {\n        y: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        y: 20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  slideLeft: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { x: 20, opacity: 0 },\n      show: {\n        x: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        x: -20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  slideRight: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { x: -20, opacity: 0 },\n      show: {\n        x: 0,\n        opacity: 1,\n        transition: { duration: 0.3 },\n      },\n      exit: {\n        x: 20,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  scaleUp: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { scale: 0.5, opacity: 0 },\n      show: {\n        scale: 1,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n          scale: {\n            type: \"spring\",\n            damping: 15,\n            stiffness: 300,\n          },\n        },\n      },\n      exit: {\n        scale: 0.5,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n  scaleDown: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { scale: 1.5, opacity: 0 },\n      show: {\n        scale: 1,\n        opacity: 1,\n        transition: {\n          duration: 0.3,\n          scale: {\n            type: \"spring\",\n            damping: 15,\n            stiffness: 300,\n          },\n        },\n      },\n      exit: {\n        scale: 1.5,\n        opacity: 0,\n        transition: { duration: 0.3 },\n      },\n    },\n  },\n}\n\nconst TextAnimateBase = ({\n  children,\n  delay = 0,\n  duration = 0.3,\n  variants,\n  className,\n  segmentClassName,\n  as: Component = \"p\",\n  startOnView = true,\n  once = false,\n  by = \"word\",\n  animation = \"fadeIn\",\n  accessible = true,\n  ...props\n}: TextAnimateProps) => {\n  const MotionComponent = motionElements[Component]\n\n  let segments: string[] = []\n  switch (by) {\n    case \"word\":\n      segments = children.split(/(\\s+)/)\n      break\n    case \"character\":\n      segments = children.split(\"\")\n      break\n    case \"line\":\n      segments = children.split(\"\\n\")\n      break\n    case \"text\":\n    default:\n      segments = [children]\n      break\n  }\n\n  const finalVariants = variants\n    ? {\n        container: {\n          hidden: { opacity: 0 },\n          show: {\n            opacity: 1,\n            transition: {\n              opacity: { duration: 0.01, delay },\n              delayChildren: delay,\n              staggerChildren: duration / segments.length,\n            },\n          },\n          exit: {\n            opacity: 0,\n            transition: {\n              staggerChildren: duration / segments.length,\n              staggerDirection: -1,\n            },\n          },\n        },\n        item: variants,\n      }\n    : animation\n      ? {\n          container: {\n            ...defaultItemAnimationVariants[animation].container,\n            show: {\n              ...defaultItemAnimationVariants[animation].container.show,\n              transition: {\n                delayChildren: delay,\n                staggerChildren: duration / segments.length,\n              },\n            },\n            exit: {\n              ...defaultItemAnimationVariants[animation].container.exit,\n              transition: {\n                staggerChildren: duration / segments.length,\n                staggerDirection: -1,\n              },\n            },\n          },\n          item: defaultItemAnimationVariants[animation].item,\n        }\n      : { container: defaultContainerVariants, item: defaultItemVariants }\n\n  return (\n    <AnimatePresence mode=\"popLayout\">\n      <MotionComponent\n        variants={finalVariants.container as Variants}\n        initial=\"hidden\"\n        whileInView={startOnView ? \"show\" : undefined}\n        animate={startOnView ? undefined : \"show\"}\n        exit=\"exit\"\n        className={cn(\"whitespace-pre-wrap\", className)}\n        viewport={{ once }}\n        aria-label={accessible ? children : undefined}\n        {...props}\n      >\n        {accessible && <span className=\"sr-only\">{children}</span>}\n        {segments.map((segment, i) => (\n          <motion.span\n            key={`${by}-${segment}-${i}`}\n            variants={finalVariants.item}\n            custom={i * staggerTimings[by]}\n            className={cn(\n              by === \"line\" ? \"block\" : \"inline-block whitespace-pre\",\n              by === \"character\" && \"\",\n              segmentClassName\n            )}\n            aria-hidden={accessible ? true : undefined}\n          >\n            {segment}\n          </motion.span>\n        ))}\n      </MotionComponent>\n    </AnimatePresence>\n  )\n}\n\n// Export the memoized version\nexport const TextAnimate = memo(TextAnimateBase)\n"
  },
  {
    "path": "apps/www/registry/magicui/text-reveal.tsx",
    "content": "\"use client\"\n\nimport {\n  useRef,\n  type ComponentPropsWithoutRef,\n  type FC,\n  type ReactNode,\n} from \"react\"\nimport { motion, MotionValue, useScroll, useTransform } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface TextRevealProps extends ComponentPropsWithoutRef<\"div\"> {\n  children: string\n}\n\nexport const TextReveal: FC<TextRevealProps> = ({ children, className }) => {\n  const sectionRef = useRef<HTMLDivElement | null>(null)\n  const { scrollYProgress } = useScroll({\n    target: sectionRef,\n  })\n\n  if (typeof children !== \"string\") {\n    throw new Error(\"TextReveal: children must be a string\")\n  }\n\n  const words = children.split(\" \")\n\n  return (\n    <div ref={sectionRef} className={cn(\"relative z-0 h-[200vh]\", className)}>\n      <div\n        className={\n          \"sticky top-0 mx-auto flex h-[50%] max-w-4xl items-center bg-transparent px-4 py-20\"\n        }\n      >\n        <span\n          className={\n            \"flex flex-wrap p-5 text-2xl font-bold text-black/20 md:p-8 md:text-3xl lg:p-10 lg:text-4xl xl:text-5xl dark:text-white/20\"\n          }\n        >\n          {words.map((word, i) => {\n            const start = i / words.length\n            const end = start + 1 / words.length\n            return (\n              <Word key={i} progress={scrollYProgress} range={[start, end]}>\n                {word}\n              </Word>\n            )\n          })}\n        </span>\n      </div>\n    </div>\n  )\n}\n\ninterface WordProps {\n  children: ReactNode\n  progress: MotionValue<number>\n  range: [number, number]\n}\n\nconst Word: FC<WordProps> = ({ children, progress, range }) => {\n  const opacity = useTransform(progress, range, [0, 1])\n  return (\n    <span className=\"xl:lg-3 relative mx-1 lg:mx-1.5\">\n      <span className=\"absolute opacity-30\">{children}</span>\n      <motion.span\n        style={{ opacity: opacity }}\n        className={\"text-black dark:text-white\"}\n      >\n        {children}\n      </motion.span>\n    </span>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/tweet-card.tsx",
    "content": "import { Suspense } from \"react\"\nimport { enrichTweet, type EnrichedTweet, type TweetProps } from \"react-tweet\"\nimport { getTweet, type Tweet } from \"react-tweet/api\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface TwitterIconProps {\n  className?: string\n  [key: string]: unknown\n}\nconst Twitter = ({ className, ...props }: TwitterIconProps) => (\n  <svg\n    stroke=\"currentColor\"\n    fill=\"currentColor\"\n    strokeWidth=\"0\"\n    viewBox=\"0 0 24 24\"\n    height=\"1em\"\n    width=\"1em\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className={className}\n    {...props}\n  >\n    <g>\n      <path fill=\"none\" d=\"M0 0h24v24H0z\"></path>\n      <path d=\"M22.162 5.656a8.384 8.384 0 0 1-2.402.658A4.196 4.196 0 0 0 21.6 4c-.82.488-1.719.83-2.656 1.015a4.182 4.182 0 0 0-7.126 3.814 11.874 11.874 0 0 1-8.62-4.37 4.168 4.168 0 0 0-.566 2.103c0 1.45.738 2.731 1.86 3.481a4.168 4.168 0 0 1-1.894-.523v.052a4.185 4.185 0 0 0 3.355 4.101 4.21 4.21 0 0 1-1.89.072A4.185 4.185 0 0 0 7.97 16.65a8.394 8.394 0 0 1-6.191 1.732 11.83 11.83 0 0 0 6.41 1.88c7.693 0 11.9-6.373 11.9-11.9 0-.18-.005-.362-.013-.54a8.496 8.496 0 0 0 2.087-2.165z\"></path>\n    </g>\n  </svg>\n)\n\nconst Verified = ({ className, ...props }: TwitterIconProps) => (\n  <svg\n    aria-label=\"Verified Account\"\n    viewBox=\"0 0 24 24\"\n    className={className}\n    {...props}\n  >\n    <g fill=\"currentColor\">\n      <path d=\"M22.5 12.5c0-1.58-.875-2.95-2.148-3.6.154-.435.238-.905.238-1.4 0-2.21-1.71-3.998-3.818-3.998-.47 0-.92.084-1.336.25C14.818 2.415 13.51 1.5 12 1.5s-2.816.917-3.437 2.25c-.415-.165-.866-.25-1.336-.25-2.11 0-3.818 1.79-3.818 4 0 .494.083.964.237 1.4-1.272.65-2.147 2.018-2.147 3.6 0 1.495.782 2.798 1.942 3.486-.02.17-.032.34-.032.514 0 2.21 1.708 4 3.818 4 .47 0 .92-.086 1.335-.25.62 1.334 1.926 2.25 3.437 2.25 1.512 0 2.818-.916 3.437-2.25.415.163.865.248 1.336.248 2.11 0 3.818-1.79 3.818-4 0-.174-.012-.344-.033-.513 1.158-.687 1.943-1.99 1.943-3.484zm-6.616-3.334l-4.334 6.5c-.145.217-.382.334-.625.334-.143 0-.288-.04-.416-.126l-.115-.094-2.415-2.415c-.293-.293-.293-.768 0-1.06s.768-.294 1.06 0l1.77 1.767 3.825-5.74c.23-.345.696-.436 1.04-.207.346.23.44.696.21 1.04z\" />\n    </g>\n  </svg>\n)\n\nexport const truncate = (str: string | null, length: number) => {\n  if (!str || str.length <= length) return str\n  return `${str.slice(0, length - 3)}...`\n}\n\nconst Skeleton = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => {\n  return (\n    <div className={cn(\"bg-primary/10 rounded-md\", className)} {...props} />\n  )\n}\n\nexport const TweetSkeleton = ({\n  className,\n  ...props\n}: {\n  className?: string\n  [key: string]: unknown\n}) => (\n  <div\n    className={cn(\n      \"flex size-full max-h-max min-w-72 flex-col gap-2 rounded-xl border p-4\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"flex flex-row gap-2\">\n      <Skeleton className=\"size-10 shrink-0 rounded-full\" />\n      <Skeleton className=\"h-10 w-full\" />\n    </div>\n    <Skeleton className=\"h-20 w-full\" />\n  </div>\n)\n\nexport const TweetNotFound = ({\n  className,\n  ...props\n}: {\n  className?: string\n  [key: string]: unknown\n}) => (\n  <div\n    className={cn(\n      \"flex size-full flex-col items-center justify-center gap-2 rounded-lg border p-4\",\n      className\n    )}\n    {...props}\n  >\n    <h3>Tweet not found</h3>\n  </div>\n)\n\nexport const TweetHeader = ({ tweet }: { tweet: EnrichedTweet }) => (\n  <div className=\"flex flex-row items-start justify-between tracking-normal\">\n    <div className=\"flex items-center space-x-3\">\n      <a\n        href={tweet.user.url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className=\"shrink-0\"\n      >\n        <img\n          title={`Profile picture of ${tweet.user.name}`}\n          alt={tweet.user.screen_name}\n          height={48}\n          width={48}\n          src={tweet.user.profile_image_url_https}\n          className=\"border-border/50 overflow-hidden rounded-full border\"\n        />\n      </a>\n      <div className=\"flex flex-col gap-0.5\">\n        <a\n          href={tweet.user.url}\n          target=\"_blank\"\n          rel=\"noreferrer\"\n          className=\"text-foreground flex items-center font-medium whitespace-nowrap transition-opacity hover:opacity-80\"\n        >\n          {truncate(tweet.user.name, 20)}\n          {tweet.user.verified ||\n            (tweet.user.is_blue_verified && (\n              <Verified className=\"ml-1 inline size-4 text-blue-500\" />\n            ))}\n        </a>\n        <div className=\"flex items-center space-x-1\">\n          <a\n            href={tweet.user.url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"text-muted-foreground hover:text-foreground text-sm transition-colors\"\n          >\n            @{truncate(tweet.user.screen_name, 16)}\n          </a>\n        </div>\n      </div>\n    </div>\n    <a href={tweet.url} target=\"_blank\" rel=\"noreferrer\">\n      <span className=\"sr-only\">Link to tweet</span>\n      <Twitter className=\"text-muted-foreground hover:text-foreground size-5 items-start transition-all ease-in-out hover:scale-105\" />\n    </a>\n  </div>\n)\n\nexport const TweetBody = ({ tweet }: { tweet: EnrichedTweet }) => (\n  <div className=\"text-[15px] leading-relaxed tracking-normal wrap-break-word\">\n    {tweet.entities.map((entity, idx) => {\n      switch (entity.type) {\n        case \"url\":\n        case \"symbol\":\n        case \"hashtag\":\n        case \"mention\":\n          return (\n            <a\n              key={idx}\n              href={entity.href}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"text-muted-foreground hover:text-foreground text-[15px] font-normal transition-colors\"\n            >\n              <span>{entity.text}</span>\n            </a>\n          )\n        case \"text\":\n          return (\n            <span\n              key={idx}\n              className=\"text-foreground text-[15px] font-normal\"\n              dangerouslySetInnerHTML={{ __html: entity.text }}\n            />\n          )\n        default:\n          return null\n      }\n    })}\n  </div>\n)\n\nexport const TweetMedia = ({ tweet }: { tweet: EnrichedTweet }) => {\n  if (!tweet.video && !tweet.photos) return null\n  return (\n    <div className=\"flex flex-1 items-center justify-center\">\n      {tweet.video && (\n        <video\n          poster={tweet.video.poster}\n          autoPlay\n          loop\n          muted\n          playsInline\n          className=\"rounded-xl border shadow-sm\"\n        >\n          <source src={tweet.video.variants[0].src} type=\"video/mp4\" />\n          Your browser does not support the video tag.\n        </video>\n      )}\n      {tweet.photos && (\n        <div className=\"relative flex transform-gpu snap-x snap-mandatory gap-4 overflow-x-auto\">\n          <div className=\"shrink-0 snap-center sm:w-2\" />\n          {tweet.photos.map((photo) => (\n            <img\n              key={photo.url}\n              src={photo.url}\n              width={photo.width}\n              height={photo.height}\n              title={\"Photo by \" + tweet.user.name}\n              alt={tweet.text}\n              className=\"h-64 w-5/6 shrink-0 snap-center snap-always rounded-xl border object-cover shadow-sm\"\n            />\n          ))}\n          <div className=\"shrink-0 snap-center sm:w-2\" />\n        </div>\n      )}\n      {!tweet.video &&\n        !tweet.photos &&\n        // @ts-expect-error package doesn't have type definitions\n        tweet?.card?.binding_values?.thumbnail_image_large?.image_value.url && (\n          <img\n            src={\n              // @ts-expect-error package doesn't have type definitions\n              tweet.card.binding_values.thumbnail_image_large.image_value.url\n            }\n            className=\"h-64 rounded-xl border object-cover shadow-sm\"\n            alt={tweet.text}\n          />\n        )}\n    </div>\n  )\n}\n\nexport const MagicTweet = ({\n  tweet,\n  className,\n  ...props\n}: {\n  tweet: Tweet\n  className?: string\n}) => {\n  const enrichedTweet = enrichTweet(tweet)\n  return (\n    <div\n      className={cn(\n        \"relative flex h-fit w-full max-w-lg flex-col gap-4 overflow-hidden rounded-xl border p-5\",\n        className\n      )}\n      {...props}\n    >\n      <TweetHeader tweet={enrichedTweet} />\n      <TweetBody tweet={enrichedTweet} />\n      <TweetMedia tweet={enrichedTweet} />\n    </div>\n  )\n}\n\n/**\n * TweetCard (Server Side Only)\n */\nexport const TweetCard = async ({\n  id,\n  components,\n  fallback = <TweetSkeleton />,\n  onError,\n  ...props\n}: TweetProps & {\n  className?: string\n}) => {\n  const tweet = id\n    ? await getTweet(id).catch((err) => {\n        if (onError) {\n          onError(err)\n        } else {\n          console.error(err)\n        }\n      })\n    : undefined\n\n  if (!tweet) {\n    const NotFound = components?.TweetNotFound ?? TweetNotFound\n    return <NotFound {...props} />\n  }\n\n  return (\n    <Suspense fallback={fallback}>\n      <MagicTweet tweet={tweet} {...props} />\n    </Suspense>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/typing-animation.tsx",
    "content": "\"use client\"\n\nimport {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ComponentType,\n  type RefAttributes,\n  type RefObject,\n} from \"react\"\nimport {\n  motion,\n  useInView,\n  type DOMMotionComponents,\n  type HTMLMotionProps,\n  type MotionProps,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst motionElements = {\n  article: motion.article,\n  div: motion.div,\n  h1: motion.h1,\n  h2: motion.h2,\n  h3: motion.h3,\n  h4: motion.h4,\n  h5: motion.h5,\n  h6: motion.h6,\n  li: motion.li,\n  p: motion.p,\n  section: motion.section,\n  span: motion.span,\n} as const\n\ntype MotionElementType = Extract<\n  keyof DOMMotionComponents,\n  keyof typeof motionElements\n>\ntype TypingAnimationMotionComponent = ComponentType<\n  Omit<HTMLMotionProps<\"span\">, \"ref\"> & RefAttributes<HTMLElement>\n>\n\ninterface TypingAnimationProps extends Omit<MotionProps, \"children\"> {\n  children?: string\n  words?: string[]\n  className?: string\n  duration?: number\n  typeSpeed?: number\n  deleteSpeed?: number\n  delay?: number\n  pauseDelay?: number\n  loop?: boolean\n  as?: MotionElementType\n  startOnView?: boolean\n  showCursor?: boolean\n  blinkCursor?: boolean\n  cursorStyle?: \"line\" | \"block\" | \"underscore\"\n}\n\nexport function TypingAnimation({\n  children,\n  words,\n  className,\n  duration = 100,\n  typeSpeed,\n  deleteSpeed,\n  delay = 0,\n  pauseDelay = 1000,\n  loop = false,\n  as: Component = \"span\",\n  startOnView = true,\n  showCursor = true,\n  blinkCursor = true,\n  cursorStyle = \"line\",\n  ...props\n}: TypingAnimationProps) {\n  const MotionComponent = motionElements[\n    Component\n  ] as TypingAnimationMotionComponent\n\n  const [displayedText, setDisplayedText] = useState<string>(\"\")\n  const [currentWordIndex, setCurrentWordIndex] = useState(0)\n  const [currentCharIndex, setCurrentCharIndex] = useState(0)\n  const [phase, setPhase] = useState<\"typing\" | \"pause\" | \"deleting\">(\"typing\")\n  const elementRef = useRef<HTMLElement | null>(null)\n  const isInView = useInView(elementRef as RefObject<Element>, {\n    amount: 0.3,\n    once: true,\n  })\n\n  const wordsToAnimate = useMemo(\n    () => words ?? (children ? [children] : []),\n    [words, children]\n  )\n  const hasMultipleWords = wordsToAnimate.length > 1\n\n  const typingSpeed = typeSpeed ?? duration\n  const deletingSpeed = deleteSpeed ?? typingSpeed / 2\n\n  const shouldStart = startOnView ? isInView : true\n  const animationSourceKey = useMemo(\n    () => (words ? words.join(\"\\u0000\") : (children ?? \"\")),\n    [words, children]\n  )\n\n  useEffect(() => {\n    setDisplayedText(\"\")\n    setCurrentWordIndex(0)\n    setCurrentCharIndex(0)\n    setPhase(\"typing\")\n  }, [animationSourceKey])\n\n  useEffect(() => {\n    let timeout: ReturnType<typeof setTimeout> | null = null\n\n    if (shouldStart && wordsToAnimate.length > 0) {\n      const timeoutDelay =\n        delay > 0 && displayedText === \"\"\n          ? delay\n          : phase === \"typing\"\n            ? typingSpeed\n            : phase === \"deleting\"\n              ? deletingSpeed\n              : pauseDelay\n\n      timeout = setTimeout(() => {\n        const currentWord = wordsToAnimate[currentWordIndex] || \"\"\n        const graphemes = Array.from(currentWord)\n\n        switch (phase) {\n          case \"typing\":\n            if (currentCharIndex < graphemes.length) {\n              setDisplayedText(\n                graphemes.slice(0, currentCharIndex + 1).join(\"\")\n              )\n              setCurrentCharIndex(currentCharIndex + 1)\n            } else {\n              if (hasMultipleWords || loop) {\n                const isLastWord =\n                  currentWordIndex === wordsToAnimate.length - 1\n                if (!isLastWord || loop) {\n                  setPhase(\"pause\")\n                }\n              }\n            }\n            break\n\n          case \"pause\":\n            setPhase(\"deleting\")\n            break\n\n          case \"deleting\":\n            if (currentCharIndex > 0) {\n              setDisplayedText(\n                graphemes.slice(0, currentCharIndex - 1).join(\"\")\n              )\n              setCurrentCharIndex(currentCharIndex - 1)\n            } else {\n              const nextIndex = (currentWordIndex + 1) % wordsToAnimate.length\n              setCurrentWordIndex(nextIndex)\n              setPhase(\"typing\")\n            }\n            break\n        }\n      }, timeoutDelay)\n    }\n\n    return () => {\n      if (timeout !== null) {\n        clearTimeout(timeout)\n      }\n    }\n  }, [\n    shouldStart,\n    phase,\n    currentCharIndex,\n    currentWordIndex,\n    displayedText,\n    wordsToAnimate,\n    hasMultipleWords,\n    loop,\n    typingSpeed,\n    deletingSpeed,\n    pauseDelay,\n    delay,\n  ])\n\n  const currentWordGraphemes = Array.from(\n    wordsToAnimate[currentWordIndex] || \"\"\n  )\n  const isComplete =\n    !loop &&\n    currentWordIndex === wordsToAnimate.length - 1 &&\n    currentCharIndex >= currentWordGraphemes.length &&\n    phase !== \"deleting\"\n\n  const shouldShowCursor =\n    showCursor &&\n    !isComplete &&\n    (hasMultipleWords || loop || currentCharIndex < currentWordGraphemes.length)\n\n  const getCursorChar = () => {\n    switch (cursorStyle) {\n      case \"block\":\n        return \"▌\"\n      case \"underscore\":\n        return \"_\"\n      case \"line\":\n      default:\n        return \"|\"\n    }\n  }\n\n  return (\n    <MotionComponent\n      ref={elementRef}\n      className={cn(\n        \"leading-20 tracking-[-0.02em]\",\n        Component === \"span\" && \"inline-block\",\n        className\n      )}\n      {...props}\n    >\n      {displayedText}\n      {shouldShowCursor && (\n        <span\n          className={cn(\"inline-block\", blinkCursor && \"animate-blink-cursor\")}\n        >\n          {getCursorChar()}\n        </span>\n      )}\n    </MotionComponent>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/video-text.tsx",
    "content": "\"use client\"\n\nimport React, { ElementType, ReactNode, useEffect, useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface VideoTextProps {\n  /**\n   * The video source URL\n   */\n  src: string\n  /**\n   * Additional className for the container\n   */\n  className?: string\n  /**\n   * Whether to autoplay the video\n   */\n  autoPlay?: boolean\n  /**\n   * Whether to mute the video\n   */\n  muted?: boolean\n  /**\n   * Whether to loop the video\n   */\n  loop?: boolean\n  /**\n   * Whether to preload the video\n   */\n  preload?: \"auto\" | \"metadata\" | \"none\"\n  /**\n   * The content to display (will have the video \"inside\" it)\n   */\n  children: ReactNode\n  /**\n   * Font size for the text mask (in viewport width units)\n   * @default 10\n   */\n  fontSize?: string | number\n  /**\n   * Font weight for the text mask\n   * @default \"bold\"\n   */\n  fontWeight?: string | number\n  /**\n   * Text anchor for the text mask\n   * @default \"middle\"\n   */\n  textAnchor?: string\n  /**\n   * Dominant baseline for the text mask\n   * @default \"middle\"\n   */\n  dominantBaseline?: string\n  /**\n   * Font family for the text mask\n   * @default \"sans-serif\"\n   */\n  fontFamily?: string\n  /**\n   * The element type to render for the text\n   * @default \"div\"\n   */\n  as?: ElementType\n}\n\nexport function VideoText({\n  src,\n  children,\n  className = \"\",\n  autoPlay = true,\n  muted = true,\n  loop = true,\n  preload = \"auto\",\n  fontSize = 20,\n  fontWeight = \"bold\",\n  textAnchor = \"middle\",\n  dominantBaseline = \"middle\",\n  fontFamily = \"sans-serif\",\n  as: Component = \"div\",\n}: VideoTextProps) {\n  const [svgMask, setSvgMask] = useState(\"\")\n  const content = React.Children.toArray(children).join(\"\")\n\n  useEffect(() => {\n    const updateSvgMask = () => {\n      const responsiveFontSize =\n        typeof fontSize === \"number\" ? `${fontSize}vw` : fontSize\n      const newSvgMask = `<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%'><text x='50%' y='50%' font-size='${responsiveFontSize}' font-weight='${fontWeight}' text-anchor='${textAnchor}' dominant-baseline='${dominantBaseline}' font-family='${fontFamily}'>${content}</text></svg>`\n      setSvgMask(newSvgMask)\n    }\n\n    updateSvgMask()\n    window.addEventListener(\"resize\", updateSvgMask)\n    return () => window.removeEventListener(\"resize\", updateSvgMask)\n  }, [content, fontSize, fontWeight, textAnchor, dominantBaseline, fontFamily])\n\n  const dataUrlMask = `url(\"data:image/svg+xml,${encodeURIComponent(svgMask)}\")`\n\n  return (\n    <Component className={cn(`relative size-full`, className)}>\n      {/* Create a container that masks the video to only show within text */}\n      <div\n        className=\"absolute inset-0 flex items-center justify-center\"\n        style={{\n          maskImage: dataUrlMask,\n          WebkitMaskImage: dataUrlMask,\n          maskSize: \"contain\",\n          WebkitMaskSize: \"contain\",\n          maskRepeat: \"no-repeat\",\n          WebkitMaskRepeat: \"no-repeat\",\n          maskPosition: \"center\",\n          WebkitMaskPosition: \"center\",\n        }}\n      >\n        <video\n          className=\"h-full w-full object-cover\"\n          autoPlay={autoPlay}\n          muted={muted}\n          loop={loop}\n          preload={preload}\n          playsInline\n        >\n          <source src={src} />\n          Your browser does not support the video tag.\n        </video>\n      </div>\n\n      {/* Add a backup text element for SEO/accessibility */}\n      <span className=\"sr-only\">{content}</span>\n    </Component>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/warp-background.tsx",
    "content": "\"use client\"\n\nimport React, { HTMLAttributes, useCallback, useMemo } from \"react\"\nimport { motion } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface WarpBackgroundProps extends HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode\n  perspective?: number\n  beamsPerSide?: number\n  beamSize?: number\n  beamDelayMax?: number\n  beamDelayMin?: number\n  beamDuration?: number\n  gridColor?: string\n}\n\nconst Beam = ({\n  width,\n  x,\n  delay,\n  duration,\n}: {\n  width: string | number\n  x: string | number\n  delay: number\n  duration: number\n}) => {\n  const hue = Math.floor(Math.random() * 360)\n  const ar = Math.floor(Math.random() * 10) + 1\n\n  return (\n    <motion.div\n      style={\n        {\n          \"--x\": `${x}`,\n          \"--width\": `${width}`,\n          \"--aspect-ratio\": `${ar}`,\n          \"--background\": `linear-gradient(hsl(${hue} 80% 60%), transparent)`,\n        } as React.CSSProperties\n      }\n      className={`absolute top-0 left-(--x) aspect-[1/var(--aspect-ratio)] w-(--width) [background:var(--background)]`}\n      initial={{ y: \"100cqmax\", x: \"-50%\" }}\n      animate={{ y: \"-100%\", x: \"-50%\" }}\n      transition={{\n        duration,\n        delay,\n        repeat: Infinity,\n        ease: \"linear\",\n      }}\n    />\n  )\n}\n\nexport const WarpBackground: React.FC<WarpBackgroundProps> = ({\n  children,\n  perspective = 100,\n  className,\n  beamsPerSide = 3,\n  beamSize = 5,\n  beamDelayMax = 3,\n  beamDelayMin = 0,\n  beamDuration = 3,\n  gridColor = \"var(--border)\",\n  ...props\n}) => {\n  const generateBeams = useCallback(() => {\n    const beams = []\n    const cellsPerSide = Math.floor(100 / beamSize)\n    const step = cellsPerSide / beamsPerSide\n\n    for (let i = 0; i < beamsPerSide; i++) {\n      const x = Math.floor(i * step)\n      const delay = Math.random() * (beamDelayMax - beamDelayMin) + beamDelayMin\n      beams.push({ x, delay })\n    }\n    return beams\n  }, [beamsPerSide, beamSize, beamDelayMax, beamDelayMin])\n\n  const topBeams = useMemo(() => generateBeams(), [generateBeams])\n  const rightBeams = useMemo(() => generateBeams(), [generateBeams])\n  const bottomBeams = useMemo(() => generateBeams(), [generateBeams])\n  const leftBeams = useMemo(() => generateBeams(), [generateBeams])\n\n  return (\n    <div className={cn(\"relative rounded border p-20\", className)} {...props}>\n      <div\n        style={\n          {\n            \"--perspective\": `${perspective}px`,\n            \"--grid-color\": gridColor,\n            \"--beam-size\": `${beamSize}%`,\n          } as React.CSSProperties\n        }\n        className={\n          \"@container-[size] pointer-events-none absolute top-0 left-0 size-full overflow-hidden [clipPath:inset(0)] perspective-(--perspective) transform-3d\"\n        }\n      >\n        {/* top side */}\n        <div className=\"@container absolute z-20 h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {topBeams.map((beam, index) => (\n            <Beam\n              key={`top-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* bottom side */}\n        <div className=\"@container absolute top-full h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {bottomBeams.map((beam, index) => (\n            <Beam\n              key={`bottom-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* left side */}\n        <div className=\"@container absolute top-0 left-0 h-[100cqmax] w-[100cqh] origin-[0%_0%] transform-[rotate(90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {leftBeams.map((beam, index) => (\n            <Beam\n              key={`left-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n        {/* right side */}\n        <div className=\"@container absolute top-0 right-0 h-[100cqmax] w-[100cqh] origin-[100%_0%] transform-[rotate(-90deg)_rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d\">\n          {rightBeams.map((beam, index) => (\n            <Beam\n              key={`right-${index}`}\n              width={`${beamSize}%`}\n              x={`${beam.x * beamSize}%`}\n              delay={beam.delay}\n              duration={beamDuration}\n            />\n          ))}\n        </div>\n      </div>\n      <div className=\"relative\">{children}</div>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/magicui/word-rotate.tsx",
    "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { AnimatePresence, motion, type MotionProps } from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface WordRotateProps {\n  words: string[]\n  duration?: number\n  motionProps?: MotionProps\n  className?: string\n}\n\nexport function WordRotate({\n  words,\n  duration = 2500,\n  motionProps = {\n    initial: { opacity: 0, y: -50 },\n    animate: { opacity: 1, y: 0 },\n    exit: { opacity: 0, y: 50 },\n    transition: { duration: 0.25, ease: \"easeOut\" },\n  },\n  className,\n}: WordRotateProps) {\n  const [index, setIndex] = useState(0)\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setIndex((prevIndex) => (prevIndex + 1) % words.length)\n    }, duration)\n\n    // Clean up interval on unmount\n    return () => clearInterval(interval)\n  }, [words, duration])\n\n  return (\n    <div className=\"overflow-hidden py-2\">\n      <AnimatePresence mode=\"wait\">\n        <motion.h1\n          key={words[index]}\n          className={cn(className)}\n          {...motionProps}\n        >\n          {words[index]}\n        </motion.h1>\n      </AnimatePresence>\n    </div>\n  )\n}\n"
  },
  {
    "path": "apps/www/registry/registry-examples.ts",
    "content": "import { type Registry } from \"shadcn/schema\"\n\nexport const examples: Registry[\"items\"] = [\n  {\n    name: \"magic-card-demo\",\n    type: \"registry:example\",\n    title: \"Magic Card Demo\",\n    description:\n      \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n    registryDependencies: [\"@magicui/magic-card\"],\n    files: [\n      {\n        path: \"example/magic-card-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"magic-card-demo-2\",\n    type: \"registry:example\",\n    title: \"Magic Card Demo 2\",\n    description: \"Example showing a magic card with an orb effect.\",\n    registryDependencies: [\"@magicui/magic-card\", \"@magicui/avatar-circles\"],\n    files: [\n      {\n        path: \"example/magic-card-demo2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"android-demo\",\n    type: \"registry:example\",\n    title: \"Android Demo\",\n    description: \"Example showing a mockup of an Android device.\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [\n      {\n        path: \"example/android-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"android-demo-2\",\n    type: \"registry:example\",\n    title: \"Android Demo 2\",\n    description: \"Second example showing a mockup of an Android device.\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [\n      {\n        path: \"example/android-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"android-demo-3\",\n    type: \"registry:example\",\n    title: \"Android Demo 3\",\n    description: \"Third example showing a mockup of an Android device.\",\n    registryDependencies: [\"@magicui/android\"],\n    files: [\n      {\n        path: \"example/android-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"warp-background-demo\",\n    type: \"registry:example\",\n    title: \"Warp Background Demo\",\n    description:\n      \"Example showing a card with a time warping background effect.\",\n    registryDependencies: [\"@magicui/warp-background\"],\n    files: [\n      {\n        path: \"example/warp-background-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"line-shadow-text-demo\",\n    type: \"registry:example\",\n    title: \"Line Shadow Text Demo\",\n    description: \"Example showing a text component with a moving line shadow.\",\n    registryDependencies: [\"@magicui/line-shadow-text\"],\n    files: [\n      {\n        path: \"example/line-shadow-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"aurora-text-demo\",\n    type: \"registry:example\",\n    title: \"Aurora Text Demo\",\n    description: \"Example showing a beautiful aurora text effect.\",\n    registryDependencies: [\"@magicui/aurora-text\"],\n    files: [\n      {\n        path: \"example/aurora-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"morphing-text-demo\",\n    type: \"registry:example\",\n    title: \"Morphing Text Demo\",\n    description: \"Example showing a dynamic text morphing component.\",\n    registryDependencies: [\"@magicui/morphing-text\"],\n    files: [\n      {\n        path: \"example/morphing-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"scroll-progress-demo\",\n    type: \"registry:example\",\n    title: \"Scroll Progress Demo\",\n    description: \"Example showing animated scroll progress for your pages.\",\n    registryDependencies: [\"@magicui/scroll-progress\"],\n    files: [\n      {\n        path: \"example/scroll-progress-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"lens-demo\",\n    type: \"registry:example\",\n    title: \"Lens Demo\",\n    description: \"Example showing a lens effect component\",\n    registryDependencies: [\"button\", \"card\", \"@magicui/lens\"],\n    files: [\n      {\n        path: \"example/lens-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"lens-demo-2\",\n    type: \"registry:example\",\n    title: \"Lens Demo 2\",\n    description: \"Second example showing a lens effect component\",\n    registryDependencies: [\"button\", \"card\", \"@magicui/lens\"],\n    files: [\n      {\n        path: \"example/lens-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"lens-demo-3\",\n    type: \"registry:example\",\n    title: \"Lens Demo 3\",\n    description: \"Third example showing a lens effect component\",\n    registryDependencies: [\"button\", \"card\", \"@magicui/lens\"],\n    files: [\n      {\n        path: \"example/lens-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"pointer-demo-1\",\n    type: \"registry:example\",\n    title: \"Pointer Demo 1\",\n    description: \"Example showing a pointer effect component\",\n    registryDependencies: [\"@magicui/pointer\"],\n    files: [\n      {\n        path: \"example/pointer-demo-1.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"smooth-cursor-demo\",\n    description: \"Basic smooth cursor example\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/smooth-cursor\"],\n    files: [\n      {\n        path: \"example/smooth-cursor-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"progressive-blur-demo\",\n    type: \"registry:example\",\n    title: \"Progressive Blur Demo\",\n    description:\n      \"Example showing progressive blur effect for scrollable content.\",\n    registryDependencies: [\"@magicui/progressive-blur\"],\n    files: [\n      {\n        path: \"example/progressive-blur-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"neon-gradient-card-demo\",\n    type: \"registry:example\",\n    title: \"Neon Gradient Card Demo\",\n    description: \"Example showing a beautiful neon card effect.\",\n    registryDependencies: [\"@magicui/neon-gradient-card\"],\n    files: [\n      {\n        path: \"example/neon-gradient-card-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"meteors-demo\",\n    type: \"registry:example\",\n    title: \"Meteors Demo\",\n    description: \"Example showing a meteor shower effect.\",\n    registryDependencies: [\"@magicui/meteors\"],\n    files: [\n      {\n        path: \"example/meteors-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"grid-pattern-demo\",\n    type: \"registry:example\",\n    title: \"Grid Pattern Demo\",\n    description: \"Example showing a background grid pattern made with SVGs.\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [\n      {\n        path: \"example/grid-pattern-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"striped-pattern-demo\",\n    type: \"registry:example\",\n    title: \"Striped Pattern Demo\",\n    description: \"Example showing a background striped pattern made with SVGs.\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [\n      {\n        path: \"example/striped-pattern-demo.tsx\",\n        type: \"registry:example\",\n        target: \"components/striped-pattern-demo.tsx\",\n      },\n    ],\n  },\n  {\n    name: \"striped-pattern-dashed\",\n    type: \"registry:example\",\n    title: \"Striped Pattern (Dashed)\",\n    description:\n      \"Example showing a background striped pattern with a dashed stroke.\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [\n      {\n        path: \"example/striped-pattern-dashed.tsx\",\n        type: \"registry:example\",\n        target: \"components/striped-pattern-dashed.tsx\",\n      },\n    ],\n  },\n  {\n    name: \"striped-pattern-right\",\n    type: \"registry:example\",\n    title: \"Striped Pattern (Right)\",\n    description:\n      \"Example showing a background striped pattern slanting to the right using SVG.\",\n    registryDependencies: [\"@magicui/striped-pattern\"],\n    files: [\n      {\n        path: \"example/striped-pattern-right.tsx\",\n        type: \"registry:example\",\n        target: \"components/striped-pattern-right.tsx\",\n      },\n    ],\n  },\n  {\n    name: \"grid-pattern-linear-gradient\",\n    type: \"registry:example\",\n    title: \"Grid Pattern Linear Gradient\",\n    description: \"Example showing a grid pattern with linear gradient effects.\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [\n      {\n        path: \"example/grid-pattern-linear-gradient.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"grid-pattern-dashed\",\n    type: \"registry:example\",\n    title: \"Grid Pattern Dashed\",\n    description: \"Example showing a dashed grid pattern.\",\n    registryDependencies: [\"@magicui/grid-pattern\"],\n    files: [\n      {\n        path: \"example/grid-pattern-dashed.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dot-pattern-demo\",\n    type: \"registry:example\",\n    title: \"Dot Pattern Demo\",\n    description: \"Example showing a background dot pattern made with SVGs.\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [\n      {\n        path: \"example/dot-pattern-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dot-pattern-linear-gradient\",\n    type: \"registry:example\",\n    title: \"Dot Pattern Linear Gradient\",\n    description: \"Example showing a dot pattern with linear gradient effects.\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [\n      {\n        path: \"example/dot-pattern-linear-gradient.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dot-pattern-with-glow-effect\",\n    type: \"registry:example\",\n    title: \"Dot Pattern with glow effect\",\n    description: \"Example showing a dot pattern with glow effect\",\n    registryDependencies: [\"@magicui/dot-pattern\"],\n    files: [\n      {\n        path: \"example/dot-pattern-with-glow-effect.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"flickering-grid-demo\",\n    type: \"registry:example\",\n    title: \"Flickering Grid Demo\",\n    description: \"Example showing a flickering grid background.\",\n    registryDependencies: [\"@magicui/flickering-grid\"],\n    files: [\n      {\n        path: \"example/flickering-grid-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"flickering-grid-rounded-demo\",\n    type: \"registry:example\",\n    title: \"Flickering Grid Rounded Demo\",\n    description:\n      \"Example showing a flickering grid background with rounded corners.\",\n    registryDependencies: [\"@magicui/flickering-grid\"],\n    files: [\n      {\n        path: \"example/flickering-grid-rounded-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"hero-video-dialog-demo\",\n    type: \"registry:example\",\n    title: \"Hero Video Dialog Demo\",\n    description: \"Example showing a hero video dialog component.\",\n    registryDependencies: [\"@magicui/hero-video-dialog\"],\n    files: [\n      {\n        path: \"example/hero-video-dialog-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"hero-video-dialog-demo-top-in-bottom-out\",\n    type: \"registry:example\",\n    title: \"Hero Video Dialog Top In Bottom Out Demo\",\n    description:\n      \"Example showing a hero video dialog with top-in bottom-out animation.\",\n    registryDependencies: [\"@magicui/hero-video-dialog\"],\n    files: [\n      {\n        path: \"example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"code-comparison-demo\",\n    type: \"registry:example\",\n    title: \"Code Comparison Demo\",\n    description:\n      \"Example showing a component which compares two code snippets.\",\n    registryDependencies: [\"@magicui/code-comparison\"],\n    files: [\n      {\n        path: \"example/code-comparison-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"marquee-demo\",\n    type: \"registry:example\",\n    title: \"Marquee Demo\",\n    description: \"Example showing an infinite scrolling component.\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [\n      {\n        path: \"example/marquee-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"marquee-demo-vertical\",\n    type: \"registry:example\",\n    title: \"Marquee Vertical Demo\",\n    description: \"Example showing a vertical infinite scrolling component.\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [\n      {\n        path: \"example/marquee-demo-vertical.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"marquee-logos\",\n    type: \"registry:example\",\n    title: \"Marquee Logos\",\n    description: \"Example showing an infinite scrolling logo carousel.\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [\n      {\n        path: \"example/marquee-logos.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"marquee-3d\",\n    type: \"registry:example\",\n    title: \"Marquee 3D\",\n    description: \"Example showing a 3D infinite scrolling component.\",\n    registryDependencies: [\"@magicui/marquee\"],\n    files: [\n      {\n        path: \"example/marquee-3d.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"globe-demo\",\n    type: \"registry:example\",\n    title: \"Globe Demo\",\n    description: \"Example showing an autorotating, interactive WebGL globe.\",\n    registryDependencies: [\"@magicui/globe\"],\n    files: [\n      {\n        path: \"example/globe-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"tweet-card-demo\",\n    type: \"registry:example\",\n    title: \"Tweet Card Demo\",\n    description: \"Example showing a tweet card with author info.\",\n    registryDependencies: [\"@magicui/client-tweet-card\", \"@magicui/tweet-card\"],\n    files: [\n      {\n        path: \"example/tweet-card-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"tweet-card-images\",\n    type: \"registry:example\",\n    title: \"Tweet Card Images\",\n    description: \"Example showing a tweet card with images.\",\n    registryDependencies: [\"@magicui/client-tweet-card\", \"@magicui/tweet-card\"],\n    files: [\n      {\n        path: \"example/tweet-card-images.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"tweet-card-meta-preview\",\n    type: \"registry:example\",\n    title: \"Tweet Card Meta Preview\",\n    description: \"Example showing a tweet card with meta preview.\",\n    registryDependencies: [\"@magicui/client-tweet-card\", \"@magicui/tweet-card\"],\n    files: [\n      {\n        path: \"example/tweet-card-meta-preview.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"shimmer-button-demo\",\n    type: \"registry:example\",\n    title: \"Shimmer Button Demo\",\n    description: \"Example showing a button with a shimmering light effect.\",\n    registryDependencies: [\"@magicui/shimmer-button\"],\n    files: [\n      {\n        path: \"example/shimmer-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"bento-demo\",\n    type: \"registry:example\",\n    title: \"Bento Demo\",\n    description: \"Example showing a bento grid layout for showcasing features.\",\n    registryDependencies: [\n      \"button\",\n      \"calendar\",\n      \"@magicui/marquee\",\n      \"@magicui/bento-grid\",\n      \"@magicui/animated-beam\",\n      \"@magicui/animated-list\",\n      \"@magicui/animated-beam-multiple-outputs\",\n      \"@magicui/animated-list-demo\",\n    ],\n    dependencies: [\"@radix-ui/react-icons\"],\n    files: [\n      {\n        path: \"example/bento-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"bento-demo-vertical\",\n    type: \"registry:example\",\n    title: \"Bento Vertical Demo\",\n    description: \"Example showing a vertical bento grid layout.\",\n    registryDependencies: [\"@magicui/bento-grid\"],\n    dependencies: [\"@radix-ui/react-icons\"],\n    files: [\n      {\n        path: \"example/bento-demo-vertical.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"number-ticker-demo\",\n    type: \"registry:example\",\n    title: \"Number Ticker Demo\",\n    description: \"Example showing animated counting numbers.\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [\n      {\n        path: \"example/number-ticker-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"number-ticker-demo-2\",\n    type: \"registry:example\",\n    title: \"Number Ticker Demo 2\",\n    description: \"Example showing animated counting numbers.\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [\n      {\n        path: \"example/number-ticker-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"number-ticker-decimal-demo\",\n    type: \"registry:example\",\n    title: \"Number Ticker Decimal Demo\",\n    description: \"Example showing animated counting decimal numbers.\",\n    registryDependencies: [\"@magicui/number-ticker\"],\n    files: [\n      {\n        path: \"example/number-ticker-decimal-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"ripple-demo\",\n    type: \"registry:example\",\n    title: \"Ripple Demo\",\n    description: \"Example showing an animated ripple effect.\",\n    registryDependencies: [\"@magicui/ripple\"],\n    files: [\n      {\n        path: \"example/ripple-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"retro-grid-demo\",\n    type: \"registry:example\",\n    title: \"Retro Grid Demo\",\n    description: \"Example showing an animated scrolling retro grid effect.\",\n    registryDependencies: [\"@magicui/retro-grid\"],\n    files: [\n      {\n        path: \"example/retro-grid-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-list-demo\",\n    type: \"registry:example\",\n    title: \"Animated List Demo\",\n    description: \"Example showing a list with sequenced item animations.\",\n    registryDependencies: [\"@magicui/animated-list\"],\n    files: [\n      {\n        path: \"example/animated-list-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-shiny-text-demo\",\n    type: \"registry:example\",\n    title: \"Animated Shiny Text Demo\",\n    description: \"Example showing text with a shimmering light effect.\",\n    registryDependencies: [\"@magicui/animated-shiny-text\"],\n    dependencies: [\"@radix-ui/react-icons\"],\n    files: [\n      {\n        path: \"example/animated-shiny-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"particles-demo\",\n    type: \"registry:example\",\n    title: \"Particles Demo\",\n    description: \"Example showing interactive particle effects.\",\n    registryDependencies: [\"@magicui/particles\"],\n    dependencies: [\"next-themes\"],\n    files: [\n      {\n        path: \"example/particles-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-grid-pattern-demo\",\n    type: \"registry:example\",\n    title: \"Animated Grid Pattern Demo\",\n    description: \"Example showing an animated grid pattern background.\",\n    registryDependencies: [\"@magicui/animated-grid-pattern\"],\n    files: [\n      {\n        path: \"example/animated-grid-pattern-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"interactive-grid-pattern-demo\",\n    type: \"registry:example\",\n    title: \"Interactive Grid Pattern Demo\",\n    description: \"Example showing an interactive grid pattern background.\",\n    registryDependencies: [\"@magicui/interactive-grid-pattern\"],\n    files: [\n      {\n        path: \"example/interactive-grid-pattern-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"interactive-grid-pattern-demo-2\",\n    type: \"registry:example\",\n    title: \"Interactive Grid Pattern Demo 2\",\n    description:\n      \"Second example showing an interactive grid pattern background.\",\n    registryDependencies: [\"@magicui/interactive-grid-pattern\"],\n    files: [\n      {\n        path: \"example/interactive-grid-pattern-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"border-beam-demo\",\n    type: \"registry:example\",\n    title: \"Border Beam Demo\",\n    description: \"Example showing an animated border beam effect.\",\n    registryDependencies: [\"@magicui/border-beam\"],\n    files: [\n      {\n        path: \"example/border-beam-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"border-beam-demo-2\",\n    type: \"registry:example\",\n    title: \"Border Beam Demo\",\n    description: \"Example showing an animated border beam effect.\",\n    registryDependencies: [\"button\", \"card\", \"@magicui/border-beam\"],\n    files: [\n      {\n        path: \"example/border-beam-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"border-beam-demo-3\",\n    type: \"registry:example\",\n    title: \"Border Beam Demo 3\",\n    description: \"Example showing an animated border beam effect.\",\n    registryDependencies: [\n      \"button\",\n      \"card\",\n      \"input\",\n      \"label\",\n      \"@magicui/border-beam\",\n    ],\n    files: [\n      {\n        path: \"example/border-beam-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"border-beam-demo-4\",\n    type: \"registry:example\",\n    title: \"Border Beam Demo 4\",\n    description: \"Example showing an animated border beam effect.\",\n    registryDependencies: [\"button\", \"@magicui/border-beam\"],\n    files: [\n      {\n        path: \"example/border-beam-demo-4.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam-demo\",\n    type: \"registry:example\",\n    title: \"Animated Beam Demo\",\n    description: \"Example showing an animated beam of light effect.\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    dependencies: [\"@radix-ui/react-icons\"],\n    files: [\n      {\n        path: \"example/animated-beam-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam-unidirectional\",\n    type: \"registry:example\",\n    title: \"Animated Beam Unidirectional\",\n    description: \"Example showing a unidirectional animated beam effect.\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [\n      {\n        path: \"example/animated-beam-unidirectional.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam-bidirectional\",\n    type: \"registry:example\",\n    title: \"Animated Beam Bidirectional\",\n    description: \"Example showing a bidirectional animated beam effect.\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [\n      {\n        path: \"example/animated-beam-bidirectional.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam-multiple-inputs\",\n    type: \"registry:example\",\n    title: \"Animated Beam Multiple Inputs\",\n    description: \"Example showing animated beams with multiple input points.\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [\n      {\n        path: \"example/animated-beam-multiple-inputs.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam-multiple-outputs\",\n    type: \"registry:example\",\n    title: \"Animated Beam Multiple Outputs\",\n    description: \"Example showing animated beams with multiple output points.\",\n    registryDependencies: [\"@magicui/animated-beam\"],\n    files: [\n      {\n        path: \"example/animated-beam-multiple-outputs.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-reveal-demo\",\n    type: \"registry:example\",\n    title: \"Text Reveal Demo\",\n    description: \"Example showing text that fades in on scroll.\",\n    registryDependencies: [\"@magicui/text-reveal\"],\n    files: [\n      {\n        path: \"example/text-reveal-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-gradient-text-demo\",\n    type: \"registry:example\",\n    title: \"Animated Gradient Text Demo\",\n    description: \"Example showing text with animated gradient backgrounds.\",\n    registryDependencies: [\"@magicui/animated-gradient-text\"],\n    dependencies: [\"lucide-react\"],\n    files: [\n      {\n        path: \"example/animated-gradient-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-gradient-text-demo-2\",\n    type: \"registry:example\",\n    title: \"Animated Gradient Text Demo 2\",\n    description:\n      \"Second example showing text with animated gradient backgrounds.\",\n    registryDependencies: [\"@magicui/animated-gradient-text\"],\n    files: [\n      {\n        path: \"example/animated-gradient-text-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"orbiting-circles-demo\",\n    type: \"registry:example\",\n    title: \"Orbiting Circles Demo\",\n    description: \"Example showing circles moving in orbital paths.\",\n    registryDependencies: [\"@magicui/orbiting-circles\"],\n    dependencies: [\"@radix-ui/react-icons\"],\n    files: [\n      {\n        path: \"example/orbiting-circles-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dock-demo\",\n    type: \"registry:example\",\n    title: \"Dock Demo\",\n    description: \"Example showing a MacOS-style dock implementation.\",\n    dependencies: [\"next-themes\"],\n    registryDependencies: [\"button\", \"@magicui/dock\"],\n    files: [\n      {\n        path: \"example/dock-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dock-demo-2\",\n    type: \"registry:example\",\n    title: \"Dock Demo 2\",\n    description: \"Second example showing a MacOS-style dock implementation.\",\n    registryDependencies: [\"@magicui/dock\"],\n    files: [\n      {\n        path: \"example/dock-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dock-demo-3\",\n    type: \"registry:example\",\n    title: \"Dock Demo 3\",\n    description: \"Third example showing a MacOS-style dock implementation.\",\n    registryDependencies: [\"@magicui/dock\"],\n    files: [\n      {\n        path: \"example/dock-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"word-rotate-demo\",\n    type: \"registry:example\",\n    title: \"Word Rotate Demo\",\n    description: \"Example showing vertical word rotation animation.\",\n    registryDependencies: [\"@magicui/word-rotate\"],\n    files: [\n      {\n        path: \"example/word-rotate-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"hyper-text-demo\",\n    type: \"registry:example\",\n    title: \"Hyper Text Demo\",\n    description: \"Example showing text with scrambling letter animations.\",\n    registryDependencies: [\"@magicui/hyper-text\"],\n    files: [\n      {\n        path: \"example/hyper-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"avatar-circles-demo\",\n    type: \"registry:example\",\n    title: \"Avatar Circles Demo\",\n    description: \"Example showing overlapping avatar circles.\",\n    registryDependencies: [\"@magicui/avatar-circles\"],\n    files: [\n      {\n        path: \"example/avatar-circles-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo\",\n    type: \"registry:example\",\n    title: \"Typing Animation Demo\",\n    description: \"Example showing typed character animations.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-2\",\n    type: \"registry:example\",\n    title: \"Typing Animation Multiple Words\",\n    description: \"Example showing multiple words with looping.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-3\",\n    type: \"registry:example\",\n    title: \"Typing Animation Custom Speed\",\n    description: \"Example showing custom typing and deleting speeds.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-4\",\n    type: \"registry:example\",\n    title: \"Typing Animation Start on View\",\n    description: \"Example showing animation that starts when in viewport.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-4.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-5\",\n    type: \"registry:example\",\n    title: \"Typing Animation Without Cursor\",\n    description: \"Example showing typing animation without cursor.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-5.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-6\",\n    type: \"registry:example\",\n    title: \"Typing Animation Single Play\",\n    description: \"Example showing single play without looping.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-6.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-7\",\n    type: \"registry:example\",\n    title: \"Typing Animation Cursor Blinking\",\n    description: \"Example showing cursor blinking control.\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-7.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation-demo-8\",\n    type: \"registry:example\",\n    title: \"Typing Animation Cursor Styles\",\n    description:\n      \"Example showing different cursor styles (line, block, underscore).\",\n    registryDependencies: [\"@magicui/typing-animation\"],\n    files: [\n      {\n        path: \"example/typing-animation-demo-8.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"scroll-based-velocity-demo\",\n    type: \"registry:example\",\n    title: \"Scroll Based Velocity Demo\",\n    description: \"Example showing text speed changes based on scroll velocity.\",\n    registryDependencies: [\"@magicui/scroll-based-velocity\"],\n    files: [\n      {\n        path: \"example/scroll-based-velocity-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"scroll-based-velocity-images-demo\",\n    type: \"registry:example\",\n    title: \"Scroll Based Velocity Images\",\n    description:\n      \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n    registryDependencies: [\"@magicui/scroll-based-velocity\"],\n    files: [\n      {\n        path: \"example/scroll-based-velocity-images-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"sparkles-text-demo\",\n    type: \"registry:example\",\n    title: \"Sparkles Text Demo\",\n    description: \"Example showing text with animated sparkle effects.\",\n    registryDependencies: [\"@magicui/sparkles-text\"],\n    files: [\n      {\n        path: \"example/sparkles-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"spinning-text-demo\",\n    type: \"registry:example\",\n    title: \"Spinning Text Demo\",\n    description: \"Example showing spinning text animation.\",\n    registryDependencies: [\"@magicui/spinning-text\"],\n    files: [\n      {\n        path: \"example/spinning-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"spinning-text-demo-2\",\n    type: \"registry:example\",\n    title: \"Spinning Text Demo 2\",\n    description: \"Example showing spinning text animation.\",\n    registryDependencies: [\"@magicui/spinning-text\"],\n    files: [\n      {\n        path: \"example/spinning-text-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"comic-text-demo\",\n    type: \"registry:example\",\n    title: \"Comic Text Demo\",\n    description: \"Example showing comic text animation.\",\n    registryDependencies: [\"@magicui/comic-text\"],\n    files: [\n      {\n        path: \"example/comic-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"icon-cloud-demo\",\n    type: \"registry:example\",\n    title: \"Icon Cloud Demo\",\n    description: \"Example showing an interactive 3D icon cloud.\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [\n      {\n        path: \"example/icon-cloud-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"icon-cloud-demo-2\",\n    type: \"registry:example\",\n    title: \"Icon Cloud Demo 2\",\n    description: \"Second example showing an interactive 3D icon cloud.\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [\n      {\n        path: \"example/icon-cloud-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"icon-cloud-demo-3\",\n    type: \"registry:example\",\n    title: \"Icon Cloud Demo 3\",\n    description: \"Third example showing an interactive 3D icon cloud.\",\n    registryDependencies: [\"@magicui/icon-cloud\"],\n    files: [\n      {\n        path: \"example/icon-cloud-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo\",\n    description: \"Example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-2\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 2\",\n    description: \"Second example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-3\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 3\",\n    description: \"Third example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-4\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 4\",\n    description: \"Fourth example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-4.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-5\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 5\",\n    description: \"Fifth example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-5.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-6\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 6\",\n    description: \"Sixth example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-6.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-7\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 7\",\n    description: \"Seventh example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-7.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-8\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 8\",\n    description: \"Eighth example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-8.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate-demo-9\",\n    type: \"registry:example\",\n    title: \"Text Animate Demo 9\",\n    description: \"Ninth example showing various text animations.\",\n    registryDependencies: [\"@magicui/text-animate\"],\n    files: [\n      {\n        path: \"example/text-animate-demo-9.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"shiny-button-demo\",\n    type: \"registry:example\",\n    title: \"Shiny Button Demo\",\n    description: \"Example showing a shiny button with dynamic styles.\",\n    registryDependencies: [\"@magicui/shiny-button\"],\n    files: [\n      {\n        path: \"example/shiny-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"animated-circular-progress-bar-demo\",\n    type: \"registry:example\",\n    title: \"Animated Circular Progress Bar Demo\",\n    description: \"Example showing an animated circular progress gauge.\",\n    registryDependencies: [\"@magicui/animated-circular-progress-bar\"],\n    files: [\n      {\n        path: \"example/animated-circular-progress-bar-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"shine-border-demo\",\n    type: \"registry:example\",\n    title: \"Shine Border Demo\",\n    description: \"Example showing an animated shining border effect.\",\n    registryDependencies: [\"@magicui/shine-border\"],\n    files: [\n      {\n        path: \"example/shine-border-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"shine-border-demo-2\",\n    type: \"registry:example\",\n    title: \"Shine Border Demo 2\",\n    description: \"Second example showing an animated shining border effect.\",\n    registryDependencies: [\"@magicui/shine-border\"],\n    files: [\n      {\n        path: \"example/shine-border-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-demo\",\n    type: \"registry:example\",\n    title: \"Confetti Demo\",\n    description: \"Example showing confetti animations for celebrations.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-basic-cannon\",\n    type: \"registry:example\",\n    title: \"Confetti Basic Cannon\",\n    description: \"Example showing basic confetti cannon animation.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-basic-cannon.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-random-direction\",\n    type: \"registry:example\",\n    title: \"Confetti Random Direction\",\n    description: \"Example showing confetti with random directions.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-random-direction.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-fireworks\",\n    type: \"registry:example\",\n    title: \"Confetti Fireworks\",\n    description: \"Example showing fireworks-style confetti animation.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-fireworks.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-stars\",\n    type: \"registry:example\",\n    title: \"Confetti Stars\",\n    description: \"Example showing star-shaped confetti animation.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-stars.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-side-cannons\",\n    type: \"registry:example\",\n    title: \"Confetti Side Cannons\",\n    description: \"Example showing side-mounted confetti cannons.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-side-cannons.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-custom-shapes\",\n    type: \"registry:example\",\n    title: \"Confetti Custom Shapes\",\n    description: \"Example showing confetti with custom shape particles.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-custom-shapes.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"confetti-emoji\",\n    type: \"registry:example\",\n    title: \"Confetti Emoji\",\n    description: \"Example showing confetti with emoji particles.\",\n    registryDependencies: [\"@magicui/confetti\"],\n    files: [\n      {\n        path: \"example/confetti-emoji.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"cool-mode-demo\",\n    type: \"registry:example\",\n    title: \"Cool Mode Demo\",\n    description: \"Example showing cool mode effect for buttons and links.\",\n    registryDependencies: [\"@magicui/cool-mode\"],\n    files: [\n      {\n        path: \"example/cool-mode-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"cool-mode-custom\",\n    type: \"registry:example\",\n    title: \"Cool Mode Custom\",\n    description: \"Example showing customized cool mode effects.\",\n    registryDependencies: [\"@magicui/cool-mode\"],\n    files: [\n      {\n        path: \"example/cool-mode-custom.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"pulsating-button-demo\",\n    type: \"registry:example\",\n    title: \"Pulsating Button Demo\",\n    description: \"Example showing an animated pulsating button.\",\n    registryDependencies: [\"@magicui/pulsating-button\"],\n    files: [\n      {\n        path: \"example/pulsating-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"ripple-button-demo\",\n    type: \"registry:example\",\n    title: \"Ripple Button Demo\",\n    description: \"Example showing an animated button with ripple effect.\",\n    registryDependencies: [\"@magicui/ripple-button\"],\n    files: [\n      {\n        path: \"example/ripple-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"file-tree-demo\",\n    type: \"registry:example\",\n    title: \"File Tree Demo\",\n    description:\n      \"Example showing a component that displays folder and file structure.\",\n    registryDependencies: [\"@magicui/file-tree\"],\n    files: [\n      {\n        path: \"example/file-tree-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"blur-fade-demo\",\n    type: \"registry:example\",\n    title: \"Blur Fade Demo\",\n    description: \"Example showing blur fade in and out animations.\",\n    registryDependencies: [\"@magicui/blur-fade\"],\n    files: [\n      {\n        path: \"example/blur-fade-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"blur-fade-text-demo\",\n    type: \"registry:example\",\n    title: \"Blur Fade Text Demo\",\n    description: \"Example showing blur fade animations with text.\",\n    registryDependencies: [\"@magicui/blur-fade\"],\n    files: [\n      {\n        path: \"example/blur-fade-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"safari-demo\",\n    type: \"registry:example\",\n    title: \"Safari Demo\",\n    description: \"Example showing a Safari browser mockup.\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [\n      {\n        path: \"example/safari-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"safari-demo-2\",\n    type: \"registry:example\",\n    title: \"Safari Demo 2\",\n    description: \"Second example showing a Safari browser mockup.\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [\n      {\n        path: \"example/safari-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"safari-demo-3\",\n    type: \"registry:example\",\n    title: \"Safari Demo 3\",\n    description: \"Third example showing a Safari browser mockup.\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [\n      {\n        path: \"example/safari-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"safari-demo-4\",\n    type: \"registry:example\",\n    title: \"Safari Demo 4\",\n    description: \"Fourth example showing a Safari browser mockup.\",\n    registryDependencies: [\"@magicui/safari\"],\n    files: [\n      {\n        path: \"example/safari-demo-4.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"iphone-demo\",\n    type: \"registry:example\",\n    title: \"iPhone Demo\",\n    description: \"Example showing an iPhone mockup.\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [\n      {\n        path: \"example/iphone-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"iphone-demo-2\",\n    type: \"registry:example\",\n    title: \"iPhone Demo 2\",\n    description: \"Second example showing an iPhone mockup.\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [\n      {\n        path: \"example/iphone-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"iphone-demo-3\",\n    type: \"registry:example\",\n    title: \"iPhone Demo 3\",\n    description: \"Third example showing an iPhone mockup.\",\n    registryDependencies: [\"@magicui/iphone\"],\n    files: [\n      {\n        path: \"example/iphone-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"rainbow-button-demo\",\n    type: \"registry:example\",\n    title: \"Rainbow Button Demo\",\n    description: \"Example showing an animated button with rainbow effect.\",\n    registryDependencies: [\"@magicui/rainbow-button\"],\n    files: [\n      {\n        path: \"example/rainbow-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"rainbow-button-demo-2\",\n    type: \"registry:example\",\n    title: \"Rainbow Button Demo 2\",\n    description: \"Example showing an animated button with rainbow effect.\",\n    registryDependencies: [\"@magicui/rainbow-button\"],\n    files: [\n      {\n        path: \"example/rainbow-button-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"interactive-hover-button-demo\",\n    type: \"registry:example\",\n    title: \"Interactive Hover Button Demo\",\n    description: \"Example showing an interactive button with hover effects.\",\n    registryDependencies: [\"@magicui/interactive-hover-button\"],\n    files: [\n      {\n        path: \"example/interactive-hover-button-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"terminal-demo\",\n    type: \"registry:example\",\n    title: \"Terminal Demo\",\n    description: \"Example showing a terminal with animated text.\",\n    registryDependencies: [\"@magicui/terminal\"],\n    files: [\n      {\n        path: \"example/terminal-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"terminal-demo-2\",\n    type: \"registry:example\",\n    title: \"Terminal Demo\",\n    description:\n      \"Example showing a terminal with animated text and custom delays\",\n    registryDependencies: [\"@magicui/terminal\"],\n    files: [\n      {\n        path: \"example/terminal-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"video-text-demo\",\n    type: \"registry:example\",\n    title: \"Video Text Demo\",\n    description: \"Example showing text with a video background.\",\n    registryDependencies: [\"@magicui/video-text\"],\n    files: [\n      {\n        path: \"example/video-text-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"pixel-image-demo\",\n    type: \"registry:example\",\n    title: \"Pixel Image Demo\",\n    description: \"Example showing a pixelated image effect.\",\n    registryDependencies: [\"@magicui/pixel-image\"],\n    files: [\n      {\n        path: \"example/pixel-image-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"highlighter-demo\",\n    type: \"registry:example\",\n    title: \"Highlighter Demo\",\n    description: \"Example showing the demo of a Highlighter\",\n    registryDependencies: [\"@magicui/highlighter\"],\n    files: [\n      {\n        path: \"example/highlighter-demo.tsx\",\n        type: \"registry:example\",\n      },\n      {\n        path: \"magicui/highlighter.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    dependencies: [\"rough-notation\"],\n  },\n  {\n    name: \"animated-theme-toggler-demo\",\n    type: \"registry:example\",\n    title: \"Animated Theme Toggler Demo\",\n    description: \"Example showing animation while changing the theme.\",\n    registryDependencies: [\"@magicui/animated-theme-toggler\"],\n    files: [\n      {\n        path: \"example/animated-theme-toggler-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"light-rays-demo\",\n    description:\n      \"Demo of the light-rays component showcasing animated light rays\",\n    type: \"registry:example\",\n    registryDependencies: [\"@magicui/light-rays\"],\n    files: [\n      {\n        path: \"example/light-rays-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dotted-map-demo\",\n    type: \"registry:example\",\n    title: \"Dotted Map Demo\",\n    description: \"Example showing a dotted map.\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    dependencies: [\"countries-list\"],\n    files: [\n      {\n        path: \"example/dotted-map-demo.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dotted-map-demo-2\",\n    type: \"registry:example\",\n    title: \"Dotted Map Demo 2\",\n    description: \"Example showing a dotted map.\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    files: [\n      {\n        path: \"example/dotted-map-demo-2.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n  {\n    name: \"dotted-map-demo-3\",\n    type: \"registry:example\",\n    title: \"Dotted Map Demo 3\",\n    description: \"Example showing a dotted map with pulse animation.\",\n    registryDependencies: [\"@magicui/dotted-map\"],\n    files: [\n      {\n        path: \"example/dotted-map-demo-3.tsx\",\n        type: \"registry:example\",\n      },\n    ],\n  },\n]\n"
  },
  {
    "path": "apps/www/registry/registry-lib.ts",
    "content": "import { type Registry } from \"shadcn/schema\"\n\nexport const lib: Registry[\"items\"] = [\n  {\n    name: \"utils\",\n    type: \"registry:lib\",\n    dependencies: [\"clsx\", \"tailwind-merge\"],\n    files: [\n      {\n        path: \"lib/utils.ts\",\n        type: \"registry:lib\",\n      },\n    ],\n  },\n]\n"
  },
  {
    "path": "apps/www/registry/registry-ui.ts",
    "content": "import { type Registry } from \"shadcn/schema\"\n\nexport const ui: Registry[\"items\"] = [\n  {\n    name: \"magic-card\",\n    type: \"registry:ui\",\n    title: \"Magic Card\",\n    description:\n      \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n    dependencies: [\"motion\", \"next-themes\"],\n    files: [\n      {\n        path: \"magicui/magic-card.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"android\",\n    type: \"registry:ui\",\n    title: \"Android\",\n    description: \"A mockup of an Android device.\",\n    files: [\n      {\n        path: \"magicui/android.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"warp-background\",\n    type: \"registry:ui\",\n    title: \"Warp Background\",\n    description: \"A card with a time warping background effect.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/warp-background.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"line-shadow-text\",\n    type: \"registry:ui\",\n    title: \"Line Shadow Text\",\n    description: \"A text component with a moving line shadow.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/line-shadow-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-line-shadow\": \"line-shadow 15s linear infinite\",\n      },\n    },\n    css: {\n      \"@keyframes line-shadow\": {\n        \"0%\": {\n          \"background-position\": \"0 0\",\n        },\n        \"100%\": {\n          \"background-position\": \"100% -100%\",\n        },\n      },\n    },\n  },\n  {\n    name: \"aurora-text\",\n    type: \"registry:ui\",\n    title: \"Aurora Text\",\n    description: \"A beautiful aurora text effect\",\n    files: [\n      {\n        path: \"magicui/aurora-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\",\n      },\n    },\n    css: {\n      \"@keyframes aurora\": {\n        \"0%\": {\n          \"background-position\": \"0% 50%\",\n          transform: \"rotate(-5deg) scale(0.9)\",\n        },\n        \"25%\": {\n          \"background-position\": \"50% 100%\",\n          transform: \"rotate(5deg) scale(1.1)\",\n        },\n        \"50%\": {\n          \"background-position\": \"100% 50%\",\n          transform: \"rotate(-3deg) scale(0.95)\",\n        },\n        \"75%\": {\n          \"background-position\": \"50% 0%\",\n          transform: \"rotate(3deg) scale(1.05)\",\n        },\n        \"100%\": {\n          \"background-position\": \"0% 50%\",\n          transform: \"rotate(-5deg) scale(0.9)\",\n        },\n      },\n    },\n  },\n  {\n    name: \"morphing-text\",\n    type: \"registry:ui\",\n    title: \"Morphing Text\",\n    description: \"A dynamic text morphing component for Magic UI.\",\n    files: [\n      {\n        path: \"magicui/morphing-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"scroll-progress\",\n    type: \"registry:ui\",\n    title: \"Scroll Progress\",\n    description: \"Animated Scroll Progress for your pages\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/scroll-progress.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"lens\",\n    type: \"registry:ui\",\n    title: \"Lens\",\n    description:\n      \"A interactive component that enables zooming into images, videos and other elements.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/lens.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"pointer\",\n    type: \"registry:ui\",\n    title: \"Pointer\",\n    description:\n      \"A component that displays a pointer when hovering over an element\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/pointer.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"smooth-cursor\",\n    description:\n      \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n    type: \"registry:ui\",\n    files: [\n      {\n        path: \"magicui/smooth-cursor.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    dependencies: [\"framer-motion\"],\n  },\n  {\n    name: \"progressive-blur\",\n    type: \"registry:ui\",\n    title: \"Progressive Blur\",\n    description:\n      \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n    files: [\n      {\n        path: \"magicui/progressive-blur.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"neon-gradient-card\",\n    type: \"registry:ui\",\n    title: \"Neon Gradient Card\",\n    description: \"A beautiful neon card effect\",\n    files: [\n      {\n        path: \"magicui/neon-gradient-card.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-background-position-spin\":\n          \"background-position-spin 3000ms infinite alternate\",\n      },\n    },\n    css: {\n      \"@keyframes background-position-spin\": {\n        \"0%\": { \"background-position\": \"top center\" },\n        \"100%\": { \"background-position\": \"bottom center\" },\n      },\n    },\n  },\n  {\n    name: \"meteors\",\n    type: \"registry:ui\",\n    title: \"Meteors\",\n    description: \"A meteor shower effect.\",\n    files: [\n      {\n        path: \"magicui/meteors.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-meteor\": \"meteor 5s linear infinite\",\n      },\n    },\n    css: {\n      \"@keyframes meteor\": {\n        \"0%\": {\n          transform: \"rotate(var(--angle)) translateX(0)\",\n          opacity: \"1\",\n        },\n        \"70%\": { opacity: \"1\" },\n        \"100%\": {\n          transform: \"rotate(var(--angle)) translateX(-500px)\",\n          opacity: \"0\",\n        },\n      },\n    },\n  },\n  {\n    name: \"grid-pattern\",\n    type: \"registry:ui\",\n    title: \"Grid Pattern\",\n    description:\n      \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    files: [\n      {\n        path: \"magicui/grid-pattern.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"striped-pattern\",\n    type: \"registry:ui\",\n    title: \"Striped Pattern\",\n    description:\n      \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    files: [\n      {\n        path: \"magicui/striped-pattern.tsx\",\n        type: \"registry:ui\",\n        target: \"components/magicui/striped-pattern.tsx\",\n      },\n    ],\n  },\n  {\n    name: \"interactive-grid-pattern\",\n    type: \"registry:ui\",\n    title: \"Interactive Grid Pattern\",\n    description:\n      \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    files: [\n      {\n        path: \"magicui/interactive-grid-pattern.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"dot-pattern\",\n    type: \"registry:ui\",\n    title: \"Dot Pattern\",\n    description:\n      \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    files: [\n      {\n        path: \"magicui/dot-pattern.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"flickering-grid\",\n    type: \"registry:ui\",\n    title: \"Flickering Grid\",\n    description:\n      \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n    files: [\n      {\n        path: \"magicui/flickering-grid.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"hero-video-dialog\",\n    type: \"registry:ui\",\n    title: \"Hero Video Dialog\",\n    description: \"A hero video dialog component.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/hero-video-dialog.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"code-comparison\",\n    type: \"registry:ui\",\n    title: \"Code Comparison\",\n    description: \"A component which compares two code snippets.\",\n    dependencies: [\"shiki\", \"next-themes\"],\n    files: [\n      {\n        path: \"magicui/code-comparison.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"marquee\",\n    type: \"registry:ui\",\n    title: \"Marquee\",\n    description:\n      \"An infinite scrolling component that can be used to display text, images, or videos.\",\n    files: [\n      {\n        path: \"magicui/marquee.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n        \"animate-marquee-vertical\":\n          \"marquee-vertical var(--duration) linear infinite\",\n      },\n    },\n    css: {\n      \"@keyframes marquee\": {\n        from: {\n          transform: \"translateX(0)\",\n        },\n        to: {\n          transform: \"translateX(calc(-100% - var(--gap)))\",\n        },\n      },\n      \"@keyframes marquee-vertical\": {\n        from: {\n          transform: \"translateY(0)\",\n        },\n        to: {\n          transform: \"translateY(calc(-100% - var(--gap)))\",\n        },\n      },\n    },\n  },\n  {\n    name: \"globe\",\n    type: \"registry:ui\",\n    title: \"Globe\",\n    description:\n      \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n    dependencies: [\"cobe\", \"motion\"],\n    files: [\n      {\n        path: \"magicui/globe.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"shimmer-button\",\n    type: \"registry:ui\",\n    title: \"Shimmer Button\",\n    description:\n      \"A button with a shimmering light which travels around the perimeter.\",\n    files: [\n      {\n        path: \"magicui/shimmer-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-shimmer-slide\":\n          \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n        \"animate-spin-around\":\n          \"spin-around calc(var(--speed) * 2) infinite linear\",\n      },\n    },\n    css: {\n      \"@keyframes shimmer-slide\": {\n        to: {\n          transform: \"translate(calc(100cqw - 100%), 0)\",\n        },\n      },\n      \"@keyframes spin-around\": {\n        \"0%\": {\n          transform: \"translateZ(0) rotate(0)\",\n        },\n        \"15%, 35%\": {\n          transform: \"translateZ(0) rotate(90deg)\",\n        },\n        \"65%, 85%\": {\n          transform: \"translateZ(0) rotate(270deg)\",\n        },\n        \"100%\": {\n          transform: \"translateZ(0) rotate(360deg)\",\n        },\n      },\n    },\n  },\n  {\n    name: \"tweet-card\",\n    type: \"registry:ui\",\n    title: \"Tweet Card\",\n    description:\n      \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n    dependencies: [\"react-tweet\"],\n    files: [\n      {\n        path: \"magicui/tweet-card.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"client-tweet-card\",\n    type: \"registry:ui\",\n    title: \"Client Tweet Card\",\n    description:\n      \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n    dependencies: [\"react-tweet\"],\n    files: [\n      {\n        path: \"magicui/client-tweet-card.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"bento-grid\",\n    type: \"registry:ui\",\n    title: \"Bento Grid\",\n    description:\n      \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n    dependencies: [\"@radix-ui/react-icons\"],\n    registryDependencies: [\"button\"],\n    files: [\n      {\n        path: \"magicui/bento-grid.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"particles\",\n    type: \"registry:ui\",\n    title: \"Particles\",\n    description:\n      \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n    files: [\n      {\n        path: \"magicui/particles.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"number-ticker\",\n    type: \"registry:ui\",\n    title: \"Number Ticker\",\n    description: \"Animate numbers to count up or down to a target number\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/number-ticker.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"ripple\",\n    type: \"registry:ui\",\n    title: \"Ripple\",\n    description:\n      \"An animated ripple effect typically used behind elements to emphasize them.\",\n    files: [\n      {\n        path: \"magicui/ripple.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-ripple\":\n          \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\",\n      },\n    },\n    css: {\n      \"@keyframes ripple\": {\n        \"0%, 100%\": {\n          transform: \"translate(-50%, -50%) scale(1)\",\n        },\n        \"50%\": {\n          transform: \"translate(-50%, -50%) scale(0.9)\",\n        },\n      },\n    },\n  },\n  {\n    name: \"retro-grid\",\n    type: \"registry:ui\",\n    title: \"Retro Grid\",\n    description: \"An animated scrolling retro grid effect\",\n    files: [\n      {\n        path: \"magicui/retro-grid.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"animated-list\",\n    type: \"registry:ui\",\n    title: \"Animated List\",\n    description:\n      \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/animated-list.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"animated-shiny-text\",\n    type: \"registry:ui\",\n    title: \"Animated Shiny Text\",\n    description:\n      \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n    files: [\n      {\n        path: \"magicui/animated-shiny-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n\n    cssVars: {\n      theme: {\n        \"animate-shiny-text\": \"shiny-text 8s infinite\",\n      },\n    },\n    css: {\n      \"@keyframes shiny-text\": {\n        \"0%, 90%, 100%\": {\n          \"background-position\": \"calc(-100% - var(--shiny-width)) 0\",\n        },\n        \"30%, 60%\": {\n          \"background-position\": \"calc(100% + var(--shiny-width)) 0\",\n        },\n      },\n    },\n  },\n  {\n    name: \"animated-grid-pattern\",\n    type: \"registry:ui\",\n    title: \"Animated Grid Pattern\",\n    description:\n      \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/animated-grid-pattern.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"border-beam\",\n    type: \"registry:ui\",\n    title: \"Border Beam\",\n    description:\n      \"An animated beam of light which travels along the border of its container.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/border-beam.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"animated-beam\",\n    type: \"registry:ui\",\n    title: \"Animated Beam\",\n    description:\n      \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/animated-beam.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"text-reveal\",\n    type: \"registry:ui\",\n    title: \"Text Reveal\",\n    description: \"Fade in text as you scroll down the page.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/text-reveal.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"hyper-text\",\n    type: \"registry:ui\",\n    title: \"Hyper Text\",\n    description:\n      \"A text animation that scrambles letters before revealing the final text.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/hyper-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"animated-gradient-text\",\n    type: \"registry:ui\",\n    title: \"Animated Gradient Text\",\n    description:\n      \"An animated gradient background which transitions between colors for text.\",\n    files: [\n      {\n        path: \"magicui/animated-gradient-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-gradient\": \"gradient 8s linear infinite\",\n      },\n    },\n    css: {\n      \"@keyframes gradient\": {\n        to: {\n          \"background-position\": \"var(--bg-size, 300%) 0\",\n        },\n      },\n    },\n  },\n  {\n    name: \"orbiting-circles\",\n    type: \"registry:ui\",\n    title: \"Orbiting Circles\",\n    description:\n      \"A collection of circles which move in orbit along a circular path\",\n    files: [\n      {\n        path: \"magicui/orbiting-circles.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\",\n      },\n    },\n    css: {\n      \"@keyframes orbit\": {\n        \"0%\": {\n          transform:\n            \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\",\n        },\n        \"100%\": {\n          transform:\n            \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\",\n        },\n      },\n    },\n  },\n  {\n    name: \"dock\",\n    type: \"registry:ui\",\n    title: \"Dock\",\n    description:\n      \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/dock.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"word-rotate\",\n    type: \"registry:ui\",\n    title: \"Word Rotate\",\n    description: \"A vertical rotation of words\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/word-rotate.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"avatar-circles\",\n    type: \"registry:ui\",\n    title: \"Avatar Circles\",\n    description: \"Overlapping circles of avatars.\",\n    files: [\n      {\n        path: \"magicui/avatar-circles.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"typing-animation\",\n    type: \"registry:ui\",\n    title: \"Typing Animation\",\n    description: \"Characters appearing in typed animation\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/typing-animation.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-blink-cursor\": \"blink-cursor 1.2s step-end infinite\",\n      },\n    },\n    css: {\n      \"@keyframes blink-cursor\": {\n        \"0%, 49%\": {\n          opacity: \"1\",\n        },\n        \"50%, 100%\": {\n          opacity: \"0\",\n        },\n      },\n    },\n  },\n  {\n    name: \"sparkles-text\",\n    type: \"registry:ui\",\n    title: \"Sparkles Text\",\n    description:\n      \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/sparkles-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"spinning-text\",\n    type: \"registry:ui\",\n    title: \"Spinning Text\",\n    description:\n      \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/spinning-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"comic-text\",\n    type: \"registry:ui\",\n    title: \"Comic Text\",\n    description: \"Comic text animation\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/comic-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"icon-cloud\",\n    type: \"registry:ui\",\n    title: \"Icon Cloud\",\n    description: \"An interactive 3D tag cloud component\",\n    dependencies: [],\n    files: [\n      {\n        path: \"magicui/icon-cloud.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"text-animate\",\n    type: \"registry:ui\",\n    title: \"Text Animate\",\n    description:\n      \"A text animation component that animates text using a variety of different animations.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/text-animate.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"scroll-based-velocity\",\n    type: \"registry:ui\",\n    title: \"Scroll Based Velocity\",\n    description: \"Scrolling text whose speed changes based on scroll speed\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/scroll-based-velocity.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"shiny-button\",\n    type: \"registry:ui\",\n    title: \"Shiny Button\",\n    description:\n      \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/shiny-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"shine-border\",\n    type: \"registry:ui\",\n    title: \"Shine Border\",\n    description: \"Shine border is an animated background border effect.\",\n    files: [\n      {\n        path: \"magicui/shine-border.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-shine\": \"shine var(--duration) infinite linear\",\n      },\n    },\n    css: {\n      \"@keyframes shine\": {\n        \"0%\": {\n          \"background-position\": \"0% 0%\",\n        },\n        \"50%\": {\n          \"background-position\": \"100% 100%\",\n        },\n        to: {\n          \"background-position\": \"0% 0%\",\n        },\n      },\n    },\n  },\n  {\n    name: \"animated-circular-progress-bar\",\n    type: \"registry:ui\",\n    title: \"Animated Circular Progress Bar\",\n    description:\n      \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n    files: [\n      {\n        path: \"magicui/animated-circular-progress-bar.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"confetti\",\n    type: \"registry:ui\",\n    title: \"Confetti\",\n    description:\n      \"Confetti animations are best used to delight your users when something special happens\",\n    dependencies: [\"canvas-confetti\", \"@types/canvas-confetti\"],\n    registryDependencies: [\"button\"],\n    files: [\n      {\n        path: \"magicui/confetti.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"cool-mode\",\n    type: \"registry:ui\",\n    title: \"Cool Mode\",\n    description: \"Cool mode effect for buttons, links, and other DOMs\",\n    files: [\n      {\n        path: \"magicui/cool-mode.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"pulsating-button\",\n    type: \"registry:ui\",\n    title: \"Pulsating Button\",\n    description:\n      \"An animated pulsating button useful for capturing attention of users.\",\n    files: [\n      {\n        path: \"magicui/pulsating-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-pulse\": \"pulse var(--duration) ease-out infinite\",\n      },\n    },\n    css: {\n      \"@keyframes pulse\": {\n        \"0%, 100%\": { boxShadow: \"0 0 0 0 var(--pulse-color)\" },\n        \"50%\": { boxShadow: \"0 0 0 8px var(--pulse-color)\" },\n      },\n    },\n  },\n  {\n    name: \"ripple-button\",\n    type: \"registry:ui\",\n    title: \"Ripple Button\",\n    description: \"An animated button with ripple useful for user engagement.\",\n    files: [\n      {\n        path: \"magicui/ripple-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      theme: {\n        \"animate-rippling\": \"rippling var(--duration) ease-out\",\n      },\n    },\n    css: {\n      \"@keyframes rippling\": {\n        \"0%\": {\n          opacity: \"1\",\n        },\n        \"100%\": {\n          transform: \"scale(2)\",\n          opacity: \"0\",\n        },\n      },\n    },\n  },\n  {\n    name: \"file-tree\",\n    type: \"registry:ui\",\n    title: \"File Tree\",\n    description:\n      \"A component used to showcase the folder and file structure of a directory.\",\n    files: [\n      {\n        path: \"magicui/file-tree.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"blur-fade\",\n    type: \"registry:ui\",\n    title: \"Blur Fade\",\n    description:\n      \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/blur-fade.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"safari\",\n    type: \"registry:ui\",\n    title: \"Safari\",\n    description: \"A safari browser mockup to showcase your website.\",\n    files: [\n      {\n        path: \"magicui/safari.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"iphone\",\n    type: \"registry:ui\",\n    title: \"iPhone\",\n    description: \"A mockup of the iPhone\",\n    files: [\n      {\n        path: \"magicui/iphone.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"rainbow-button\",\n    type: \"registry:ui\",\n    title: \"Rainbow Button\",\n    description: \"An animated button with a rainbow effect.\",\n    files: [\n      {\n        path: \"magicui/rainbow-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    cssVars: {\n      light: {\n        \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n        \"color-2\": \"oklch(60.4% 0.26 302)\",\n        \"color-3\": \"oklch(69.6% 0.165 251)\",\n        \"color-4\": \"oklch(80.2% 0.134 225)\",\n        \"color-5\": \"oklch(90.7% 0.231 133)\",\n      },\n      dark: {\n        \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n        \"color-2\": \"oklch(60.4% 0.26 302)\",\n        \"color-3\": \"oklch(69.6% 0.165 251)\",\n        \"color-4\": \"oklch(80.2% 0.134 225)\",\n        \"color-5\": \"oklch(90.7% 0.231 133)\",\n      },\n      theme: {\n        \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\",\n      },\n    },\n\n    css: {\n      \"@keyframes rainbow\": {\n        \"0%\": { \"background-position\": \"0%\" },\n        \"100%\": { \"background-position\": \"200%\" },\n      },\n    },\n  },\n  {\n    name: \"interactive-hover-button\",\n    type: \"registry:ui\",\n    files: [\n      {\n        path: \"magicui/interactive-hover-button.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"terminal\",\n    type: \"registry:ui\",\n    title: \"Terminal\",\n    description: \"A terminal component\",\n    files: [\n      {\n        path: \"magicui/terminal.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"video-text\",\n    type: \"registry:ui\",\n    title: \"Video Text\",\n    description:\n      \"A component that displays text with a video playing in the background.\",\n    files: [\n      {\n        path: \"magicui/video-text.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"pixel-image\",\n    type: \"registry:ui\",\n    title: \"Pixel Image\",\n    description:\n      \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n    files: [\n      {\n        path: \"magicui/pixel-image.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"highlighter\",\n    type: \"registry:ui\",\n    title: \"Highlighter\",\n    description:\n      \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n    files: [\n      {\n        path: \"magicui/highlighter.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    dependencies: [\"rough-notation\"],\n  },\n  {\n    name: \"animated-theme-toggler\",\n    type: \"registry:ui\",\n    title: \"Theme Toggler\",\n    description: \"A component for theme changing animation.\",\n    dependencies: [\"lucide-react\"],\n    files: [\n      {\n        path: \"magicui/animated-theme-toggler.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n    css: {\n      \"::view-transition-old(root), ::view-transition-new(root)\": {\n        animation: \"none\",\n        \"mix-blend-mode\": \"normal\",\n      },\n    },\n  },\n  {\n    name: \"light-rays\",\n    type: \"registry:ui\",\n    title: \"Light Rays\",\n    description:\n      \"A component with animated light rays which shine down from above.\",\n    dependencies: [\"motion\"],\n    files: [\n      {\n        path: \"magicui/light-rays.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n  {\n    name: \"dotted-map\",\n    type: \"registry:ui\",\n    title: \"Dotted Map\",\n    description: \"A component with a dotted map.\",\n    dependencies: [\"svg-dotted-map\"],\n    files: [\n      {\n        path: \"magicui/dotted-map.tsx\",\n        type: \"registry:ui\",\n      },\n    ],\n  },\n]\n"
  },
  {
    "path": "apps/www/registry.json",
    "content": "{\n  \"name\": \"magicui\",\n  \"homepage\": \"https://magicui.design\",\n  \"items\": [\n    {\n      \"name\": \"index\",\n      \"type\": \"registry:style\",\n      \"dependencies\": [\n        \"class-variance-authority\",\n        \"lucide-react\"\n      ],\n      \"devDependencies\": [\n        \"tw-animate-css\"\n      ],\n      \"registryDependencies\": [\n        \"utils\"\n      ],\n      \"files\": [],\n      \"cssVars\": {}\n    },\n    {\n      \"name\": \"magic-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Magic Card\",\n      \"description\": \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"dependencies\": [\n        \"motion\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/magic-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Android\",\n      \"description\": \"A mockup of an Android device.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/android.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Warp Background\",\n      \"description\": \"A card with a time warping background effect.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/warp-background.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Line Shadow Text\",\n      \"description\": \"A text component with a moving line shadow.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/line-shadow-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-line-shadow\": \"line-shadow 15s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes line-shadow\": {\n          \"0%\": {\n            \"background-position\": \"0 0\"\n          },\n          \"100%\": {\n            \"background-position\": \"100% -100%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"aurora-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aurora Text\",\n      \"description\": \"A beautiful aurora text effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/aurora-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes aurora\": {\n          \"0%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          },\n          \"25%\": {\n            \"background-position\": \"50% 100%\",\n            \"transform\": \"rotate(5deg) scale(1.1)\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 50%\",\n            \"transform\": \"rotate(-3deg) scale(0.95)\"\n          },\n          \"75%\": {\n            \"background-position\": \"50% 0%\",\n            \"transform\": \"rotate(3deg) scale(1.05)\"\n          },\n          \"100%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"morphing-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Morphing Text\",\n      \"description\": \"A dynamic text morphing component for Magic UI.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/morphing-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Progress\",\n      \"description\": \"Animated Scroll Progress for your pages\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-progress.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Lens\",\n      \"description\": \"A interactive component that enables zooming into images, videos and other elements.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/lens.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pointer\",\n      \"description\": \"A component that displays a pointer when hovering over an element\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pointer.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor\",\n      \"type\": \"registry:ui\",\n      \"description\": \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n      \"dependencies\": [\n        \"framer-motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/smooth-cursor.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progressive Blur\",\n      \"description\": \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/progressive-blur.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Neon Gradient Card\",\n      \"description\": \"A beautiful neon card effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/neon-gradient-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-background-position-spin\": \"background-position-spin 3000ms infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes background-position-spin\": {\n          \"0%\": {\n            \"background-position\": \"top center\"\n          },\n          \"100%\": {\n            \"background-position\": \"bottom center\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"meteors\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Meteors\",\n      \"description\": \"A meteor shower effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/meteors.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-meteor\": \"meteor 5s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes meteor\": {\n          \"0%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(0)\",\n            \"opacity\": \"1\"\n          },\n          \"70%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(-500px)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Grid Pattern\",\n      \"description\": \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Striped Pattern\",\n      \"description\": \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/striped-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/striped-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Interactive Grid Pattern\",\n      \"description\": \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dot Pattern\",\n      \"description\": \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dot-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Flickering Grid\",\n      \"description\": \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/flickering-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hero Video Dialog\",\n      \"description\": \"A hero video dialog component.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hero-video-dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Code Comparison\",\n      \"description\": \"A component which compares two code snippets.\",\n      \"dependencies\": [\n        \"shiki\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/code-comparison.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Marquee\",\n      \"description\": \"An infinite scrolling component that can be used to display text, images, or videos.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/marquee.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n          \"animate-marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes marquee\": {\n          \"from\": {\n            \"transform\": \"translateX(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateX(calc(-100% - var(--gap)))\"\n          }\n        },\n        \"@keyframes marquee-vertical\": {\n          \"from\": {\n            \"transform\": \"translateY(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateY(calc(-100% - var(--gap)))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"globe\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Globe\",\n      \"description\": \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n      \"dependencies\": [\n        \"cobe\",\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/globe.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shimmer Button\",\n      \"description\": \"A button with a shimmering light which travels around the perimeter.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shimmer-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shimmer-slide\": \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n          \"animate-spin-around\": \"spin-around calc(var(--speed) * 2) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shimmer-slide\": {\n          \"to\": {\n            \"transform\": \"translate(calc(100cqw - 100%), 0)\"\n          }\n        },\n        \"@keyframes spin-around\": {\n          \"0%\": {\n            \"transform\": \"translateZ(0) rotate(0)\"\n          },\n          \"15%, 35%\": {\n            \"transform\": \"translateZ(0) rotate(90deg)\"\n          },\n          \"65%, 85%\": {\n            \"transform\": \"translateZ(0) rotate(270deg)\"\n          },\n          \"100%\": {\n            \"transform\": \"translateZ(0) rotate(360deg)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tweet Card\",\n      \"description\": \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"client-tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Client Tweet Card\",\n      \"description\": \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/client-tweet-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Bento Grid\",\n      \"description\": \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/bento-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Particles\",\n      \"description\": \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/particles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Number Ticker\",\n      \"description\": \"Animate numbers to count up or down to a target number\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/number-ticker.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple\",\n      \"description\": \"An animated ripple effect typically used behind elements to emphasize them.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-ripple\": \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes ripple\": {\n          \"0%, 100%\": {\n            \"transform\": \"translate(-50%, -50%) scale(1)\"\n          },\n          \"50%\": {\n            \"transform\": \"translate(-50%, -50%) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"retro-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Retro Grid\",\n      \"description\": \"An animated scrolling retro grid effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/retro-grid.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated List\",\n      \"description\": \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-list.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Shiny Text\",\n      \"description\": \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-shiny-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shiny-text\": \"shiny-text 8s infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shiny-text\": {\n          \"0%, 90%, 100%\": {\n            \"background-position\": \"calc(-100% - var(--shiny-width)) 0\"\n          },\n          \"30%, 60%\": {\n            \"background-position\": \"calc(100% + var(--shiny-width)) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Grid Pattern\",\n      \"description\": \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-grid-pattern.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Border Beam\",\n      \"description\": \"An animated beam of light which travels along the border of its container.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/border-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Beam\",\n      \"description\": \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-beam.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Reveal\",\n      \"description\": \"Fade in text as you scroll down the page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-reveal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hyper Text\",\n      \"description\": \"A text animation that scrambles letters before revealing the final text.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hyper-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Gradient Text\",\n      \"description\": \"An animated gradient background which transitions between colors for text.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-gradient-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-gradient\": \"gradient 8s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes gradient\": {\n          \"to\": {\n            \"background-position\": \"var(--bg-size, 300%) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"orbiting-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Orbiting Circles\",\n      \"description\": \"A collection of circles which move in orbit along a circular path\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/orbiting-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes orbit\": {\n          \"0%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"dock\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dock\",\n      \"description\": \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dock.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Word Rotate\",\n      \"description\": \"A vertical rotation of words\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/word-rotate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar Circles\",\n      \"description\": \"Overlapping circles of avatars.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/avatar-circles.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Typing Animation\",\n      \"description\": \"Characters appearing in typed animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/typing-animation.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-blink-cursor\": \"blink-cursor 1.2s step-end infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes blink-cursor\": {\n          \"0%, 49%\": {\n            \"opacity\": \"1\"\n          },\n          \"50%, 100%\": {\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"sparkles-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Sparkles Text\",\n      \"description\": \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/sparkles-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Spinning Text\",\n      \"description\": \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/spinning-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Comic Text\",\n      \"description\": \"Comic text animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/comic-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon Cloud\",\n      \"description\": \"An interactive 3D tag cloud component\",\n      \"dependencies\": [],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/icon-cloud.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Animate\",\n      \"description\": \"A text animation component that animates text using a variety of different animations.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-animate.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Based Velocity\",\n      \"description\": \"Scrolling text whose speed changes based on scroll speed\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-based-velocity.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shiny Button\",\n      \"description\": \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shiny-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shine Border\",\n      \"description\": \"Shine border is an animated background border effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shine-border.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shine\": \"shine var(--duration) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shine\": {\n          \"0%\": {\n            \"background-position\": \"0% 0%\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 100%\"\n          },\n          \"to\": {\n            \"background-position\": \"0% 0%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-circular-progress-bar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Circular Progress Bar\",\n      \"description\": \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-circular-progress-bar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Confetti\",\n      \"description\": \"Confetti animations are best used to delight your users when something special happens\",\n      \"dependencies\": [\n        \"canvas-confetti\",\n        \"@types/canvas-confetti\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/confetti.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Cool Mode\",\n      \"description\": \"Cool mode effect for buttons, links, and other DOMs\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/cool-mode.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pulsating Button\",\n      \"description\": \"An animated pulsating button useful for capturing attention of users.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pulsating-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-pulse\": \"pulse var(--duration) ease-out infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes pulse\": {\n          \"0%, 100%\": {\n            \"boxShadow\": \"0 0 0 0 var(--pulse-color)\"\n          },\n          \"50%\": {\n            \"boxShadow\": \"0 0 0 8px var(--pulse-color)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"ripple-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple Button\",\n      \"description\": \"An animated button with ripple useful for user engagement.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rippling\": \"rippling var(--duration) ease-out\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rippling\": {\n          \"0%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"scale(2)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"file-tree\",\n      \"type\": \"registry:ui\",\n      \"title\": \"File Tree\",\n      \"description\": \"A component used to showcase the folder and file structure of a directory.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/file-tree.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Blur Fade\",\n      \"description\": \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/blur-fade.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Safari\",\n      \"description\": \"A safari browser mockup to showcase your website.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/safari.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone\",\n      \"type\": \"registry:ui\",\n      \"title\": \"iPhone\",\n      \"description\": \"A mockup of the iPhone\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/iphone.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Rainbow Button\",\n      \"description\": \"An animated button with a rainbow effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/rainbow-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\"\n        },\n        \"light\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        },\n        \"dark\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rainbow\": {\n          \"0%\": {\n            \"background-position\": \"0%\"\n          },\n          \"100%\": {\n            \"background-position\": \"200%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"interactive-hover-button\",\n      \"type\": \"registry:ui\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-hover-button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Terminal\",\n      \"description\": \"A terminal component\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/terminal.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Video Text\",\n      \"description\": \"A component that displays text with a video playing in the background.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/video-text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pixel Image\",\n      \"description\": \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pixel-image.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Highlighter\",\n      \"description\": \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Theme Toggler\",\n      \"description\": \"A component for theme changing animation.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-theme-toggler.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"css\": {\n        \"::view-transition-old(root), ::view-transition-new(root)\": {\n          \"animation\": \"none\",\n          \"mix-blend-mode\": \"normal\"\n        }\n      }\n    },\n    {\n      \"name\": \"light-rays\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Light Rays\",\n      \"description\": \"A component with animated light rays which shine down from above.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/light-rays.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dotted Map\",\n      \"description\": \"A component with a dotted map.\",\n      \"dependencies\": [\n        \"svg-dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dotted-map.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo\",\n      \"description\": \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo 2\",\n      \"description\": \"Example showing a magic card with an orb effect.\",\n      \"registryDependencies\": [\n        \"@magicui/magic-card\",\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo\",\n      \"description\": \"Example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 2\",\n      \"description\": \"Second example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 3\",\n      \"description\": \"Third example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"@magicui/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Warp Background Demo\",\n      \"description\": \"Example showing a card with a time warping background effect.\",\n      \"registryDependencies\": [\n        \"@magicui/warp-background\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/warp-background-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Line Shadow Text Demo\",\n      \"description\": \"Example showing a text component with a moving line shadow.\",\n      \"registryDependencies\": [\n        \"@magicui/line-shadow-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/line-shadow-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"aurora-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Aurora Text Demo\",\n      \"description\": \"Example showing a beautiful aurora text effect.\",\n      \"registryDependencies\": [\n        \"@magicui/aurora-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/aurora-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"morphing-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Morphing Text Demo\",\n      \"description\": \"Example showing a dynamic text morphing component.\",\n      \"registryDependencies\": [\n        \"@magicui/morphing-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/morphing-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Progress Demo\",\n      \"description\": \"Example showing animated scroll progress for your pages.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-progress\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-progress-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo\",\n      \"description\": \"Example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 2\",\n      \"description\": \"Second example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 3\",\n      \"description\": \"Third example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer-demo-1\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pointer Demo 1\",\n      \"description\": \"Example showing a pointer effect component\",\n      \"registryDependencies\": [\n        \"@magicui/pointer\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pointer-demo-1.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Basic smooth cursor example\",\n      \"registryDependencies\": [\n        \"@magicui/smooth-cursor\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/smooth-cursor-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Progressive Blur Demo\",\n      \"description\": \"Example showing progressive blur effect for scrollable content.\",\n      \"registryDependencies\": [\n        \"@magicui/progressive-blur\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/progressive-blur-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Neon Gradient Card Demo\",\n      \"description\": \"Example showing a beautiful neon card effect.\",\n      \"registryDependencies\": [\n        \"@magicui/neon-gradient-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/neon-gradient-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"meteors-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Meteors Demo\",\n      \"description\": \"Example showing a meteor shower effect.\",\n      \"registryDependencies\": [\n        \"@magicui/meteors\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/meteors-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Demo\",\n      \"description\": \"Example showing a background grid pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern Demo\",\n      \"description\": \"Example showing a background striped pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Dashed)\",\n      \"description\": \"Example showing a background striped pattern with a dashed stroke.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-dashed.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-dashed.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-right\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Right)\",\n      \"description\": \"Example showing a background striped pattern slanting to the right using SVG.\",\n      \"registryDependencies\": [\n        \"@magicui/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-right.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-right.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Linear Gradient\",\n      \"description\": \"Example showing a grid pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Dashed\",\n      \"description\": \"Example showing a dashed grid pattern.\",\n      \"registryDependencies\": [\n        \"@magicui/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-dashed.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Demo\",\n      \"description\": \"Example showing a background dot pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Linear Gradient\",\n      \"description\": \"Example showing a dot pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-with-glow-effect\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern with glow effect\",\n      \"description\": \"Example showing a dot pattern with glow effect\",\n      \"registryDependencies\": [\n        \"@magicui/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-with-glow-effect.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Demo\",\n      \"description\": \"Example showing a flickering grid background.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-rounded-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Rounded Demo\",\n      \"description\": \"Example showing a flickering grid background with rounded corners.\",\n      \"registryDependencies\": [\n        \"@magicui/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-rounded-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Demo\",\n      \"description\": \"Example showing a hero video dialog component.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo-top-in-bottom-out\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Top In Bottom Out Demo\",\n      \"description\": \"Example showing a hero video dialog with top-in bottom-out animation.\",\n      \"registryDependencies\": [\n        \"@magicui/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Code Comparison Demo\",\n      \"description\": \"Example showing a component which compares two code snippets.\",\n      \"registryDependencies\": [\n        \"@magicui/code-comparison\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/code-comparison-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Demo\",\n      \"description\": \"Example showing an infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Vertical Demo\",\n      \"description\": \"Example showing a vertical infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-logos\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Logos\",\n      \"description\": \"Example showing an infinite scrolling logo carousel.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-logos.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-3d\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee 3D\",\n      \"description\": \"Example showing a 3D infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"@magicui/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-3d.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"globe-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Globe Demo\",\n      \"description\": \"Example showing an autorotating, interactive WebGL globe.\",\n      \"registryDependencies\": [\n        \"@magicui/globe\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/globe-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Demo\",\n      \"description\": \"Example showing a tweet card with author info.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-images\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Images\",\n      \"description\": \"Example showing a tweet card with images.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-images.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-meta-preview\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Meta Preview\",\n      \"description\": \"Example showing a tweet card with meta preview.\",\n      \"registryDependencies\": [\n        \"@magicui/client-tweet-card\",\n        \"@magicui/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-meta-preview.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shimmer Button Demo\",\n      \"description\": \"Example showing a button with a shimmering light effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shimmer-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shimmer-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Demo\",\n      \"description\": \"Example showing a bento grid layout for showcasing features.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"calendar\",\n        \"@magicui/marquee\",\n        \"@magicui/bento-grid\",\n        \"@magicui/animated-beam\",\n        \"@magicui/animated-list\",\n        \"@magicui/animated-beam-multiple-outputs\",\n        \"@magicui/animated-list-demo\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Vertical Demo\",\n      \"description\": \"Example showing a vertical bento grid layout.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/bento-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo-vertical.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo 2\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-decimal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Decimal Demo\",\n      \"description\": \"Example showing animated counting decimal numbers.\",\n      \"registryDependencies\": [\n        \"@magicui/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-decimal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Demo\",\n      \"description\": \"Example showing an animated ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"retro-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Retro Grid Demo\",\n      \"description\": \"Example showing an animated scrolling retro grid effect.\",\n      \"registryDependencies\": [\n        \"@magicui/retro-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/retro-grid-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated List Demo\",\n      \"description\": \"Example showing a list with sequenced item animations.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-list\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-list-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Shiny Text Demo\",\n      \"description\": \"Example showing text with a shimmering light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-shiny-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-shiny-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Particles Demo\",\n      \"description\": \"Example showing interactive particle effects.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/particles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/particles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Grid Pattern Demo\",\n      \"description\": \"Example showing an animated grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo\",\n      \"description\": \"Example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo 2\",\n      \"description\": \"Second example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 3\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"input\",\n        \"label\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 4\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Demo\",\n      \"description\": \"Example showing an animated beam of light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-unidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Unidirectional\",\n      \"description\": \"Example showing a unidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-unidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-bidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Bidirectional\",\n      \"description\": \"Example showing a bidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-bidirectional.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-inputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Inputs\",\n      \"description\": \"Example showing animated beams with multiple input points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-inputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-outputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Outputs\",\n      \"description\": \"Example showing animated beams with multiple output points.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-outputs.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Reveal Demo\",\n      \"description\": \"Example showing text that fades in on scroll.\",\n      \"registryDependencies\": [\n        \"@magicui/text-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-reveal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo\",\n      \"description\": \"Example showing text with animated gradient backgrounds.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo 2\",\n      \"description\": \"Second example showing text with animated gradient backgrounds.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"orbiting-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Orbiting Circles Demo\",\n      \"description\": \"Example showing circles moving in orbital paths.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/orbiting-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/orbiting-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo\",\n      \"description\": \"Example showing a MacOS-style dock implementation.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 2\",\n      \"description\": \"Second example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 3\",\n      \"description\": \"Third example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"@magicui/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Word Rotate Demo\",\n      \"description\": \"Example showing vertical word rotation animation.\",\n      \"registryDependencies\": [\n        \"@magicui/word-rotate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/word-rotate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hyper Text Demo\",\n      \"description\": \"Example showing text with scrambling letter animations.\",\n      \"registryDependencies\": [\n        \"@magicui/hyper-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hyper-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Avatar Circles Demo\",\n      \"description\": \"Example showing overlapping avatar circles.\",\n      \"registryDependencies\": [\n        \"@magicui/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/avatar-circles-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Demo\",\n      \"description\": \"Example showing typed character animations.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Multiple Words\",\n      \"description\": \"Example showing multiple words with looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Custom Speed\",\n      \"description\": \"Example showing custom typing and deleting speeds.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Start on View\",\n      \"description\": \"Example showing animation that starts when in viewport.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Without Cursor\",\n      \"description\": \"Example showing typing animation without cursor.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Single Play\",\n      \"description\": \"Example showing single play without looping.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Blinking\",\n      \"description\": \"Example showing cursor blinking control.\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Cursor Styles\",\n      \"description\": \"Example showing different cursor styles (line, block, underscore).\",\n      \"registryDependencies\": [\n        \"@magicui/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Demo\",\n      \"description\": \"Example showing text speed changes based on scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-images-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Images\",\n      \"description\": \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n      \"registryDependencies\": [\n        \"@magicui/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-images-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkles-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Sparkles Text Demo\",\n      \"description\": \"Example showing text with animated sparkle effects.\",\n      \"registryDependencies\": [\n        \"@magicui/sparkles-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/sparkles-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo 2\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Comic Text Demo\",\n      \"description\": \"Example showing comic text animation.\",\n      \"registryDependencies\": [\n        \"@magicui/comic-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/comic-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo\",\n      \"description\": \"Example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 2\",\n      \"description\": \"Second example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 3\",\n      \"description\": \"Third example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"@magicui/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo\",\n      \"description\": \"Example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 2\",\n      \"description\": \"Second example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 3\",\n      \"description\": \"Third example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 4\",\n      \"description\": \"Fourth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 5\",\n      \"description\": \"Fifth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-5.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 6\",\n      \"description\": \"Sixth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-6.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 7\",\n      \"description\": \"Seventh example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-7.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 8\",\n      \"description\": \"Eighth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-8.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-9\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 9\",\n      \"description\": \"Ninth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"@magicui/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-9.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shiny Button Demo\",\n      \"description\": \"Example showing a shiny button with dynamic styles.\",\n      \"registryDependencies\": [\n        \"@magicui/shiny-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shiny-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-circular-progress-bar-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Circular Progress Bar Demo\",\n      \"description\": \"Example showing an animated circular progress gauge.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-circular-progress-bar\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-circular-progress-bar-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo\",\n      \"description\": \"Example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo 2\",\n      \"description\": \"Second example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"@magicui/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Demo\",\n      \"description\": \"Example showing confetti animations for celebrations.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-basic-cannon\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Basic Cannon\",\n      \"description\": \"Example showing basic confetti cannon animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-basic-cannon.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-random-direction\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Random Direction\",\n      \"description\": \"Example showing confetti with random directions.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-random-direction.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-fireworks\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Fireworks\",\n      \"description\": \"Example showing fireworks-style confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-fireworks.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-stars\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Stars\",\n      \"description\": \"Example showing star-shaped confetti animation.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-stars.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-side-cannons\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Side Cannons\",\n      \"description\": \"Example showing side-mounted confetti cannons.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-side-cannons.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-custom-shapes\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Custom Shapes\",\n      \"description\": \"Example showing confetti with custom shape particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-custom-shapes.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-emoji\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Emoji\",\n      \"description\": \"Example showing confetti with emoji particles.\",\n      \"registryDependencies\": [\n        \"@magicui/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-emoji.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Demo\",\n      \"description\": \"Example showing cool mode effect for buttons and links.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-custom\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Custom\",\n      \"description\": \"Example showing customized cool mode effects.\",\n      \"registryDependencies\": [\n        \"@magicui/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-custom.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pulsating Button Demo\",\n      \"description\": \"Example showing an animated pulsating button.\",\n      \"registryDependencies\": [\n        \"@magicui/pulsating-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pulsating-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Button Demo\",\n      \"description\": \"Example showing an animated button with ripple effect.\",\n      \"registryDependencies\": [\n        \"@magicui/ripple-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"file-tree-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"File Tree Demo\",\n      \"description\": \"Example showing a component that displays folder and file structure.\",\n      \"registryDependencies\": [\n        \"@magicui/file-tree\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/file-tree-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Demo\",\n      \"description\": \"Example showing blur fade in and out animations.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Text Demo\",\n      \"description\": \"Example showing blur fade animations with text.\",\n      \"registryDependencies\": [\n        \"@magicui/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo\",\n      \"description\": \"Example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 2\",\n      \"description\": \"Second example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 3\",\n      \"description\": \"Third example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 4\",\n      \"description\": \"Fourth example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-4.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo\",\n      \"description\": \"Example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 2\",\n      \"description\": \"Second example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone Demo 3\",\n      \"description\": \"Third example showing an iPhone mockup.\",\n      \"registryDependencies\": [\n        \"@magicui/iphone\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo 2\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"@magicui/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-hover-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Hover Button Demo\",\n      \"description\": \"Example showing an interactive button with hover effects.\",\n      \"registryDependencies\": [\n        \"@magicui/interactive-hover-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-hover-button-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text.\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text and custom delays\",\n      \"registryDependencies\": [\n        \"@magicui/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Video Text Demo\",\n      \"description\": \"Example showing text with a video background.\",\n      \"registryDependencies\": [\n        \"@magicui/video-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/video-text-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pixel Image Demo\",\n      \"description\": \"Example showing a pixelated image effect.\",\n      \"registryDependencies\": [\n        \"@magicui/pixel-image\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pixel-image-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Highlighter Demo\",\n      \"description\": \"Example showing the demo of a Highlighter\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/highlighter\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/highlighter-demo.tsx\",\n          \"type\": \"registry:example\"\n        },\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Theme Toggler Demo\",\n      \"description\": \"Example showing animation while changing the theme.\",\n      \"registryDependencies\": [\n        \"@magicui/animated-theme-toggler\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"light-rays-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Demo of the light-rays component showcasing animated light rays\",\n      \"registryDependencies\": [\n        \"@magicui/light-rays\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/light-rays-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo\",\n      \"description\": \"Example showing a dotted map.\",\n      \"dependencies\": [\n        \"countries-list\"\n      ],\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 2\",\n      \"description\": \"Example showing a dotted map.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-2.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dotted-map-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dotted Map Demo 3\",\n      \"description\": \"Example showing a dotted map with pulse animation.\",\n      \"registryDependencies\": [\n        \"@magicui/dotted-map\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dotted-map-demo-3.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"utils\",\n      \"type\": \"registry:lib\",\n      \"dependencies\": [\n        \"clsx\",\n        \"tailwind-merge\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/lib/utils.ts\",\n          \"type\": \"registry:lib\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "apps/www/scripts/build-registry.mts",
    "content": "import { exec } from \"child_process\"\nimport { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { rimraf } from \"rimraf\"\nimport { Registry } from \"shadcn/schema\"\n\nimport { siteConfig } from \"../config/site\"\nimport {\n  assertNoMissingExampleFiles,\n  syncExampleRegistryDependencies,\n} from \"./sync-example-registry-dependencies.mts\"\n\nasync function loadRegistry(): Promise<Registry> {\n  const { registry } = await import(\"../registry/index.ts\")\n  return registry\n}\n\nasync function buildRegistryIndex(registry: Registry) {\n  let index = `/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// @ts-nocheck\n// This file is autogenerated by scripts/build-registry.ts\n// Do not edit this file directly.\nimport * as React from \"react\"\n\nexport const Index: Record<string, any> = {`\n  for (const item of registry.items) {\n    const resolveFiles = item.files?.map((file) => `registry/${file.path}`)\n    if (!resolveFiles) {\n      continue\n    }\n\n    const componentPath = item.files?.[0]?.path\n      ? `@/registry/${item.files[0].path}`\n      : \"\"\n\n    index += `\n  \"${item.name}\": {\n    name: \"${item.name}\",\n    description: \"${item.description ?? \"\"}\",\n    type: \"${item.type}\",\n    registryDependencies: ${JSON.stringify(item.registryDependencies)},\n    files: [${item.files?.map((file) => {\n      const filePath = `registry/${typeof file === \"string\" ? file : file.path}`\n      const resolvedFilePath = path.resolve(filePath)\n      return typeof file === \"string\"\n        ? `\"${resolvedFilePath}\"`\n        : `{\n      path: \"${filePath}\",\n      type: \"${file.type}\",\n      target: \"${file.target ?? \"\"}\"\n    }`\n    })}],\n    component: ${\n      componentPath\n        ? `React.lazy(async () => {\n      const mod = await import(\"${componentPath}\")\n      const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') ?? item.name\n      return { default: mod.default ?? mod[exportName] }\n    })`\n        : \"null\"\n    },\n    meta: ${JSON.stringify(item.meta)},\n  },`\n  }\n\n  index += `\n  }`\n\n  // Write style index.\n  rimraf.sync(path.join(process.cwd(), \"registry/__index__.tsx\"))\n  await fs.writeFile(path.join(process.cwd(), \"registry/__index__.tsx\"), index)\n}\n\nasync function buildRegistryJsonFile(registry: Registry) {\n  // 1. Fix the path for registry items.\n  const fixedRegistry = {\n    ...registry,\n    items: registry.items.map((item) => {\n      const files = item.files?.map((file) => {\n        return {\n          ...file,\n          path: `registry/${file.path}`,\n        }\n      })\n\n      return {\n        ...item,\n        files,\n      }\n    }),\n  }\n\n  // 2. Write the content of the registry to `registry.json`\n  rimraf.sync(path.join(process.cwd(), `registry.json`))\n  await fs.writeFile(\n    path.join(process.cwd(), `registry.json`),\n    JSON.stringify(fixedRegistry, null, 2)\n  )\n\n  // 3. Copy the registry.json to the www/public/r directory.\n  await fs.cp(\n    path.join(process.cwd(), \"registry.json\"),\n    path.join(process.cwd(), \"../www/public/r/registry.json\"),\n    { recursive: true }\n  )\n\n  // 3. Copy the registry.json to the www/public/r directory.\n  await fs.cp(\n    path.join(process.cwd(), \"registry.json\"),\n    path.join(process.cwd(), \"../www/public/registry.json\"),\n    { recursive: true }\n  )\n}\n\ntype RegistryItem = Registry[\"items\"][number]\n\ntype FileEntry = string | { path: string; type?: string; target?: string }\n\nasync function readRegistryFilesContents(item: RegistryItem): Promise<string> {\n  if (!item.files?.length) return \"\"\n\n  const paths = item.files\n    .map((f: FileEntry) => (typeof f === \"string\" ? f : f?.path))\n    .filter(Boolean)\n    .sort() as string[]\n\n  // Read all files in parallel\n  const contents = await Promise.all(\n    paths.map(async (filePath) => {\n      try {\n        const content = await fs.readFile(\n          path.join(process.cwd(), \"registry\", filePath),\n          \"utf8\"\n        )\n        return `--- file: ${filePath} ---\\n${content.endsWith(\"\\n\") ? content : content + \"\\n\"}`\n      } catch {\n        return null // Skip missing files\n      }\n    })\n  )\n\n  // Join non-null contents with blank lines between them\n  return contents.filter(Boolean).join(\"\\n\")\n}\n\nfunction getComponentExamples(registry: Registry) {\n  const examplesByComponent = new Map<string, string[]>()\n\n  registry.items\n    .filter((item) => item.type === \"registry:example\")\n    .forEach((example) => {\n      example.registryDependencies?.forEach((dep) => {\n        const componentName = dep.split(\"/\").pop()\n        if (componentName) {\n          if (!examplesByComponent.has(componentName)) {\n            examplesByComponent.set(componentName, [])\n          }\n          examplesByComponent.get(componentName)!.push(example.name)\n        }\n      })\n    })\n\n  return examplesByComponent\n}\n\nasync function generateLlmsContent(registry: Registry) {\n  const components = registry.items\n    .filter((item) => item.type === \"registry:ui\")\n    .sort((a, b) => a.name.localeCompare(b.name))\n    .map((component) => {\n      const title = component.title || component.name\n      const description = component.description || `The ${title} component.`\n      return `- [${title}](${siteConfig.url}/docs/components/${component.name}): ${description}`\n    })\n\n  const exampleSet = new Set<string>()\n  const examplesList = registry.items\n    .filter((item) => item.type === \"registry:example\")\n    .filter((example) => {\n      if (exampleSet.has(example.name)) return false\n      exampleSet.add(example.name)\n      return true\n    })\n    .map((example) => {\n      const title = example.title || example.name\n      const firstFile = example.files?.[0]?.path || \"\"\n      const url = firstFile\n        ? `${siteConfig.links.github}/blob/main/${firstFile}`\n        : siteConfig.links.github\n      return `- [${title}](${url}): Example usage`\n    })\n\n  return [\n    `# ${siteConfig.name}`,\n    \"\",\n    `> ${siteConfig.description}`,\n    \"\",\n    \"This file provides LLM-friendly entry points to documentation and examples.\",\n    \"\",\n    \"## Components\",\n    \"\",\n    ...components,\n    \"\",\n    \"## Examples\",\n    \"\",\n    ...examplesList,\n    \"\",\n    \"## Optional\",\n    \"\",\n    `- [Repository](${siteConfig.links.github}): Source code and issues`,\n    `- [Sitemap](${siteConfig.url}/sitemap.xml): Indexable pages`,\n  ].join(\"\\n\")\n}\n\nasync function generateLlmsFullContent(\n  registry: Registry,\n  examplesByComponent: Map<string, string[]>\n) {\n  const components = registry.items\n    .filter((item) => item.type === \"registry:ui\")\n    .sort((a, b) => a.name.localeCompare(b.name))\n\n  const componentContents = await Promise.all(\n    components.map(async (component) => {\n      const title = component.title || component.name\n      const description = component.description || `The ${title} component.`\n\n      let content = [\n        `===== COMPONENT: ${component.name} =====`,\n        `Title: ${title}`,\n        `Description: ${description}`,\n        \"\",\n        await readRegistryFilesContents(component),\n      ].join(\"\\n\")\n\n      // Add examples for this component\n      const relatedExamples = examplesByComponent.get(component.name) || []\n      for (const exampleName of relatedExamples) {\n        const example = registry.items.find((e) => e.name === exampleName)\n        if (example) {\n          const exTitle = example.title || example.name\n          content += [\n            \"\",\n            \"\",\n            `===== EXAMPLE: ${exampleName} =====`,\n            `Title: ${exTitle}`,\n            \"\",\n            await readRegistryFilesContents(example),\n          ].join(\"\\n\")\n        }\n      }\n\n      return content\n    })\n  )\n\n  return componentContents.join(\"\\n\\n\\n\")\n}\n\nasync function buildLlmsFiles(registry: Registry) {\n  const examplesByComponent = getComponentExamples(registry)\n\n  const [minContent, fullContent] = await Promise.all([\n    generateLlmsContent(registry),\n    generateLlmsFullContent(registry, examplesByComponent),\n  ])\n\n  const publicDir = path.join(process.cwd(), \"public\")\n  await fs.mkdir(publicDir, { recursive: true })\n\n  await Promise.all([\n    fs.writeFile(path.join(publicDir, \"llms.txt\"), minContent, \"utf8\"),\n    fs.writeFile(path.join(publicDir, \"llms-full.txt\"), fullContent, \"utf8\"),\n  ])\n}\n\nasync function buildRegistry() {\n  return new Promise((resolve, reject) => {\n    const process = exec(`pnpm shadcn:build`)\n\n    process.on(\"exit\", (code) => {\n      if (code === 0) {\n        resolve(undefined)\n      } else {\n        reject(new Error(`Process exited with code ${code}`))\n      }\n    })\n  })\n}\n\ntry {\n  console.log(\"🔎 Syncing registry example dependencies...\")\n  const syncIssues = await syncExampleRegistryDependencies({ mode: \"fix\" })\n  assertNoMissingExampleFiles(syncIssues)\n  console.log(\"✅ Registry example dependencies synced\")\n\n  const registry = await loadRegistry()\n\n  console.log(\"��️ Building registry/__index__.tsx...\")\n  await buildRegistryIndex(registry)\n  console.log(\"✅ Registry index built successfully\")\n\n  console.log(\"💅 Building registry.json...\")\n  await buildRegistryJsonFile(registry)\n  console.log(\"✅ Registry JSON file built successfully\")\n\n  console.log(\"🧠 Building llms files...\")\n  await buildLlmsFiles(registry)\n  console.log(\"✅ llms-min.txt and llms.txt built successfully\")\n\n  console.log(\"🏗️ Building registry...\")\n  await buildRegistry()\n  console.log(\"✅ Registry build completed\")\n} catch (error) {\n  console.error(\"❌ Build failed with error:\")\n  console.error(error)\n  if (error instanceof Error) {\n    console.error(\"Error stack:\", error.stack)\n  }\n  process.exit(1)\n}\n"
  },
  {
    "path": "apps/www/scripts/sync-example-registry-dependencies.mts",
    "content": "import { promises as fs } from \"node:fs\"\nimport path from \"node:path\"\nimport process from \"node:process\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { CodeBlockWriter, Node, Project, SyntaxKind } from \"ts-morph\"\n\nconst MAGICUI_IMPORT_PREFIX = \"@/registry/magicui/\"\nconst MAGICUI_PACKAGE_PREFIX = \"@magicui/\"\nconst EXAMPLE_IMPORT_PREFIX = \"@/registry/example/\"\nconst REGISTRY_IMPORT_PREFIX = \"@/registry/\"\n\nconst scriptPath = fileURLToPath(import.meta.url)\nconst appRoot = path.resolve(path.dirname(scriptPath), \"..\")\nconst registryRoot = path.join(appRoot, \"registry\")\nconst registryExamplesPath = path.join(registryRoot, \"registry-examples.ts\")\nconst registryUiPath = path.join(registryRoot, \"registry-ui.ts\")\n\ntype SyncMode = \"check\" | \"fix\"\n\ntype SyncOptions = {\n  mode: SyncMode\n}\n\ntype ExampleIssue = {\n  exampleName: string\n  exampleFiles: string[]\n  extraDependencies: string[]\n  missingDependencies: string[]\n  missingFiles: string[]\n}\n\n// Detect direct CLI execution so this module can also be imported by builds.\nfunction isMainModule() {\n  return process.argv[1]\n    ? path.resolve(process.argv[1]) === scriptPath\n    : false\n}\n\n// Read plain string values from string literals and template literals.\nfunction getStringLiteralValue(node: Node | undefined) {\n  if (!node) {\n    return null\n  }\n\n  if (\n    Node.isStringLiteral(node) ||\n    Node.isNoSubstitutionTemplateLiteral(node)\n  ) {\n    return node.getLiteralText()\n  }\n\n  return null\n}\n\n// Resolve a named object property when it exists as a simple assignment.\nfunction getObjectPropertyAssignment(\n  node: Node,\n  propertyName: string\n): Node | undefined {\n  if (!Node.isObjectLiteralExpression(node)) {\n    return undefined\n  }\n\n  const property = node.getProperty(propertyName)\n  if (!property || !Node.isPropertyAssignment(property)) {\n    return undefined\n  }\n\n  return property\n}\n\n// Extract string items from array properties like registryDependencies.\nfunction getStringArrayValues(node: Node | undefined) {\n  if (!node || !Node.isPropertyAssignment(node)) {\n    return []\n  }\n\n  const initializer = node.getInitializer()\n  if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n    return []\n  }\n\n  return initializer\n    .getElements()\n    .flatMap((element) => {\n      const value = getStringLiteralValue(element)\n      return value ? [value] : []\n    })\n}\n\n// Collect referenced .tsx files from an example's files array.\nfunction getExampleFilePaths(node: Node) {\n  const filesProperty = getObjectPropertyAssignment(node, \"files\")\n  if (!filesProperty || !Node.isPropertyAssignment(filesProperty)) {\n    return []\n  }\n\n  const initializer = filesProperty.getInitializer()\n  if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n    return []\n  }\n\n  return initializer\n    .getElements()\n    .flatMap((element) => {\n      const stringPath = getStringLiteralValue(element)\n      if (stringPath) {\n        return [stringPath]\n      }\n\n      if (!Node.isObjectLiteralExpression(element)) {\n        return []\n      }\n\n      const pathProperty = getObjectPropertyAssignment(element, \"path\")\n      if (!pathProperty || !Node.isPropertyAssignment(pathProperty)) {\n        return []\n      }\n\n      const filePath = getStringLiteralValue(pathProperty.getInitializer())\n      return filePath ? [filePath] : []\n    })\n    .filter((filePath) => filePath.endsWith(\".tsx\"))\n}\n\n// Read the registry item name for reporting.\nfunction getRegistryItemName(node: Node) {\n  const nameProperty = getObjectPropertyAssignment(node, \"name\")\n  if (!nameProperty || !Node.isPropertyAssignment(nameProperty)) {\n    return \"unknown\"\n  }\n\n  return getStringLiteralValue(nameProperty.getInitializer()) ?? \"unknown\"\n}\n\n// Read the registry item type so only examples are processed.\nfunction getRegistryItemType(node: Node) {\n  const typeProperty = getObjectPropertyAssignment(node, \"type\")\n  if (!typeProperty || !Node.isPropertyAssignment(typeProperty)) {\n    return null\n  }\n\n  return getStringLiteralValue(typeProperty.getInitializer())\n}\n\n// Read a registry array declaration like examples/ui so items can be inspected.\nfunction getRegistryItemsDeclaration(sourceFile: Node, declarationName: string) {\n  if (!Node.isSourceFile(sourceFile)) {\n    return null\n  }\n\n  const declaration = sourceFile.getVariableDeclaration(declarationName)\n  const initializer = declaration?.getInitializer()\n  if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n    return null\n  }\n\n  return initializer\n}\n\n// Preserve insertion order while removing duplicates.\nfunction dedupe(values: string[]) {\n  const seen = new Set<string>()\n\n  return values.filter((value) => {\n    if (seen.has(value)) {\n      return false\n    }\n\n    seen.add(value)\n    return true\n  })\n}\n\n// Convert local registry imports into namespaced registry dependency ids.\nfunction getRegistryDependencyName(moduleSpecifier: string) {\n  const prefix = [MAGICUI_IMPORT_PREFIX, EXAMPLE_IMPORT_PREFIX].find((value) =>\n    moduleSpecifier.startsWith(value)\n  )\n\n  if (!prefix) {\n    return null\n  }\n\n  const itemName = moduleSpecifier.slice(prefix.length)\n  if (!itemName) {\n    return null\n  }\n\n  return `${MAGICUI_PACKAGE_PREFIX}${itemName}`\n}\n\n// Map registry source files back to their published registry dependency ids.\nfunction getRegistryDependencyNameFromFilePath(filePath: string) {\n  const registryItemRoots = [\n    path.join(registryRoot, \"magicui\"),\n    path.join(registryRoot, \"example\"),\n  ]\n\n  const matchingRoot = registryItemRoots.find((rootPath) => {\n    const relativePath = path.relative(rootPath, filePath)\n    return !relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath)\n  })\n\n  if (!matchingRoot) {\n    return null\n  }\n\n  const relativePath = path.relative(matchingRoot, filePath)\n\n  if (\n    !/\\.(ts|tsx)$/.test(relativePath)\n  ) {\n    return null\n  }\n\n  const packageName = relativePath\n    .replace(/\\.(ts|tsx)$/, \"\")\n    .split(path.sep)\n    .join(\"/\")\n\n  return `${MAGICUI_PACKAGE_PREFIX}${packageName}`\n}\n\n// Limit exact matching to magicui package entries and leave other deps alone.\nfunction isMagicUiPackage(dependency: string) {\n  return dependency.startsWith(MAGICUI_PACKAGE_PREFIX)\n}\n\n// Infer the primary UI package from example naming conventions like confetti-fireworks.\nfunction inferRegistryDependenciesFromExampleName(\n  exampleName: string,\n  registryUiNames: string[]\n) {\n  const matchingUiNames = registryUiNames\n    .filter((uiName) => {\n      return exampleName === uiName || exampleName.startsWith(`${uiName}-`)\n    })\n    .sort((left, right) => right.length - left.length || left.localeCompare(right))\n\n  const longestMatch = matchingUiNames.at(0)\n  if (!longestMatch) {\n    return []\n  }\n\n  return [`${MAGICUI_PACKAGE_PREFIX}${longestMatch}`]\n}\n\n// Collect static and dynamic module specifiers from a source file.\nfunction collectModuleSpecifiersFromSourceFile(sourceFile: Node) {\n  const importSpecifiers = sourceFile\n    .getDescendantsOfKind(SyntaxKind.ImportDeclaration)\n    .map((importDeclaration) => importDeclaration.getModuleSpecifierValue())\n\n  const dynamicImportSpecifiers = sourceFile\n    .getDescendantsOfKind(SyntaxKind.CallExpression)\n    .flatMap((callExpression) => {\n      if (callExpression.getExpression().getKind() !== SyntaxKind.ImportKeyword) {\n        return []\n      }\n\n      return [getStringLiteralValue(callExpression.getArguments().at(0))]\n    })\n    .filter((specifier): specifier is string => specifier !== null)\n\n  return dedupe([...importSpecifiers, ...dynamicImportSpecifiers])\n}\n\n// Check whether an import points at another source file under apps/www/registry.\nfunction getRegistryImportBasePath(\n  fromFilePath: string,\n  moduleSpecifier: string\n) {\n  if (moduleSpecifier.startsWith(REGISTRY_IMPORT_PREFIX)) {\n    return path.join(registryRoot, moduleSpecifier.slice(REGISTRY_IMPORT_PREFIX.length))\n  }\n\n  if (!moduleSpecifier.startsWith(\".\")) {\n    return null\n  }\n\n  const resolvedPath = path.resolve(path.dirname(fromFilePath), moduleSpecifier)\n  const relativePath = path.relative(registryRoot, resolvedPath)\n\n  if (relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n    return null\n  }\n\n  return resolvedPath\n}\n\n// Resolve registry-local imports without needing a full tsconfig module resolver.\nasync function resolveRegistryImportPath(\n  fromFilePath: string,\n  moduleSpecifier: string\n) {\n  const basePath = getRegistryImportBasePath(fromFilePath, moduleSpecifier)\n  if (!basePath) {\n    return null\n  }\n\n  const candidates = /\\.[mc]?[jt]sx?$/.test(basePath)\n    ? [basePath]\n    : [\n        `${basePath}.tsx`,\n        `${basePath}.ts`,\n        path.join(basePath, \"index.tsx\"),\n        path.join(basePath, \"index.ts\"),\n      ]\n\n  for (const candidate of candidates) {\n    try {\n      await fs.access(candidate)\n      return candidate\n    } catch {\n      continue\n    }\n  }\n\n  return {\n    missingImport: moduleSpecifier,\n    sourceFile: path.relative(registryRoot, fromFilePath),\n  }\n}\n\n// Walk the local registry import graph and collect all reachable @magicui/* packages.\nasync function collectRegistryDependenciesFromFile(\n  project: Project,\n  filePath: string,\n  dependencies: Set<string>,\n  missingFiles: string[],\n  excludedDependencies: Set<string>,\n  visitedFiles = new Set<string>()\n) {\n  const absolutePath = path.resolve(filePath)\n  if (visitedFiles.has(absolutePath)) {\n    return\n  }\n\n  visitedFiles.add(absolutePath)\n\n  const sourceFile =\n    project.getSourceFile(absolutePath) ??\n    project.addSourceFileAtPathIfExists(absolutePath)\n\n  if (!sourceFile) {\n    missingFiles.push(path.relative(registryRoot, absolutePath))\n    return\n  }\n\n  const fileDependency = getRegistryDependencyNameFromFilePath(absolutePath)\n  if (fileDependency && !excludedDependencies.has(fileDependency)) {\n    dependencies.add(fileDependency)\n  }\n\n  for (const moduleSpecifier of collectModuleSpecifiersFromSourceFile(sourceFile)) {\n    const directDependency = getRegistryDependencyName(moduleSpecifier)\n    if (directDependency && !excludedDependencies.has(directDependency)) {\n      dependencies.add(directDependency)\n    }\n\n    const resolvedImport = await resolveRegistryImportPath(\n      absolutePath,\n      moduleSpecifier\n    )\n\n    if (!resolvedImport) {\n      continue\n    }\n\n    if (typeof resolvedImport !== \"string\") {\n      missingFiles.push(\n        `${resolvedImport.sourceFile} -> ${resolvedImport.missingImport}`\n      )\n      continue\n    }\n\n    await collectRegistryDependenciesFromFile(\n      project,\n      resolvedImport,\n      dependencies,\n      missingFiles,\n      excludedDependencies,\n      visitedFiles\n    )\n  }\n}\n\n// Aggregate magicui dependencies across all files referenced by one example.\nasync function collectExampleRegistryDependencies(\n  project: Project,\n  filePaths: string[]\n) {\n  const missingFiles: string[] = []\n  const dependencies = new Set<string>()\n  const visitedFiles = new Set<string>()\n  const excludedDependencies = new Set(\n    filePaths\n      .filter((filePath) => filePath.startsWith(\"example/\"))\n      .map((filePath) => {\n        return getRegistryDependencyNameFromFilePath(path.join(registryRoot, filePath))\n      })\n      .filter((dependency): dependency is string => dependency !== null)\n  )\n\n  for (const filePath of filePaths) {\n    const absolutePath = path.join(registryRoot, filePath)\n\n    try {\n      await fs.access(absolutePath)\n    } catch {\n      missingFiles.push(filePath)\n      continue\n    }\n\n    await collectRegistryDependenciesFromFile(\n      project,\n      absolutePath,\n      dependencies,\n      missingFiles,\n      excludedDependencies,\n      visitedFiles\n    )\n  }\n\n  return {\n    dependencies: Array.from(dependencies).sort((left, right) =>\n      left.localeCompare(right)\n    ),\n    missingFiles,\n  }\n}\n\n// Upsert registryDependencies while keeping the property near files.\nfunction setRegistryDependencies(node: Node, dependencies: string[]) {\n  if (!Node.isObjectLiteralExpression(node)) {\n    return\n  }\n\n  const normalizedDependencies = dedupe(dependencies)\n  const existingProperty = getObjectPropertyAssignment(\n    node,\n    \"registryDependencies\"\n  )\n  const filesPropertyIndex = node\n    .getProperties()\n    .findIndex((property) => {\n      return Node.isPropertyAssignment(property) && property.getName() === \"files\"\n    })\n\n  const initializer = (writer: CodeBlockWriter) => {\n    writer.write(\"[\")\n\n    if (normalizedDependencies.length === 0) {\n      writer.write(\"]\")\n      return\n    }\n\n    writer.newLine()\n    writer.indent(() => {\n      for (const dependency of normalizedDependencies) {\n        writer.writeLine(`${JSON.stringify(dependency)},`)\n      }\n    })\n    writer.write(\"]\")\n  }\n\n  if (existingProperty && Node.isPropertyAssignment(existingProperty)) {\n    existingProperty.setInitializer(initializer)\n    return\n  }\n\n  const insertIndex =\n    filesPropertyIndex >= 0 ? filesPropertyIndex : node.getProperties().length\n\n  node.insertPropertyAssignment(insertIndex, {\n    name: \"registryDependencies\",\n    initializer,\n  })\n}\n\n// Format one mismatch entry for CLI output.\nfunction formatIssue(issue: ExampleIssue) {\n  const fileList =\n    issue.exampleFiles.length > 0 ? issue.exampleFiles.join(\", \") : \"no files\"\n  const extraDependencies =\n    issue.extraDependencies.length > 0\n      ? issue.extraDependencies.join(\", \")\n      : \"none\"\n  const missingDependencies =\n    issue.missingDependencies.length > 0\n      ? issue.missingDependencies.join(\", \")\n      : \"none\"\n  const missingFiles =\n    issue.missingFiles.length > 0 ? issue.missingFiles.join(\", \") : \"none\"\n\n  return [\n    `- ${issue.exampleName}`,\n    `  files: ${fileList}`,\n    `  extra registryDependencies: ${extraDependencies}`,\n    `  missing registryDependencies: ${missingDependencies}`,\n    `  missing files: ${missingFiles}`,\n  ].join(\"\\n\")\n}\n\n// Treat missing files or missing dependencies as failures that need action.\nfunction hasBlockingIssue(issue: ExampleIssue) {\n  return issue.missingDependencies.length > 0 || issue.missingFiles.length > 0\n}\n\n// Treat extra dependencies as non-blocking warnings to avoid destructive churn.\nfunction hasWarningIssue(issue: ExampleIssue) {\n  return issue.extraDependencies.length > 0 && !hasBlockingIssue(issue)\n}\n\n// Raise a hard failure when an example points at files that cannot be read.\nexport function assertNoMissingExampleFiles(issues: ExampleIssue[]) {\n  const missingFileIssues = issues.filter((issue) => issue.missingFiles.length > 0)\n  if (missingFileIssues.length === 0) {\n    return\n  }\n\n  const issueSummary = missingFileIssues.map(formatIssue).join(\"\\n\")\n  throw new Error(\n    [\n      \"registry example dependency sync failed because some example files are missing:\",\n      issueSummary,\n    ].join(\"\\n\")\n  )\n}\n\n// Compare imported magicui components with declared registryDependencies.\nexport async function syncExampleRegistryDependencies({\n  mode,\n}: SyncOptions): Promise<ExampleIssue[]> {\n  const project = new Project({\n    skipAddingFilesFromTsConfig: true,\n  })\n  const registryExamplesSourceFile =\n    project.addSourceFileAtPath(registryExamplesPath)\n  const registryUiSourceFile = project.addSourceFileAtPath(registryUiPath)\n\n  const initializer = getRegistryItemsDeclaration(\n    registryExamplesSourceFile,\n    \"examples\"\n  )\n  const uiInitializer = getRegistryItemsDeclaration(registryUiSourceFile, \"ui\")\n\n  if (!initializer) {\n    throw new Error(\"Could not find the examples array in registry-examples.ts.\")\n  }\n\n  if (!uiInitializer) {\n    throw new Error(\"Could not find the ui array in registry-ui.ts.\")\n  }\n\n  const registryUiNames = uiInitializer\n    .getElements()\n    .flatMap((item) => {\n      if (!Node.isObjectLiteralExpression(item)) {\n        return []\n      }\n\n      if (getRegistryItemType(item) !== \"registry:ui\") {\n        return []\n      }\n\n      return [getRegistryItemName(item)]\n    })\n    .sort((left, right) => right.length - left.length || left.localeCompare(right))\n\n  const issues: ExampleIssue[] = []\n\n  for (const item of initializer.getElements()) {\n    if (!Node.isObjectLiteralExpression(item)) {\n      continue\n    }\n\n    if (getRegistryItemType(item) !== \"registry:example\") {\n      continue\n    }\n\n    const exampleName = getRegistryItemName(item)\n    const exampleFiles = getExampleFilePaths(item)\n    const currentDependencies = getStringArrayValues(\n      getObjectPropertyAssignment(item, \"registryDependencies\")\n    )\n    const { dependencies: importedDependencies, missingFiles } =\n      await collectExampleRegistryDependencies(project, exampleFiles)\n    const inferredDependencies = inferRegistryDependenciesFromExampleName(\n      exampleName,\n      registryUiNames\n    )\n    const expectedDependencies = dedupe([\n      ...importedDependencies,\n      ...inferredDependencies,\n    ]).sort((left, right) => left.localeCompare(right))\n\n    const normalizedCurrentDependencies = dedupe(currentDependencies)\n    const currentMagicUiDependencies = normalizedCurrentDependencies.filter(\n      isMagicUiPackage\n    )\n    const extraDependencies = currentMagicUiDependencies.filter((dependency) => {\n      return !expectedDependencies.includes(dependency)\n    })\n    const missingDependencies = expectedDependencies.filter((dependency) => {\n      return !currentMagicUiDependencies.includes(dependency)\n    })\n    const nextDependencies = [...normalizedCurrentDependencies, ...missingDependencies]\n    const dependenciesChanged =\n      nextDependencies.length !== currentDependencies.length ||\n      nextDependencies.some(\n        (dependency, index) => dependency !== currentDependencies[index]\n      )\n\n    if (dependenciesChanged || missingFiles.length > 0) {\n      issues.push({\n        exampleName,\n        exampleFiles,\n        extraDependencies,\n        missingDependencies,\n        missingFiles,\n      })\n    }\n\n    if (mode === \"fix\" && dependenciesChanged) {\n      setRegistryDependencies(item, nextDependencies)\n    }\n  }\n\n  if (mode === \"fix\" && registryExamplesSourceFile.isSaved() === false) {\n    await registryExamplesSourceFile.save()\n  }\n\n  return issues\n}\n\n// Expose a small check/fix CLI for local runs and package scripts.\nasync function main() {\n  const mode = process.argv.includes(\"--check\") ? \"check\" : \"fix\"\n  const issues = await syncExampleRegistryDependencies({ mode })\n  const blockingIssues = issues.filter(hasBlockingIssue)\n  const warningIssues = issues.filter(hasWarningIssue)\n\n  if (issues.length === 0) {\n    console.log(\"registry example dependencies are in sync\")\n    return\n  }\n\n  const blockingIssueSummary = blockingIssues.map(formatIssue).join(\"\\n\")\n  const warningIssueSummary = warningIssues.map(formatIssue).join(\"\\n\")\n\n  if (mode === \"check\") {\n    if (blockingIssues.length > 0) {\n      console.error(\"registry example dependency mismatches found:\")\n      console.error(blockingIssueSummary)\n      process.exit(1)\n    }\n\n    console.warn(\"registry example dependencies have non-blocking warnings:\")\n    console.warn(warningIssueSummary)\n    return\n  }\n\n  try {\n    assertNoMissingExampleFiles(issues)\n  } catch (error) {\n    console.error(\"registry example dependency sync completed with missing files:\")\n    console.error(error instanceof Error ? error.message : error)\n    process.exit(1)\n  }\n\n  if (blockingIssues.length > 0) {\n    console.log(\"updated registry example dependencies:\")\n    console.log(blockingIssueSummary)\n  } else {\n    console.log(\"registry example dependencies are in sync\")\n  }\n\n  if (warningIssues.length > 0) {\n    console.warn(\"registry example dependencies have non-blocking warnings:\")\n    console.warn(warningIssueSummary)\n  }\n}\n\nif (isMainModule()) {\n  await main()\n}\n"
  },
  {
    "path": "apps/www/source.config.ts",
    "content": "import { remarkImage } from \"fumadocs-core/mdx-plugins\"\nimport {\n  defineConfig,\n  defineDocs,\n  frontmatterSchema,\n} from \"fumadocs-mdx/config\"\nimport rehypePrettyCode from \"rehype-pretty-code\"\nimport { z } from \"zod\"\n\nimport { transformers } from \"@/lib/highlight-code\"\n\nexport default defineConfig({\n  mdxOptions: {\n    remarkPlugins: [\n      [\n        remarkImage,\n        {\n          onError: \"ignore\",\n        },\n      ],\n    ],\n    rehypePlugins: (plugins) => {\n      plugins.shift()\n      plugins.push([\n        // TODO: fix the type.\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        rehypePrettyCode as any,\n        {\n          theme: {\n            dark: \"github-dark\",\n            light: \"github-light-default\",\n          },\n          transformers,\n        },\n      ])\n\n      return plugins\n    },\n  },\n})\n\nexport const docs = defineDocs({\n  dir: \"content/docs\",\n  docs: {\n    schema: frontmatterSchema.extend({\n      date: z.date().optional(),\n      author: z.string().optional(),\n      published: z.boolean().optional().default(true),\n      video: z.string().optional(),\n      links: z\n        .object({\n          doc: z.string().optional(),\n          api: z.string().optional(),\n        })\n        .optional(),\n    }),\n  },\n})\n\nexport const showcase = defineDocs({\n  dir: \"content/showcase\",\n  docs: {\n    schema: frontmatterSchema.extend({\n      affiliation: z.string().optional(),\n      featured: z.boolean().optional().default(false),\n      href: z.string().url().optional(),\n      image: z.string().optional(),\n    }),\n  },\n})\n\nexport const blog = defineDocs({\n  dir: \"content/blog\",\n  docs: {\n    schema: frontmatterSchema.extend({\n      tags: z.array(z.string()).optional(),\n      publishedOn: z.string(),\n      featured: z.boolean().optional().default(false),\n      image: z.string().optional(),\n      author: z.string().optional(),\n    }),\n  },\n})\n"
  },
  {
    "path": "apps/www/styles/globals.css",
    "content": "@import \"tailwindcss\";\n@import \"tw-animate-css\";\n\n@custom-variant dark (&:is(.dark *));\n@custom-variant fixed (&:is(.layout-fixed *));\n\n:root {\n  --font-geist-sans: \"Geist\", sans-serif;\n  --font-geist-mono: \"Geist Mono\", monospace;\n  --radius: 0.625rem;\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.646 0.222 41.116);\n  --chart-2: oklch(0.6 0.118 184.704);\n  --chart-3: oklch(0.398 0.07 227.392);\n  --chart-4: oklch(0.828 0.189 84.429);\n  --chart-5: oklch(0.769 0.188 70.08);\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  --surface: oklch(0.98 0 0);\n  --surface-foreground: var(--foreground);\n  --code: var(--surface);\n  --code-foreground: var(--surface-foreground);\n  --code-highlight: oklch(0.96 0 0);\n  --code-number: oklch(0.56 0 0);\n  --selection: oklch(0.145 0 0);\n  --selection-foreground: oklch(1 0 0);\n\n  --color-1: oklch(66.2% 0.225 25.9);\n  --color-2: oklch(60.4% 0.26 302);\n  --color-3: oklch(69.6% 0.165 251);\n  --color-4: oklch(80.2% 0.134 225);\n  --color-5: oklch(90.7% 0.231 133);\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.488 0.243 264.376);\n  --chart-2: oklch(0.696 0.17 162.48);\n  --chart-3: oklch(0.769 0.188 70.08);\n  --chart-4: oklch(0.627 0.265 303.9);\n  --chart-5: oklch(0.645 0.246 16.439);\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  --surface: oklch(0.2 0 0);\n  --surface-foreground: oklch(0.708 0 0);\n  --code: var(--surface);\n  --code-foreground: var(--surface-foreground);\n  --code-highlight: oklch(0.27 0 0);\n  --code-number: oklch(0.72 0 0);\n  --selection: oklch(0.922 0 0);\n  --selection-foreground: oklch(0.205 0 0);\n}\n\n@theme inline {\n  --breakpoint-3xl: 1600px;\n  --breakpoint-4xl: 2000px;\n  --font-sans: var(--font-geist-sans);\n  --font-inter: var(--font-inter);\n  --font-mono: var(--font-geist-mono);\n  --radius-sm: calc(var(--radius) - 4px);\n  --radius-md: calc(var(--radius) - 2px);\n  --radius-lg: var(--radius);\n  --radius-xl: calc(var(--radius) + 4px);\n  --color-background: var(--background);\n  --color-foreground: var(--foreground);\n  --color-card: var(--card);\n  --color-card-foreground: var(--card-foreground);\n  --color-popover: var(--popover);\n  --color-popover-foreground: var(--popover-foreground);\n  --color-primary: var(--primary);\n  --color-primary-foreground: var(--primary-foreground);\n  --color-secondary: var(--secondary);\n  --color-secondary-foreground: var(--secondary-foreground);\n  --color-muted: var(--muted);\n  --color-muted-foreground: var(--muted-foreground);\n  --color-accent: var(--accent);\n  --color-accent-foreground: var(--accent-foreground);\n  --color-destructive: var(--destructive);\n  --color-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  --color-surface: var(--surface);\n  --color-surface-foreground: var(--surface-foreground);\n  --color-code: var(--code);\n  --color-code-foreground: var(--code-foreground);\n  --color-code-highlight: var(--code-highlight);\n  --color-code-number: var(--code-number);\n  --color-selection: var(--selection);\n  --color-selection-foreground: var(--selection-foreground);\n\n  /* Added Animation Variables */\n  --animate-accordion-down: accordion-down 0.2s ease-out;\n  --animate-accordion-up: accordion-up 0.2s ease-out;\n  --animate-gradient: gradient 8s linear infinite;\n  --animate-meteor: meteor 5s linear infinite;\n  --animate-marquee: marquee var(--duration) infinite linear;\n  --animate-marquee-vertical: marquee-vertical var(--duration) linear infinite;\n  --animate-spin-around: spin-around calc(var(--speed) * 2) infinite linear;\n  --animate-shiny-text: shiny-text 8s infinite;\n  --animate-shimmer-slide: shimmer-slide var(--speed) ease-in-out infinite\n    alternate;\n  --animate-ripple: ripple var(--duration, 2s) ease calc(var(--i, 0) * 0.2s)\n    infinite;\n  --animate-rippling: rippling var(--duration, 0.6s) ease-out;\n  --animate-line: line 2s linear infinite;\n  --animate-orbit: orbit calc(var(--duration) * 1s) linear infinite;\n  --animate-background-position-spin: background-position-spin 3000ms infinite\n    alternate;\n  --animate-shine: shine var(--duration) infinite linear;\n  --animate-pulse: pulse var(--duration) ease-out infinite;\n  --animate-rainbow: rainbow var(--speed, 2s) infinite linear;\n  --animate-line-shadow: line-shadow 15s linear infinite;\n  --animate-aurora: aurora 8s ease-in-out infinite alternate;\n  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n  --animate-blink-cursor: blink-cursor 1.2s step-end infinite;\n\n  /* End Animation Variables */\n\n  /* Added Keyframes */\n  @keyframes blink-cursor {\n    0%,\n    49% {\n      opacity: 1;\n    }\n    50%,\n    100% {\n      opacity: 0;\n    }\n  }\n\n  @keyframes aurora {\n    0% {\n      background-position: 0% 50%;\n      transform: rotate(-5deg) scale(0.9);\n    }\n    25% {\n      background-position: 50% 100%;\n      transform: rotate(5deg) scale(1.1);\n    }\n    50% {\n      background-position: 100% 50%;\n      transform: rotate(-3deg) scale(0.95);\n    }\n    75% {\n      background-position: 50% 0%;\n      transform: rotate(3deg) scale(1.05);\n    }\n    100% {\n      background-position: 0% 50%;\n      transform: rotate(-5deg) scale(0.9);\n    }\n  }\n\n  @keyframes accordion-down {\n    from {\n      height: 0;\n    }\n    to {\n      height: var(--radix-accordion-content-height);\n    }\n  }\n\n  @keyframes accordion-up {\n    from {\n      height: var(--radix-accordion-content-height);\n    }\n    to {\n      height: 0;\n    }\n  }\n\n  @keyframes background-position-spin {\n    0% {\n      background-position: top center;\n    }\n    100% {\n      background-position: bottom center;\n    }\n  }\n\n  @keyframes gradient {\n    to {\n      background-position: var(--bg-size, 300%) 0;\n    }\n  }\n\n  @keyframes meteor {\n    0% {\n      transform: rotate(var(--angle)) translateX(0);\n      opacity: 1;\n    }\n    70% {\n      opacity: 1;\n    }\n    100% {\n      transform: rotate(var(--angle)) translateX(-500px);\n      opacity: 0;\n    }\n  }\n\n  @keyframes marquee {\n    from {\n      transform: translateX(0);\n    }\n    to {\n      transform: translateX(calc(-100% - var(--gap)));\n    }\n  }\n\n  @keyframes marquee-vertical {\n    from {\n      transform: translateY(0);\n    }\n    to {\n      transform: translateY(calc(-100% - var(--gap)));\n    }\n  }\n\n  @keyframes spin-around {\n    0% {\n      transform: translateZ(0) rotate(0);\n    }\n    15%,\n    35% {\n      transform: translateZ(0) rotate(90deg);\n    }\n    65%,\n    85% {\n      transform: translateZ(0) rotate(270deg);\n    }\n    100% {\n      transform: translateZ(0) rotate(360deg);\n    }\n  }\n\n  @keyframes ripple {\n    0%,\n    100% {\n      transform: translate(-50%, -50%) scale(1);\n    }\n    50% {\n      transform: translate(-50%, -50%) scale(0.9);\n    }\n  }\n\n  @keyframes rippling {\n    0% {\n      opacity: 1;\n    }\n    100% {\n      transform: scale(2);\n      opacity: 0;\n    }\n  }\n\n  @keyframes shimmer-slide {\n    to {\n      transform: translate(calc(100cqw - 100%), 0);\n    }\n  }\n\n  @keyframes line {\n    0% {\n      mask-position-x: 0%;\n    }\n    100% {\n      mask-position-x: 100%;\n    }\n  }\n\n  @keyframes shiny-text {\n    0%,\n    90%,\n    100% {\n      background-position: calc(-100% - var(--shiny-width)) 0;\n    }\n    30%,\n    60% {\n      background-position: calc(100% + var(--shiny-width)) 0;\n    }\n  }\n\n  @keyframes orbit {\n    0% {\n      transform: rotate(calc(var(--angle) * 1deg))\n        translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg));\n    }\n    100% {\n      transform: rotate(calc(var(--angle) * 1deg + 360deg))\n        translateY(calc(var(--radius) * 1px))\n        rotate(calc((var(--angle) * -1deg) - 360deg));\n    }\n  }\n\n  @keyframes shine {\n    0% {\n      background-position: 0% 0%;\n    }\n    50% {\n      background-position: 100% 100%;\n    }\n    to {\n      background-position: 0% 0%;\n    }\n  }\n\n  @keyframes pulse {\n    0%,\n    100% {\n      box-shadow: 0 0 0 0 var(--pulse-color);\n    }\n    50% {\n      box-shadow: 0 0 0 8px var(--pulse-color);\n    }\n  }\n\n  @keyframes rainbow {\n    0% {\n      background-position: 0%;\n    }\n    100% {\n      background-position: 200%;\n    }\n  }\n\n  @keyframes line-shadow {\n    0% {\n      background-position: 0 0;\n    }\n    100% {\n      background-position: 100% -100%;\n    }\n  }\n\n  @keyframes ping {\n    75%,\n    100% {\n      transform: scale(2);\n      opacity: 0;\n    }\n  }\n}\n\n@layer base {\n  :root {\n    @apply overflow-x-hidden overscroll-none;\n  }\n\n  * {\n    @apply border-border outline-ring/50;\n  }\n  ::selection {\n    @apply bg-selection text-selection-foreground;\n  }\n  html {\n    @apply scroll-smooth;\n  }\n\n  body {\n    @apply bg-background text-foreground overscroll-none;\n    font-synthesis-weight: none;\n    text-rendering: optimizeLegibility;\n  }\n\n  a:active,\n  button:active {\n    @apply opacity-60 md:opacity-100;\n  }\n\n  ::view-transition-old(root),\n  ::view-transition-new(root) {\n    animation: none;\n    mix-blend-mode: normal;\n  }\n}\n\n@utility no-scrollbar {\n  -ms-overflow-style: none;\n  scrollbar-width: none;\n\n  &::-webkit-scrollbar {\n    display: none;\n  }\n}\n\n@utility container-wrapper {\n  @apply 3xl:fixed:max-w-[calc(var(--breakpoint-2xl)+2rem)] mx-auto w-full px-2;\n}\n@utility container {\n  @apply 3xl:max-w-screen-2xl mx-auto max-w-[1400px] px-4 lg:px-8;\n}\n\n@utility extend-touch-target {\n  @media (pointer: coarse) {\n    @apply relative touch-manipulation after:absolute after:-inset-2;\n  }\n}\n\n.lab-bg {\n  --mask-offset: 100px;\n  -webkit-mask:\n    linear-gradient(\n      to bottom,\n      transparent,\n      #fff var(--mask-offset) calc(100% - var(--mask-offset)),\n      transparent\n    ),\n    linear-gradient(\n      to right,\n      transparent,\n      #fff var(--mask-offset) calc(100% - var(--mask-offset)),\n      transparent\n    );\n  mask:\n    linear-gradient(\n      to bottom,\n      transparent,\n      #fff var(--mask-offset) calc(100% - var(--mask-offset)),\n      transparent\n    ),\n    linear-gradient(\n      to right,\n      transparent,\n      #fff var(--mask-offset) calc(100% - var(--mask-offset)),\n      transparent\n    );\n  -webkit-mask-composite: source-in, xor;\n  mask-composite: intersect;\n}\n\n@layer components {\n  .steps {\n    counter-reset: steps;\n  }\n\n  .steps > h3 {\n    counter-increment: steps;\n  }\n\n  .steps > h3:before {\n    @apply border-background bg-muted absolute inline-flex h-9 w-9 items-center justify-center rounded-full border-4 text-center -indent-px font-mono text-base font-medium;\n    @apply mt-[-4px] ml-[-50px];\n    content: counter(steps);\n  }\n\n  [data-rehype-pretty-code-figure] {\n    background-color: var(--color-code);\n    color: var(--color-code-foreground);\n    border-radius: var(--radius-lg);\n    border-width: 1px;\n    border-color: var(--border);\n    margin-top: calc(var(--spacing) * 6);\n    overflow: hidden;\n    font-size: var(--text-sm);\n    outline: none;\n    position: relative;\n    @apply -mx-1 md:-mx-1;\n\n    &:has([data-rehype-pretty-code-title]) [data-slot=\"copy-button\"] {\n      top: calc(var(--spacing) * 1.5) !important;\n    }\n  }\n\n  [data-rehype-pretty-code-title] {\n    border-bottom: color-mix(in oklab, var(--border) 30%, transparent);\n    border-bottom-width: 1px;\n    border-bottom-style: solid;\n    padding-block: calc(var(--spacing) * 2.5);\n    padding-inline: calc(var(--spacing) * 4);\n    font-size: var(--text-sm);\n    font-family: var(--font-mono);\n    color: var(--color-code-foreground);\n  }\n\n  [data-line-numbers] {\n    display: grid;\n    min-width: 100%;\n    white-space: pre;\n    border: 0;\n    background: transparent;\n    padding: 0;\n    counter-reset: line;\n    box-decoration-break: clone;\n  }\n\n  [data-line-numbers] [data-line]::before {\n    font-size: var(--text-sm);\n    counter-increment: line;\n    content: counter(line);\n    display: inline-block;\n    width: calc(var(--spacing) * 16);\n    padding-right: calc(var(--spacing) * 6);\n    text-align: right;\n    color: var(--color-code-number);\n    background-color: var(--color-code);\n    position: sticky;\n    left: 0;\n  }\n\n  [data-line-numbers] [data-highlighted-line][data-line]::before {\n    background-color: var(--color-code-highlight);\n  }\n\n  [data-line] {\n    padding-top: calc(var(--spacing) * 0.5);\n    padding-bottom: calc(var(--spacing) * 0.5);\n    min-height: calc(var(--spacing) * 1);\n    width: 100%;\n    display: inline-block;\n  }\n\n  [data-line] span {\n    color: var(--shiki-light);\n\n    @variant dark {\n      color: var(--shiki-dark) !important;\n    }\n  }\n\n  [data-highlighted-line],\n  [data-highlighted-chars] {\n    position: relative;\n    background-color: var(--color-code-highlight);\n  }\n\n  [data-highlighted-line] {\n    &:after {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 2px;\n      height: 100%;\n      content: \"\";\n      background-color: color-mix(\n        in oklab,\n        var(--muted-foreground) 50%,\n        transparent\n      );\n    }\n  }\n\n  [data-highlighted-chars] {\n    border-radius: var(--radius-sm);\n    padding-inline: 0.3rem;\n    padding-block: 0.1rem;\n    font-family: var(--font-mono);\n    font-size: 0.8rem;\n  }\n\n  iframe {\n    @apply mt-6 rounded-lg overflow-hidden;\n  }\n}\n"
  },
  {
    "path": "apps/www/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"target\": \"esnext\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    }\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n  \"exclude\": [\"node_modules\", \"packages/**/*\", \"scripts/**/*\"]\n}\n"
  },
  {
    "path": "apps/www/tsconfig.scripts.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"target\": \"es6\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"esModuleInterop\": true,\n    \"isolatedModules\": false\n  },\n  \"include\": [\"scripts/**/*.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "apps/www/types/index.d.ts",
    "content": "import { Icons } from \"@/components/icons\"\n\nexport interface NavItem {\n  title: string\n  href?: string\n  disabled?: boolean\n  external?: boolean\n  icon?: keyof typeof Icons\n  label?: string\n  paid?: boolean\n  event?: Event[\"name\"]\n}\n\nexport interface NavItemWithChildren extends NavItem {\n  items?: NavItemWithChildren[]\n}\n\nexport type DashboardConfig = {\n  mainNav: NavItem[]\n  sidebarNav: NavItemWithChildren[]\n}\n"
  },
  {
    "path": "apps/www/types/unist.ts",
    "content": "import type { Node } from \"unist\"\n\nexport interface UnistNode extends Node {\n  type: string\n  name?: string\n  tagName?: string\n  value?: string\n  properties?: {\n    __rawString__?: string\n    __className__?: string\n    __event__?: string\n    [key: string]: unknown\n  } & NpmCommands\n  attributes?: {\n    name: string\n    value: unknown\n    type?: string\n  }[]\n  children?: UnistNode[]\n}\n\nexport interface UnistTree extends UnistNode {\n  children: UnistNode[]\n}\n\nexport interface NpmCommands {\n  __npmCommand__?: string\n  __yarnCommand__?: string\n  __pnpmCommand__?: string\n  __bunCommand__?: string\n}\n"
  },
  {
    "path": "lefthook.yml",
    "content": "pre-commit:\n  parallel: true\n  commands:\n    build:registry:\n      glob: \"**/registry/**/*.{ts,tsx}\"\n      run: pnpm build:registry && git add --all\n      stage_fixed: true\n    typecheck:\n      glob: \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}\"\n      run: pnpm typecheck\n      stage_fixed: true\n    lint:fix:\n      glob: \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}\"\n      run: pnpm lint:fix\n      stage_fixed: true\n    format:fix:silent:\n      glob: \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}\"\n      run: pnpm format:fix:silent\n      stage_fixed: true\n\ncommit-msg:\n  commands:\n    \"lint commit message\":\n      run: npx --no -- commitlint --edit \"$1\"\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"magicui\",\n  \"private\": true,\n  \"version\": \"0.1.0\",\n  \"type\": \"module\",\n  \"packageManager\": \"pnpm@9.15.0\",\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"dev\": \"turbo run dev --parallel\",\n    \"build\": \"turbo run build\",\n    \"start\": \"turbo run start\",\n    \"lint\": \"turbo run lint\",\n    \"lint:fix\": \"turbo run lint:fix\",\n    \"typecheck\": \"turbo run typecheck\",\n    \"format:fix\": \"turbo run format:fix\",\n    \"format:fix:silent\": \"turbo run format:fix -- --log-level silent\",\n    \"format:check\": \"turbo run format:check\",\n    \"registry-deps:check\": \"pnpm --filter=www registry-deps:check\",\n    \"build:registry\": \"pnpm --filter=www build:registry && pnpm --filter=www lint:fix && pnpm format:fix:silent\",\n    \"check\": \"pnpm lint && pnpm typecheck && pnpm format:check && pnpm registry-deps:check\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/cli\": \"^19.8.1\",\n    \"@commitlint/config-conventional\": \"^19.8.1\",\n    \"js-yaml\": \"^4.1.0\",\n    \"lefthook\": \"^1.13.4\",\n    \"turbo\": \"^2.5.8\",\n    \"ultracite\": \"5.4.4\"\n  },\n  \"engines\": {\n    \"node\": \">=22.14.0\",\n    \"pnpm\": \">=9\"\n  },\n  \"commitlint\": {\n    \"extends\": [\n      \"@commitlint/config-conventional\"\n    ]\n  }\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - apps/*\n  - packages/*\n"
  },
  {
    "path": "registry.json",
    "content": "{\n  \"name\": \"magic-ui\",\n  \"homepage\": \"https://magicui.design\",\n  \"items\": [\n    {\n      \"name\": \"index\",\n      \"type\": \"registry:style\",\n      \"dependencies\": [\n        \"tw-animate-css\",\n        \"class-variance-authority\",\n        \"lucide-react\"\n      ],\n      \"registryDependencies\": [\n        \"utils\"\n      ],\n      \"files\": [],\n      \"cssVars\": {}\n    },\n    {\n      \"name\": \"magic-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Magic Card\",\n      \"description\": \"A spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/magic-card.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/magic-card.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Android\",\n      \"description\": \"A mockup of an Android device.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/android.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/android.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Warp Background\",\n      \"description\": \"A card with a time warping background effect.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/warp-background.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/warp-background.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Line Shadow Text\",\n      \"description\": \"A text component with a moving line shadow.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/line-shadow-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/line-shadow-text.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-line-shadow\": \"line-shadow 15s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes line-shadow\": {\n          \"0%\": {\n            \"background-position\": \"0 0\"\n          },\n          \"100%\": {\n            \"background-position\": \"100% -100%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"aurora-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aurora Text\",\n      \"description\": \"A beautiful aurora text effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/aurora-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/aurora-text.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-aurora\": \"aurora 8s ease-in-out infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes aurora\": {\n          \"0%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          },\n          \"25%\": {\n            \"background-position\": \"50% 100%\",\n            \"transform\": \"rotate(5deg) scale(1.1)\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 50%\",\n            \"transform\": \"rotate(-3deg) scale(0.95)\"\n          },\n          \"75%\": {\n            \"background-position\": \"50% 0%\",\n            \"transform\": \"rotate(3deg) scale(1.05)\"\n          },\n          \"100%\": {\n            \"background-position\": \"0% 50%\",\n            \"transform\": \"rotate(-5deg) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"morphing-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Morphing Text\",\n      \"description\": \"A dynamic text morphing component for Magic UI.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/morphing-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/morphing-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Progress\",\n      \"description\": \"Animated Scroll Progress for your pages\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-progress.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/scroll-progress.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Lens\",\n      \"description\": \"A interactive component that enables zooming into images, videos and other elements.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/lens.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/lens.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pointer\",\n      \"description\": \"A component that displays a pointer when hovering over an element\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pointer.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/pointer.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor\",\n      \"type\": \"registry:ui\",\n      \"description\": \"A customizable, physics-based smooth cursor animation component with spring animations and rotation effects\",\n      \"dependencies\": [\n        \"framer-motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/smooth-cursor.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progressive Blur\",\n      \"description\": \"The Progressive Blur component adds a smooth blur gradient effect to scrollable content, indicating more content below or above.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/progressive-blur.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/progressive-blur.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Neon Gradient Card\",\n      \"description\": \"A beautiful neon card effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/neon-gradient-card.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/neon-gradient-card.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-background-position-spin\": \"background-position-spin 3000ms infinite alternate\"\n        }\n      },\n      \"css\": {\n        \"@keyframes background-position-spin\": {\n          \"0%\": {\n            \"background-position\": \"top center\"\n          },\n          \"100%\": {\n            \"background-position\": \"bottom center\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"meteors\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Meteors\",\n      \"description\": \"A meteor shower effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/meteors.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/meteors.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-meteor\": \"meteor 5s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes meteor\": {\n          \"0%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(0)\",\n            \"opacity\": \"1\"\n          },\n          \"70%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(var(--angle)) translateX(-500px)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Grid Pattern\",\n      \"description\": \"A background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/grid-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/grid-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Striped Pattern\",\n      \"description\": \"A background striped pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/striped-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/striped-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Interactive Grid Pattern\",\n      \"description\": \"A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-grid-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/interactive-grid-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dot Pattern\",\n      \"description\": \"A background dot pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dot-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/dot-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Flickering Grid\",\n      \"description\": \"A flickering grid background made with SVGs, fully customizable using Tailwind CSS.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/flickering-grid.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/flickering-grid.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hero Video Dialog\",\n      \"description\": \"A hero video dialog component.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hero-video-dialog.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/hero-video-dialog.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Code Comparison\",\n      \"description\": \"A component which compares two code snippets.\",\n      \"dependencies\": [\n        \"shiki\",\n        \"next-themes\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/code-comparison.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/code-comparison.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"script-copy-btn\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Script Copy Button\",\n      \"description\": \"Copy code to clipboard\",\n      \"dependencies\": [\n        \"motion\",\n        \"shiki\",\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/script-copy-btn.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/script-copy-btn.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Marquee\",\n      \"description\": \"An infinite scrolling component that can be used to display text, images, or videos.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/marquee.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/marquee.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-marquee\": \"marquee var(--duration) infinite linear\",\n          \"animate-marquee-vertical\": \"marquee-vertical var(--duration) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes marquee\": {\n          \"from\": {\n            \"transform\": \"translateX(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateX(calc(-100% - var(--gap)))\"\n          }\n        },\n        \"@keyframes marquee-vertical\": {\n          \"from\": {\n            \"transform\": \"translateY(0)\"\n          },\n          \"to\": {\n            \"transform\": \"translateY(calc(-100% - var(--gap)))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"globe\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Globe\",\n      \"description\": \"An autorotating, interactive, and highly performant globe made using WebGL.\",\n      \"dependencies\": [\n        \"cobe\",\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/globe.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/globe.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shimmer Button\",\n      \"description\": \"A button with a shimmering light which travels around the perimeter.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shimmer-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/shimmer-button.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shimmer-slide\": \"shimmer-slide var(--speed) ease-in-out infinite alternate\",\n          \"animate-spin-around\": \"spin-around calc(var(--speed) * 2) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shimmer-slide\": {\n          \"to\": {\n            \"transform\": \"translate(calc(100cqw - 100%), 0)\"\n          }\n        },\n        \"@keyframes spin-around\": {\n          \"0%\": {\n            \"transform\": \"translateZ(0) rotate(0)\"\n          },\n          \"15%, 35%\": {\n            \"transform\": \"translateZ(0) rotate(90deg)\"\n          },\n          \"65%, 85%\": {\n            \"transform\": \"translateZ(0) rotate(270deg)\"\n          },\n          \"100%\": {\n            \"transform\": \"translateZ(0) rotate(360deg)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tweet Card\",\n      \"description\": \"A card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/tweet-card.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/tweet-card.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"client-tweet-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Client Tweet Card\",\n      \"description\": \"A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.\",\n      \"dependencies\": [\n        \"react-tweet\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/client-tweet-card.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/client-tweet-card.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Bento Grid\",\n      \"description\": \"Bento grid is a layout used to showcase the features of a product in a simple and elegant way.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/bento-grid.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/bento-grid.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Particles\",\n      \"description\": \"Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/particles.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/particles.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Number Ticker\",\n      \"description\": \"Animate numbers to count up or down to a target number\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/number-ticker.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/number-ticker.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple\",\n      \"description\": \"An animated ripple effect typically used behind elements to emphasize them.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/ripple.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-ripple\": \"ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes ripple\": {\n          \"0%, 100%\": {\n            \"transform\": \"translate(-50%, -50%) scale(1)\"\n          },\n          \"50%\": {\n            \"transform\": \"translate(-50%, -50%) scale(0.9)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"retro-grid\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Retro Grid\",\n      \"description\": \"An animated scrolling retro grid effect\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/retro-grid.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/retro-grid.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-grid\": \"grid 15s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes grid\": {\n          \"0%\": {\n            \"transform\": \"translateY(-50%)\"\n          },\n          \"100%\": {\n            \"transform\": \"translateY(0)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-list\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated List\",\n      \"description\": \"A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-list.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-list.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Shiny Text\",\n      \"description\": \"A light glare effect which pans across text making it appear as if it is shimmering.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-shiny-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-shiny-text.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shiny-text\": \"shiny-text 8s infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shiny-text\": {\n          \"0%, 90%, 100%\": {\n            \"background-position\": \"calc(-100% - var(--shiny-width)) 0\"\n          },\n          \"30%, 60%\": {\n            \"background-position\": \"calc(100% + var(--shiny-width)) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-grid-pattern\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Grid Pattern\",\n      \"description\": \"A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-grid-pattern.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-grid-pattern.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Border Beam\",\n      \"description\": \"An animated beam of light which travels along the border of its container.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/border-beam.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/border-beam.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Beam\",\n      \"description\": \"An animated beam of light which travels along a path. Useful for showcasing the integration features of a website.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-beam.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-beam.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Reveal\",\n      \"description\": \"Fade in text as you scroll down the page.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-reveal.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/text-reveal.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hyper Text\",\n      \"description\": \"A text animation that scrambles letters before revealing the final text.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/hyper-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/hyper-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Gradient Text\",\n      \"description\": \"An animated gradient background which transitions between colors for text.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-gradient-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-gradient-text.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-gradient\": \"gradient 8s linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes gradient\": {\n          \"to\": {\n            \"background-position\": \"var(--bg-size, 300%) 0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"orbiting-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Orbiting Circles\",\n      \"description\": \"A collection of circles which move in orbit along a circular path\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/orbiting-circles.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/orbiting-circles.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-orbit\": \"orbit calc(var(--duration)*1s) linear infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes orbit\": {\n          \"0%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))\"\n          },\n          \"100%\": {\n            \"transform\": \"rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"dock\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dock\",\n      \"description\": \"An implementation of the MacOS dock using react + tailwindcss + motion\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/dock.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/dock.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Word Rotate\",\n      \"description\": \"A vertical rotation of words\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/word-rotate.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/word-rotate.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar Circles\",\n      \"description\": \"Overlapping circles of avatars.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/avatar-circles.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/avatar-circles.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Typing Animation\",\n      \"description\": \"Characters appearing in typed animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/typing-animation.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/typing-animation.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkles-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Sparkles Text\",\n      \"description\": \"A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/sparkles-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/sparkles-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Spinning Text\",\n      \"description\": \"The Spinning Text component animates text in a circular motion with customizable speed, direction, color, and transitions for dynamic and engaging effects.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/spinning-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/spinning-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flip-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Flip Text\",\n      \"description\": \"Text flipping character animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/flip-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/flip-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Comic Text\",\n      \"description\": \"Comic text animation\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/comic-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/comic-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon Cloud\",\n      \"description\": \"An interactive 3D tag cloud component\",\n      \"dependencies\": [],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/icon-cloud.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/icon-cloud.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text Animate\",\n      \"description\": \"A text animation component that animates text using a variety of different animations.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/text-animate.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/text-animate.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scroll Based Velocity\",\n      \"description\": \"Scrolling text whose speed changes based on scroll speed\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scroll-based-velocity.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/scroll-based-velocity.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scratch-to-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Scratch To Reveal\",\n      \"description\": \"The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/scratch-to-reveal.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/scratch-to-reveal.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shiny Button\",\n      \"description\": \"A shiny button component with dynamic styles in the dark mode or light mode.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shiny-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/shiny-button.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"box-reveal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Box Reveal Animation\",\n      \"description\": \"Sliding box animation that reveals text behind it.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/box-reveal.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/box-reveal.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Shine Border\",\n      \"description\": \"Shine border is an animated background border effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/shine-border.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/shine-border.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-shine\": \"shine var(--duration) infinite linear\"\n        }\n      },\n      \"css\": {\n        \"@keyframes shine\": {\n          \"0%\": {\n            \"background-position\": \"0% 0%\"\n          },\n          \"50%\": {\n            \"background-position\": \"100% 100%\"\n          },\n          \"to\": {\n            \"background-position\": \"0% 0%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"animated-circular-progress-bar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Circular Progress Bar\",\n      \"description\": \"Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-circular-progress-bar.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-circular-progress-bar.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Confetti\",\n      \"description\": \"Confetti animations are best used to delight your users when something special happens\",\n      \"dependencies\": [\n        \"canvas-confetti\",\n        \"@types/canvas-confetti\"\n      ],\n      \"registryDependencies\": [\n        \"button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/confetti.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/confetti.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-subscribe-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Animated Subscribe Button\",\n      \"description\": \"An animated subscribe button useful for showing a micro animation from intial to final result.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-subscribe-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-subscribe-button.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Cool Mode\",\n      \"description\": \"Cool mode effect for buttons, links, and other DOMs\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/cool-mode.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/cool-mode.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pulsating Button\",\n      \"description\": \"An animated pulsating button useful for capturing attention of users.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pulsating-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/pulsating-button.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-pulse\": \"pulse var(--duration) ease-out infinite\"\n        }\n      },\n      \"css\": {\n        \"@keyframes pulse\": {\n          \"0%, 100%\": {\n            \"boxShadow\": \"0 0 0 0 var(--pulse-color)\"\n          },\n          \"50%\": {\n            \"boxShadow\": \"0 0 0 8px var(--pulse-color)\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"ripple-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Ripple Button\",\n      \"description\": \"An animated button with ripple useful for user engagement.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/ripple-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/ripple-button.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rippling\": \"rippling var(--duration) ease-out\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rippling\": {\n          \"0%\": {\n            \"opacity\": \"1\"\n          },\n          \"100%\": {\n            \"transform\": \"scale(2)\",\n            \"opacity\": \"0\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"file-tree\",\n      \"type\": \"registry:ui\",\n      \"title\": \"File Tree\",\n      \"description\": \"A component used to showcase the folder and file structure of a directory.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/file-tree.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/file-tree.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Blur Fade\",\n      \"description\": \"Blur fade in and out animation. Used to smoothly fade in and out content.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/blur-fade.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/blur-fade.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Safari\",\n      \"description\": \"A safari browser mockup to showcase your website.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/safari.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/safari.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-15-pro\",\n      \"type\": \"registry:ui\",\n      \"title\": \"iPhone 15 Pro\",\n      \"description\": \"A mockup of the iPhone 15 Pro\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/iphone-15-pro.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/iphone-15-pro.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Rainbow Button\",\n      \"description\": \"An animated button with a rainbow effect.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/rainbow-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/rainbow-button.tsx\"\n        }\n      ],\n      \"cssVars\": {\n        \"theme\": {\n          \"animate-rainbow\": \"rainbow var(--speed, 2s) infinite linear\"\n        },\n        \"light\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        },\n        \"dark\": {\n          \"color-1\": \"oklch(66.2% 0.225 25.9)\",\n          \"color-2\": \"oklch(60.4% 0.26 302)\",\n          \"color-3\": \"oklch(69.6% 0.165 251)\",\n          \"color-4\": \"oklch(80.2% 0.134 225)\",\n          \"color-5\": \"oklch(90.7% 0.231 133)\"\n        }\n      },\n      \"css\": {\n        \"@keyframes rainbow\": {\n          \"0%\": {\n            \"background-position\": \"0%\"\n          },\n          \"100%\": {\n            \"background-position\": \"200%\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"interactive-hover-button\",\n      \"type\": \"registry:ui\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/interactive-hover-button.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/interactive-hover-button.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Terminal\",\n      \"description\": \"A terminal component\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/terminal.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/terminal.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Video Text\",\n      \"description\": \"A component that displays text with a video playing in the background.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/video-text.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/video-text.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Pixel Image\",\n      \"description\": \"A component that displays an image with a pixelated effect, creating a retro aesthetic.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/pixel-image.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/pixel-image.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Highlighter\",\n      \"description\": \"A text highlighter that mimics the effect of a human-drawn marker stroke.\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/highlighter.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"arc-timeline\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Arc Timeline\",\n      \"description\": \"A curved timeline that elegantly visualizes key milestones, perfect for Web3 and AI roadmaps.\",\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/arc-timeline.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/arc-timeline.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Theme Toggler\",\n      \"description\": \"A component for theme changing animation.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/animated-theme-toggler.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/animated-theme-toggler.tsx\"\n        }\n      ],\n      \"css\": {\n        \"::view-transition-old(root), ::view-transition-new(root)\": {\n          \"animation\": \"none\",\n          \"mix-blend-mode\": \"normal\"\n        }\n      }\n    },\n    {\n      \"name\": \"grid-beams\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Grid Beams\",\n      \"description\": \"A dynamic grid background with animated light beams rays and grid patterns.\",\n      \"dependencies\": [\n        \"motion\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/magicui/grid-beams.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/grid-beams.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"magic-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Magic Card Demo\",\n      \"description\": \"Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/magic-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/magic-card-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/magic-card-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo\",\n      \"description\": \"Example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/android-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 2\",\n      \"description\": \"Second example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/android-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"android-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Android Demo 3\",\n      \"description\": \"Third example showing a mockup of an Android device.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/android\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/android-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/android-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"warp-background-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Warp Background Demo\",\n      \"description\": \"Example showing a card with a time warping background effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/warp-background\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/warp-background-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/warp-background-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"line-shadow-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Line Shadow Text Demo\",\n      \"description\": \"Example showing a text component with a moving line shadow.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/line-shadow-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/line-shadow-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/line-shadow-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"aurora-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Aurora Text Demo\",\n      \"description\": \"Example showing a beautiful aurora text effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/aurora-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/aurora-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/aurora-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"morphing-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Morphing Text Demo\",\n      \"description\": \"Example showing a dynamic text morphing component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/morphing-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/morphing-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/morphing-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-progress-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Progress Demo\",\n      \"description\": \"Example showing animated scroll progress for your pages.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/scroll-progress\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-progress-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/scroll-progress-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo\",\n      \"description\": \"Example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"https://magicui.design/r/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/lens-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 2\",\n      \"description\": \"Second example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"https://magicui.design/r/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/lens-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lens-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Lens Demo 3\",\n      \"description\": \"Third example showing a lens effect component\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"https://magicui.design/r/lens\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/lens-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/lens-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pointer-demo-1\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pointer Demo 1\",\n      \"description\": \"Example showing a pointer effect component\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/pointer\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pointer-demo-1.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/pointer-demo-1.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"smooth-cursor-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Basic smooth cursor example\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/smooth-cursor\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/smooth-cursor-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/smooth-cursor-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"progressive-blur-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Progressive Blur Demo\",\n      \"description\": \"Example showing progressive blur effect for scrollable content.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/progressive-blur\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/progressive-blur-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/progressive-blur-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"neon-gradient-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Neon Gradient Card Demo\",\n      \"description\": \"Example showing a beautiful neon card effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/neon-gradient-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/neon-gradient-card-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/neon-gradient-card-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"meteors-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Meteors Demo\",\n      \"description\": \"Example showing a meteor shower effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/meteors\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/meteors-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/meteors-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Demo\",\n      \"description\": \"Example showing a background grid pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/grid-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern Demo\",\n      \"description\": \"Example showing a background striped pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-left\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Left)\",\n      \"description\": \"Example showing a background striped pattern slanting to the left using SVG.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-left.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-left.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"striped-pattern-right\",\n      \"type\": \"registry:example\",\n      \"title\": \"Striped Pattern (Right)\",\n      \"description\": \"Example showing a background striped pattern slanting to the right using SVG.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/striped-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/striped-pattern-right.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/striped-pattern-right.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Linear Gradient\",\n      \"description\": \"Example showing a grid pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/grid-pattern-linear-gradient.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-pattern-dashed\",\n      \"type\": \"registry:example\",\n      \"title\": \"Grid Pattern Dashed\",\n      \"description\": \"Example showing a dashed grid pattern.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-pattern-dashed.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/grid-pattern-dashed.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Demo\",\n      \"description\": \"Example showing a background dot pattern made with SVGs.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dot-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-linear-gradient\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern Linear Gradient\",\n      \"description\": \"Example showing a dot pattern with linear gradient effects.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-linear-gradient.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dot-pattern-linear-gradient.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dot-pattern-with-glow-effect\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dot Pattern with glow effect\",\n      \"description\": \"Example showing a dot pattern with glow effect\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/dot-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dot-pattern-with-glow-effect.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dot-pattern-with-glow-effect.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Demo\",\n      \"description\": \"Example showing a flickering grid background.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/flickering-grid-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flickering-grid-rounded-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flickering Grid Rounded Demo\",\n      \"description\": \"Example showing a flickering grid background with rounded corners.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/flickering-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flickering-grid-rounded-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/flickering-grid-rounded-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Demo\",\n      \"description\": \"Example showing a hero video dialog component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/hero-video-dialog-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hero-video-dialog-demo-top-in-bottom-out\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hero Video Dialog Top In Bottom Out Demo\",\n      \"description\": \"Example showing a hero video dialog with top-in bottom-out animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/hero-video-dialog\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/hero-video-dialog-demo-top-in-bottom-out.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"code-comparison-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Code Comparison Demo\",\n      \"description\": \"Example showing a component which compares two code snippets.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/code-comparison\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/code-comparison-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/code-comparison-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"script-copy-btn-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Script Copy Button Demo\",\n      \"description\": \"Example showing how to copy code to clipboard.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/script-copy-btn\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/script-copy-btn-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/script-copy-btn-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Demo\",\n      \"description\": \"Example showing an infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/marquee-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Vertical Demo\",\n      \"description\": \"Example showing a vertical infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-demo-vertical.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/marquee-demo-vertical.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-logos\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee Logos\",\n      \"description\": \"Example showing an infinite scrolling logo carousel.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-logos.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/marquee-logos.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"marquee-3d\",\n      \"type\": \"registry:example\",\n      \"title\": \"Marquee 3D\",\n      \"description\": \"Example showing a 3D infinite scrolling component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/marquee\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/marquee-3d.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/marquee-3d.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"globe-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Globe Demo\",\n      \"description\": \"Example showing an autorotating, interactive WebGL globe.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/globe\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/globe-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/globe-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Demo\",\n      \"description\": \"Example showing a tweet card with author info.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/tweet-card-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-images\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Images\",\n      \"description\": \"Example showing a tweet card with images.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-images.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/tweet-card-images.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"tweet-card-meta-preview\",\n      \"type\": \"registry:example\",\n      \"title\": \"Tweet Card Meta Preview\",\n      \"description\": \"Example showing a tweet card with meta preview.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/tweet-card\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/tweet-card-meta-preview.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/tweet-card-meta-preview.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shimmer-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shimmer Button Demo\",\n      \"description\": \"Example showing a button with a shimmering light effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/shimmer-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shimmer-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/shimmer-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Demo\",\n      \"description\": \"Example showing a bento grid layout for showcasing features.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"calendar\",\n        \"https://magicui.design/r/marquee\",\n        \"https://magicui.design/r/bento-grid\",\n        \"https://magicui.design/r/animated-list-demo\",\n        \"https://magicui.design/r/animated-beam-multiple-outputs\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/bento-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"bento-demo-vertical\",\n      \"type\": \"registry:example\",\n      \"title\": \"Bento Vertical Demo\",\n      \"description\": \"Example showing a vertical bento grid layout.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/bento-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/bento-demo-vertical.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/bento-demo-vertical.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/number-ticker-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Demo 2\",\n      \"description\": \"Example showing animated counting numbers.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/number-ticker-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"number-ticker-decimal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Number Ticker Decimal Demo\",\n      \"description\": \"Example showing animated counting decimal numbers.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/number-ticker\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/number-ticker-decimal-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/number-ticker-decimal-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Demo\",\n      \"description\": \"Example showing an animated ripple effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/ripple\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/ripple-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"retro-grid-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Retro Grid Demo\",\n      \"description\": \"Example showing an animated scrolling retro grid effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/retro-grid\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/retro-grid-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/retro-grid-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-list-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated List Demo\",\n      \"description\": \"Example showing a list with sequenced item animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-list\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-list-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-list-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-shiny-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Shiny Text Demo\",\n      \"description\": \"Example showing text with a shimmering light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-shiny-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-shiny-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-shiny-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"particles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Particles Demo\",\n      \"description\": \"Example showing interactive particle effects.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/particles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/particles-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/particles-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Grid Pattern Demo\",\n      \"description\": \"Example showing an animated grid pattern background.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-grid-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo\",\n      \"description\": \"Example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/interactive-grid-pattern-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-grid-pattern-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Grid Pattern Demo 2\",\n      \"description\": \"Second example showing an interactive grid pattern background.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/interactive-grid-pattern\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-grid-pattern-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/interactive-grid-pattern-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/border-beam-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"https://magicui.design/r/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/border-beam-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 3\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"card\",\n        \"input\",\n        \"label\",\n        \"https://magicui.design/r/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/border-beam-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"border-beam-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Border Beam Demo 4\",\n      \"description\": \"Example showing an animated border beam effect.\",\n      \"registryDependencies\": [\n        \"button\",\n        \"https://magicui.design/r/border-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/border-beam-demo-4.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/border-beam-demo-4.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Demo\",\n      \"description\": \"Example showing an animated beam of light effect.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-beam-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-unidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Unidirectional\",\n      \"description\": \"Example showing a unidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-unidirectional.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-beam-unidirectional.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-bidirectional\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Bidirectional\",\n      \"description\": \"Example showing a bidirectional animated beam effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-bidirectional.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-beam-bidirectional.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-inputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Inputs\",\n      \"description\": \"Example showing animated beams with multiple input points.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-inputs.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-beam-multiple-inputs.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-beam-multiple-outputs\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Beam Multiple Outputs\",\n      \"description\": \"Example showing animated beams with multiple output points.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-beam\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-beam-multiple-outputs.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-beam-multiple-outputs.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Reveal Demo\",\n      \"description\": \"Example showing text that fades in on scroll.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-reveal-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-reveal-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo\",\n      \"description\": \"Example showing text with animated gradient backgrounds.\",\n      \"dependencies\": [\n        \"lucide-react\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-gradient-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-gradient-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Gradient Text Demo 2\",\n      \"description\": \"Second example showing text with animated gradient backgrounds.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-gradient-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-gradient-text-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-gradient-text-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"orbiting-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Orbiting Circles Demo\",\n      \"description\": \"Example showing circles moving in orbital paths.\",\n      \"dependencies\": [\n        \"@radix-ui/react-icons\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/orbiting-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/orbiting-circles-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/orbiting-circles-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo\",\n      \"description\": \"Example showing a MacOS-style dock implementation.\",\n      \"dependencies\": [\n        \"next-themes\"\n      ],\n      \"registryDependencies\": [\n        \"button\",\n        \"https://magicui.design/r/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dock-demo.tsx\"\n        },\n        {\n          \"path\": \"registry/magicui/mode-toggle.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/mode-toggle.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 2\",\n      \"description\": \"Second example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dock-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"dock-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Dock Demo 3\",\n      \"description\": \"Third example showing a MacOS-style dock implementation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/dock\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/dock-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/dock-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"word-rotate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Word Rotate Demo\",\n      \"description\": \"Example showing vertical word rotation animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/word-rotate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/word-rotate-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/word-rotate-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hyper-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Hyper Text Demo\",\n      \"description\": \"Example showing text with scrambling letter animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/hyper-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/hyper-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/hyper-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"avatar-circles-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Avatar Circles Demo\",\n      \"description\": \"Example showing overlapping avatar circles.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/avatar-circles\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/avatar-circles-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/avatar-circles-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"typing-animation-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Typing Animation Demo\",\n      \"description\": \"Example showing typed character animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/typing-animation\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/typing-animation-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/typing-animation-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Demo\",\n      \"description\": \"Example showing text speed changes based on scroll velocity.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/scroll-based-velocity-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scroll-based-velocity-images-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scroll Based Velocity Images\",\n      \"description\": \"Example showing Unsplash images scrolling with speed reacting to scroll velocity.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/scroll-based-velocity\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scroll-based-velocity-images-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/scroll-based-velocity-images-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"scratch-to-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Scratch To Reveal Demo\",\n      \"description\": \"Example showing an interactive scratch-off reveal effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/scratch-to-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/scratch-to-reveal-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/scratch-to-reveal-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"flip-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Flip Text Demo\",\n      \"description\": \"Example showing text with character flip animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/flip-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/flip-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/flip-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkles-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Sparkles Text Demo\",\n      \"description\": \"Example showing text with animated sparkle effects.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/sparkles-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/sparkles-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/sparkles-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/spinning-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spinning-text-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Spinning Text Demo 2\",\n      \"description\": \"Example showing spinning text animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/spinning-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/spinning-text-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/spinning-text-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"comic-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Comic Text Demo\",\n      \"description\": \"Example showing comic text animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/comic-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/comic-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/comic-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo\",\n      \"description\": \"Example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/icon-cloud-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 2\",\n      \"description\": \"Second example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/icon-cloud-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"icon-cloud-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Icon Cloud Demo 3\",\n      \"description\": \"Third example showing an interactive 3D icon cloud.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/icon-cloud\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/icon-cloud-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/icon-cloud-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo\",\n      \"description\": \"Example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 2\",\n      \"description\": \"Second example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 3\",\n      \"description\": \"Third example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 4\",\n      \"description\": \"Fourth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-4.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-4.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-5\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 5\",\n      \"description\": \"Fifth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-5.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-5.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-6\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 6\",\n      \"description\": \"Sixth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-6.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-6.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-7\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 7\",\n      \"description\": \"Seventh example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-7.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-7.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-8\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 8\",\n      \"description\": \"Eighth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-8.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-8.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"text-animate-demo-9\",\n      \"type\": \"registry:example\",\n      \"title\": \"Text Animate Demo 9\",\n      \"description\": \"Ninth example showing various text animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/text-animate\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/text-animate-demo-9.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/text-animate-demo-9.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shiny-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shiny Button Demo\",\n      \"description\": \"Example showing a shiny button with dynamic styles.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/shiny-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shiny-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/shiny-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"box-reveal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Box Reveal Demo\",\n      \"description\": \"Example showing a sliding box text reveal animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/box-reveal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/box-reveal-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/box-reveal-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-circular-progress-bar-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Circular Progress Bar Demo\",\n      \"description\": \"Example showing an animated circular progress gauge.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-circular-progress-bar\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-circular-progress-bar-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-circular-progress-bar-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo\",\n      \"description\": \"Example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/shine-border-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"shine-border-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Shine Border Demo 2\",\n      \"description\": \"Second example showing an animated shining border effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/shine-border\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/shine-border-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/shine-border-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Demo\",\n      \"description\": \"Example showing confetti animations for celebrations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-basic-cannon\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Basic Cannon\",\n      \"description\": \"Example showing basic confetti cannon animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-basic-cannon.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-basic-cannon.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-random-direction\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Random Direction\",\n      \"description\": \"Example showing confetti with random directions.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-random-direction.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-random-direction.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-fireworks\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Fireworks\",\n      \"description\": \"Example showing fireworks-style confetti animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-fireworks.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-fireworks.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-stars\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Stars\",\n      \"description\": \"Example showing star-shaped confetti animation.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-stars.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-stars.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-side-cannons\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Side Cannons\",\n      \"description\": \"Example showing side-mounted confetti cannons.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-side-cannons.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-side-cannons.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-custom-shapes\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Custom Shapes\",\n      \"description\": \"Example showing confetti with custom shape particles.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-custom-shapes.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-custom-shapes.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"confetti-emoji\",\n      \"type\": \"registry:example\",\n      \"title\": \"Confetti Emoji\",\n      \"description\": \"Example showing confetti with emoji particles.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/confetti\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/confetti-emoji.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/confetti-emoji.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-subscribe-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Subscribe Button Demo\",\n      \"description\": \"Example showing an animated subscribe button with micro animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-subscribe-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-subscribe-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-subscribe-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-subscribe-button-controlled-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Subscribe Button (Controlled)\",\n      \"description\": \"Controlled example showing async behavior for AnimatedSubscribeButton.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/animated-subscribe-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-subscribe-button-controlled-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-subscribe-button-controlled-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Demo\",\n      \"description\": \"Example showing cool mode effect for buttons and links.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/cool-mode-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cool-mode-custom\",\n      \"type\": \"registry:example\",\n      \"title\": \"Cool Mode Custom\",\n      \"description\": \"Example showing customized cool mode effects.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/cool-mode\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/cool-mode-custom.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/cool-mode-custom.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pulsating-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pulsating Button Demo\",\n      \"description\": \"Example showing an animated pulsating button.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/pulsating-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pulsating-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/pulsating-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ripple-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Ripple Button Demo\",\n      \"description\": \"Example showing an animated button with ripple effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/ripple-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/ripple-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/ripple-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"file-tree-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"File Tree Demo\",\n      \"description\": \"Example showing a component that displays folder and file structure.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/file-tree\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/file-tree-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/file-tree-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Demo\",\n      \"description\": \"Example showing blur fade in and out animations.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/blur-fade-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"blur-fade-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Blur Fade Text Demo\",\n      \"description\": \"Example showing blur fade animations with text.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/blur-fade\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/blur-fade-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/blur-fade-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo\",\n      \"description\": \"Example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/safari-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 2\",\n      \"description\": \"Second example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/safari-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 3\",\n      \"description\": \"Third example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/safari-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"safari-demo-4\",\n      \"type\": \"registry:example\",\n      \"title\": \"Safari Demo 4\",\n      \"description\": \"Fourth example showing a Safari browser mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/safari\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/safari-demo-4.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/safari-demo-4.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-15-pro-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone 15 Pro Demo\",\n      \"description\": \"Example showing an iPhone 15 Pro mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/iphone-15-pro\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-15-pro-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/iphone-15-pro-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-15-pro-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone 15 Pro Demo 2\",\n      \"description\": \"Second example showing an iPhone 15 Pro mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/iphone-15-pro\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-15-pro-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/iphone-15-pro-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"iphone-15-pro-demo-3\",\n      \"type\": \"registry:example\",\n      \"title\": \"iPhone 15 Pro Demo 3\",\n      \"description\": \"Third example showing an iPhone 15 Pro mockup.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/iphone-15-pro\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/iphone-15-pro-demo-3.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/iphone-15-pro-demo-3.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/rainbow-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"rainbow-button-demo-2\",\n      \"type\": \"registry:example\",\n      \"title\": \"Rainbow Button Demo 2\",\n      \"description\": \"Example showing an animated button with rainbow effect.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/rainbow-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/rainbow-button-demo-2.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/rainbow-button-demo-2.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"interactive-hover-button-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Interactive Hover Button Demo\",\n      \"description\": \"Example showing an interactive button with hover effects.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/interactive-hover-button\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/interactive-hover-button-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/interactive-hover-button-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"terminal-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Terminal Demo\",\n      \"description\": \"Example showing a terminal with animated text.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/terminal\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/terminal-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/terminal-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"video-text-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Video Text Demo\",\n      \"description\": \"Example showing text with a video background.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/video-text\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/video-text-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/video-text-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pixel-image-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Pixel Image Demo\",\n      \"description\": \"Example showing a pixelated image effect.\",\n      \"registryDependencies\": [\n        \"pixel-image\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/pixel-image-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/pixel-image-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"highlighter-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Highlighter Demo\",\n      \"description\": \"Example showing the demo of a Highlighter\",\n      \"dependencies\": [\n        \"rough-notation\"\n      ],\n      \"registryDependencies\": [\n        \"https://magicui.design/r/highlighter\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/highlighter-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/highlighter-demo.tsx\"\n        },\n        {\n          \"path\": \"registry/magicui/highlighter.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/highlighter.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"arc-timeline-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Arc Timeline Demo\",\n      \"description\": \"Example showing an arc timeline component.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/r/arc-timeline\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/arc-timeline-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/arc-timeline-demo.tsx\"\n        },\n        {\n          \"path\": \"registry/magicui/arc-timeline.tsx\",\n          \"type\": \"registry:ui\",\n          \"target\": \"components/magicui/arc-timeline.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"animated-theme-toggler-demo\",\n      \"type\": \"registry:example\",\n      \"title\": \"Animated Theme Toggler Demo\",\n      \"description\": \"Example showing animation while changing the theme.\",\n      \"registryDependencies\": [\n        \"https://magicui.design/animated-theme-toggler\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/animated-theme-toggler-demo.tsx\",\n          \"type\": \"registry:example\",\n          \"target\": \"components/animated-theme-toggler-demo.tsx\"\n        }\n      ]\n    },\n    {\n      \"name\": \"grid-beams-demo\",\n      \"type\": \"registry:example\",\n      \"description\": \"Demo of the grid-beams component showcasing animated light rays over a grid\",\n      \"registryDependencies\": [\n        \"grid-beams\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/example/grid-beams-demo.tsx\",\n          \"type\": \"registry:example\"\n        }\n      ]\n    },\n    {\n      \"name\": \"utils\",\n      \"type\": \"registry:lib\",\n      \"dependencies\": [\n        \"clsx\",\n        \"tailwind-merge\"\n      ],\n      \"files\": [\n        {\n          \"path\": \"registry/lib/utils.ts\",\n          \"type\": \"registry:lib\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "skills/magic-ui/SKILL.md",
    "content": "---\nname: magic-ui\ndescription: Use this skill when users want to add, customize, or troubleshoot Magic UI components in React/Next.js projects. It covers component selection, shadcn registry installation (`@magicui/*`), integration patterns, and practical quality checks for accessibility and maintainability.\nmetadata:\n  short-description: Build and customize UIs with Magic UI components\n---\n\n# Magic UI\n\nUse this skill when the task involves Magic UI components, animated UI sections, or converting static sections into interactive UI using the Magic UI registry.\n\n## When To Apply\n\nApply this skill when users ask to:\n\n- Add a Magic UI component (for example: marquee, globe, blur-fade, shiny-button)\n- Build a section with Magic UI effects (hero, testimonials, CTA, feature grid)\n- Replace custom animation code with Magic UI components\n- Troubleshoot installation/import issues for `@magicui/*`\n\n## Core Workflow\n\n1. Define the UI outcome first.\n  - Identify section type, tone, motion intensity, and responsive behavior.\n  - Keep motion intentional; avoid stacking many high-motion effects in one viewport.\n\n2. Confirm project prerequisites.\n  - Project should be React/Next.js with Tailwind CSS.\n  - shadcn must be initialized before adding registry components:\n```bash\nnpx shadcn@latest init\n```\n\n3. Install the selected component(s).\n```bash\nnpx shadcn@latest add @magicui/<component-slug>\n```\nExample:\n```bash\nnpx shadcn@latest add @magicui/magic-card\n```\n\n4. Integrate into the target section.\n  - Import from the generated path (typically `@/components/ui/<component-slug>`).\n  - Keep component APIs intact; prefer prop/className customization over rewriting internals.\n  - If docs mention extra dependencies or CSS keyframes, add them during integration.\n\n5. Validate quality before finishing.\n  - Accessibility: semantic HTML, keyboard access, meaningful labels/text.\n  - Responsiveness: check mobile layout and overflow behavior.\n  - Performance: avoid unnecessary client-only wrappers and heavy animation stacking.\n  - Maintainability: keep new code modular and consistent with existing project conventions.\n\n## References To Load On Demand\n\n- For component choice, install shape, and dependency expectations:\n  - Read `references/components.md`\n- For section-level implementation patterns:\n  - Read `references/recipes.md`\n\n## Quick Component Selection Heuristics\n\n- Social proof/logo rails: `marquee`, `avatar-circles`\n- Hero visual impact: `globe`, `warp-background`, `animated-grid-pattern`\n- Text animation: `blur-fade`, `text-animate`, `word-rotate`, `sparkles-text`\n- CTA emphasis: `shiny-button`, `shimmer-button`, `rainbow-button`\n- Ambient backgrounds: `grid-pattern`, `dot-pattern`, `particles`, `flickering-grid`\n\nStart with 1 core component + 1 supporting effect, then expand only if needed.\n\n## Troubleshooting\n\n- `components.json` or registry init error:\n  - Run `npx shadcn@latest init` in the project root.\n- Import path mismatch (`@/` alias not configured):\n  - Use the project's alias style or relative imports.\n- Visual mismatch after install:\n  - Check for required global CSS/keyframes listed in the component docs.\n- Missing package errors:\n  - Install dependencies listed in the component's manual installation steps.\n\n## Reference Links\n\n- Magic UI docs: `https://magicui.design/docs`\n- Component docs: `https://magicui.design/docs/components`\n- Installation: `https://magicui.design/docs/installation`\n- MCP setup (optional, for AI IDE workflows): `https://magicui.design/docs/mcp`\n"
  },
  {
    "path": "skills/magic-ui/references/components.md",
    "content": "# Magic UI Component Reference\n\n## Purpose\n\nUse this document to choose the right Magic UI component and avoid integration mistakes before implementation.\n\n## Install Contract\n\n- Initialize shadcn once per project:\n```bash\nnpx shadcn@latest init\n```\n- Add components via registry:\n```bash\nnpx shadcn@latest add @magicui/<component-slug>\n```\n- Default import path is usually:\n```tsx\nimport { ComponentName } from \"@/components/ui/<component-slug>\"\n```\n\nIf the project does not use `@/` aliases, adapt import paths to local conventions.\n\n## Families\n\n### Layout And Social Proof\n\n- `marquee`\n- `avatar-circles`\n- `bento-grid`\n\nUse for logo rails, testimonial movement, and feature grids.\n\n### Hero And Visual Anchors\n\n- `globe`\n- `warp-background`\n- `animated-grid-pattern`\n- `retro-grid`\n\nUse one primary visual anchor per hero to keep hierarchy clear.\n\n### Text Motion\n\n- `blur-fade`\n- `text-animate`\n- `word-rotate`\n- `sparkles-text`\n- `typing-animation`\n\nUse when product messaging needs motion emphasis.\n\n### Buttons And CTA Emphasis\n\n- `shiny-button`\n- `shimmer-button`\n- `rainbow-button`\n- `ripple-button`\n\nKeep CTA style consistent within one page section.\n\n### Ambient Effects\n\n- `particles`\n- `flickering-grid`\n- `dot-pattern`\n- `grid-pattern`\n- `light-rays`\n\nUse these as supporting layers, not primary content.\n\n## Integration Notes\n\n- Some components require additional dependencies (for example `cobe`, `motion` for `globe` patterns).\n- Some components require global CSS keyframes (for example `marquee` variants).\n- Prefer prop-level customization before editing generated source.\n- If customization grows large, wrap the component in a local section component rather than editing registry output directly.\n\n## Quality Checks\n\n- Accessibility: interactive controls remain keyboard-accessible.\n- Readability: animated backgrounds do not reduce text contrast.\n- Responsiveness: no horizontal overflow on small screens.\n- Performance: avoid stacking multiple expensive animated backgrounds in one viewport.\n"
  },
  {
    "path": "skills/magic-ui/references/recipes.md",
    "content": "# Magic UI Recipes\n\n## Purpose\n\nUse these recipes when the user asks for concrete UI sections rather than a single component.\n\n## Recipe 1: Hero With Visual Depth\n\n### Goal\n\nCreate a hero section with strong visual identity and clear CTA hierarchy.\n\n### Suggested Stack\n\n- Primary visual: `warp-background` or `animated-grid-pattern`\n- Heading entrance: `blur-fade`\n- CTA: `shiny-button`\n\n### Steps\n\n1. Install components:\n```bash\nnpx shadcn@latest add @magicui/warp-background @magicui/blur-fade @magicui/shiny-button\n```\n2. Wrap hero content in the background component.\n3. Animate heading and subheading with subtle stagger.\n4. Keep one primary CTA and one secondary action.\n\n### Guardrails\n\n- Keep animations under control: avoid combining more than two high-motion effects in hero.\n- Preserve text contrast over animated backgrounds.\n\n## Recipe 2: Testimonial And Logo Trust Rail\n\n### Goal\n\nShow social proof without static blocks.\n\n### Suggested Stack\n\n- `marquee`\n- `avatar-circles` (optional for compact profile clusters)\n\n### Steps\n\n1. Install:\n```bash\nnpx shadcn@latest add @magicui/marquee @magicui/avatar-circles\n```\n2. Use horizontal marquee for desktop and reduced density on mobile.\n3. If using avatar clusters, add concise labels and accessible alt text.\n\n### Guardrails\n\n- Ensure auto-scrolling content can pause on hover/focus for usability.\n- Do not overload with long testimonial paragraphs in moving rails.\n\n## Recipe 3: Feature Grid With Motion Highlights\n\n### Goal\n\nPresent product capabilities in an interactive but readable grid.\n\n### Suggested Stack\n\n- `bento-grid`\n- One text motion component per card group (`text-animate` or `word-rotate`)\n\n### Steps\n\n1. Install:\n```bash\nnpx shadcn@latest add @magicui/bento-grid @magicui/text-animate\n```\n2. Keep card copy short and scannable.\n3. Use motion for emphasis on only 1-2 cards.\n\n### Guardrails\n\n- Maintain consistent card heights where possible.\n- Avoid running simultaneous animations in every card.\n\n## Final Validation Checklist\n\n- Layout works at mobile and desktop breakpoints.\n- Interactive elements are reachable with keyboard navigation.\n- Motion supports content hierarchy instead of competing with it.\n- Added components compile with the current path alias setup.\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"ui\": \"tui\",\n  \"envMode\": \"strict\",\n  \"globalEnv\": [\n    \"NODE_ENV\",\n    \"NEXT_PUBLIC_POSTHOG_API_KEY\",\n    \"BLOG_WEBHOOK_ACCESS_TOKEN\",\n    \"GITHUB_TOKEN\"\n  ],\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"env\": [\"NEXT_PUBLIC_APP_URL\"],\n      \"outputs\": [\"dist/**\", \".next/**\"]\n    },\n    \"preview\": {\n      \"env\": [\"NEXT_PUBLIC_APP_URL\"],\n      \"outputs\": [\".next/**\"]\n    },\n    \"start\": {\n      \"dependsOn\": [\"^build\"]\n    },\n    \"lint\": { \"cache\": false, \"outputs\": [] },\n    \"lint:fix\": { \"cache\": false, \"outputs\": [] },\n    \"format:check\": { \"cache\": false, \"outputs\": [] },\n    \"format:fix\": { \"cache\": false, \"outputs\": [] },\n    \"typecheck\": {},\n    \"dev\": { \"cache\": false },\n    \"check\": { \"cache\": false },\n    \"test\": { \"cache\": false, \"outputs\": [] },\n    \"build:registry\": {\n      \"cache\": false,\n      \"outputs\": []\n    }\n  }\n}\n"
  }
]